changeset 18651:e556659340f0

manifestmerge: fix order in which manifests are fetched If the manifest of an earlier revision on the same delta chain is read before that of a later revision, the revlog remembers that we parsed the earlier revision and continues applying deltas from there onwards. If manifests are parsed the other way round, we have to start over from the fulltext. For a fresh clone of mozilla-central, updating from 29dd80c95b7d to its parent aab96936a177 requires approximately 400 fewer zlib.decompress calls, which results in a speedup from 1.10 seconds to 1.05.
author Siddharth Agarwal <sid0@fb.com>
date Sun, 10 Feb 2013 16:55:01 +0000
parents de0bd4bfc6d7
children 170142161672 d9ff580fcaa2
files mercurial/merge.py
diffstat 1 files changed, 8 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/merge.py	Sun Feb 10 12:16:46 2013 +0000
+++ b/mercurial/merge.py	Sun Feb 10 16:55:01 2013 +0000
@@ -196,6 +196,7 @@
     overwrite = force and not branchmerge
     actions, copy, movewithdir = [], {}, {}
 
+    followcopies = False
     if overwrite:
         pa = wctx
     elif pa == p2: # backwards
@@ -203,6 +204,13 @@
     elif not branchmerge and not wctx.dirty(missing=True):
         pass
     elif pa and repo.ui.configbool("merge", "followcopies", True):
+        followcopies = True
+
+    # manifests fetched in order are going to be faster, so prime the caches
+    [x.manifest() for x in
+     sorted(wctx.parents() + [p2, pa], key=lambda x: x.rev())]
+
+    if followcopies:
         ret = copies.mergecopies(repo, wctx, p2, pa)
         copy, movewithdir, diverge, renamedelete = ret
         for of, fl in diverge.iteritems():