diff options
-rw-r--r-- | app/services/git/branch_hooks_service.rb | 8 | ||||
-rw-r--r-- | changelogs/unreleased/59257-find-new-branches-harder.yml | 5 | ||||
-rw-r--r-- | spec/services/git/branch_hooks_service_spec.rb | 34 |
3 files changed, 46 insertions, 1 deletions
diff --git a/app/services/git/branch_hooks_service.rb b/app/services/git/branch_hooks_service.rb index 4aee48f22e7..c41f445c3c4 100644 --- a/app/services/git/branch_hooks_service.rb +++ b/app/services/git/branch_hooks_service.rb @@ -105,8 +105,14 @@ module Git CreateGpgSignatureWorker.perform_async(signable, project.id) end + # It's not sufficient to just check for a blank SHA as it's possible for the + # branch to be pushed, but for the `post-receive` hook to never run: + # https://gitlab.com/gitlab-org/gitlab-ce/issues/59257 def creating_branch? - Gitlab::Git.blank_ref?(params[:oldrev]) + strong_memoize(:creating_branch) do + Gitlab::Git.blank_ref?(params[:oldrev]) || + !project.repository.branch_exists?(branch_name) + end end def updating_branch? diff --git a/changelogs/unreleased/59257-find-new-branches-harder.yml b/changelogs/unreleased/59257-find-new-branches-harder.yml new file mode 100644 index 00000000000..631eaa22ef0 --- /dev/null +++ b/changelogs/unreleased/59257-find-new-branches-harder.yml @@ -0,0 +1,5 @@ +--- +title: Look for new branches more carefully +merge_request: 29761 +author: +type: fixed diff --git a/spec/services/git/branch_hooks_service_spec.rb b/spec/services/git/branch_hooks_service_spec.rb index b5694628269..23be400059e 100644 --- a/spec/services/git/branch_hooks_service_spec.rb +++ b/spec/services/git/branch_hooks_service_spec.rb @@ -344,4 +344,38 @@ describe Git::BranchHooksService do end end end + + describe 'New branch detection' do + let(:branch) { 'fix' } + + context 'oldrev is the blank SHA' do + let(:oldrev) { Gitlab::Git::BLANK_SHA } + + it 'is treated as a new branch' do + expect(service).to receive(:branch_create_hooks) + + service.execute + end + end + + context 'oldrev is set' do + context 'Gitaly does not know about the branch' do + it 'is treated as a new branch' do + allow(project.repository).to receive(:branch_names) { [] } + + expect(service).to receive(:branch_create_hooks) + + service.execute + end + end + + context 'Gitaly knows about the branch' do + it 'is not treated as a new branch' do + expect(service).not_to receive(:branch_create_hooks) + + service.execute + end + end + end + end end |