debian-mirror-gitlab/lib/gitlab/git/hook.rb

88 lines
2.2 KiB
Ruby
Raw Normal View History

2015-09-25 12:07:36 +05:30
module Gitlab
module Git
class Hook
2016-08-24 12:49:21 +05:30
GL_PROTOCOL = 'web'.freeze
2015-09-25 12:07:36 +05:30
attr_reader :name, :repo_path, :path
def initialize(name, repo_path)
@name = name
@repo_path = repo_path
@path = File.join(repo_path.strip, 'hooks', name)
end
def exists?
File.exist?(path)
end
def trigger(gl_id, oldrev, newrev, ref)
2016-08-24 12:49:21 +05:30
return [true, nil] unless exists?
2015-09-25 12:07:36 +05:30
2016-09-29 09:46:39 +05:30
Bundler.with_clean_env do
case name
when "pre-receive", "post-receive"
call_receive_hook(gl_id, oldrev, newrev, ref)
when "update"
call_update_hook(gl_id, oldrev, newrev, ref)
end
2015-12-23 02:04:40 +05:30
end
end
private
def call_receive_hook(gl_id, oldrev, newrev, ref)
2015-09-25 12:07:36 +05:30
changes = [oldrev, newrev, ref].join(" ")
exit_status = false
2016-08-24 12:49:21 +05:30
exit_message = nil
2015-09-25 12:07:36 +05:30
vars = {
'GL_ID' => gl_id,
2016-08-24 12:49:21 +05:30
'PWD' => repo_path,
'GL_PROTOCOL' => GL_PROTOCOL
2015-09-25 12:07:36 +05:30
}
options = {
chdir: repo_path
}
2016-08-24 12:49:21 +05:30
Open3.popen3(vars, path, options) do |stdin, stdout, stderr, wait_thr|
2015-09-25 12:07:36 +05:30
exit_status = true
stdin.sync = true
# in git, pre- and post- receive hooks may just exit without
# reading stdin. We catch the exception to avoid a broken pipe
# warning
begin
# inject all the changes as stdin to the hook
changes.lines do |line|
stdin.puts line
end
rescue Errno::EPIPE
end
stdin.close
unless wait_thr.value == 0
exit_status = false
2016-08-24 12:49:21 +05:30
exit_message = retrieve_error_message(stderr, stdout)
2015-09-25 12:07:36 +05:30
end
end
2016-08-24 12:49:21 +05:30
[exit_status, exit_message]
2015-09-25 12:07:36 +05:30
end
2015-12-23 02:04:40 +05:30
def call_update_hook(gl_id, oldrev, newrev, ref)
Dir.chdir(repo_path) do
2016-08-24 12:49:21 +05:30
stdout, stderr, status = Open3.capture3({ 'GL_ID' => gl_id }, path, ref, oldrev, newrev)
[status.success?, stderr.presence || stdout]
2015-12-23 02:04:40 +05:30
end
end
2016-08-24 12:49:21 +05:30
def retrieve_error_message(stderr, stdout)
err_message = stderr.gets
err_message.blank? ? stdout.gets : err_message
end
2015-09-25 12:07:36 +05:30
end
end
end