From 1c5876eb7b2deb069d919bd19b51c9f6218e0f41 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 28 Jan 2013 17:22:45 +0200 Subject: Do gitolite calls async. Remove satellite with project remove --- app/contexts/projects/create_context.rb | 12 +++--------- app/models/project.rb | 16 +++++++++++----- app/models/users_project.rb | 2 +- app/observers/project_observer.rb | 1 + app/workers/gitolite_worker.rb | 10 ++++++++++ app/workers/post_receive.rb | 15 ++++++++------- 6 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 app/workers/gitolite_worker.rb (limited to 'app') diff --git a/app/contexts/projects/create_context.rb b/app/contexts/projects/create_context.rb index e644d89a356..915bd8be8b0 100644 --- a/app/contexts/projects/create_context.rb +++ b/app/contexts/projects/create_context.rb @@ -32,16 +32,10 @@ module Projects @project.namespace_id = current_user.namespace_id end - Project.transaction do - @project.creator = current_user - @project.save! + @project.creator = current_user - # Add user as project master - @project.users_projects.create!(project_access: UsersProject::MASTER, user: current_user) - - # when project saved no team member exist so - # project repository should be updated after first user add - @project.update_repository + if @project.save + @project.users_projects.create(project_access: UsersProject::MASTER, user: current_user) end @project diff --git a/app/models/project.rb b/app/models/project.rb index cb6986ce43d..dde15927808 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -299,6 +299,9 @@ class Project < ActiveRecord::Base def trigger_post_receive(oldrev, newrev, ref, user) data = post_receive_data(oldrev, newrev, ref, user) + # Create satellite + self.satellite.create unless self.satellite.exists? + # Create push event self.observe_push(data) @@ -313,9 +316,6 @@ class Project < ActiveRecord::Base self.execute_services(data.dup) end - # Create satellite - self.satellite.create unless self.satellite.exists? - # Discover the default branch, but only if it hasn't already been set to # something else if repository && default_branch.nil? @@ -460,11 +460,17 @@ class Project < ActiveRecord::Base end def update_repository - gitolite.update_repository(self) + GitoliteWorker.perform_async( + :update_repository, + self.id + ) end def destroy_repository - gitolite.remove_repository(self) + GitoliteWorker.perform_async( + :remove_repository, + self.path_with_namespace + ) end def repo_exists? diff --git a/app/models/users_project.rb b/app/models/users_project.rb index ca5048ca7d4..3206600413c 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -129,7 +129,7 @@ class UsersProject < ActiveRecord::Base end def update_repository - gitolite.update_repository(project) + project.update_repository end def project_access_human diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb index b1c694569d7..cc454ae3e35 100644 --- a/app/observers/project_observer.rb +++ b/app/observers/project_observer.rb @@ -10,6 +10,7 @@ class ProjectObserver < ActiveRecord::Observer def after_destroy(project) log_info("Project \"#{project.name}\" was removed") + project.satellite.destroy project.destroy_repository end diff --git a/app/workers/gitolite_worker.rb b/app/workers/gitolite_worker.rb new file mode 100644 index 00000000000..d134ea035f4 --- /dev/null +++ b/app/workers/gitolite_worker.rb @@ -0,0 +1,10 @@ +class GitoliteWorker + include Sidekiq::Worker + include Gitolited + + sidekiq_options queue: :gitolite + + def perform(action, arg) + gitolite.send(action, arg) + end +end diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb index e74379a65dd..a906f78f7e3 100644 --- a/app/workers/post_receive.rb +++ b/app/workers/post_receive.rb @@ -13,13 +13,14 @@ class PostReceive # Ignore push from non-gitlab users user = if identifier.eql? Gitlab.config.gitolite.admin_key - email = project.repository.commit(newrev).author.email rescue nil - User.find_by_email(email) if email - elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier) - User.find_by_email(identifier) - else - Key.find_by_identifier(identifier).try(:user) - end + email = project.repository.commit(newrev).author.email rescue nil + User.find_by_email(email) if email + elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier) + User.find_by_email(identifier) + else + Key.find_by_identifier(identifier).try(:user) + end + return false unless user project.trigger_post_receive(oldrev, newrev, ref, user) -- cgit v1.2.3