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