diff options
author | Dmitriy Zaporozhets <dzaporozhets@gitlab.com> | 2015-01-15 20:01:31 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dzaporozhets@gitlab.com> | 2015-01-15 20:01:31 +0000 |
commit | 23255bff9913fc1a58c1cf629a2a030c1cbf8a87 (patch) | |
tree | 3deed79f71e84d6303df7f44ee2e2e80ef12de0e | |
parent | 089df35f027034c9cd24ab09ad51bff83ef13ad8 (diff) | |
parent | de27375d6cb2772b91459f5e706aed5b03b35a54 (diff) | |
download | gitlab-ce-23255bff9913fc1a58c1cf629a2a030c1cbf8a87.tar.gz |
Merge branch 'send_checkout_sha_to_services' into 'master'
Send checkout sha to services
In case of tags it may be useful to have sha of commit this tag points to.
So now web hooks and services get additional parameter `checkout_sha`
See merge request !1400
-rw-r--r-- | lib/gitlab/git.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/push_data_builder.rb | 121 | ||||
-rw-r--r-- | spec/lib/gitlab/push_data_builder_spec.rb | 5 |
3 files changed, 76 insertions, 54 deletions
diff --git a/lib/gitlab/git.rb b/lib/gitlab/git.rb index 67aca5e36e9..4a712c6345f 100644 --- a/lib/gitlab/git.rb +++ b/lib/gitlab/git.rb @@ -1,5 +1,9 @@ module Gitlab module Git BLANK_SHA = '0' * 40 + + def self.extract_ref_name(ref) + ref.gsub(/\Arefs\/(tags|heads)\//, '') + end end end diff --git a/lib/gitlab/push_data_builder.rb b/lib/gitlab/push_data_builder.rb index 72c42a6a254..faea6ae375c 100644 --- a/lib/gitlab/push_data_builder.rb +++ b/lib/gitlab/push_data_builder.rb @@ -1,63 +1,80 @@ module Gitlab class PushDataBuilder - # Produce a hash of post-receive data - # - # data = { - # before: String, - # after: String, - # ref: String, - # user_id: String, - # user_name: String, - # project_id: String, - # repository: { - # name: String, - # url: String, - # description: String, - # homepage: String, - # }, - # commits: Array, - # total_commits_count: Fixnum - # } - # - def self.build(project, user, oldrev, newrev, ref, commits = []) - # Total commits count - commits_count = commits.size + class << self + # Produce a hash of post-receive data + # + # data = { + # before: String, + # after: String, + # ref: String, + # user_id: String, + # user_name: String, + # project_id: String, + # repository: { + # name: String, + # url: String, + # description: String, + # homepage: String, + # }, + # commits: Array, + # total_commits_count: Fixnum + # } + # + def build(project, user, oldrev, newrev, ref, commits = []) + # Total commits count + commits_count = commits.size - # Get latest 20 commits ASC - commits_limited = commits.last(20) + # Get latest 20 commits ASC + commits_limited = commits.last(20) - # Hash to be passed as post_receive_data - data = { - before: oldrev, - after: newrev, - ref: ref, - user_id: user.id, - user_name: user.name, - project_id: project.id, - repository: { - name: project.name, - url: project.url_to_repo, - description: project.description, - homepage: project.web_url, - }, - commits: [], - total_commits_count: commits_count - } + # Hash to be passed as post_receive_data + data = { + before: oldrev, + after: newrev, + ref: ref, + checkout_sha: checkout_sha(project.repository, newrev, ref), + user_id: user.id, + user_name: user.name, + project_id: project.id, + repository: { + name: project.name, + url: project.url_to_repo, + description: project.description, + homepage: project.web_url, + }, + commits: [], + total_commits_count: commits_count + } - # For performance purposes maximum 20 latest commits - # will be passed as post receive hook data. - commits_limited.each do |commit| - data[:commits] << commit.hook_attrs(project) + # For performance purposes maximum 20 latest commits + # will be passed as post receive hook data. + commits_limited.each do |commit| + data[:commits] << commit.hook_attrs(project) + end + + data end - data - end + # This method provide a sample data generated with + # existing project and commits to test web hooks + def build_sample(project, user) + commits = project.repository.commits(project.default_branch, nil, 3) + build(project, user, commits.last.id, commits.first.id, "refs/heads/#{project.default_branch}", commits) + end - # This method provide a sample data generated with - # existing project and commits to test web hooks - def self.build_sample(project, user) - commits = project.repository.commits(project.default_branch, nil, 3) - build(project, user, commits.last.id, commits.first.id, "refs/heads/#{project.default_branch}", commits) + def checkout_sha(repository, newrev, ref) + if newrev != Gitlab::Git::BLANK_SHA && ref.start_with?('refs/tags/') + tag_name = Gitlab::Git.extract_ref_name(ref) + tag = repository.find_tag(tag_name) + + if tag + commit = repository.commit(tag.target) + commit.try(:sha) + end + else + newrev + end + end end end end diff --git a/spec/lib/gitlab/push_data_builder_spec.rb b/spec/lib/gitlab/push_data_builder_spec.rb index fbf767a167f..691fd133637 100644 --- a/spec/lib/gitlab/push_data_builder_spec.rb +++ b/spec/lib/gitlab/push_data_builder_spec.rb @@ -21,13 +21,14 @@ describe 'Gitlab::PushDataBuilder' do Gitlab::PushDataBuilder.build(project, user, Gitlab::Git::BLANK_SHA, - '5937ac0a7beb003549fc5fd26fc247adbce4a52e', + '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b', 'refs/tags/v1.1.0') end it { data.should be_a(Hash) } it { data[:before].should == Gitlab::Git::BLANK_SHA } - it { data[:after].should == '5937ac0a7beb003549fc5fd26fc247adbce4a52e' } + it { data[:checkout_sha].should == '5937ac0a7beb003549fc5fd26fc247adbce4a52e' } + it { data[:after].should == '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b' } it { data[:ref].should == 'refs/tags/v1.1.0' } it { data[:commits].should be_empty } it { data[:total_commits_count].should be_zero } |