From patchwork Wed Sep 23 21:51:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3,of,7] sidedata: add a `decode_files_sidedata` function From: Pierre-Yves David X-Patchwork-Id: 47265 Message-Id: <67e54907605de3c48ad8.1600897912@nodosa.octobus.net> To: mercurial-devel@mercurial-scm.org Date: Wed, 23 Sep 2020 23:51:52 +0200 # HG changeset patch # User Pierre-Yves David # 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. 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)