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
--- 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: