comparison tests/testlib/ext-sidedata.py @ 46718:ba8e508a8e69

sidedata-exchange: rewrite sidedata on-the-fly whenever possible When a A exchanges with B, the difference of their supported sidedata categories is made, and the responsibility is always with the client to generated it: - If A pushes to B and B requires category `foo` that A does not have, A will need to generate it when sending it to B. - If A pulls from B and A needs category `foo`, it will generate `foo` before the end of the transaction. - Any category that is not required is removed. If peers are not compatible, abort. It is forbidden to rewrite sidedata for a rev that already has sidedata, since that would introduce unreachable (garbage) data in the data file, something we're not prepared for yet. Differential Revision: https://phab.mercurial-scm.org/D10032
author Rapha?l Gom?s <rgomes@octobus.net>
date Fri, 19 Feb 2021 11:24:50 +0100
parents 3d740058b467
children d55b71393907
comparison
equal deleted inserted replaced
46717:502e795b55ac 46718:ba8e508a8e69
1 # ext-sidedata.py - small extension to test the sidedata logic 1 # ext-sidedata.py - small extension to test the sidedata logic
2 # 2 #
3 # Copyright 2019 Pierre-Yves David <pierre-yves.david@octobus.net) 3 # Copyright 2019 Pierre-Yves David <pierre-yves.david@octobus.net>
4 # 4 #
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from __future__ import absolute_import 8 from __future__ import absolute_import
45 if getattr(self, 'sidedatanocheck', False): 45 if getattr(self, 'sidedatanocheck', False):
46 return text, sd 46 return text, sd
47 if self.version & 0xFFFF != 2: 47 if self.version & 0xFFFF != 2:
48 return text, sd 48 return text, sd
49 if nodeorrev != nullrev and nodeorrev != nullid: 49 if nodeorrev != nullrev and nodeorrev != nullid:
50 if len(text) != struct.unpack('>I', sd[sidedata.SD_TEST1])[0]: 50 cat1 = sd.get(sidedata.SD_TEST1)
51 if cat1 is not None and len(text) != struct.unpack('>I', cat1)[0]:
51 raise RuntimeError('text size mismatch') 52 raise RuntimeError('text size mismatch')
52 expected = sd[sidedata.SD_TEST2] 53 expected = sd.get(sidedata.SD_TEST2)
53 got = hashlib.sha256(text).digest() 54 got = hashlib.sha256(text).digest()
54 if got != expected: 55 if expected is not None and got != expected:
55 raise RuntimeError('sha256 mismatch') 56 raise RuntimeError('sha256 mismatch')
56 return text, sd 57 return text, sd
57 58
58 59
59 def wrapgetsidedatacompanion(orig, srcrepo, dstrepo): 60 def wrapgetsidedatacompanion(orig, srcrepo, dstrepo):
84 extensions.wrapfunction(revlog.revlog, 'addrevision', wrapaddrevision) 85 extensions.wrapfunction(revlog.revlog, 'addrevision', wrapaddrevision)
85 extensions.wrapfunction(revlog.revlog, '_revisiondata', wrap_revisiondata) 86 extensions.wrapfunction(revlog.revlog, '_revisiondata', wrap_revisiondata)
86 extensions.wrapfunction( 87 extensions.wrapfunction(
87 upgrade_engine, 'getsidedatacompanion', wrapgetsidedatacompanion 88 upgrade_engine, 'getsidedatacompanion', wrapgetsidedatacompanion
88 ) 89 )
90
91
92 def reposetup(ui, repo):
93 # We don't register sidedata computers because we don't care within these
94 # tests
95 repo.register_wanted_sidedata(sidedata.SD_TEST1)
96 repo.register_wanted_sidedata(sidedata.SD_TEST2)