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.



149
150
151
# File 'lib/overcommit/hook/base.rb', line 149

def applicable_files
  @applicable_files ||= modified_files.select { |file| applicable_file?(file) }.sort
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>)


125
126
127
# File 'lib/overcommit/hook/base.rb', line 125

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'] || "Running #{name}"
end

#enabled?Boolean

Returns:

  • (Boolean)


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

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



99
100
101
# File 'lib/overcommit/hook/base.rb', line 99

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

#execute_in_background(cmd) ⇒ Object



103
104
105
# File 'lib/overcommit/hook/base.rb', line 103

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>)


143
144
145
# File 'lib/overcommit/hook/base.rb', line 143

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

#in_path?(cmd) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#nameObject



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

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

#quiet?Boolean

Returns:

  • (Boolean)


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

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



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

def required_executable
  @config['required_executable']
end

#required_librariesObject



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

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)


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

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)


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

def skip?
  @config['skip']
end