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
This commit is contained in:
commit
23255bff99
3 changed files with 76 additions and 54 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
|
|
Loading…
Reference in a new issue