D6941: revlog: add a way to control sidedata changes during revlog.clone

marmoute (Pierre-Yves David) phabricator at mercurial-scm.org
Wed Oct 9 12:46:52 EDT 2019


Closed by commit rHG3de4d13f22be: revlog: add a way to control sidedata changes during revlog.clone (authored by marmoute).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6941?vs=16945&id=16995

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6941/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6941

AFFECTED FILES
  mercurial/revlog.py

CHANGE DETAILS

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -2542,6 +2542,7 @@
         addrevisioncb=None,
         deltareuse=DELTAREUSESAMEREVS,
         forcedeltabothparents=None,
+        sidedatacompanion=None,
     ):
         """Copy this revlog to another, possibly with format changes.
 
@@ -2583,6 +2584,20 @@
         In addition to the delta policy, the ``forcedeltabothparents``
         argument controls whether to force compute deltas against both parents
         for merges. By default, the current default is used.
+
+        If not None, the `sidedatacompanion` is callable that accept two
+        arguments:
+
+            (srcrevlog, rev)
+
+        and return a triplet that control changes to sidedata content from the
+        old revision to the new clone result:
+
+            (dropall, filterout, update)
+
+        * if `dropall` is True, all sidedata should be dropped
+        * `filterout` is a set of sidedata keys that should be dropped
+        * `update` is a mapping of additionnal/new key -> value
         """
         if deltareuse not in self.DELTAREUSEALL:
             raise ValueError(
@@ -2617,7 +2632,12 @@
             destrevlog._deltabothparents = forcedeltabothparents or oldamd
 
             self._clone(
-                tr, destrevlog, addrevisioncb, deltareuse, forcedeltabothparents
+                tr,
+                destrevlog,
+                addrevisioncb,
+                deltareuse,
+                forcedeltabothparents,
+                sidedatacompanion,
             )
 
         finally:
@@ -2626,7 +2646,13 @@
             destrevlog._deltabothparents = oldamd
 
     def _clone(
-        self, tr, destrevlog, addrevisioncb, deltareuse, forcedeltabothparents
+        self,
+        tr,
+        destrevlog,
+        addrevisioncb,
+        deltareuse,
+        forcedeltabothparents,
+        sidedatacompanion,
     ):
         """perform the core duty of `revlog.clone` after parameter processing"""
         deltacomputer = deltautil.deltacomputer(destrevlog)
@@ -2642,12 +2668,24 @@
             p2 = index[entry[6]][7]
             node = entry[7]
 
+            sidedataactions = (False, [], {})
+            if sidedatacompanion is not None:
+                sidedataactions = sidedatacompanion(self, rev)
+
             # (Possibly) reuse the delta from the revlog if allowed and
             # the revlog chunk is a delta.
             cachedelta = None
             rawtext = None
-            if deltareuse == self.DELTAREUSEFULLADD:
-                text = self.revision(rev)
+            if any(sidedataactions) or deltareuse == self.DELTAREUSEFULLADD:
+                dropall, filterout, update = sidedataactions
+                text, sidedata = self._revisiondata(rev)
+                if dropall:
+                    sidedata = {}
+                for key in filterout:
+                    sidedata.pop(key, None)
+                sidedata.update(update)
+                if not sidedata:
+                    sidedata = None
                 destrevlog.addrevision(
                     text,
                     tr,
@@ -2658,6 +2696,7 @@
                     node=node,
                     flags=flags,
                     deltacomputer=deltacomputer,
+                    sidedata=sidedata,
                 )
             else:
                 if destrevlog._lazydelta:



To: marmoute, indygreg, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list