Use subproccess instead subshell for git calls

This commit is contained in:
Dmitriy Zaporozhets 2013-01-22 10:35:58 +02:00
parent 68fa988219
commit d770714578

View file

@ -8,10 +8,11 @@ module Gitlab
class PushError < StandardError; end class PushError < StandardError; end
class BrokenGitolite < StandardError; end class BrokenGitolite < StandardError; end
attr_reader :config_tmp_dir, :ga_repo, :conf attr_reader :config_tmp_dir, :tmp_dir, :ga_repo, :conf
def config_tmp_dir def initialize
@config_tmp_dir ||= Rails.root.join('tmp',"gitlabhq-gitolite-#{Time.now.to_i}") @tmp_dir = Rails.root.join("tmp").to_s
@config_tmp_dir = File.join(@tmp_dir,"gitlabhq-gitolite-#{Time.now.to_i}")
end end
def ga_repo def ga_repo
@ -23,7 +24,7 @@ module Gitlab
def apply def apply
Timeout::timeout(30) do Timeout::timeout(30) do
File.open(Rails.root.join('tmp', "gitlabhq-gitolite.lock"), "w+") do |f| File.open(File.join(tmp_dir, "gitlabhq-gitolite.lock"), "w+") do |f|
begin begin
# Set exclusive lock # Set exclusive lock
# to prevent race condition # to prevent race condition
@ -31,7 +32,7 @@ module Gitlab
# Pull gitolite-admin repo # Pull gitolite-admin repo
# in tmp dir before do any changes # in tmp dir before do any changes
pull(config_tmp_dir) pull
# Build ga_repo object and @conf # Build ga_repo object and @conf
# to access gitolite-admin configuration # to access gitolite-admin configuration
@ -49,7 +50,7 @@ module Gitlab
# Push gitolite-admin repo # Push gitolite-admin repo
# to apply all changes # to apply all changes
push(config_tmp_dir) push
ensure ensure
# Remove tmp dir # Remove tmp dir
# removing the gitolite folder first is important to avoid # removing the gitolite folder first is important to avoid
@ -192,16 +193,20 @@ module Gitlab
private private
def pull tmp_dir def pull
Dir.mkdir tmp_dir # Create config tmp dir like "RAILS_ROOT/tmp/gitlabhq-gitolite-132545"
`git clone #{Gitlab.config.gitolite.admin_uri} #{tmp_dir}/gitolite` Dir.mkdir config_tmp_dir
unless File.exists?(File.join(tmp_dir, 'gitolite', 'conf', 'gitolite.conf')) # Clone gitolite-admin repo into tmp dir
popen("git clone #{Gitlab.config.gitolite.admin_uri} #{config_tmp_dir}/gitolite", tmp_dir)
# Ensure file with config presents after cloning
unless File.exists?(File.join(config_tmp_dir, 'gitolite', 'conf', 'gitolite.conf'))
raise PullError, "unable to clone gitolite-admin repo" raise PullError, "unable to clone gitolite-admin repo"
end end
end end
def push tmp_dir def push
output, status = popen('git add -A') output, status = popen('git add -A')
raise "Git add failed." unless status.zero? raise "Git add failed." unless status.zero?
@ -222,8 +227,8 @@ module Gitlab
end end
end end
def popen(cmd) def popen(cmd, path = nil)
path = File.join(config_tmp_dir,'gitolite') path ||= File.join(config_tmp_dir,'gitolite')
vars = { "PWD" => path } vars = { "PWD" => path }
options = { :chdir => path } options = { :chdir => path }
@ -239,4 +244,3 @@ module Gitlab
end end
end end
end end