Commit 963746f97847cd106e5f90f830fe9dc0b5ae0102

Authored by Dmitriy Zaporozhets
1 parent b994a65f

Refactor gitolite_config

Showing 1 changed file with 43 additions and 28 deletions   Show diff stats
lib/gitlab/backend/gitolite_config.rb
... ... @@ -4,39 +4,64 @@ require 'fileutils'
4 4  
5 5 module Gitlab
6 6 class GitoliteConfig
7   - attr_reader :config_tmp_dir
  7 + attr_reader :config_tmp_dir, :ga_repo, :conf
8 8  
9   - def reset_config_tmp_dir
10   - @config_tmp_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}")
  9 + def config_tmp_dir
  10 + @config_tmp_dir ||= File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}")
  11 + end
  12 +
  13 + def ga_repo
  14 + @ga_repo ||= ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
11 15 end
12 16  
13 17 def apply
14 18 Timeout::timeout(30) do
15 19 File.open(File.join(Rails.root, 'tmp', "gitlabhq-gitolite.lock"), "w+") do |f|
16 20 begin
  21 + # Set exclusive lock
  22 + # to prevent race condition
17 23 f.flock(File::LOCK_EX)
18   - reset_config_tmp_dir
19   - pull
  24 +
  25 + # Pull gitolite-admin repo
  26 + # in tmp dir before do any changes
  27 + pull(config_tmp_dir)
  28 +
  29 + # Build ga_repo object and @conf
  30 + # to access gitolite-admin configuration
  31 + @conf = ga_repo.config
  32 +
  33 + # Do any changes
  34 + # in gitolite-admin
  35 + # config here
20 36 yield(self)
21   - push
  37 +
  38 + # Save changes in
  39 + # gitolite-admin repo
  40 + # before pusht it
  41 + ga_repo.save
  42 +
  43 + # Push gitolite-admin repo
  44 + # to apply all changes
  45 + push(config_tmp_dir)
  46 +
  47 + # Remove tmp dir
  48 + # wiith gitolite-admin
22 49 FileUtils.rm_rf(config_tmp_dir)
23 50 ensure
  51 + # unlock so other task cann access
  52 + # gitolite configuration
24 53 f.flock(File::LOCK_UN)
25 54 end
26 55 end
27 56 end
28 57 rescue Exception => ex
29   - Gitlab::Logger.error(ex.message)
  58 + Gitlab::Logger.error(ex.class.name + " " + ex.message)
30 59 raise Gitolite::AccessDenied.new("gitolite timeout")
31 60 end
32 61  
33 62 def destroy_project(project)
34 63 FileUtils.rm_rf(project.path_to_repo)
35   -
36   - ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
37   - conf = ga_repo.config
38 64 conf.rm_repo(project.path)
39   - ga_repo.save
40 65 end
41 66  
42 67 def destroy_project!(project)
... ... @@ -58,12 +83,8 @@ module Gitlab
58 83  
59 84 # update or create
60 85 def update_project(repo_name, project)
61   - ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
62   - conf = ga_repo.config
63 86 repo = update_project_config(project, conf)
64 87 conf.add_repo(repo, true)
65   -
66   - ga_repo.save
67 88 end
68 89  
69 90 def update_project!(repo_name, project)
... ... @@ -75,15 +96,10 @@ module Gitlab
75 96 # Updates many projects and uses project.path as the repo path
76 97 # An order of magnitude faster than update_project
77 98 def update_projects(projects)
78   - ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
79   - conf = ga_repo.config
80   -
81 99 projects.each do |project|
82 100 repo = update_project_config(project, conf)
83 101 conf.add_repo(repo, true)
84 102 end
85   -
86   - ga_repo.save
87 103 end
88 104  
89 105 def update_project_config(project, conf)
... ... @@ -118,9 +134,9 @@ module Gitlab
118 134 repo
119 135 end
120 136  
  137 + # Enable access to all repos for gitolite admin.
  138 + # We use it for accept merge request feature
121 139 def admin_all_repo
122   - ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
123   - conf = ga_repo.config
124 140 owner_name = ""
125 141  
126 142 # Read gitolite-admin user
... ... @@ -144,7 +160,6 @@ module Gitlab
144 160  
145 161 repo.add_permission("RW+", "", owner_name)
146 162 conf.add_repo(repo, true)
147   - ga_repo.save
148 163 end
149 164  
150 165 def admin_all_repo!
... ... @@ -153,13 +168,13 @@ module Gitlab
153 168  
154 169 private
155 170  
156   - def pull
157   - Dir.mkdir config_tmp_dir
158   - `git clone #{Gitlab.config.gitolite_admin_uri} #{config_tmp_dir}/gitolite`
  171 + def pull tmp_dir
  172 + Dir.mkdir tmp_dir
  173 + `git clone #{Gitlab.config.gitolite_admin_uri} #{tmp_dir}/gitolite`
159 174 end
160 175  
161   - def push
162   - Dir.chdir(File.join(config_tmp_dir, "gitolite"))
  176 + def push tmp_dir
  177 + Dir.chdir(File.join(tmp_dir, "gitolite"))
163 178 `git add -A`
164 179 `git commit -am "GitLab"`
165 180 `git push`
... ...