Fixes timeout when adding an SSH key

Users with many projects (>100) will hit the 20 second timeout when
updating the gitolite config. This fix batches those changes into a
signle update to the file, causing an order of magnitude speed increase
which finishes well below the 20 second timeout.

Fixes gitlabhq/gitlabhq#220
This commit is contained in:
Jeremy Mack 2011-12-20 09:52:04 -05:00
parent 6d5c969872
commit 8a1deea586
2 changed files with 30 additions and 8 deletions

View file

@ -21,20 +21,14 @@ class Key < ActiveRecord::Base
def update_repository def update_repository
Gitlabhq::GitHost.system.new.configure do |c| Gitlabhq::GitHost.system.new.configure do |c|
c.update_keys(identifier, key) c.update_keys(identifier, key)
c.update_projects(projects)
projects.each do |project|
c.update_project(project.path, project)
end
end end
end end
def repository_delete_key def repository_delete_key
Gitlabhq::GitHost.system.new.configure do |c| Gitlabhq::GitHost.system.new.configure do |c|
c.delete_key(identifier) c.delete_key(identifier)
c.update_projects(projects)
projects.each do |project|
c.update_project(project.path, project)
end
end end
end end

View file

@ -81,5 +81,33 @@ module Gitlabhq
ga_repo.save ga_repo.save
end end
# 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(@local_dir,'gitolite'))
conf = ga_repo.config
projects.each do |project|
repo_name = project.path
repo = if conf.has_repo?(repo_name)
conf.get_repo(repo_name)
else
::Gitolite::Config::Repo.new(repo_name)
end
name_readers = project.repository_readers
name_writers = project.repository_writers
repo.clean_permissions
repo.add_permission("R", "", name_readers) unless name_readers.blank?
repo.add_permission("RW+", "", name_writers) unless name_writers.blank?
conf.add_repo(repo, true)
end
ga_repo.save
end
end end
end end