forked from sds/overcommit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathline_endings.rb
77 lines (65 loc) · 1.93 KB
/
line_endings.rb
1
2
3
4
5
6
7
8
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# frozen_string_literal: true
module Overcommit::Hook::PreCommit
# Checks for line endings in files.
#
# WARNING: Works with Git 2.10.0 or newer.
class LineEndings < Base
def run
messages = []
offending_files.map do |file_name|
file = File.open(file_name)
begin
messages += check_file(file, file_name)
rescue ArgumentError => ex
# File is likely a binary file which this check should ignore, but
# print a warning just in case
messages << Overcommit::Hook::Message.new(
:warning,
file_name,
file.lineno,
"#{file_name}:#{file.lineno}:#{ex.message}"
)
end
end
messages
end
private
def check_file(file, file_name)
messages_for_file = []
file.each_line do |line|
# Remove configured line-ending
line.gsub!(/#{config['eol']}/, '')
# Detect any left over line-ending characters
next unless line.end_with?("\n", "\r")
messages_for_file << Overcommit::Hook::Message.new(
:error,
file_name,
file.lineno,
"#{file_name}:#{file.lineno}:#{line.inspect}"
)
end
messages_for_file
end
def offending_files
result = execute(%w[git ls-files --eol -z --], args: applicable_files)
raise 'Unable to access git tree' unless result.success?
result.stdout.split("\0").map do |file_info|
info, path = file_info.split("\t")
i = info.split.first
next if i == 'l/-text' # ignore binary files
next if i == "l/#{eol}"
path
end.compact
end
def eol
@eol ||= case config['eol']
when "\n"
'lf'
when "\r\n"
'crlf'
else
raise 'Invalid `eol` option specified: must be "\n" or "\r\n"'
end
end
end
end