Mercurial > public > mercurial-scm > hg
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) |