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/'`