Patchwork [3,of,7] sidedata: add a `decode_files_sidedata` function

login
register
mail settings
Submitter Pierre-Yves David
Date Sept. 23, 2020, 9:51 p.m.
Message ID <67e54907605de3c48ad8.1600897912@nodosa.octobus.net>
Download mbox | patch
Permalink /patch/47265/
State Accepted
Headers show

Comments

Pierre-Yves David - Sept. 23, 2020, 9:51 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@octobus.net>
# Date 1600866824 -7200
#      Wed Sep 23 15:13:44 2020 +0200
# Node ID 67e54907605de3c48ad87c49acdfbc27debf3996
# Parent  4ca4cc404afd6ec3dc4a61b2d68b33e1aa7f1cf6
# EXP-Topic new-metadata-pre
# Available At https://foss.heptapod.net/octobus/mercurial-devel/
#              hg pull https://foss.heptapod.net/octobus/mercurial-devel/ -r 67e54907605d
sidedata: add a `decode_files_sidedata` function

Right now the function mostly gather existing code to build a consistent object.
However having this function allow us prepare all user code independently from
the actual side data format change (and associated encoding/decoding changes)

Strictly speaking, we could not need to passe the sidedata explicitly since we
have access to it though the `changelogrevision` object. However, the short
term goal is to drop that first parameter to only pass the sidedata binaries.

Patch

diff --git a/mercurial/changelog.py b/mercurial/changelog.py
--- a/mercurial/changelog.py
+++ b/mercurial/changelog.py
@@ -306,13 +306,16 @@  class changelogrevision(object):
     def changes(self):
         if self._changes is not None:
             return self._changes
-        changes = metadata.ChangingFiles(
-            touched=self.files or (),
-            added=self.filesadded or (),
-            removed=self.filesremoved or (),
-            p1_copies=self.p1copies or {},
-            p2_copies=self.p2copies or {},
-        )
+        if self._cpsd:
+            changes = metadata.decode_files_sidedata(self, self._sidedata)
+        else:
+            changes = metadata.ChangingFiles(
+                touched=self.files or (),
+                added=self.filesadded or (),
+                removed=self.filesremoved or (),
+                p1_copies=self.p1copies or {},
+                p2_copies=self.p2copies or {},
+            )
         self._changes = changes
         return changes
 
diff --git a/mercurial/metadata.py b/mercurial/metadata.py
--- a/mercurial/metadata.py
+++ b/mercurial/metadata.py
@@ -342,6 +342,32 @@  def encode_files_sidedata(files):
     return sidedata
 
 
+def decode_files_sidedata(changelogrevision, sidedata):
+    """Return a ChangingFiles instance from a changelogrevision using sidata
+    """
+    touched = changelogrevision.files
+
+    rawindices = sidedata.get(sidedatamod.SD_FILESADDED)
+    added = decodefileindices(touched, rawindices)
+
+    rawindices = sidedata.get(sidedatamod.SD_FILESREMOVED)
+    removed = decodefileindices(touched, rawindices)
+
+    rawcopies = sidedata.get(sidedatamod.SD_P1COPIES)
+    p1_copies = decodecopies(touched, rawcopies)
+
+    rawcopies = sidedata.get(sidedatamod.SD_P2COPIES)
+    p2_copies = decodecopies(touched, rawcopies)
+
+    return ChangingFiles(
+        touched=touched,
+        added=added,
+        removed=removed,
+        p1_copies=p1_copies,
+        p2_copies=p2_copies,
+    )
+
+
 def _getsidedata(srcrepo, rev):
     ctx = srcrepo[rev]
     filescopies = computechangesetcopies(ctx)