module Gitlab
class GitoliteConfig
- attr_reader :config_tmp_dir
+ attr_reader :config_tmp_dir, :ga_repo, :conf
- def reset_config_tmp_dir
- @config_tmp_dir = File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}")
+ def config_tmp_dir
+ @config_tmp_dir ||= File.join(Rails.root, 'tmp',"gitlabhq-gitolite-#{Time.now.to_i}")
+ end
+
+ def ga_repo
+ @ga_repo ||= ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
end
def apply
Timeout::timeout(30) do
File.open(File.join(Rails.root, 'tmp', "gitlabhq-gitolite.lock"), "w+") do |f|
begin
+ # Set exclusive lock
+ # to prevent race condition
f.flock(File::LOCK_EX)
- reset_config_tmp_dir
- pull
+
+ # Pull gitolite-admin repo
+ # in tmp dir before do any changes
+ pull(config_tmp_dir)
+
+ # Build ga_repo object and @conf
+ # to access gitolite-admin configuration
+ @conf = ga_repo.config
+
+ # Do any changes
+ # in gitolite-admin
+ # config here
yield(self)
- push
+
+ # Save changes in
+ # gitolite-admin repo
+ # before pusht it
+ ga_repo.save
+
+ # Push gitolite-admin repo
+ # to apply all changes
+ push(config_tmp_dir)
+
+ # Remove tmp dir
+ # wiith gitolite-admin
FileUtils.rm_rf(config_tmp_dir)
ensure
+ # unlock so other task cann access
+ # gitolite configuration
f.flock(File::LOCK_UN)
end
end
end
rescue Exception => ex
- Gitlab::Logger.error(ex.message)
+ Gitlab::Logger.error(ex.class.name + " " + ex.message)
raise Gitolite::AccessDenied.new("gitolite timeout")
end
def destroy_project(project)
FileUtils.rm_rf(project.path_to_repo)
-
- ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
- conf = ga_repo.config
conf.rm_repo(project.path)
- ga_repo.save
end
def destroy_project!(project)
# update or create
def update_project(repo_name, project)
- ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
- conf = ga_repo.config
repo = update_project_config(project, conf)
conf.add_repo(repo, true)
-
- ga_repo.save
end
def update_project!(repo_name, project)
# Updates many projects and uses project.path as the repo path
# An order of magnitude faster than update_project
def update_projects(projects)
- ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
- conf = ga_repo.config
-
projects.each do |project|
repo = update_project_config(project, conf)
conf.add_repo(repo, true)
end
-
- ga_repo.save
end
def update_project_config(project, conf)
repo
end
+ # Enable access to all repos for gitolite admin.
+ # We use it for accept merge request feature
def admin_all_repo
- ga_repo = ::Gitolite::GitoliteAdmin.new(File.join(config_tmp_dir,'gitolite'))
- conf = ga_repo.config
owner_name = ""
# Read gitolite-admin user
repo.add_permission("RW+", "", owner_name)
conf.add_repo(repo, true)
- ga_repo.save
end
def admin_all_repo!
private
- def pull
- Dir.mkdir config_tmp_dir
- `git clone #{Gitlab.config.gitolite_admin_uri} #{config_tmp_dir}/gitolite`
+ def pull tmp_dir
+ Dir.mkdir tmp_dir
+ `git clone #{Gitlab.config.gitolite_admin_uri} #{tmp_dir}/gitolite`
end
- def push
- Dir.chdir(File.join(config_tmp_dir, "gitolite"))
+ def push tmp_dir
+ Dir.chdir(File.join(tmp_dir, "gitolite"))
`git add -A`
`git commit -am "GitLab"`
`git push`