Commit 23255bff authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

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
parents 089df35f de27375d
module Gitlab module Gitlab
module Git module Git
BLANK_SHA = '0' * 40 BLANK_SHA = '0' * 40
def self.extract_ref_name(ref)
ref.gsub(/\Arefs\/(tags|heads)\//, '')
end
end end
end end
module Gitlab module Gitlab
class PushDataBuilder class PushDataBuilder
# Produce a hash of post-receive data class << self
# # Produce a hash of post-receive data
# data = { #
# before: String, # data = {
# after: String, # before: String,
# ref: String, # after: String,
# user_id: String, # ref: String,
# user_name: String, # user_id: String,
# project_id: String, # user_name: String,
# repository: { # project_id: String,
# name: String, # repository: {
# url: String, # name: String,
# description: String, # url: String,
# homepage: String, # description: String,
# }, # homepage: String,
# commits: Array, # },
# total_commits_count: Fixnum # commits: Array,
# } # total_commits_count: Fixnum
# # }
def self.build(project, user, oldrev, newrev, ref, commits = []) #
# Total commits count def build(project, user, oldrev, newrev, ref, commits = [])
commits_count = commits.size # Total commits count
commits_count = commits.size
# Get latest 20 commits ASC # Get latest 20 commits ASC
commits_limited = commits.last(20) commits_limited = commits.last(20)
# Hash to be passed as post_receive_data # Hash to be passed as post_receive_data
data = { data = {
before: oldrev, before: oldrev,
after: newrev, after: newrev,
ref: ref, ref: ref,
user_id: user.id, checkout_sha: checkout_sha(project.repository, newrev, ref),
user_name: user.name, user_id: user.id,
project_id: project.id, user_name: user.name,
repository: { project_id: project.id,
name: project.name, repository: {
url: project.url_to_repo, name: project.name,
description: project.description, url: project.url_to_repo,
homepage: project.web_url, description: project.description,
}, homepage: project.web_url,
commits: [], },
total_commits_count: commits_count commits: [],
} total_commits_count: commits_count
}
# For performance purposes maximum 20 latest commits # For performance purposes maximum 20 latest commits
# will be passed as post receive hook data. # will be passed as post receive hook data.
commits_limited.each do |commit| commits_limited.each do |commit|
data[:commits] << commit.hook_attrs(project) data[:commits] << commit.hook_attrs(project)
end
data
end end
data # This method provide a sample data generated with
end # 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 def checkout_sha(repository, newrev, ref)
# existing project and commits to test web hooks if newrev != Gitlab::Git::BLANK_SHA && ref.start_with?('refs/tags/')
def self.build_sample(project, user) tag_name = Gitlab::Git.extract_ref_name(ref)
commits = project.repository.commits(project.default_branch, nil, 3) tag = repository.find_tag(tag_name)
build(project, user, commits.last.id, commits.first.id, "refs/heads/#{project.default_branch}", commits)
if tag
commit = repository.commit(tag.target)
commit.try(:sha)
end
else
newrev
end
end
end end
end end
end end
...@@ -21,13 +21,14 @@ describe 'Gitlab::PushDataBuilder' do ...@@ -21,13 +21,14 @@ describe 'Gitlab::PushDataBuilder' do
Gitlab::PushDataBuilder.build(project, Gitlab::PushDataBuilder.build(project,
user, user,
Gitlab::Git::BLANK_SHA, Gitlab::Git::BLANK_SHA,
'5937ac0a7beb003549fc5fd26fc247adbce4a52e', '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b',
'refs/tags/v1.1.0') 'refs/tags/v1.1.0')
end end
it { data.should be_a(Hash) } it { data.should be_a(Hash) }
it { data[:before].should == Gitlab::Git::BLANK_SHA } 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[:ref].should == 'refs/tags/v1.1.0' }
it { data[:commits].should be_empty } it { data[:commits].should be_empty }
it { data[:total_commits_count].should be_zero } it { data[:total_commits_count].should be_zero }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment