class Overcommit::Printer

Provide a set of callbacks which can be executed as events occur during the course of {HookRunner#run}.

Attributes

log[R]

Public Class Methods

new(config, logger, context) click to toggle source
# File lib/overcommit/printer.rb, line 11
def initialize(config, logger, context)
  @config = config
  @log = logger
  @context = context
  @lock = Monitor.new # Need to use monitor so we can have re-entrant locks
  synchronize_all_methods
end

Public Instance Methods

end_hook(hook, status, output) click to toggle source

Executed at the end of an individual hook run.

# File lib/overcommit/printer.rb, line 37
def end_hook(hook, status, output)
  # Want to print the header for quiet hooks only if the result wasn't good
  # so that the user knows what failed
  print_header(hook) if (!hook.quiet? && !@config['quiet']) || status != :pass

  print_result(hook, status, output)
end
hook_run_failed(message) click to toggle source
# File lib/overcommit/printer.rb, line 81
def hook_run_failed(message)
  log.newline
  log.log message
  log.newline
end
hook_skipped(hook) click to toggle source
# File lib/overcommit/printer.rb, line 28
def hook_skipped(hook)
  log.warning "Skipping #{hook.name}"
end
interrupt_triggered() click to toggle source
# File lib/overcommit/printer.rb, line 45
def interrupt_triggered
  log.newline
  log.error 'Interrupt signal received. Stopping hooks...'
end
nothing_to_run() click to toggle source
# File lib/overcommit/printer.rb, line 24
def nothing_to_run
  log.debug "✓ No applicable #{hook_script_name} hooks to run"
end
required_hook_not_skipped(hook) click to toggle source
# File lib/overcommit/printer.rb, line 32
def required_hook_not_skipped(hook)
  log.warning "Cannot skip #{hook.name} since it is required"
end
run_failed() click to toggle source

Executed when one or more hooks by the end of the run.

# File lib/overcommit/printer.rb, line 59
def run_failed
  log.newline
  log.error "✗ One or more #{hook_script_name} hooks failed"
  log.newline
end
run_interrupted() click to toggle source

Executed when a hook run was interrupted/cancelled by user.

# File lib/overcommit/printer.rb, line 51
def run_interrupted
  log.newline
  log.warning '⚠  Hook run interrupted by user'
  log.warning '⚠  If files appear modified/missing, check your stash to recover them'
  log.newline
end
run_succeeded() click to toggle source

Executed when no hooks failed by the end of the run.

# File lib/overcommit/printer.rb, line 73
def run_succeeded
  unless @config['quiet']
    log.newline
    log.success "✓ All #{hook_script_name} hooks passed"
    log.newline
  end
end
run_warned() click to toggle source

Executed when no hooks failed by the end of the run, but some warned.

# File lib/overcommit/printer.rb, line 66
def run_warned
  log.newline
  log.warning "⚠ All #{hook_script_name} hooks passed, but with warnings"
  log.newline
end
start_run() click to toggle source

Executed at the very beginning of running the collection of hooks.

# File lib/overcommit/printer.rb, line 20
def start_run
  log.bold "Running #{hook_script_name} hooks" unless @config['quiet']
end

Private Instance Methods

hook_script_name() click to toggle source
# File lib/overcommit/printer.rb, line 121
def hook_script_name
  @context.hook_script_name
end
print_header(hook) click to toggle source
print_report(output, format = :log) click to toggle source
print_result(hook, status, output) click to toggle source
synchronize_all_methods() click to toggle source

Get all public methods that were defined on this class and wrap them with synchronization locks so we ensure the output isn't interleaved amongst the various threads.

# File lib/overcommit/printer.rb, line 128
def synchronize_all_methods
  methods = self.class.instance_methods - self.class.superclass.instance_methods

  methods.each do |method_name|
    old_method = :"old_#{method_name}"
    new_method = :"synchronized_#{method_name}"

    self.class.__send__(:alias_method, old_method, method_name)

    self.class.send(:define_method, new_method) do |*args|
      @lock.synchronize { __send__(old_method, *args) }
    end

    self.class.__send__(:alias_method, method_name, new_method)
  end
end