diff --git a/pre_commit/languages/pygrep.py b/pre_commit/languages/pygrep.py index bc01208a..b1af2f20 100644 --- a/pre_commit/languages/pygrep.py +++ b/pre_commit/languages/pygrep.py @@ -30,10 +30,10 @@ def _process_filename_by_line(pattern, filename): def _process_filename_at_once(pattern, filename): retv = 0 with open(filename, 'rb') as f: - match = pattern.search(f.read().decode('utf-8').replace('\n', '')) + match = pattern.search(f.read()) if match: retv = 1 - output.write('{}:'.format(filename)) + output.write('{}:{}-{}:'.format(filename, match.start(), match.end())) output.write_line(match.group()) return retv @@ -59,6 +59,9 @@ def main(argv=None): args = parser.parse_args(argv) flags = re.IGNORECASE if args.ignore_case else 0 + if args.null_data: + flags = flags | re.MULTILINE | re.DOTALL + pattern = re.compile(args.pattern.encode(), flags) retv = 0 diff --git a/tests/languages/pygrep_test.py b/tests/languages/pygrep_test.py index 33250e4a..e2063a95 100644 --- a/tests/languages/pygrep_test.py +++ b/tests/languages/pygrep_test.py @@ -41,7 +41,21 @@ def test_ignore_case(some_files, cap_out): def test_null_data(some_files, cap_out): - ret = pygrep.main(('--null-data', r'foo.*bar', 'f1', 'f2', 'f3')) + ret = pygrep.main(('--null-data', r'foo\nbar', 'f1', 'f2', 'f3')) out = cap_out.get() assert ret == 1 - assert out == 'f1:foobar\n' + assert out == 'f1:0-7:foo\nbar\n' + + +def test_null_data_dotall_flag_is_enabled(some_files, cap_out): + ret = pygrep.main(('--null-data', r'o.*bar', 'f1', 'f2', 'f3')) + out = cap_out.get() + assert ret == 1 + assert out == 'f1:1-7:oo\nbar\n' + + +def test_null_data_multiline_flag_is_enabled(some_files, cap_out): + ret = pygrep.main(('--null-data', r'foo$.*bar', 'f1', 'f2', 'f3')) + out = cap_out.get() + assert ret == 1 + assert out == 'f1:0-7:foo\nbar\n'