lib/pre-commit/checks/grep.rb in pre-commit-0.19.0 vs lib/pre-commit/checks/grep.rb in pre-commit-0.20.0
- old
+ new
@@ -1,11 +1,12 @@
-require 'pre-commit/checks/plugin'
-require 'shellwords'
+require 'pre-commit/checks/shell'
+require 'pre-commit/error_list'
+require 'pre-commit/line'
module PreCommit
module Checks
- class Grep < Plugin
+ class Grep < Shell
class PaternNotSet < StandardError
def message
"Please define 'pattern' method."
end
end
@@ -15,11 +16,11 @@
def files_filter(staged_files)
staged_files
end
def extra_grep
- @extra_grep or ""
+ @extra_grep or []
end
def message
@message or ""
end
@@ -29,24 +30,46 @@
end
# general code:
def call(staged_files)
- staged_files = files_filter(staged_files).map(&:shellescape)
+ staged_files = files_filter(staged_files)
return if staged_files.empty?
- errors = `#{grep} #{pattern} #{staged_files.join(" ")}#{extra_grep}`
- return unless $?.success?
- "#{message}#{errors}"
+
+ result =
+ in_groups(staged_files).map do |files|
+ args = grep + [pattern] + files
+ args += ["|", "grep"] + extra_grep if !extra_grep.nil? and !extra_grep.empty?
+ execute(args, success_status: false)
+ end.compact
+
+ result.empty? ? nil : parse_errors(message, result)
end
private
+ def parse_errors(message, list)
+ result = PreCommit::ErrorList.new(message)
+ result.errors +=
+ list.map do |group|
+ group.split(/\n/)
+ end.flatten.compact.map do |line|
+ PreCommit::Line.new(nil, *parse_error(line))
+ end
+ result
+ end
+
+ def parse_error(line)
+ matches = /^([^:]+):([[:digit:]]+):(.*)$/.match(line)
+ matches and matches.captures
+ end
+
def grep(grep_version = nil)
grep_version ||= detect_grep_version
if grep_version =~ /FreeBSD/
- "grep -EnIH"
+ %w{grep -EnIH}
else
- "grep -PnIH"
+ %w{grep -PnIH}
end
end
def detect_grep_version
`grep --version | head -n 1 | sed -e 's/^[^0-9.]*\([0-9.]*\)$/\1/'`