# HG changeset patch # User Yuya Nishihara # Date 1441720844 -32400 # Node ID 9cf65f43b49ba45adfcf7b3900e1d59f5d9301be # Parent eb2187ebdf8a723e0d23f39e1f0381d6e2dae941 graphmod: compute slow revset query once prior to reachableroots (issue4782) Because revsets query is evaluated lazily, "list(revs)" may take long for complicated query. So we shouldn't iterate revs many times. This patch is the easiest workaround for the issue4782. We could introduce more aggressive caching, but it wouldn't be as fast as the simple baseset operation. Gregory Szorc said "this makes `hg wip` on my Firefox clone ~4x faster than 3.5.1 (~6.5s to ~1.5s). This is after a regression in @ to ~45s." diff -r eb2187ebdf8a -r 9cf65f43b49b mercurial/graphmod.py --- a/mercurial/graphmod.py Mon Sep 07 11:35:40 2015 -0700 +++ b/mercurial/graphmod.py Tue Sep 08 23:00:44 2015 +0900 @@ -260,6 +260,10 @@ for mpar in mpars: gp = gpcache.get(mpar) if gp is None: + # precompute slow query as we know reachableroots() goes + # through all revs (issue4782) + if not isinstance(revs, revset.baseset): + revs = revset.baseset(revs) gp = gpcache[mpar] = revset.reachableroots(repo, revs, [mpar]) if not gp: parents.append(mpar)