Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/upgrade_utils/engine.py @ 50524:0935b9db21b6
upgrade: use StoreEntry object in upgrade
We will make more use of the API in the next changeset, but just moving to use
entry is a significant change for the engine codebase.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 15 May 2023 09:01:36 +0200 |
parents | 2eb7f0b5a499 |
children | 5f636e0fec4a |
comparison
equal
deleted
inserted
replaced
50523:2eb7f0b5a499 | 50524:0935b9db21b6 |
---|---|
45 replace=True, | 45 replace=True, |
46 ) | 46 ) |
47 return sidedatamod.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata) | 47 return sidedatamod.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata) |
48 | 48 |
49 | 49 |
50 def _revlogfrompath(repo, rl_type, path): | 50 def _revlog_from_store_entry(repo, entry): |
51 """Obtain a revlog from a repo path. | 51 """Obtain a revlog from a repo store entry. |
52 | 52 |
53 An instance of the appropriate class is returned. | 53 An instance of the appropriate class is returned. |
54 """ | 54 """ |
55 rl_type = entry.revlog_type | |
56 path = entry.unencoded_path | |
55 if rl_type & store.FILEFLAGS_CHANGELOG: | 57 if rl_type & store.FILEFLAGS_CHANGELOG: |
56 return changelog.changelog(repo.svfs) | 58 return changelog.changelog(repo.svfs) |
57 elif rl_type & store.FILEFLAGS_MANIFESTLOG: | 59 elif rl_type & store.FILEFLAGS_MANIFESTLOG: |
58 mandir = b'' | 60 mandir = b'' |
59 if b'/' in path: | 61 if b'/' in path: |
70 raise error.Abort(msg) | 72 raise error.Abort(msg) |
71 path = path_part[1] | 73 path = path_part[1] |
72 return filelog.filelog(repo.svfs, path) | 74 return filelog.filelog(repo.svfs, path) |
73 | 75 |
74 | 76 |
75 def _copyrevlog(tr, destrepo, oldrl, rl_type, unencodedname): | 77 def _copyrevlog(tr, destrepo, oldrl, entry): |
76 """copy all relevant files for `oldrl` into `destrepo` store | 78 """copy all relevant files for `oldrl` into `destrepo` store |
77 | 79 |
78 Files are copied "as is" without any transformation. The copy is performed | 80 Files are copied "as is" without any transformation. The copy is performed |
79 without extra checks. Callers are responsible for making sure the copied | 81 without extra checks. Callers are responsible for making sure the copied |
80 content is compatible with format of the destination repository. | 82 content is compatible with format of the destination repository. |
81 """ | 83 """ |
82 oldrl = getattr(oldrl, '_revlog', oldrl) | 84 oldrl = getattr(oldrl, '_revlog', oldrl) |
83 newrl = _revlogfrompath(destrepo, rl_type, unencodedname) | 85 newrl = _revlog_from_store_entry(destrepo, entry) |
84 newrl = getattr(newrl, '_revlog', newrl) | 86 newrl = getattr(newrl, '_revlog', newrl) |
85 | 87 |
86 oldvfs = oldrl.opener | 88 oldvfs = oldrl.opener |
87 newvfs = newrl.opener | 89 newvfs = newrl.opener |
88 oldindex = oldvfs.join(oldrl._indexfile) | 90 oldindex = oldvfs.join(oldrl._indexfile) |
96 util.copyfile(oldindex, newindex) | 98 util.copyfile(oldindex, newindex) |
97 copydata = oldrl.opener.exists(oldrl._datafile) | 99 copydata = oldrl.opener.exists(oldrl._datafile) |
98 if copydata: | 100 if copydata: |
99 util.copyfile(olddata, newdata) | 101 util.copyfile(olddata, newdata) |
100 | 102 |
101 if rl_type & store.FILEFLAGS_FILELOG: | 103 if entry.revlog_type & store.FILEFLAGS_FILELOG: |
104 unencodedname = entry.unencoded_path | |
102 destrepo.svfs.fncache.add(unencodedname) | 105 destrepo.svfs.fncache.add(unencodedname) |
103 if copydata: | 106 if copydata: |
104 destrepo.svfs.fncache.add(unencodedname[:-2] + b'.d') | 107 destrepo.svfs.fncache.add(unencodedname[:-2] + b'.d') |
105 | 108 |
106 | 109 |
131 def _perform_clone( | 134 def _perform_clone( |
132 ui, | 135 ui, |
133 dstrepo, | 136 dstrepo, |
134 tr, | 137 tr, |
135 old_revlog, | 138 old_revlog, |
136 rl_type, | 139 entry, |
137 unencoded, | |
138 upgrade_op, | 140 upgrade_op, |
139 sidedata_helpers, | 141 sidedata_helpers, |
140 oncopiedrevision, | 142 oncopiedrevision, |
141 ): | 143 ): |
142 """returns the new revlog object created""" | 144 """returns the new revlog object created""" |
143 newrl = None | 145 newrl = None |
144 if matchrevlog(upgrade_op.revlogs_to_process, rl_type): | 146 revlog_path = entry.unencoded_path |
147 if matchrevlog(upgrade_op.revlogs_to_process, entry.revlog_type): | |
145 ui.note( | 148 ui.note( |
146 _(b'cloning %d revisions from %s\n') % (len(old_revlog), unencoded) | 149 _(b'cloning %d revisions from %s\n') |
147 ) | 150 % (len(old_revlog), revlog_path) |
148 newrl = _revlogfrompath(dstrepo, rl_type, unencoded) | 151 ) |
152 newrl = _revlog_from_store_entry(dstrepo, entry) | |
149 old_revlog.clone( | 153 old_revlog.clone( |
150 tr, | 154 tr, |
151 newrl, | 155 newrl, |
152 addrevisioncb=oncopiedrevision, | 156 addrevisioncb=oncopiedrevision, |
153 deltareuse=upgrade_op.delta_reuse_mode, | 157 deltareuse=upgrade_op.delta_reuse_mode, |
154 forcedeltabothparents=upgrade_op.force_re_delta_both_parents, | 158 forcedeltabothparents=upgrade_op.force_re_delta_both_parents, |
155 sidedata_helpers=sidedata_helpers, | 159 sidedata_helpers=sidedata_helpers, |
156 ) | 160 ) |
157 else: | 161 else: |
158 msg = _(b'blindly copying %s containing %i revisions\n') | 162 msg = _(b'blindly copying %s containing %i revisions\n') |
159 ui.note(msg % (unencoded, len(old_revlog))) | 163 ui.note(msg % (revlog_path, len(old_revlog))) |
160 _copyrevlog(tr, dstrepo, old_revlog, rl_type, unencoded) | 164 _copyrevlog(tr, dstrepo, old_revlog, entry) |
161 | 165 |
162 newrl = _revlogfrompath(dstrepo, rl_type, unencoded) | 166 newrl = _revlog_from_store_entry(dstrepo, entry) |
163 return newrl | 167 return newrl |
164 | 168 |
165 | 169 |
166 def _clonerevlogs( | 170 def _clonerevlogs( |
167 ui, | 171 ui, |
201 # Perform a pass to collect metadata. This validates we can open all | 205 # Perform a pass to collect metadata. This validates we can open all |
202 # source files and allows a unified progress bar to be displayed. | 206 # source files and allows a unified progress bar to be displayed. |
203 for entry in alldatafiles: | 207 for entry in alldatafiles: |
204 if not (entry.is_revlog and entry.is_revlog_main): | 208 if not (entry.is_revlog and entry.is_revlog_main): |
205 continue | 209 continue |
206 unencoded = entry.unencoded_path | 210 |
207 | 211 rl = _revlog_from_store_entry(srcrepo, entry) |
208 rl = _revlogfrompath(srcrepo, entry.revlog_type, unencoded) | |
209 | 212 |
210 info = rl.storageinfo( | 213 info = rl.storageinfo( |
211 exclusivefiles=True, | 214 exclusivefiles=True, |
212 revisionscount=True, | 215 revisionscount=True, |
213 trackedsize=True, | 216 trackedsize=True, |
221 srcsize += datasize | 224 srcsize += datasize |
222 srcrawsize += rawsize | 225 srcrawsize += rawsize |
223 | 226 |
224 # This is for the separate progress bars. | 227 # This is for the separate progress bars. |
225 if entry.revlog_type & store.FILEFLAGS_CHANGELOG: | 228 if entry.revlog_type & store.FILEFLAGS_CHANGELOG: |
226 changelogs[unencoded] = entry.revlog_type | 229 changelogs[entry.target_id] = entry |
227 crevcount += len(rl) | 230 crevcount += len(rl) |
228 csrcsize += datasize | 231 csrcsize += datasize |
229 crawsize += rawsize | 232 crawsize += rawsize |
230 elif entry.revlog_type & store.FILEFLAGS_MANIFESTLOG: | 233 elif entry.revlog_type & store.FILEFLAGS_MANIFESTLOG: |
231 manifests[unencoded] = entry.revlog_type | 234 manifests[entry.target_id] = entry |
232 mcount += 1 | 235 mcount += 1 |
233 mrevcount += len(rl) | 236 mrevcount += len(rl) |
234 msrcsize += datasize | 237 msrcsize += datasize |
235 mrawsize += rawsize | 238 mrawsize += rawsize |
236 elif entry.revlog_type & store.FILEFLAGS_FILELOG: | 239 elif entry.revlog_type & store.FILEFLAGS_FILELOG: |
237 filelogs[unencoded] = entry.revlog_type | 240 filelogs[entry.target_id] = entry |
238 fcount += 1 | 241 fcount += 1 |
239 frevcount += len(rl) | 242 frevcount += len(rl) |
240 fsrcsize += datasize | 243 fsrcsize += datasize |
241 frawsize += rawsize | 244 frawsize += rawsize |
242 else: | 245 else: |
277 util.bytecount(fsrcsize), | 280 util.bytecount(fsrcsize), |
278 util.bytecount(frawsize), | 281 util.bytecount(frawsize), |
279 ) | 282 ) |
280 ) | 283 ) |
281 progress = srcrepo.ui.makeprogress(_(b'file revisions'), total=frevcount) | 284 progress = srcrepo.ui.makeprogress(_(b'file revisions'), total=frevcount) |
282 for unencoded, rl_type in sorted(filelogs.items()): | 285 for target_id, entry in sorted(filelogs.items()): |
283 oldrl = _revlogfrompath(srcrepo, rl_type, unencoded) | 286 oldrl = _revlog_from_store_entry(srcrepo, entry) |
284 | 287 |
285 newrl = _perform_clone( | 288 newrl = _perform_clone( |
286 ui, | 289 ui, |
287 dstrepo, | 290 dstrepo, |
288 tr, | 291 tr, |
289 oldrl, | 292 oldrl, |
290 rl_type, | 293 entry, |
291 unencoded, | |
292 upgrade_op, | 294 upgrade_op, |
293 sidedata_helpers, | 295 sidedata_helpers, |
294 oncopiedrevision, | 296 oncopiedrevision, |
295 ) | 297 ) |
296 info = newrl.storageinfo(storedsize=True) | 298 info = newrl.storageinfo(storedsize=True) |
319 if progress: | 321 if progress: |
320 progress.complete() | 322 progress.complete() |
321 progress = srcrepo.ui.makeprogress( | 323 progress = srcrepo.ui.makeprogress( |
322 _(b'manifest revisions'), total=mrevcount | 324 _(b'manifest revisions'), total=mrevcount |
323 ) | 325 ) |
324 for unencoded, rl_type in sorted(manifests.items()): | 326 for target_id, entry in sorted(manifests.items()): |
325 oldrl = _revlogfrompath(srcrepo, rl_type, unencoded) | 327 oldrl = _revlog_from_store_entry(srcrepo, entry) |
326 newrl = _perform_clone( | 328 newrl = _perform_clone( |
327 ui, | 329 ui, |
328 dstrepo, | 330 dstrepo, |
329 tr, | 331 tr, |
330 oldrl, | 332 oldrl, |
331 rl_type, | 333 entry, |
332 unencoded, | |
333 upgrade_op, | 334 upgrade_op, |
334 sidedata_helpers, | 335 sidedata_helpers, |
335 oncopiedrevision, | 336 oncopiedrevision, |
336 ) | 337 ) |
337 info = newrl.storageinfo(storedsize=True) | 338 info = newrl.storageinfo(storedsize=True) |
359 if progress: | 360 if progress: |
360 progress.complete() | 361 progress.complete() |
361 progress = srcrepo.ui.makeprogress( | 362 progress = srcrepo.ui.makeprogress( |
362 _(b'changelog revisions'), total=crevcount | 363 _(b'changelog revisions'), total=crevcount |
363 ) | 364 ) |
364 for unencoded, rl_type in sorted(changelogs.items()): | 365 for target_id, entry in sorted(changelogs.items()): |
365 oldrl = _revlogfrompath(srcrepo, rl_type, unencoded) | 366 oldrl = _revlog_from_store_entry(srcrepo, entry) |
366 newrl = _perform_clone( | 367 newrl = _perform_clone( |
367 ui, | 368 ui, |
368 dstrepo, | 369 dstrepo, |
369 tr, | 370 tr, |
370 oldrl, | 371 oldrl, |
371 rl_type, | 372 entry, |
372 unencoded, | |
373 upgrade_op, | 373 upgrade_op, |
374 sidedata_helpers, | 374 sidedata_helpers, |
375 oncopiedrevision, | 375 oncopiedrevision, |
376 ) | 376 ) |
377 info = newrl.storageinfo(storedsize=True) | 377 info = newrl.storageinfo(storedsize=True) |