Commit 9e089efe5a2defa38cc94347a5051f1cfe91406b
1 parent
c03bc6e2
Exists in
master
and in
4 other branches
gitolite & gitosis support
Showing
14 changed files
with
200 additions
and
98 deletions
Show diff stats
app/controllers/application_controller.rb
| @@ -3,7 +3,7 @@ class ApplicationController < ActionController::Base | @@ -3,7 +3,7 @@ class ApplicationController < ActionController::Base | ||
| 3 | protect_from_forgery | 3 | protect_from_forgery |
| 4 | helper_method :abilities, :can? | 4 | helper_method :abilities, :can? |
| 5 | 5 | ||
| 6 | - rescue_from Gitosis::AccessDenied do |exception| | 6 | + rescue_from Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied do |exception| |
| 7 | render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false | 7 | render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false |
| 8 | end | 8 | end |
| 9 | 9 |
app/controllers/projects_controller.rb
| @@ -42,7 +42,7 @@ class ProjectsController < ApplicationController | @@ -42,7 +42,7 @@ class ProjectsController < ApplicationController | ||
| 42 | format.js | 42 | format.js |
| 43 | end | 43 | end |
| 44 | end | 44 | end |
| 45 | - rescue Gitosis::AccessDenied | 45 | + rescue Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied |
| 46 | render :js => "location.href = '#{errors_gitosis_path}'" and return | 46 | render :js => "location.href = '#{errors_gitosis_path}'" and return |
| 47 | rescue StandardError => ex | 47 | rescue StandardError => ex |
| 48 | @project.errors.add(:base, "Cant save project. Please try again later") | 48 | @project.errors.add(:base, "Cant save project. Please try again later") |
app/models/key.rb
| @@ -19,7 +19,7 @@ class Key < ActiveRecord::Base | @@ -19,7 +19,7 @@ class Key < ActiveRecord::Base | ||
| 19 | end | 19 | end |
| 20 | 20 | ||
| 21 | def update_gitosis | 21 | def update_gitosis |
| 22 | - Gitosis.new.configure do |c| | 22 | + GitoProxy.system.new.configure do |c| |
| 23 | c.update_keys(identifier, key) | 23 | c.update_keys(identifier, key) |
| 24 | 24 | ||
| 25 | projects.each do |project| | 25 | projects.each do |project| |
| @@ -29,7 +29,7 @@ class Key < ActiveRecord::Base | @@ -29,7 +29,7 @@ class Key < ActiveRecord::Base | ||
| 29 | end | 29 | end |
| 30 | 30 | ||
| 31 | def gitosis_delete_key | 31 | def gitosis_delete_key |
| 32 | - Gitosis.new.configure do |c| | 32 | + GitoProxy.system.new.configure do |c| |
| 33 | c.delete_key(identifier) | 33 | c.delete_key(identifier) |
| 34 | 34 | ||
| 35 | projects.each do |project| | 35 | projects.each do |project| |
app/models/repository.rb
| @@ -22,25 +22,25 @@ class Repository | @@ -22,25 +22,25 @@ class Repository | ||
| 22 | end | 22 | end |
| 23 | 23 | ||
| 24 | def url_to_repo | 24 | def url_to_repo |
| 25 | - if !GITOSIS["port"] or GITOSIS["port"] == 22 | ||
| 26 | - "#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{path}.git" | 25 | + if !GIT_HOST["port"] or GIT_HOST["port"] == 22 |
| 26 | + "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{path}.git" | ||
| 27 | else | 27 | else |
| 28 | - "ssh://#{GITOSIS["git_user"]}@#{GITOSIS["host"]}:#{GITOSIS["port"]}/#{path}.git" | 28 | + "ssh://#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{GIT_HOST["port"]}/#{path}.git" |
| 29 | end | 29 | end |
| 30 | end | 30 | end |
| 31 | 31 | ||
| 32 | def path_to_repo | 32 | def path_to_repo |
| 33 | - GITOSIS["base_path"] + path + ".git" | 33 | + GIT_HOST["base_path"] + path + ".git" |
| 34 | end | 34 | end |
| 35 | 35 | ||
| 36 | def update_gitosis_project | 36 | def update_gitosis_project |
| 37 | - Gitosis.new.configure do |c| | 37 | + GitProxy.system.new.configure do |c| |
| 38 | c.update_project(path, project.gitosis_writers) | 38 | c.update_project(path, project.gitosis_writers) |
| 39 | end | 39 | end |
| 40 | end | 40 | end |
| 41 | 41 | ||
| 42 | def destroy_gitosis_project | 42 | def destroy_gitosis_project |
| 43 | - Gitosis.new.configure do |c| | 43 | + GitProxy.system.new.configure do |c| |
| 44 | c.destroy_project(@project) | 44 | c.destroy_project(@project) |
| 45 | end | 45 | end |
| 46 | end | 46 | end |
app/views/projects/_form.html.haml
| @@ -20,13 +20,13 @@ | @@ -20,13 +20,13 @@ | ||
| 20 | %tr | 20 | %tr |
| 21 | %td | 21 | %td |
| 22 | .left= f.label :path | 22 | .left= f.label :path |
| 23 | - %cite.right= "git@#{GITOSIS["host"]}:" | 23 | + %cite.right= "git@#{GIT_HOST["host"]}:" |
| 24 | %td | 24 | %td |
| 25 | = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record? | 25 | = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record? |
| 26 | %tr | 26 | %tr |
| 27 | %td | 27 | %td |
| 28 | .left= f.label :code | 28 | .left= f.label :code |
| 29 | - %cite.right= "http://#{GITOSIS["host"]}/" | 29 | + %cite.right= "http://#{GIT_HOST["host"]}/" |
| 30 | %td= f.text_field :code, :placeholder => "example" | 30 | %td= f.text_field :code, :placeholder => "example" |
| 31 | 31 | ||
| 32 | %tr | 32 | %tr |
config/environment.rb
| @@ -4,4 +4,4 @@ require File.expand_path('../application', __FILE__) | @@ -4,4 +4,4 @@ require File.expand_path('../application', __FILE__) | ||
| 4 | # Initialize the rails application | 4 | # Initialize the rails application |
| 5 | Gitlab::Application.initialize! | 5 | Gitlab::Application.initialize! |
| 6 | 6 | ||
| 7 | -require File.join(Rails.root, "lib", "gitosis") | 7 | +require File.join(Rails.root, "lib", "gitlabhq", "git_host") |
config/gitlab.yml
| @@ -7,7 +7,8 @@ email: | @@ -7,7 +7,8 @@ email: | ||
| 7 | host: gitlabhq.com | 7 | host: gitlabhq.com |
| 8 | 8 | ||
| 9 | # Gitosis congiguration | 9 | # Gitosis congiguration |
| 10 | -gitosis: | 10 | +git_host: |
| 11 | + system: gitolite# or gitosis | ||
| 11 | admin_uri: git@localhost:gitolite-admin | 12 | admin_uri: git@localhost:gitolite-admin |
| 12 | base_path: /home/git/repositories/ | 13 | base_path: /home/git/repositories/ |
| 13 | host: localhost | 14 | host: localhost |
config/initializers/gitlabhq/10_load_config.rb
| 1 | -GITOSIS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["gitosis"] | 1 | +GIT_HOST = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git_host"] |
| 2 | EMAIL_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["email"] | 2 | EMAIL_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["email"] |
| 3 | GIT_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git"] | 3 | GIT_OPTS = YAML.load_file("#{Rails.root}/config/gitlab.yml")["git"] |
| @@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
| 1 | +require File.join(Rails.root, "lib", "gitlabhq", "gitolite") | ||
| 2 | +require File.join(Rails.root, "lib", "gitlabhq", "gitosis") | ||
| 3 | + | ||
| 4 | +module Gitlabhq | ||
| 5 | + class GitHost | ||
| 6 | + def self.system | ||
| 7 | + if GIT_HOST["system"] == "gitolite" | ||
| 8 | + Gitlabhq::Gitolite | ||
| 9 | + else | ||
| 10 | + Gitlabhq::Gitosis | ||
| 11 | + end | ||
| 12 | + end | ||
| 13 | + | ||
| 14 | + def self.admin_uri | ||
| 15 | + GIT_HOST["admin_uri"] | ||
| 16 | + end | ||
| 17 | + end | ||
| 18 | +end |
| @@ -0,0 +1,80 @@ | @@ -0,0 +1,80 @@ | ||
| 1 | +require 'gitolite' | ||
| 2 | +require 'timeout' | ||
| 3 | +require 'fileutils' | ||
| 4 | + | ||
| 5 | +module Gitlabhq | ||
| 6 | + class Gitolite | ||
| 7 | + class AccessDenied < StandardError; end | ||
| 8 | + | ||
| 9 | + def pull | ||
| 10 | + # create tmp dir | ||
| 11 | + @local_dir = File.join(Dir.tmpdir,"gitlabhq-gitolite-#{Time.now.to_i}") | ||
| 12 | + Dir.mkdir @local_dir | ||
| 13 | + | ||
| 14 | + `git clone #{GitHost.admin_uri} #{@local_dir}/gitolite` | ||
| 15 | + end | ||
| 16 | + | ||
| 17 | + def push | ||
| 18 | + Dir.chdir(File.join(@local_dir, "gitolite")) | ||
| 19 | + `git add -A` | ||
| 20 | + `git commit -am "Gitlab"` | ||
| 21 | + `git push` | ||
| 22 | + Dir.chdir(Rails.root) | ||
| 23 | + | ||
| 24 | + FileUtils.rm_rf(@local_dir) | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + def configure | ||
| 28 | + status = Timeout::timeout(20) do | ||
| 29 | + File.open(File.join(Dir.tmpdir,"gitlabhq-gitolite.lock"), "w+") do |f| | ||
| 30 | + begin | ||
| 31 | + f.flock(File::LOCK_EX) | ||
| 32 | + pull | ||
| 33 | + yield(self) | ||
| 34 | + push | ||
| 35 | + ensure | ||
| 36 | + f.flock(File::LOCK_UN) | ||
| 37 | + end | ||
| 38 | + end | ||
| 39 | + end | ||
| 40 | + rescue Exception => ex | ||
| 41 | + raise Gitolite::AccessDenied.new("gitolite timeout") | ||
| 42 | + end | ||
| 43 | + | ||
| 44 | + def destroy_project(project) | ||
| 45 | + `sudo -u git rm -rf #{project.path_to_repo}` | ||
| 46 | + | ||
| 47 | + ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite')) | ||
| 48 | + conf = ga_repo.config | ||
| 49 | + conf.rm_repo(project.path) | ||
| 50 | + ga_repo.save | ||
| 51 | + end | ||
| 52 | + | ||
| 53 | + #update or create | ||
| 54 | + def update_keys(user, key) | ||
| 55 | + File.open(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) } | ||
| 56 | + end | ||
| 57 | + | ||
| 58 | + def delete_key(user) | ||
| 59 | + File.unlink(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub")) | ||
| 60 | + `cd #{File.join(@local_dir,'gitolite')} ; git rm keydir/#{user}.pub` | ||
| 61 | + end | ||
| 62 | + | ||
| 63 | + # update or create | ||
| 64 | + def update_project(repo_name, name_writers) | ||
| 65 | + ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite')) | ||
| 66 | + conf = ga_repo.config | ||
| 67 | + | ||
| 68 | + repo = if conf.has_repo?(repo_name) | ||
| 69 | + conf.get_repo(repo_name) | ||
| 70 | + else | ||
| 71 | + ::Gitolite::Config::Repo.new(repo_name) | ||
| 72 | + end | ||
| 73 | + | ||
| 74 | + repo.add_permission("RW+", "", name_writers) unless name_writers.blank? | ||
| 75 | + conf.add_repo(repo) | ||
| 76 | + | ||
| 77 | + ga_repo.save | ||
| 78 | + end | ||
| 79 | + end | ||
| 80 | +end |
| @@ -0,0 +1,76 @@ | @@ -0,0 +1,76 @@ | ||
| 1 | +require 'inifile' | ||
| 2 | +require 'timeout' | ||
| 3 | +require 'fileutils' | ||
| 4 | + | ||
| 5 | +module Gitlabhq | ||
| 6 | + class Gitosis | ||
| 7 | + class AccessDenied < StandardError; end | ||
| 8 | + | ||
| 9 | + def pull | ||
| 10 | + # create tmp dir | ||
| 11 | + @local_dir = File.join(Dir.tmpdir,"gitlabhq-gitosis-#{Time.now.to_i}") | ||
| 12 | + | ||
| 13 | + Dir.mkdir @local_dir | ||
| 14 | + | ||
| 15 | + `git clone #{GitHost.admin_uri} #{@local_dir}/gitosis` | ||
| 16 | + end | ||
| 17 | + | ||
| 18 | + def push | ||
| 19 | + Dir.chdir(File.join(@local_dir, "gitosis")) | ||
| 20 | + `git add -A` | ||
| 21 | + `git commit -am "Gitlab"` | ||
| 22 | + `git push` | ||
| 23 | + Dir.chdir(Rails.root) | ||
| 24 | + | ||
| 25 | + FileUtils.rm_rf(@local_dir) | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | + def configure | ||
| 29 | + status = Timeout::timeout(20) do | ||
| 30 | + File.open(File.join(Dir.tmpdir,"gitlabhq-gitosis.lock"), "w+") do |f| | ||
| 31 | + begin | ||
| 32 | + f.flock(File::LOCK_EX) | ||
| 33 | + pull | ||
| 34 | + yield(self) | ||
| 35 | + push | ||
| 36 | + ensure | ||
| 37 | + f.flock(File::LOCK_UN) | ||
| 38 | + end | ||
| 39 | + end | ||
| 40 | + end | ||
| 41 | + rescue Exception => ex | ||
| 42 | + raise Gitosis::AccessDenied.new("gitosis timeout") | ||
| 43 | + end | ||
| 44 | + | ||
| 45 | + def destroy_project(project) | ||
| 46 | + `sudo -u git rm -rf #{project.path_to_repo}` | ||
| 47 | + | ||
| 48 | + conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf')) | ||
| 49 | + | ||
| 50 | + conf.delete_section("group #{project.path}") | ||
| 51 | + | ||
| 52 | + conf.write | ||
| 53 | + end | ||
| 54 | + | ||
| 55 | + #update or create | ||
| 56 | + def update_keys(user, key) | ||
| 57 | + File.open(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) } | ||
| 58 | + end | ||
| 59 | + | ||
| 60 | + def delete_key(user) | ||
| 61 | + File.unlink(File.join(@local_dir, 'gitosis/keydir',"#{user}.pub")) | ||
| 62 | + `cd #{File.join(@local_dir,'gitosis')} ; git rm keydir/#{user}.pub` | ||
| 63 | + end | ||
| 64 | + | ||
| 65 | + #update or create | ||
| 66 | + def update_project(repo_name, name_writers) | ||
| 67 | + # write config file | ||
| 68 | + conf = IniFile.new(File.join(@local_dir,'gitosis','gitosis.conf')) | ||
| 69 | + | ||
| 70 | + conf["group #{repo_name}"]['writable'] = repo_name | ||
| 71 | + conf["group #{repo_name}"]['members'] = name_writers.join(' ') | ||
| 72 | + | ||
| 73 | + conf.write | ||
| 74 | + end | ||
| 75 | + end | ||
| 76 | +end |
lib/gitosis.rb
| @@ -1,83 +0,0 @@ | @@ -1,83 +0,0 @@ | ||
| 1 | -require 'gitolite' | ||
| 2 | - | ||
| 3 | -require 'inifile' | ||
| 4 | -require 'timeout' | ||
| 5 | -require 'fileutils' | ||
| 6 | - | ||
| 7 | -class Gitosis | ||
| 8 | - class AccessDenied < StandardError; end | ||
| 9 | - | ||
| 10 | - def pull | ||
| 11 | - # create tmp dir | ||
| 12 | - @local_dir = File.join(Dir.tmpdir,"gitlabhq-gitolite-#{Time.now.to_i}") | ||
| 13 | - | ||
| 14 | - Dir.mkdir @local_dir | ||
| 15 | - | ||
| 16 | - `git clone #{GITOSIS['admin_uri']} #{@local_dir}/gitolite` | ||
| 17 | - end | ||
| 18 | - | ||
| 19 | - def push | ||
| 20 | - Dir.chdir(File.join(@local_dir, "gitolite")) | ||
| 21 | - `git add -A` | ||
| 22 | - `git commit -am "Gitlab"` | ||
| 23 | - `git push` | ||
| 24 | - Dir.chdir(Rails.root) | ||
| 25 | - | ||
| 26 | - FileUtils.rm_rf(@local_dir) | ||
| 27 | - end | ||
| 28 | - | ||
| 29 | - def configure | ||
| 30 | - status = Timeout::timeout(20) do | ||
| 31 | - File.open(File.join(Dir.tmpdir,"gitlabhq-gitolite.lock"), "w+") do |f| | ||
| 32 | - begin | ||
| 33 | - f.flock(File::LOCK_EX) | ||
| 34 | - pull | ||
| 35 | - yield(self) | ||
| 36 | - push | ||
| 37 | - ensure | ||
| 38 | - f.flock(File::LOCK_UN) | ||
| 39 | - end | ||
| 40 | - end | ||
| 41 | - end | ||
| 42 | - #rescue Exception => ex | ||
| 43 | - #raise Gitosis::AccessDenied.new("gitolite timeout") | ||
| 44 | - end | ||
| 45 | - | ||
| 46 | - def destroy_project(project) | ||
| 47 | - `sudo -u git rm -rf #{project.path_to_repo}` | ||
| 48 | - | ||
| 49 | - conf = IniFile.new(File.join(@local_dir,'gitolite', 'conf', 'gitolite.conf')) | ||
| 50 | - | ||
| 51 | - conf.delete_section("group #{project.path}") | ||
| 52 | - | ||
| 53 | - conf.write | ||
| 54 | - end | ||
| 55 | - | ||
| 56 | - #update or create | ||
| 57 | - def update_keys(user, key) | ||
| 58 | - File.open(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub"), 'w') {|f| f.write(key.gsub(/\n/,'')) } | ||
| 59 | - end | ||
| 60 | - | ||
| 61 | - def delete_key(user) | ||
| 62 | - File.unlink(File.join(@local_dir, 'gitolite/keydir',"#{user}.pub")) | ||
| 63 | - `cd #{File.join(@local_dir,'gitolite')} ; git rm keydir/#{user}.pub` | ||
| 64 | - end | ||
| 65 | - | ||
| 66 | - #update or create | ||
| 67 | - def update_project(repo_name, name_writers) | ||
| 68 | - ga_repo = Gitolite::GitoliteAdmin.new(File.join(@local_dir,'gitolite')) | ||
| 69 | - conf = ga_repo.config | ||
| 70 | - | ||
| 71 | - repo = if conf.has_repo?(repo_name) | ||
| 72 | - conf.get_repo(repo_name) | ||
| 73 | - else | ||
| 74 | - Gitolite::Config::Repo.new(repo_name) | ||
| 75 | - end | ||
| 76 | - | ||
| 77 | - repo.add_permission("RW+", "", name_writers) unless name_writers.blank? | ||
| 78 | - | ||
| 79 | - conf.add_repo(repo) | ||
| 80 | - | ||
| 81 | - ga_repo.save | ||
| 82 | - end | ||
| 83 | -end |