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