Class: Overcommit::Hook::Base

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/overcommit/hook/base.rb

Overview

Functionality common to all hooks.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config, context) ⇒ Base


25
26
27
28
# File 'lib/overcommit/hook/base.rb', line 25

def initialize(config, context)
  @config = config.for_hook(self)
  @context = context
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config


21
22
23
# File 'lib/overcommit/hook/base.rb', line 21

def config
  @config
end

Instance Method Details

#applicable_filesObject

Gets a list of staged files that apply to this hook based on its configured `include` and `exclude` lists.


157
158
159
# File 'lib/overcommit/hook/base.rb', line 157

def applicable_files
  @applicable_files ||= select_applicable(modified_files)
end

#commandArray<String>

Return command to execute for this hook.

This is intended to be configurable so hooks can prefix their commands with `bundle exec` or similar. It will appends the command line flags specified by the `flags` option after.

Note that any files intended to be passed must be handled by the hook itself.


133
134
135
# File 'lib/overcommit/hook/base.rb', line 133

def command
  Array(@config['command'] || required_executable) + flags
end

#descriptionObject


56
57
58
# File 'lib/overcommit/hook/base.rb', line 56

def description
  @config['description'] || "Run #{name}"
end

#enabled?Boolean


76
77
78
# File 'lib/overcommit/hook/base.rb', line 76

def enabled?
  @config['enabled'] != false
end

#execute(cmd, options = {}) ⇒ #status, ...

Execute a command in a separate process.

If `splittable_args` is specified, ensures that those arguments are concatenated onto the end of the `cmd` arguments, but split up so that the operating system's maximum command length is not exceeded. This is useful for splitting up long file lists.

Options Hash (options):

  • :args (Array<String>)

    arguments that can be split up over multiple invocations (usually a list of files)

  • :input (String)

    string to pass to process' standard input stream


107
108
109
# File 'lib/overcommit/hook/base.rb', line 107

def execute(cmd, options = {})
  Overcommit::Utils.execute(cmd, options)
end

#execute_in_background(cmd) ⇒ Object


111
112
113
# File 'lib/overcommit/hook/base.rb', line 111

def execute_in_background(cmd)
  Overcommit::Utils.execute_in_background(cmd)
end

#flagsArray<String>

Return command line flags to be passed to the command.

This excludes the list of files, as that must be handled by the hook itself.

The intention here is to provide flexibility for when a tool removes/renames its flags. Rather than wait for Overcommit to update the flags it uses, you can update your configuration to use the new flags right away without being blocked.

Also note that any flags containing dynamic content must be passed in the hook's #run method.


151
152
153
# File 'lib/overcommit/hook/base.rb', line 151

def flags
  Array(@config['flags'])
end

#in_path?(cmd) ⇒ Boolean


89
90
91
# File 'lib/overcommit/hook/base.rb', line 89

def in_path?(cmd)
  Overcommit::Utils.in_path?(cmd)
end

#included_filesObject

Gets a list of all files that apply to this hook based on its configured `include` and `exclude` lists.


163
164
165
# File 'lib/overcommit/hook/base.rb', line 163

def included_files
  @included_files ||= select_applicable(all_files)
end

#nameObject


52
53
54
# File 'lib/overcommit/hook/base.rb', line 52

def name
  self.class.name.split('::').last
end

#parallelize?Boolean


64
65
66
# File 'lib/overcommit/hook/base.rb', line 64

def parallelize?
  @config['parallelize'] != false
end

#processorsObject


68
69
70
# File 'lib/overcommit/hook/base.rb', line 68

def processors
  @config.fetch('processors', 1)
end

#quiet?Boolean


72
73
74
# File 'lib/overcommit/hook/base.rb', line 72

def quiet?
  @config['quiet']
end

#required?Boolean


60
61
62
# File 'lib/overcommit/hook/base.rb', line 60

def required?
  @config['required']
end

#required_executableObject


115
116
117
# File 'lib/overcommit/hook/base.rb', line 115

def required_executable
  @config['required_executable']
end

#required_librariesObject


119
120
121
# File 'lib/overcommit/hook/base.rb', line 119

def required_libraries
  Array(@config['required_library'] || @config['required_libraries'])
end

#runObject

Runs the hook.

Raises:

  • (NotImplementedError)

31
32
33
# File 'lib/overcommit/hook/base.rb', line 31

def run
  raise NotImplementedError, 'Hook must define `run`'
end

#run?Boolean


84
85
86
87
# File 'lib/overcommit/hook/base.rb', line 84

def run?
  enabled? &&
    !(@config['requires_files'] && applicable_files.empty?)
end

#run_and_transformObject

Runs the hook and transforms the status returned based on the hook's configuration.

Poorly named because we already have a bunch of hooks in the wild that implement `#run`, and we needed a wrapper step to transform the status based on any custom configuration.


41
42
43
44
45
46
47
48
49
50
# File 'lib/overcommit/hook/base.rb', line 41

def run_and_transform
  if output = check_for_requirements
    status = :fail
  else
    result = Overcommit::Utils.with_environment(@config.fetch('env', {})) { run }
    status, output = process_hook_return_value(result)
  end

  [transform_status(status), output]
end

#skip?Boolean


80
81
82
# File 'lib/overcommit/hook/base.rb', line 80

def skip?
  @config['skip']
end