Class: Overcommit::HookSigner

Inherits:
Object
  • Object
show all
Defined in:
lib/overcommit/hook_signer.rb

Overview

Calculates, stores, and retrieves stored signatures of hook plugins.

Constant Summary collapse

IGNORED_CONFIG_KEYS =

We don’t want to include the skip setting as it is set by Overcommit itself

%w[skip].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hook_name, config, context) ⇒ HookSigner

Returns a new instance of HookSigner.

Parameters:



15
16
17
18
19
# File 'lib/overcommit/hook_signer.rb', line 15

def initialize(hook_name, config, context)
  @hook_name = hook_name
  @config = config
  @context = context
end

Instance Attribute Details

#hook_nameObject (readonly)

Returns the value of attribute hook_name.



6
7
8
# File 'lib/overcommit/hook_signer.rb', line 6

def hook_name
  @hook_name
end

Instance Method Details

#hook_pathString

Returns the path of the file that should be incorporated into this hooks signature.

Returns:

  • (String)


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/overcommit/hook_signer.rb', line 25

def hook_path
  @hook_path ||= begin
    plugin_path = File.join(@config.plugin_directory,
                            @context.hook_type_name,
                            "#{Overcommit::Utils.snake_case(@hook_name)}.rb")

    if File.exist?(plugin_path)
      plugin_path
    else
      # Otherwise this is an ad hoc hook using an existing hook script
      hook_config = @config.for_hook(@hook_name, @context.hook_class_name)

      command = Array(hook_config['command'] || hook_config['required_executable'])

      if @config.verify_signatures? &&
        signable_file?(command.first) &&
        !Overcommit::GitRepo.tracked?(command.first)
        raise Overcommit::Exceptions::InvalidHookDefinition,
              'Hook specified a `required_executable` or `command` that ' \
              'is a path relative to the root of the repository, and so ' \
              'must be tracked by Git in order to be signed'
      end

      File.join(Overcommit::Utils.repo_root, command.first.to_s)
    end
  end
end

#signable_file?(file) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
56
57
58
59
# File 'lib/overcommit/hook_signer.rb', line 53

def signable_file?(file)
  return unless file

  sep = Overcommit::OS.windows? ? '\\' : File::SEPARATOR
  file.start_with?(".#{sep}") ||
    file.start_with?(Overcommit::Utils.repo_root)
end

#signature_changed?true, false

Return whether the signature for this hook has changed since it was last calculated.

Returns:

  • (true, false)


65
66
67
# File 'lib/overcommit/hook_signer.rb', line 65

def signature_changed?
  signature != stored_signature
end

#update_signature!Object

Update the current stored signature for this hook.



70
71
72
73
74
75
76
77
78
79
# File 'lib/overcommit/hook_signer.rb', line 70

def update_signature!
  result = Overcommit::Utils.execute(
    %w[git config --local] + [signature_config_key, signature]
  )

  unless result.success?
    raise Overcommit::Exceptions::GitConfigError,
          "Unable to write to local repo git config: #{result.stderr}"
  end
end