@@ -27,6 +27,23 @@ def _process_filename_by_line(pattern, filename):
2727 return retv
2828
2929
30+ def _process_filename_at_once (pattern , filename ):
31+ retv = 0
32+ with open (filename , 'rb' ) as f :
33+ contents = f .read ()
34+ match = pattern .search (contents )
35+ if match :
36+ retv = 1
37+ line_no = contents [:match .start ()].count (b'\n ' )
38+ output .write ('{}:{}:' .format (filename , line_no + 1 ))
39+
40+ matched_lines = match .group ().split (b'\n ' )
41+ matched_lines [0 ] = contents .split (b'\n ' )[line_no ]
42+
43+ output .write_line (b'\n ' .join (matched_lines ))
44+ return retv
45+
46+
3047def run_hook (prefix , hook , file_args ):
3148 exe = (sys .executable , '-m' , __name__ )
3249 exe += tuple (hook ['args' ]) + (hook ['entry' ],)
@@ -42,16 +59,23 @@ def main(argv=None):
4259 ),
4360 )
4461 parser .add_argument ('-i' , '--ignore-case' , action = 'store_true' )
62+ parser .add_argument ('--multiline' , action = 'store_true' )
4563 parser .add_argument ('pattern' , help = 'python regex pattern.' )
4664 parser .add_argument ('filenames' , nargs = '*' )
4765 args = parser .parse_args (argv )
4866
4967 flags = re .IGNORECASE if args .ignore_case else 0
68+ if args .multiline :
69+ flags |= re .MULTILINE | re .DOTALL
70+
5071 pattern = re .compile (args .pattern .encode (), flags )
5172
5273 retv = 0
5374 for filename in args .filenames :
54- retv |= _process_filename_by_line (pattern , filename )
75+ if args .multiline :
76+ retv |= _process_filename_at_once (pattern , filename )
77+ else :
78+ retv |= _process_filename_by_line (pattern , filename )
5579 return retv
5680
5781
0 commit comments