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

Returns a new instance of Base.

Parameters:



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.

Returns:

  • (Array<String>)


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

Returns:

  • (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.

Parameters:

  • cmd (Array<String>)

    command arguments

  • options (Hash) (defaults to: {})

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

Returns:

  • (#status, #stdout, #stderr)

    struct containing result of invocation



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.

Returns:

  • (Array<String>)


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

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

#in_path?(cmd) ⇒ Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (Boolean)


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

def quiet?
  @config['quiet']
end

#required?Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (Boolean)


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

def skip?
  @config['skip']
end