Skip to content
Snippets Groups Projects
Commit a0d4235c authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Send checkout sha for web hooks and services

parent 1e0f36b4
No related branches found
No related tags found
1 merge request!8686add "Uplaod" and "Replace" functionality
module Gitlab
module Git
BLANK_SHA = '0' * 40
def self.extract_ref_name(ref)
ref.gsub(/\Arefs\/(tags|heads)\//, '')
end
end
end
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)
commit = repository.commit(tag.target)
commit.try(:sha)
else
newrev
end
end
end
end
end
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