revset: added lazyset implementation to grep revset
authorLucas Moscovicz <lmoscovicz@fb.com>
Thu, 30 Jan 2014 16:03:18 -0800
changeset 20453 6aa7dcae6bd8
parent 20452 a685d9870eb5
child 20454 47fd57f650e5
revset: added lazyset implementation to grep revset Performance benchmarking: $ time hg log -qr "first(grep(hg))" 0:9117c6561b0b real 0m2.214s user 0m2.163s sys 0m0.045s $ time ./hg log -qr "first(grep(hg))" 0:9117c6561b0b real 0m0.211s user 0m0.146s sys 0m0.035s
mercurial/revset.py
--- a/mercurial/revset.py	Thu Jan 30 15:39:56 2014 -0800
+++ b/mercurial/revset.py	Thu Jan 30 16:03:18 2014 -0800
@@ -800,14 +800,15 @@
         gr = re.compile(getstring(x, _("grep requires a string")))
     except re.error, e:
         raise error.ParseError(_('invalid match pattern: %s') % e)
-    l = []
-    for r in subset:
-        c = repo[r]
+
+    def matches(x):
+        c = repo[x]
         for e in c.files() + [c.user(), c.description()]:
             if gr.search(e):
-                l.append(r)
-                break
-    return baseset(l)
+                return True
+        return False
+
+    return lazyset(subset, matches)
 
 def _matchfiles(repo, subset, x):
     # _matchfiles takes a revset list of prefixed arguments: