Module: Overcommit::HookContext::Helpers::FileModifications

Included in:
CommitMsg, PreCommit
Defined in:
lib/overcommit/hook_context/helpers/file_modifications.rb

Overview

This module contains methods for determining what files were changed and on what unique line numbers did the change occur.

Instance Method Summary collapse

Instance Method Details

#amendment?Boolean

Returns whether this hook run was triggered by `git commit –amend`

Returns:

  • (Boolean)

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/overcommit/hook_context/helpers/file_modifications.rb', line 9

def amendment?
  return @amendment unless @amendment.nil?

  cmd = Overcommit::Utils.parent_command
  return unless cmd

  amend_pattern = 'commit(\s.*)?\s--amend(\s|$)'

  # Since the ps command can return invalid byte sequences for commands
  # containing unicode characters, we replace the offending characters,
  # since the pattern we're looking for will consist of ASCII characters
  unless cmd.valid_encoding?
    cmd = Overcommit::Utils.
      parent_command.
      encode('UTF-16be', invalid: :replace, replace: '?').
      encode('UTF-8')
  end

  return @amendment if
    # True if the command is a commit with the --amend flag
    @amendment = !(/\s#{amend_pattern}/ =~ cmd).nil?

  # Check for git aliases that call `commit --amend`
  `git config --get-regexp "^alias\\." "#{amend_pattern}"`.
    scan(/alias\.([-\w]+)/). # Extract the alias
    each do |match|
      return @amendment if
        # True if the command uses a git alias for `commit --amend`
        @amendment = !(/git(\.exe)?\s+#{match[0]}/ =~ cmd).nil?
    end

  @amendment
end

#modified_filesObject

Get a list of added, copied, or modified files that have been staged. Renames and deletions are ignored, since there should be nothing to check.


45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/overcommit/hook_context/helpers/file_modifications.rb', line 45

def modified_files
  unless @modified_files
    currently_staged = Overcommit::GitRepo.modified_files(staged: true)
    @modified_files = currently_staged

    # Include files modified in last commit if amending
    if amendment?
      subcmd = 'show --format=%n'
      previously_modified = Overcommit::GitRepo.modified_files(subcmd: subcmd)
      @modified_files |= filter_modified_files(previously_modified)
    end
  end
  @modified_files
end

#modified_lines_in_file(file) ⇒ Object

Returns the set of line numbers corresponding to the lines that were changed in a specified file.


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/overcommit/hook_context/helpers/file_modifications.rb', line 62

def modified_lines_in_file(file)
  @modified_lines ||= {}
  unless @modified_lines[file]
    @modified_lines[file] =
      Overcommit::GitRepo.extract_modified_lines(file, staged: true)

    # Include lines modified in last commit if amending
    if amendment?
      subcmd = 'show --format=%n'
      @modified_lines[file] +=
        Overcommit::GitRepo.extract_modified_lines(file, subcmd: subcmd)
    end
  end
  @modified_lines[file]
end