changeset 26187:9cf65f43b49b

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."
author Yuya Nishihara <yuya@tcha.org>
date Tue, 08 Sep 2015 23:00:44 +0900
parents eb2187ebdf8a
children 662ea52d5dca
files mercurial/graphmod.py
diffstat 1 files changed, 4 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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)