Commit d770714578cffe5423c6a1752367f7f545fa1f22

Authored by Dmitriy Zaporozhets
1 parent 68fa9882

Use subproccess instead subshell for git calls

Showing 1 changed file with 18 additions and 14 deletions   Show diff stats
lib/gitlab/backend/gitolite_config.rb
@@ -8,10 +8,11 @@ module Gitlab @@ -8,10 +8,11 @@ module Gitlab
8 class PushError < StandardError; end 8 class PushError < StandardError; end
9 class BrokenGitolite < StandardError; end 9 class BrokenGitolite < StandardError; end
10 10
11 - attr_reader :config_tmp_dir, :ga_repo, :conf 11 + attr_reader :config_tmp_dir, :tmp_dir, :ga_repo, :conf
12 12
13 - def config_tmp_dir  
14 - @config_tmp_dir ||= Rails.root.join('tmp',"gitlabhq-gitolite-#{Time.now.to_i}") 13 + def initialize
  14 + @tmp_dir = Rails.root.join("tmp").to_s
  15 + @config_tmp_dir = File.join(@tmp_dir,"gitlabhq-gitolite-#{Time.now.to_i}")
15 end 16 end
16 17
17 def ga_repo 18 def ga_repo
@@ -23,7 +24,7 @@ module Gitlab @@ -23,7 +24,7 @@ module Gitlab
23 24
24 def apply 25 def apply
25 Timeout::timeout(30) do 26 Timeout::timeout(30) do
26 - File.open(Rails.root.join('tmp', "gitlabhq-gitolite.lock"), "w+") do |f| 27 + File.open(File.join(tmp_dir, "gitlabhq-gitolite.lock"), "w+") do |f|
27 begin 28 begin
28 # Set exclusive lock 29 # Set exclusive lock
29 # to prevent race condition 30 # to prevent race condition
@@ -31,7 +32,7 @@ module Gitlab @@ -31,7 +32,7 @@ module Gitlab
31 32
32 # Pull gitolite-admin repo 33 # Pull gitolite-admin repo
33 # in tmp dir before do any changes 34 # in tmp dir before do any changes
34 - pull(config_tmp_dir) 35 + pull
35 36
36 # Build ga_repo object and @conf 37 # Build ga_repo object and @conf
37 # to access gitolite-admin configuration 38 # to access gitolite-admin configuration
@@ -49,7 +50,7 @@ module Gitlab @@ -49,7 +50,7 @@ module Gitlab
49 50
50 # Push gitolite-admin repo 51 # Push gitolite-admin repo
51 # to apply all changes 52 # to apply all changes
52 - push(config_tmp_dir) 53 + push
53 ensure 54 ensure
54 # Remove tmp dir 55 # Remove tmp dir
55 # removing the gitolite folder first is important to avoid 56 # removing the gitolite folder first is important to avoid
@@ -192,16 +193,20 @@ module Gitlab @@ -192,16 +193,20 @@ module Gitlab
192 193
193 private 194 private
194 195
195 - def pull tmp_dir  
196 - Dir.mkdir tmp_dir  
197 - `git clone #{Gitlab.config.gitolite.admin_uri} #{tmp_dir}/gitolite` 196 + def pull
  197 + # Create config tmp dir like "RAILS_ROOT/tmp/gitlabhq-gitolite-132545"
  198 + Dir.mkdir config_tmp_dir
198 199
199 - unless File.exists?(File.join(tmp_dir, 'gitolite', 'conf', 'gitolite.conf')) 200 + # Clone gitolite-admin repo into tmp dir
  201 + popen("git clone #{Gitlab.config.gitolite.admin_uri} #{config_tmp_dir}/gitolite", tmp_dir)
  202 +
  203 + # Ensure file with config presents after cloning
  204 + unless File.exists?(File.join(config_tmp_dir, 'gitolite', 'conf', 'gitolite.conf'))
200 raise PullError, "unable to clone gitolite-admin repo" 205 raise PullError, "unable to clone gitolite-admin repo"
201 end 206 end
202 end 207 end
203 208
204 - def push tmp_dir 209 + def push
205 output, status = popen('git add -A') 210 output, status = popen('git add -A')
206 raise "Git add failed." unless status.zero? 211 raise "Git add failed." unless status.zero?
207 212
@@ -222,8 +227,8 @@ module Gitlab @@ -222,8 +227,8 @@ module Gitlab
222 end 227 end
223 end 228 end
224 229
225 - def popen(cmd)  
226 - path = File.join(config_tmp_dir,'gitolite') 230 + def popen(cmd, path = nil)
  231 + path ||= File.join(config_tmp_dir,'gitolite')
227 vars = { "PWD" => path } 232 vars = { "PWD" => path }
228 options = { :chdir => path } 233 options = { :chdir => path }
229 234
@@ -239,4 +244,3 @@ module Gitlab @@ -239,4 +244,3 @@ module Gitlab
239 end 244 end
240 end 245 end
241 end 246 end
242 -