treemanifest: speed up commit using dirty flag
authorMartin von Zweigbergk <martinvonz@google.com>
Mon, 18 May 2015 21:31:40 -0700
changeset 25221 eafa06e9edde
parent 25220 f0fbd88b21fb
child 25222 0de132d5328a
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.
mercurial/manifest.py
--- a/mercurial/manifest.py	Thu Feb 26 08:16:13 2015 -0800
+++ b/mercurial/manifest.py	Mon May 18 21:31:40 2015 -0700
@@ -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):