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 |