[PATCH 2 of 3] treemanifest: speed up commit using dirty flag

Martin von Zweigbergk martinvonz at google.com
Tue May 19 01:50:34 CDT 2015


# HG changeset patch
# User Martin von Zweigbergk <martinvonz at google.com>
# Date 1432009900 25200
#      Mon May 18 21:31:40 2015 -0700
# Node ID 865abb0f72a9fa03b97ec785e718056ea484501a
# Parent  6e62f0325819d701bdd591a113920bbdf65dca5d
treemanifest: speed up commit using dirty flag

We currently avoid saving a treemanifest revision if it's the same as
one of it's parents. This is checked by comparing the generated text
for all three versions. Let's avoid that when possible by comparing
the nodeids for clean (not dirty) nodes.

On the Mozilla repo, this speeds up commit from 2.836s to 2.343s.

diff --git a/mercurial/manifest.py b/mercurial/manifest.py
--- a/mercurial/manifest.py
+++ b/mercurial/manifest.py
@@ -759,6 +759,9 @@
         _diff(self, m2)
         return result
 
+    def unmodifiedsince(self, m2):
+        return not self._dirty and not m2._dirty and self._node == m2._node
+
     def parse(self, text, readsubtree):
         for f, n, fl in _parse(text):
             if fl == 'd':
@@ -951,13 +954,16 @@
         return n
 
     def _addtree(self, m, transaction, link, m1, m2):
+        # If the manifest is unchanged compared to one parent,
+        # don't write a new revision
+        if m.unmodifiedsince(m1) or m.unmodifiedsince(m2):
+            return m.node()
         def writesubtree(subm, subp1, subp2):
             sublog = self.dirlog(subm.dir())
             sublog.add(subm, transaction, link, subp1, subp2, None, None)
         m.writesubtrees(m1, m2, writesubtree)
         text = m.dirtext(self._usemanifestv2)
-        # If the manifest is unchanged compared to one parent,
-        # don't write a new revision
+        # Double-check whether contents are unchanged to one parent
         if text == m1.dirtext(self._usemanifestv2):
             n = m1.node()
         elif text == m2.dirtext(self._usemanifestv2):


More information about the Mercurial-devel mailing list