[PATCH] memctx: allow the memctx to reuse the manifest node

Mateusz Kwapich mitrandir at fb.com
Wed Nov 16 20:15:28 UTC 2016


# HG changeset patch
# User Mateusz Kwapich <mitrandir at fb.com>
# Date 1479327311 0
#      Wed Nov 16 20:15:11 2016 +0000
# Node ID 0fd8175aa4e8a3a0cd6f637b34bfa25a103c454e
# Parent  c27614f2dec1405db606d1ef871dfabf72cc0737
memctx: allow the memctx to reuse the manifest node

When we have a lot of files writing a new manifest revision can be expensive.
This commit adds a possibility for memctx to reuse a manifest from a different
commit. This can be beneficial for commands that are creating metadata changes
without any actual files changed like "hg metaedit" in evolve extension.

I will send the change for evolve that leverages this once this is accepted.

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -1160,6 +1160,7 @@
                  changes=None):
         self._repo = repo
         self._rev = None
+        self._manifestnode = None
         self._node = None
         self._text = text
         if date:
@@ -1268,7 +1269,8 @@
         return None
 
     def manifestnode(self):
-        return None
+        return self._manifestnode
+
     def user(self):
         return self._user or self._repo.ui.username()
     def date(self):
@@ -1833,11 +1835,12 @@
     # this field to determine what to do in filectxfn.
     _returnnoneformissingfiles = True
 
-    def __init__(self, repo, parents, text, files, filectxfn, user=None,
-                 date=None, extra=None, editor=False):
+    def __init__(self, repo, parents, text, files, filectxfn=None, user=None,
+                 date=None, extra=None, editor=False, manifestnode=None):
         super(memctx, self).__init__(repo, text, user, date, extra)
         self._rev = None
         self._node = None
+        self._manifestnode = manifestnode
         parents = [(p or nullid) for p in parents]
         p1, p2 = parents
         self._parents = [changectx(self._repo, p) for p in (p1, p2)]
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1695,7 +1695,11 @@
             tr = self.transaction("commit")
             trp = weakref.proxy(tr)
 
-            if ctx.files():
+            if ctx.manifestnode():
+                # reuse an existing manifest revision
+                mn = ctx.manifestnode()
+                files = ctx.files()
+            elif ctx.files():
                 m1ctx = p1.manifestctx()
                 m2ctx = p2.manifestctx()
                 mctx = m1ctx.copy()


More information about the Mercurial-devel mailing list