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:
parent
6d5c969872
commit
8a1deea586
|
@ -21,20 +21,14 @@ class Key < ActiveRecord::Base
|
|||
def update_repository
|
||||
Gitlabhq::GitHost.system.new.configure do |c|
|
||||
c.update_keys(identifier, key)
|
||||
|
||||
projects.each do |project|
|
||||
c.update_project(project.path, project)
|
||||
end
|
||||
c.update_projects(projects)
|
||||
end
|
||||
end
|
||||
|
||||
def repository_delete_key
|
||||
Gitlabhq::GitHost.system.new.configure do |c|
|
||||
c.delete_key(identifier)
|
||||
|
||||
projects.each do |project|
|
||||
c.update_project(project.path, project)
|
||||
end
|
||||
c.update_projects(projects)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -81,5 +81,33 @@ module Gitlabhq
|
|||
|
||||
ga_repo.save
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue