10 import hashlib |
10 import hashlib |
11 import struct |
11 import struct |
12 |
12 |
13 from mercurial.node import nullrev |
13 from mercurial.node import nullrev |
14 from mercurial import ( |
14 from mercurial import ( |
|
15 changegroup, |
15 extensions, |
16 extensions, |
16 requirements, |
17 requirements, |
17 revlog, |
18 revlog, |
18 ) |
19 ) |
19 |
20 |
20 from mercurial.upgrade_utils import engine as upgrade_engine |
21 from mercurial.upgrade_utils import engine as upgrade_engine |
21 |
22 |
|
23 from mercurial.revlogutils import constants |
22 from mercurial.revlogutils import sidedata |
24 from mercurial.revlogutils import sidedata |
23 |
25 |
24 |
26 |
25 def wrapaddrevision( |
27 def wrapaddrevision( |
26 orig, self, text, transaction, link, p1, p2, *args, **kwargs |
28 orig, self, text, transaction, link, p1, p2, *args, **kwargs |
52 if expected is not None and got != expected: |
54 if expected is not None and got != expected: |
53 raise RuntimeError('sha256 mismatch') |
55 raise RuntimeError('sha256 mismatch') |
54 return text, sd |
56 return text, sd |
55 |
57 |
56 |
58 |
57 def wrapgetsidedatacompanion(orig, srcrepo, dstrepo): |
59 def wrapget_sidedata_helpers(orig, srcrepo, dstrepo): |
58 sidedatacompanion = orig(srcrepo, dstrepo) |
60 repo, computers, removers = orig(srcrepo, dstrepo) |
|
61 assert not computers and not removers # deal with composition later |
59 addedreqs = dstrepo.requirements - srcrepo.requirements |
62 addedreqs = dstrepo.requirements - srcrepo.requirements |
|
63 |
60 if requirements.SIDEDATA_REQUIREMENT in addedreqs: |
64 if requirements.SIDEDATA_REQUIREMENT in addedreqs: |
61 assert sidedatacompanion is None # deal with composition later |
|
62 |
65 |
63 def sidedatacompanion(revlog, rev): |
66 def computer(repo, revlog, rev, old_sidedata): |
|
67 assert not old_sidedata # not supported yet |
64 update = {} |
68 update = {} |
65 revlog.sidedatanocheck = True |
69 revlog.sidedatanocheck = True |
66 try: |
70 try: |
67 text = revlog.revision(rev) |
71 text = revlog.revision(rev) |
68 finally: |
72 finally: |
71 # text length |
75 # text length |
72 update[sidedata.SD_TEST1] = struct.pack('>I', len(text)) |
76 update[sidedata.SD_TEST1] = struct.pack('>I', len(text)) |
73 # and sha2 hashes |
77 # and sha2 hashes |
74 sha256 = hashlib.sha256(text).digest() |
78 sha256 = hashlib.sha256(text).digest() |
75 update[sidedata.SD_TEST2] = struct.pack('>32s', sha256) |
79 update[sidedata.SD_TEST2] = struct.pack('>32s', sha256) |
76 return False, (), update, 0, 0 |
80 return update, (0, 0) |
77 |
81 |
78 return sidedatacompanion |
82 srcrepo.register_sidedata_computer( |
|
83 constants.KIND_CHANGELOG, |
|
84 b"whatever", |
|
85 (sidedata.SD_TEST1, sidedata.SD_TEST2), |
|
86 computer, |
|
87 0, |
|
88 ) |
|
89 dstrepo.register_wanted_sidedata(b"whatever") |
|
90 |
|
91 return changegroup.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata) |
79 |
92 |
80 |
93 |
81 def extsetup(ui): |
94 def extsetup(ui): |
82 extensions.wrapfunction(revlog.revlog, 'addrevision', wrapaddrevision) |
95 extensions.wrapfunction(revlog.revlog, 'addrevision', wrapaddrevision) |
83 extensions.wrapfunction(revlog.revlog, '_revisiondata', wrap_revisiondata) |
96 extensions.wrapfunction(revlog.revlog, '_revisiondata', wrap_revisiondata) |
84 extensions.wrapfunction( |
97 extensions.wrapfunction( |
85 upgrade_engine, 'getsidedatacompanion', wrapgetsidedatacompanion |
98 upgrade_engine, 'get_sidedata_helpers', wrapget_sidedata_helpers |
86 ) |
99 ) |
87 |
100 |
88 |
101 |
89 def reposetup(ui, repo): |
102 def reposetup(ui, repo): |
90 # We don't register sidedata computers because we don't care within these |
103 # We don't register sidedata computers because we don't care within these |