diff -r e8c11a2c96c0 -r bc2519513ae0 mercurial/localrepo.py --- a/mercurial/localrepo.py Thu Feb 18 18:18:35 2021 +0100 +++ b/mercurial/localrepo.py Fri Feb 19 10:53:27 2021 +0100 @@ -49,6 +49,7 @@ match as matchmod, mergestate as mergestatemod, mergeutil, + metadata as metadatamod, namespaces, narrowspec, obsolete, @@ -273,6 +274,11 @@ caps = moderncaps.copy() self._repo = repo.filtered(b'served') self.ui = repo.ui + + if repo._wanted_sidedata: + formatted = bundle2.format_remote_wanted_sidedata(repo) + caps.add(b'exp-wanted-sidedata=' + formatted) + self._caps = repo._restrictcapabilities(caps) # Begin of _basepeer interface. @@ -1395,6 +1401,10 @@ if requirementsmod.COPIESSDC_REQUIREMENT in self.requirements: self.filecopiesmode = b'changeset-sidedata' + self._wanted_sidedata = set() + self._sidedata_computers = {} + metadatamod.set_sidedata_spec_for_repo(self) + def _getvfsward(self, origfunc): """build a ward for self.vfs""" rref = weakref.ref(self) @@ -3332,6 +3342,22 @@ fp.close() return self.pathto(fp.name[len(self.root) + 1 :]) + def register_wanted_sidedata(self, category): + self._wanted_sidedata.add(pycompat.bytestr(category)) + + def register_sidedata_computer(self, kind, category, keys, computer): + if kind not in (b"changelog", b"manifest", b"filelog"): + msg = _(b"unexpected revlog kind '%s'.") + raise error.ProgrammingError(msg % kind) + category = pycompat.bytestr(category) + if category in self._sidedata_computers.get(kind, []): + msg = _( + b"cannot register a sidedata computer twice for category '%s'." + ) + raise error.ProgrammingError(msg % category) + self._sidedata_computers.setdefault(kind, {}) + self._sidedata_computers[kind][category] = (keys, computer) + # used to avoid circular references so destructors work def aftertrans(files):