class Bringit::Hook
Constants
- GL_PROTOCOL
Attributes
name[R]
path[R]
repo_path[R]
Public Class Methods
new(name, repo_path)
click to toggle source
# File lib/bringit/hook.rb, line 8 def initialize(name, repo_path) @name = name @repo_path = repo_path @path = File.join(repo_path.strip, 'hooks', name) end
Public Instance Methods
exists?()
click to toggle source
# File lib/bringit/hook.rb, line 14 def exists? File.exist?(path) end
trigger(user_id, oldrev, newrev, ref)
click to toggle source
# File lib/bringit/hook.rb, line 18 def trigger(user_id, oldrev, newrev, ref) return [true, nil] unless exists? Bundler.with_clean_env do case name when "pre-receive", "post-receive" call_receive_hook(user_id, oldrev, newrev, ref) when "update" call_update_hook(user_id, oldrev, newrev, ref) end end end
Private Instance Methods
call_receive_hook(user_id, oldrev, newrev, ref)
click to toggle source
# File lib/bringit/hook.rb, line 33 def call_receive_hook(user_id, oldrev, newrev, ref) changes = [oldrev, newrev, ref].join(" ") exit_status = false exit_message = nil vars = { 'USER_ID' => user_id, 'PWD' => repo_path, 'GL_PROTOCOL' => GL_PROTOCOL } options = { chdir: repo_path } Open3.popen3(vars, path, options) do |stdin, stdout, stderr, wait_thr| 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 exit_message = retrieve_error_message(stderr, stdout) end end [exit_status, exit_message] end
call_update_hook(user_id, oldrev, newrev, ref)
click to toggle source
# File lib/bringit/hook.rb, line 75 def call_update_hook(user_id, oldrev, newrev, ref) Dir.chdir(repo_path) do stdout, stderr, status = Open3.capture3({ 'USER_ID' => user_id }, path, ref, oldrev, newrev) [status.success?, stderr.presence || stdout] end end
retrieve_error_message(stderr, stdout)
click to toggle source
# File lib/bringit/hook.rb, line 82 def retrieve_error_message(stderr, stdout) err_message = stderr.gets err_message.blank? ? stdout.gets : err_message end