Commits

idank committed 35ba170

grep: don't search past the end of the searched string

'*' causes the resulting RE to match 0 or more repetitions of the preceding RE:

>>> bool(re.search('.*', ''))
>>> True

This causes an infinite loop because currently we're only checking if there was
a match without looking at where we are in the searched string.

Comments (0)

Files changed (2)

mercurial/commands.py

     def matchlines(body):
         begin = 0
         linenum = 0
-        while True:
+        while True and begin < len(body):
             match = regexp.search(body, begin)
             if not match:
                 break

tests/test-grep.t

 
 simple
 
+  $ hg grep '.*'
+  port:4:export
+  port:4:vaportight
+  port:4:import/export
   $ hg grep port port
   port:4:export
   port:4:vaportight