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.
--- a/mercurial/changelog.py Tue Sep 15 15:37:32 2020 +0200
+++ b/mercurial/changelog.py Wed Sep 23 15:13:44 2020 +0200
@@ -306,13 +306,16 @@
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
--- a/mercurial/metadata.py Tue Sep 15 15:37:32 2020 +0200
+++ b/mercurial/metadata.py Wed Sep 23 15:13:44 2020 +0200
@@ -342,6 +342,32 @@
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)