Skip to content
Snippets Groups Projects
Commit cf58271e authored by Adam Niedzielski's avatar Adam Niedzielski
Browse files

Pass tag SHA to post-receive hook when tag is created via UI

We only know the tag SHA after we create the tag.
This means that we pass a different value to the hooks that happen before
creating the tag, and a different value to the hooks that happen after
creating the tag.

This is not an ideal situation, but it is a trade-off we decided to
make. For discussion of the alternatives please refer to
https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/7700#note_18982873

"pre-receive" and "update" hooks always get the SHA of the commit
that the tag points to. "post-receive" gets the tag SHA if it is
an annotated tag or the commit SHA if it is an lightweight tag.
Currently we always create annotated tags if UI is used.
parent 9e6cdc64
No related branches found
No related tags found
No related merge requests found
Loading
@@ -196,8 +196,9 @@ class Repository
Loading
@@ -196,8 +196,9 @@ class Repository
   
options = { message: message, tagger: user_to_committer(user) } if message options = { message: message, tagger: user_to_committer(user) } if message
   
GitHooksService.new.execute(user, path_to_repo, oldrev, target, ref) do GitHooksService.new.execute(user, path_to_repo, oldrev, target, ref) do |service|
rugged.tags.create(tag_name, target, options) raw_tag = rugged.tags.create(tag_name, target, options)
service.newrev = raw_tag.target_id
end end
   
find_tag(tag_name) find_tag(tag_name)
Loading
Loading
class GitHooksService class GitHooksService
PreReceiveError = Class.new(StandardError) PreReceiveError = Class.new(StandardError)
   
attr_accessor :oldrev, :newrev, :ref
def execute(user, repo_path, oldrev, newrev, ref) def execute(user, repo_path, oldrev, newrev, ref)
@repo_path = repo_path @repo_path = repo_path
@user = Gitlab::GlId.gl_id(user) @user = Gitlab::GlId.gl_id(user)
Loading
@@ -16,7 +18,7 @@ class GitHooksService
Loading
@@ -16,7 +18,7 @@ class GitHooksService
end end
end end
   
yield yield self
   
run_hook('post-receive') run_hook('post-receive')
end end
Loading
@@ -25,6 +27,6 @@ class GitHooksService
Loading
@@ -25,6 +27,6 @@ class GitHooksService
   
def run_hook(name) def run_hook(name)
hook = Gitlab::Git::Hook.new(name, @repo_path) hook = Gitlab::Git::Hook.new(name, @repo_path)
hook.trigger(@user, @oldrev, @newrev, @ref) hook.trigger(@user, oldrev, newrev, ref)
end end
end end
---
title: Pass tag SHA to post-receive hook when tag is created via UI
merge_request: 7700
author:
Loading
@@ -1308,6 +1308,32 @@ describe Repository, models: true do
Loading
@@ -1308,6 +1308,32 @@ describe Repository, models: true do
   
expect(tag).to be_a(Gitlab::Git::Tag) expect(tag).to be_a(Gitlab::Git::Tag)
end end
it 'passes commit SHA to pre-receive and update hooks,\
and tag SHA to post-receive hook' do
pre_receive_hook = Gitlab::Git::Hook.new('pre-receive', repository.path_to_repo)
update_hook = Gitlab::Git::Hook.new('update', repository.path_to_repo)
post_receive_hook = Gitlab::Git::Hook.new('post-receive', repository.path_to_repo)
allow(Gitlab::Git::Hook).to receive(:new).
and_return(pre_receive_hook, update_hook, post_receive_hook)
allow(pre_receive_hook).to receive(:trigger).and_call_original
allow(update_hook).to receive(:trigger).and_call_original
allow(post_receive_hook).to receive(:trigger).and_call_original
tag = repository.add_tag(user, '8.5', 'master', 'foo')
commit_sha = repository.commit('master').id
tag_sha = tag.target
expect(pre_receive_hook).to have_received(:trigger).
with(anything, anything, commit_sha, anything)
expect(update_hook).to have_received(:trigger).
with(anything, anything, commit_sha, anything)
expect(post_receive_hook).to have_received(:trigger).
with(anything, anything, tag_sha, anything)
end
end end
   
context 'with an invalid target' do context 'with an invalid target' do
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment