From a431ca0f8b7f8967e89a35caddf1e41e53eee290 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 2 Nov 2016 11:39:12 +0100 Subject: [PATCH] Don't execute git hooks if you create branch as part of other change Currently, our procedure for adding a commit requires us to execute `CreateBranchService` before file creation. It's OK, but also we do execute `git hooks` (the `PostReceive` sidekiq job) as part of this process. However, this hook is execute before the file is actually committed, so the ref is updated. Secondly, we do execute a `git hooks` after committing file and updating ref. This results in duplicate `PostReceive` jobs, where the first one is completely invalid. This change makes the branch creation, something that is intermediate step of bigger process (file creation or update, commit cherry pick or revert) to not execute git hooks. --- app/models/repository.rb | 8 ++++++-- app/services/commits/change_service.rb | 2 +- app/services/create_branch_service.rb | 4 ++-- app/services/files/base_service.rb | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/models/repository.rb b/app/models/repository.rb index 30be7262438..0776c7ccc5d 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -160,14 +160,18 @@ class Repository tags.find { |tag| tag.name == name } end - def add_branch(user, branch_name, target) + def add_branch(user, branch_name, target, with_hooks: true) oldrev = Gitlab::Git::BLANK_SHA ref = Gitlab::Git::BRANCH_REF_PREFIX + branch_name target = commit(target).try(:id) return false unless target - GitHooksService.new.execute(user, path_to_repo, oldrev, target, ref) do + if with_hooks + GitHooksService.new.execute(user, path_to_repo, oldrev, target, ref) do + update_ref!(ref, target, oldrev) + end + else update_ref!(ref, target, oldrev) end diff --git a/app/services/commits/change_service.rb b/app/services/commits/change_service.rb index 1c82599c579..2d4c9788d02 100644 --- a/app/services/commits/change_service.rb +++ b/app/services/commits/change_service.rb @@ -55,7 +55,7 @@ module Commits return success if repository.find_branch(new_branch) result = CreateBranchService.new(@project, current_user) - .execute(new_branch, @target_branch, source_project: @source_project) + .execute(new_branch, @target_branch, source_project: @source_project, with_hooks: false) if result[:status] == :error raise ChangeError, "There was an error creating the source branch: #{result[:message]}" diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb index 757fc35a78f..a6a3461e17b 100644 --- a/app/services/create_branch_service.rb +++ b/app/services/create_branch_service.rb @@ -1,7 +1,7 @@ require_relative 'base_service' class CreateBranchService < BaseService - def execute(branch_name, ref, source_project: @project) + def execute(branch_name, ref, source_project: @project, with_hooks: true) valid_branch = Gitlab::GitRefValidator.validate(branch_name) unless valid_branch @@ -26,7 +26,7 @@ class CreateBranchService < BaseService repository.find_branch(branch_name) else - repository.add_branch(current_user, branch_name, ref) + repository.add_branch(current_user, branch_name, ref, with_hooks: with_hooks) end if new_branch diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb index 9bd4bd464f7..1802b932e03 100644 --- a/app/services/files/base_service.rb +++ b/app/services/files/base_service.rb @@ -74,7 +74,7 @@ module Files end def create_target_branch - result = CreateBranchService.new(project, current_user).execute(@target_branch, @source_branch, source_project: @source_project) + result = CreateBranchService.new(project, current_user).execute(@target_branch, @source_branch, source_project: @source_project, with_hooks: false) unless result[:status] == :success raise_error("Something went wrong when we tried to create #{@target_branch} for you: #{result[:message]}") -- GitLab