# HG changeset patch # User Lucas Moscovicz # Date 2014-01-31 00:03:18 # Node ID 6aa7dcae6bd835be3f6a0daa8ebd9a9a556b137e # Parent a685d9870eb5623b8cd744f1790ff849f75643b5 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 diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -800,14 +800,15 @@ def grep(repo, subset, x): 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: