grep: don't search past the end of the searched string
authorIdan Kamara <idankk86@gmail.com>
Mon, 12 Nov 2012 19:27:03 +0200
changeset 17923 1e6b5faf9d4e
parent 17922 7f5dab94e48c
child 17925 2631b3576a33
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.
mercurial/commands.py
tests/test-grep.t
--- a/mercurial/commands.py	Wed Nov 07 16:21:39 2012 -0600
+++ b/mercurial/commands.py	Mon Nov 12 19:27:03 2012 +0200
@@ -2936,7 +2936,7 @@
     def matchlines(body):
         begin = 0
         linenum = 0
-        while True:
+        while True and begin < len(body):
             match = regexp.search(body, begin)
             if not match:
                 break
--- a/tests/test-grep.t	Wed Nov 07 16:21:39 2012 -0600
+++ b/tests/test-grep.t	Mon Nov 12 19:27:03 2012 +0200
@@ -23,6 +23,10 @@
 
 simple
 
+  $ hg grep '.*'
+  port:4:export
+  port:4:vaportight
+  port:4:import/export
   $ hg grep port port
   port:4:export
   port:4:vaportight