Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/upgrade_utils/engine.py @ 47098:27f1191b1305
sidedata: replace sidedata upgrade mechanism with the new one
Note: this is split into a separate change (like some other patches in this
series) because it's not easy to have all patches work 100% and this seemed
easier for reviewers.
When cloning or upgrading a repo, we may need to compute (or remove) sidedata.
This is the same mechanism that is used in exchange, so we re-use the new
system to simplify the code and fix the remaining issues (correctly dropping
flags and handling partial removal, etc.).
This also highlighted an issue with `test-copies-in-changeset.t` that kept
sidedata categories that are not relevant anymore. They should probably be
dropped entirely, but that would be for another patch.
Differential Revision: https://phab.mercurial-scm.org/D10359
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Mon, 19 Apr 2021 11:22:24 +0200 |
parents | 1c52d77d7861 |
children | 3aab2330b7d3 |
comparison
equal
deleted
inserted
replaced
47097:81eb7091c494 | 47098:27f1191b1305 |
---|---|
10 import stat | 10 import stat |
11 | 11 |
12 from ..i18n import _ | 12 from ..i18n import _ |
13 from ..pycompat import getattr | 13 from ..pycompat import getattr |
14 from .. import ( | 14 from .. import ( |
15 changegroup, | |
15 changelog, | 16 changelog, |
16 error, | 17 error, |
17 filelog, | 18 filelog, |
18 manifest, | 19 manifest, |
19 metadata, | 20 metadata, |
20 pycompat, | 21 pycompat, |
21 requirements, | 22 requirements, |
22 revlog, | |
23 scmutil, | 23 scmutil, |
24 store, | 24 store, |
25 util, | 25 util, |
26 vfs as vfsmod, | 26 vfs as vfsmod, |
27 ) | 27 ) |
28 from ..revlogutils import nodemap | 28 from ..revlogutils import ( |
29 constants as revlogconst, | |
30 flagutil, | |
31 nodemap, | |
32 sidedata as sidedatamod, | |
33 ) | |
34 | |
35 | |
36 def get_sidedata_helpers(srcrepo, dstrepo): | |
37 use_w = srcrepo.ui.configbool(b'experimental', b'worker.repository-upgrade') | |
38 sequential = pycompat.iswindows or not use_w | |
39 if not sequential: | |
40 srcrepo.register_sidedata_computer( | |
41 revlogconst.KIND_CHANGELOG, | |
42 sidedatamod.SD_FILES, | |
43 (sidedatamod.SD_FILES,), | |
44 metadata._get_worker_sidedata_adder(srcrepo, dstrepo), | |
45 flagutil.REVIDX_HASCOPIESINFO, | |
46 replace=True, | |
47 ) | |
48 return changegroup.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata) | |
29 | 49 |
30 | 50 |
31 def _revlogfrompath(repo, rl_type, path): | 51 def _revlogfrompath(repo, rl_type, path): |
32 """Obtain a revlog from a repo path. | 52 """Obtain a revlog from a repo path. |
33 | 53 |
87 UPGRADE_ALL_REVLOGS = frozenset( | 107 UPGRADE_ALL_REVLOGS = frozenset( |
88 [UPGRADE_CHANGELOG, UPGRADE_MANIFEST, UPGRADE_FILELOGS] | 108 [UPGRADE_CHANGELOG, UPGRADE_MANIFEST, UPGRADE_FILELOGS] |
89 ) | 109 ) |
90 | 110 |
91 | 111 |
92 def getsidedatacompanion(srcrepo, dstrepo): | |
93 sidedatacompanion = None | |
94 removedreqs = srcrepo.requirements - dstrepo.requirements | |
95 addedreqs = dstrepo.requirements - srcrepo.requirements | |
96 if requirements.SIDEDATA_REQUIREMENT in removedreqs: | |
97 | |
98 def sidedatacompanion(rl, rev): | |
99 rl = getattr(rl, '_revlog', rl) | |
100 if rl.flags(rev) & revlog.REVIDX_SIDEDATA: | |
101 return True, (), {}, 0, 0 | |
102 return False, (), {}, 0, 0 | |
103 | |
104 elif requirements.COPIESSDC_REQUIREMENT in addedreqs: | |
105 sidedatacompanion = metadata.getsidedataadder(srcrepo, dstrepo) | |
106 elif requirements.COPIESSDC_REQUIREMENT in removedreqs: | |
107 sidedatacompanion = metadata.getsidedataremover(srcrepo, dstrepo) | |
108 return sidedatacompanion | |
109 | |
110 | |
111 def matchrevlog(revlogfilter, rl_type): | 112 def matchrevlog(revlogfilter, rl_type): |
112 """check if a revlog is selected for cloning. | 113 """check if a revlog is selected for cloning. |
113 | 114 |
114 In other words, are there any updates which need to be done on revlog | 115 In other words, are there any updates which need to be done on revlog |
115 or it can be blindly copied. | 116 or it can be blindly copied. |
129 tr, | 130 tr, |
130 old_revlog, | 131 old_revlog, |
131 rl_type, | 132 rl_type, |
132 unencoded, | 133 unencoded, |
133 upgrade_op, | 134 upgrade_op, |
134 sidedatacompanion, | 135 sidedata_helpers, |
135 oncopiedrevision, | 136 oncopiedrevision, |
136 ): | 137 ): |
137 """ returns the new revlog object created""" | 138 """ returns the new revlog object created""" |
138 newrl = None | 139 newrl = None |
139 if matchrevlog(upgrade_op.revlogs_to_process, rl_type): | 140 if matchrevlog(upgrade_op.revlogs_to_process, rl_type): |
145 tr, | 146 tr, |
146 newrl, | 147 newrl, |
147 addrevisioncb=oncopiedrevision, | 148 addrevisioncb=oncopiedrevision, |
148 deltareuse=upgrade_op.delta_reuse_mode, | 149 deltareuse=upgrade_op.delta_reuse_mode, |
149 forcedeltabothparents=upgrade_op.force_re_delta_both_parents, | 150 forcedeltabothparents=upgrade_op.force_re_delta_both_parents, |
150 sidedatacompanion=sidedatacompanion, | 151 sidedata_helpers=sidedata_helpers, |
151 ) | 152 ) |
152 else: | 153 else: |
153 msg = _(b'blindly copying %s containing %i revisions\n') | 154 msg = _(b'blindly copying %s containing %i revisions\n') |
154 ui.note(msg % (unencoded, len(old_revlog))) | 155 ui.note(msg % (unencoded, len(old_revlog))) |
155 _copyrevlog(tr, dstrepo, old_revlog, rl_type, unencoded) | 156 _copyrevlog(tr, dstrepo, old_revlog, rl_type, unencoded) |
255 progress = None | 256 progress = None |
256 | 257 |
257 def oncopiedrevision(rl, rev, node): | 258 def oncopiedrevision(rl, rev, node): |
258 progress.increment() | 259 progress.increment() |
259 | 260 |
260 sidedatacompanion = getsidedatacompanion(srcrepo, dstrepo) | 261 sidedata_helpers = get_sidedata_helpers(srcrepo, dstrepo) |
261 | 262 |
262 # Migrating filelogs | 263 # Migrating filelogs |
263 ui.status( | 264 ui.status( |
264 _( | 265 _( |
265 b'migrating %d filelogs containing %d revisions ' | 266 b'migrating %d filelogs containing %d revisions ' |
280 tr, | 281 tr, |
281 oldrl, | 282 oldrl, |
282 rl_type, | 283 rl_type, |
283 unencoded, | 284 unencoded, |
284 upgrade_op, | 285 upgrade_op, |
285 sidedatacompanion, | 286 sidedata_helpers, |
286 oncopiedrevision, | 287 oncopiedrevision, |
287 ) | 288 ) |
288 info = newrl.storageinfo(storedsize=True) | 289 info = newrl.storageinfo(storedsize=True) |
289 fdstsize += info[b'storedsize'] or 0 | 290 fdstsize += info[b'storedsize'] or 0 |
290 ui.status( | 291 ui.status( |
320 tr, | 321 tr, |
321 oldrl, | 322 oldrl, |
322 rl_type, | 323 rl_type, |
323 unencoded, | 324 unencoded, |
324 upgrade_op, | 325 upgrade_op, |
325 sidedatacompanion, | 326 sidedata_helpers, |
326 oncopiedrevision, | 327 oncopiedrevision, |
327 ) | 328 ) |
328 info = newrl.storageinfo(storedsize=True) | 329 info = newrl.storageinfo(storedsize=True) |
329 mdstsize += info[b'storedsize'] or 0 | 330 mdstsize += info[b'storedsize'] or 0 |
330 ui.status( | 331 ui.status( |
359 tr, | 360 tr, |
360 oldrl, | 361 oldrl, |
361 rl_type, | 362 rl_type, |
362 unencoded, | 363 unencoded, |
363 upgrade_op, | 364 upgrade_op, |
364 sidedatacompanion, | 365 sidedata_helpers, |
365 oncopiedrevision, | 366 oncopiedrevision, |
366 ) | 367 ) |
367 info = newrl.storageinfo(storedsize=True) | 368 info = newrl.storageinfo(storedsize=True) |
368 cdstsize += info[b'storedsize'] or 0 | 369 cdstsize += info[b'storedsize'] or 0 |
369 progress.complete() | 370 progress.complete() |