# HG changeset patch # User Patrick Mezard # Date 2012-04-11 09:14:07 # Node ID 4aa4f50c52b9f14947bc41eb7b332e045e304a66 # Parent 17deb6bbfbab1be6c7c955d8cfe1828143622596 graphlog: pass changesets to revset.match() in changelog order Running: $ time hg debugrevspec 'user(mpm)' | wc on Mercurial repository takes 1.0s with a regular version and 1.8s if commands.debugrevspec() is patched to pass revisions to revset.match() from tip to 0. Depending on what we expect from the revset API and caller wisdom, we might want to push this change in revset.match() later. diff --git a/hgext/graphlog.py b/hgext/graphlog.py --- a/hgext/graphlog.py +++ b/hgext/graphlog.py @@ -409,7 +409,11 @@ def getlogrevs(repo, pats, opts): return [], None, None expr, filematcher = _makelogrevset(repo, pats, opts, revs) if expr: - revs = revsetmod.match(repo.ui, expr)(repo, revs) + # Evaluate revisions in changelog order for performance + # reasons but preserve the original sequence order in the + # filtered result. + matched = set(revsetmod.match(repo.ui, expr)(repo, sorted(revs))) + revs = [r for r in revs if r in matched] return revs, expr, filematcher def generate(ui, dag, displayer, showparents, edgefn, getrenamed=None,