Commit bdc658095c6bc7e7a2a49447b404156f3f947fe1
1 parent
8134fe0e
Exists in
master
and in
4 other branches
refcatoring. cleaning after gitosis
Showing
13 changed files
with
58 additions
and
124 deletions
Show diff stats
app/controllers/application_controller.rb
| ... | ... | @@ -3,8 +3,8 @@ class ApplicationController < ActionController::Base |
| 3 | 3 | protect_from_forgery |
| 4 | 4 | helper_method :abilities, :can? |
| 5 | 5 | |
| 6 | - rescue_from Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied do |exception| | |
| 7 | - render :file => File.join(Rails.root, "public", "gitosis_error"), :layout => false | |
| 6 | + rescue_from Gitlabhq::Gitolite::AccessDenied do |exception| | |
| 7 | + render :file => File.join(Rails.root, "public", "githost_error"), :layout => false | |
| 8 | 8 | end |
| 9 | 9 | |
| 10 | 10 | layout :layout_by_resource | ... | ... |
app/controllers/errors_controller.rb
app/controllers/projects_controller.rb
| ... | ... | @@ -42,8 +42,8 @@ class ProjectsController < ApplicationController |
| 42 | 42 | format.js |
| 43 | 43 | end |
| 44 | 44 | end |
| 45 | - rescue Gitlabhq::Gitosis::AccessDenied, Gitlabhq::Gitolite::AccessDenied | |
| 46 | - render :js => "location.href = '#{errors_gitosis_path}'" and return | |
| 45 | + rescue Gitlabhq::Gitolite::AccessDenied | |
| 46 | + render :js => "location.href = '#{errors_githost_path}'" and return | |
| 47 | 47 | rescue StandardError => ex |
| 48 | 48 | @project.errors.add(:base, "Cant save project. Please try again later") |
| 49 | 49 | respond_to do |format| | ... | ... |
app/models/key.rb
| ... | ... | @@ -11,29 +11,29 @@ class Key < ActiveRecord::Base |
| 11 | 11 | :length => { :within => 0..5000 } |
| 12 | 12 | |
| 13 | 13 | before_save :set_identifier |
| 14 | - after_save :update_gitosis | |
| 15 | - after_destroy :gitosis_delete_key | |
| 14 | + after_save :update_repository | |
| 15 | + after_destroy :repository_delete_key | |
| 16 | 16 | |
| 17 | 17 | def set_identifier |
| 18 | 18 | self.identifier = "#{user.identifier}_#{Time.now.to_i}" |
| 19 | 19 | end |
| 20 | 20 | |
| 21 | - def update_gitosis | |
| 21 | + def update_repository | |
| 22 | 22 | Gitlabhq::GitHost.system.new.configure do |c| |
| 23 | 23 | c.update_keys(identifier, key) |
| 24 | 24 | |
| 25 | 25 | projects.each do |project| |
| 26 | - c.update_project(project.path, project.gitosis_writers) | |
| 26 | + c.update_project(project.path, project.repository_writers) | |
| 27 | 27 | end |
| 28 | 28 | end |
| 29 | 29 | end |
| 30 | 30 | |
| 31 | - def gitosis_delete_key | |
| 31 | + def repository_delete_key | |
| 32 | 32 | Gitlabhq::GitHost.system.new.configure do |c| |
| 33 | 33 | c.delete_key(identifier) |
| 34 | 34 | |
| 35 | 35 | projects.each do |project| |
| 36 | - c.update_project(project.path, project.gitosis_writers) | |
| 36 | + c.update_project(project.path, project.repository_writers) | |
| 37 | 37 | end |
| 38 | 38 | end |
| 39 | 39 | end | ... | ... |
app/models/project.rb
| ... | ... | @@ -40,8 +40,8 @@ class Project < ActiveRecord::Base |
| 40 | 40 | validate :check_limit |
| 41 | 41 | validate :repo_name |
| 42 | 42 | |
| 43 | - after_destroy :destroy_gitosis_project | |
| 44 | - after_save :update_gitosis_project | |
| 43 | + after_destroy :destroy_repository | |
| 44 | + after_save :update_repository | |
| 45 | 45 | |
| 46 | 46 | attr_protected :private_flag, :owner_id |
| 47 | 47 | |
| ... | ... | @@ -54,8 +54,8 @@ class Project < ActiveRecord::Base |
| 54 | 54 | delegate :repo, |
| 55 | 55 | :url_to_repo, |
| 56 | 56 | :path_to_repo, |
| 57 | - :update_gitosis_project, | |
| 58 | - :destroy_gitosis_project, | |
| 57 | + :update_repository, | |
| 58 | + :destroy_repository, | |
| 59 | 59 | :tags, |
| 60 | 60 | :repo_exists?, |
| 61 | 61 | :commit, |
| ... | ... | @@ -113,7 +113,7 @@ class Project < ActiveRecord::Base |
| 113 | 113 | @writers ||= users_projects.includes(:user).where(:write => true).map(&:user) |
| 114 | 114 | end |
| 115 | 115 | |
| 116 | - def gitosis_writers | |
| 116 | + def repository_writers | |
| 117 | 117 | keys = Key.joins({:user => :users_projects}).where("users_projects.project_id = ? AND users_projects.write = ?", id, true) |
| 118 | 118 | keys.map(&:identifier) |
| 119 | 119 | end |
| ... | ... | @@ -184,8 +184,8 @@ class Project < ActiveRecord::Base |
| 184 | 184 | end |
| 185 | 185 | |
| 186 | 186 | def repo_name |
| 187 | - if path == "gitosis-admin" && path == "gitolite-admin" | |
| 188 | - errors.add(:path, " like 'gitosis-admin' is not allowed") | |
| 187 | + if path == "gitolite-admin" | |
| 188 | + errors.add(:path, " like 'gitolite-admin' is not allowed") | |
| 189 | 189 | end |
| 190 | 190 | end |
| 191 | 191 | ... | ... |
app/models/repository.rb
| ... | ... | @@ -24,24 +24,20 @@ class Repository |
| 24 | 24 | end |
| 25 | 25 | |
| 26 | 26 | def url_to_repo |
| 27 | - if !GIT_HOST["port"] or GIT_HOST["port"] == 22 | |
| 28 | - "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{path}.git" | |
| 29 | - else | |
| 30 | - "ssh://#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{GIT_HOST["port"]}/#{path}.git" | |
| 31 | - end | |
| 27 | + Gitlabhq::GitHost.url_to_repo(path) | |
| 32 | 28 | end |
| 33 | 29 | |
| 34 | 30 | def path_to_repo |
| 35 | 31 | GIT_HOST["base_path"] + path + ".git" |
| 36 | 32 | end |
| 37 | 33 | |
| 38 | - def update_gitosis_project | |
| 34 | + def update_repository | |
| 39 | 35 | Gitlabhq::GitHost.system.new.configure do |c| |
| 40 | - c.update_project(path, project.gitosis_writers) | |
| 36 | + c.update_project(path, project.repository_writers) | |
| 41 | 37 | end |
| 42 | 38 | end |
| 43 | 39 | |
| 44 | - def destroy_gitosis_project | |
| 40 | + def destroy_repository | |
| 45 | 41 | Gitlabhq::GitHost.system.new.configure do |c| |
| 46 | 42 | c.destroy_project(@project) |
| 47 | 43 | end | ... | ... |
app/models/users_project.rb
| ... | ... | @@ -4,7 +4,7 @@ class UsersProject < ActiveRecord::Base |
| 4 | 4 | |
| 5 | 5 | attr_protected :project_id, :project |
| 6 | 6 | |
| 7 | - after_commit :update_gitosis_project | |
| 7 | + after_commit :update_repository | |
| 8 | 8 | |
| 9 | 9 | validates_uniqueness_of :user_id, :scope => [:project_id] |
| 10 | 10 | validates_presence_of :user_id |
| ... | ... | @@ -13,9 +13,9 @@ class UsersProject < ActiveRecord::Base |
| 13 | 13 | |
| 14 | 14 | delegate :name, :email, :to => :user, :prefix => true |
| 15 | 15 | |
| 16 | - def update_gitosis_project | |
| 16 | + def update_repository | |
| 17 | 17 | Gitosis.new.configure do |c| |
| 18 | - c.update_project(project.path, project.gitosis_writers) | |
| 18 | + c.update_project(project.path, project.repository) | |
| 19 | 19 | end |
| 20 | 20 | end |
| 21 | 21 | ... | ... |
config/routes.rb
| ... | ... | @@ -14,7 +14,7 @@ Gitlab::Application.routes.draw do |
| 14 | 14 | root :to => "users#index" |
| 15 | 15 | end |
| 16 | 16 | |
| 17 | - get "errors/gitosis" | |
| 17 | + get "errors/githost" | |
| 18 | 18 | get "profile/password", :to => "profile#password" |
| 19 | 19 | put "profile/password", :to => "profile#password_update" |
| 20 | 20 | put "profile/reset_private_token", :to => "profile#reset_private_token" | ... | ... |
lib/gitlabhq/git_host.rb
| 1 | 1 | require File.join(Rails.root, "lib", "gitlabhq", "gitolite") |
| 2 | -require File.join(Rails.root, "lib", "gitlabhq", "gitosis") | |
| 3 | 2 | |
| 4 | 3 | module Gitlabhq |
| 5 | 4 | class GitHost |
| 6 | 5 | def self.system |
| 7 | - if GIT_HOST["system"] == "gitosis" | |
| 8 | - Gitlabhq::Gitosis | |
| 9 | - else | |
| 10 | - Gitlabhq::Gitolite | |
| 11 | - end | |
| 6 | + Gitlabhq::Gitolite | |
| 12 | 7 | end |
| 13 | 8 | |
| 14 | 9 | def self.admin_uri |
| 15 | 10 | GIT_HOST["admin_uri"] |
| 16 | 11 | end |
| 12 | + | |
| 13 | + def self.url_to_repo(path) | |
| 14 | + if !GIT_HOST["port"] or GIT_HOST["port"] == 22 | |
| 15 | + "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{path}.git" | |
| 16 | + else | |
| 17 | + "ssh://#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:#{GIT_HOST["port"]}/#{path}.git" | |
| 18 | + end | |
| 19 | + end | |
| 17 | 20 | end |
| 18 | 21 | end | ... | ... |
lib/gitlabhq/gitosis.rb
| ... | ... | @@ -1,76 +0,0 @@ |
| 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 |
| ... | ... | @@ -0,0 +1,11 @@ |
| 1 | +desc "Rebuild each project at gitolite config" | |
| 2 | +task :gitolite_rebuild => :environment do | |
| 3 | + puts "Starting..." | |
| 4 | + Project.find_each(:batch_size => 100) do |project| | |
| 5 | + puts | |
| 6 | + puts "=== #{project.name}" | |
| 7 | + project.update_repository | |
| 8 | + puts | |
| 9 | + end | |
| 10 | + puts "Done" | |
| 11 | +end | ... | ... |
spec/models/project_spec.rb
| ... | ... | @@ -18,12 +18,12 @@ describe Project do |
| 18 | 18 | describe "Respond to" do |
| 19 | 19 | it { should respond_to(:readers) } |
| 20 | 20 | it { should respond_to(:writers) } |
| 21 | - it { should respond_to(:gitosis_writers) } | |
| 21 | + it { should respond_to(:repository_writers) } | |
| 22 | 22 | it { should respond_to(:admins) } |
| 23 | 23 | it { should respond_to(:add_access) } |
| 24 | 24 | it { should respond_to(:reset_access) } |
| 25 | - it { should respond_to(:update_gitosis_project) } | |
| 26 | - it { should respond_to(:destroy_gitosis_project) } | |
| 25 | + it { should respond_to(:update_repository) } | |
| 26 | + it { should respond_to(:destroy_repository) } | |
| 27 | 27 | it { should respond_to(:public?) } |
| 28 | 28 | it { should respond_to(:private?) } |
| 29 | 29 | it { should respond_to(:url_to_repo) } |
| ... | ... | @@ -35,9 +35,9 @@ describe Project do |
| 35 | 35 | it { should respond_to(:commit) } |
| 36 | 36 | end |
| 37 | 37 | |
| 38 | - it "should not allow 'gitosis-admin' as repo name" do | |
| 38 | + it "should not allow 'gitolite-admin' as repo name" do | |
| 39 | 39 | should allow_value("blah").for(:path) |
| 40 | - should_not allow_value("gitosis-admin").for(:path) | |
| 40 | + should_not allow_value("gitolite-admin").for(:path) | |
| 41 | 41 | end |
| 42 | 42 | |
| 43 | 43 | it "should return valid url to repo" do | ... | ... |
spec/monkeypatch.rb
| 1 | -# Stubbing Project <-> gitosis path | |
| 1 | +# Stubbing Project <-> git host path | |
| 2 | 2 | # create project using Factory only |
| 3 | 3 | class Project |
| 4 | - def update_gitosis_project | |
| 4 | + def update_repository | |
| 5 | 5 | true |
| 6 | 6 | end |
| 7 | 7 | |
| 8 | - def update_gitosis | |
| 8 | + def update_repository | |
| 9 | 9 | true |
| 10 | 10 | end |
| 11 | 11 | |
| ... | ... | @@ -15,17 +15,17 @@ class Project |
| 15 | 15 | end |
| 16 | 16 | |
| 17 | 17 | class Key |
| 18 | - def update_gitosis | |
| 18 | + def update_repository | |
| 19 | 19 | true |
| 20 | 20 | end |
| 21 | 21 | |
| 22 | - def gitosis_delete_key | |
| 22 | + def repository_delete_key | |
| 23 | 23 | true |
| 24 | 24 | end |
| 25 | 25 | end |
| 26 | 26 | |
| 27 | 27 | class UsersProject |
| 28 | - def update_gitosis_project | |
| 28 | + def update_repository | |
| 29 | 29 | true |
| 30 | 30 | end |
| 31 | 31 | end | ... | ... |