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()