comparison mercurial/upgrade_utils/engine.py @ 50624:e1ee6910f6bc

store: add a `get_revlog_instance` method on revlog entries The upgrade code needs this a lot, and the stream code is about to needs it too. So we start by moving the upgrade code in a more generic location.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sat, 27 May 2023 04:01:17 +0200
parents aede57466804
children e06d1a779eb6
comparison
equal deleted inserted replaced
50623:9b0fe2b075b5 50624:e1ee6910f6bc
9 import stat 9 import stat
10 10
11 from ..i18n import _ 11 from ..i18n import _
12 from ..pycompat import getattr 12 from ..pycompat import getattr
13 from .. import ( 13 from .. import (
14 changelog,
15 error, 14 error,
16 filelog,
17 manifest,
18 metadata, 15 metadata,
19 pycompat, 16 pycompat,
20 requirements, 17 requirements,
21 scmutil, 18 scmutil,
22 store, 19 store,
45 replace=True, 42 replace=True,
46 ) 43 )
47 return sidedatamod.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata) 44 return sidedatamod.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata)
48 45
49 46
50 def _revlog_from_store_entry(repo, entry):
51 """Obtain a revlog from a repo store entry.
52
53 An instance of the appropriate class is returned.
54 """
55 if entry.is_changelog:
56 return changelog.changelog(repo.svfs)
57 elif entry.is_manifestlog:
58 mandir = entry.target_id.rstrip(b'/')
59 return manifest.manifestrevlog(
60 repo.nodeconstants, repo.svfs, tree=mandir
61 )
62 else:
63 return filelog.filelog(repo.svfs, entry.target_id)
64
65
66 def _copyrevlog(tr, destrepo, oldrl, entry): 47 def _copyrevlog(tr, destrepo, oldrl, entry):
67 """copy all relevant files for `oldrl` into `destrepo` store 48 """copy all relevant files for `oldrl` into `destrepo` store
68 49
69 Files are copied "as is" without any transformation. The copy is performed 50 Files are copied "as is" without any transformation. The copy is performed
70 without extra checks. Callers are responsible for making sure the copied 51 without extra checks. Callers are responsible for making sure the copied
71 content is compatible with format of the destination repository. 52 content is compatible with format of the destination repository.
72 """ 53 """
73 oldrl = getattr(oldrl, '_revlog', oldrl) 54 oldrl = getattr(oldrl, '_revlog', oldrl)
74 newrl = _revlog_from_store_entry(destrepo, entry) 55 newrl = entry.get_revlog_instance(destrepo)
75 newrl = getattr(newrl, '_revlog', newrl) 56 newrl = getattr(newrl, '_revlog', newrl)
76 57
77 oldvfs = oldrl.opener 58 oldvfs = oldrl.opener
78 newvfs = newrl.opener 59 newvfs = newrl.opener
79 oldindex = oldvfs.join(oldrl._indexfile) 60 oldindex = oldvfs.join(oldrl._indexfile)
136 if matchrevlog(upgrade_op.revlogs_to_process, entry): 117 if matchrevlog(upgrade_op.revlogs_to_process, entry):
137 ui.note( 118 ui.note(
138 _(b'cloning %d revisions from %s\n') 119 _(b'cloning %d revisions from %s\n')
139 % (len(old_revlog), revlog_path) 120 % (len(old_revlog), revlog_path)
140 ) 121 )
141 newrl = _revlog_from_store_entry(dstrepo, entry) 122 newrl = entry.get_revlog_instance(dstrepo)
142 old_revlog.clone( 123 old_revlog.clone(
143 tr, 124 tr,
144 newrl, 125 newrl,
145 addrevisioncb=oncopiedrevision, 126 addrevisioncb=oncopiedrevision,
146 deltareuse=upgrade_op.delta_reuse_mode, 127 deltareuse=upgrade_op.delta_reuse_mode,
150 else: 131 else:
151 msg = _(b'blindly copying %s containing %i revisions\n') 132 msg = _(b'blindly copying %s containing %i revisions\n')
152 ui.note(msg % (revlog_path, len(old_revlog))) 133 ui.note(msg % (revlog_path, len(old_revlog)))
153 _copyrevlog(tr, dstrepo, old_revlog, entry) 134 _copyrevlog(tr, dstrepo, old_revlog, entry)
154 135
155 newrl = _revlog_from_store_entry(dstrepo, entry) 136 newrl = entry.get_revlog_instance(dstrepo)
156 return newrl 137 return newrl
157 138
158 139
159 def _clonerevlogs( 140 def _clonerevlogs(
160 ui, 141 ui,
195 # source files and allows a unified progress bar to be displayed. 176 # source files and allows a unified progress bar to be displayed.
196 for entry in alldatafiles: 177 for entry in alldatafiles:
197 if not entry.is_revlog: 178 if not entry.is_revlog:
198 continue 179 continue
199 180
200 rl = _revlog_from_store_entry(srcrepo, entry) 181 rl = entry.get_revlog_instance(srcrepo)
201 182
202 info = rl.storageinfo( 183 info = rl.storageinfo(
203 exclusivefiles=True, 184 exclusivefiles=True,
204 revisionscount=True, 185 revisionscount=True,
205 trackedsize=True, 186 trackedsize=True,
270 util.bytecount(frawsize), 251 util.bytecount(frawsize),
271 ) 252 )
272 ) 253 )
273 progress = srcrepo.ui.makeprogress(_(b'file revisions'), total=frevcount) 254 progress = srcrepo.ui.makeprogress(_(b'file revisions'), total=frevcount)
274 for target_id, entry in sorted(filelogs.items()): 255 for target_id, entry in sorted(filelogs.items()):
275 oldrl = _revlog_from_store_entry(srcrepo, entry) 256 oldrl = entry.get_revlog_instance(srcrepo)
276 257
277 newrl = _perform_clone( 258 newrl = _perform_clone(
278 ui, 259 ui,
279 dstrepo, 260 dstrepo,
280 tr, 261 tr,
311 progress.complete() 292 progress.complete()
312 progress = srcrepo.ui.makeprogress( 293 progress = srcrepo.ui.makeprogress(
313 _(b'manifest revisions'), total=mrevcount 294 _(b'manifest revisions'), total=mrevcount
314 ) 295 )
315 for target_id, entry in sorted(manifests.items()): 296 for target_id, entry in sorted(manifests.items()):
316 oldrl = _revlog_from_store_entry(srcrepo, entry) 297 oldrl = entry.get_revlog_instance(srcrepo)
317 newrl = _perform_clone( 298 newrl = _perform_clone(
318 ui, 299 ui,
319 dstrepo, 300 dstrepo,
320 tr, 301 tr,
321 oldrl, 302 oldrl,
350 progress.complete() 331 progress.complete()
351 progress = srcrepo.ui.makeprogress( 332 progress = srcrepo.ui.makeprogress(
352 _(b'changelog revisions'), total=crevcount 333 _(b'changelog revisions'), total=crevcount
353 ) 334 )
354 for target_id, entry in sorted(changelogs.items()): 335 for target_id, entry in sorted(changelogs.items()):
355 oldrl = _revlog_from_store_entry(srcrepo, entry) 336 oldrl = entry.get_revlog_instance(srcrepo)
356 newrl = _perform_clone( 337 newrl = _perform_clone(
357 ui, 338 ui,
358 dstrepo, 339 dstrepo,
359 tr, 340 tr,
360 oldrl, 341 oldrl,