Mercurial > hg-stable
changeset 50657: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 | 9b0fe2b075b5 |
children | 3ea3767c23a4 |
files | mercurial/store.py mercurial/upgrade_utils/engine.py |
diffstat | 2 files changed, 23 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/store.py Mon May 29 02:22:20 2023 +0200 +++ b/mercurial/store.py Sat May 27 04:01:17 2023 +0200 @@ -19,6 +19,7 @@ from . import ( changelog, error, + filelog, manifest, policy, pycompat, @@ -545,6 +546,21 @@ files.append(StoreFile(unencoded_path=path, **data)) return files + def get_revlog_instance(self, repo): + """Obtain a revlog instance from this store entry + + An instance of the appropriate class is returned. + """ + if self.is_changelog: + return changelog.changelog(repo.svfs) + elif self.is_manifestlog: + mandir = self.target_id.rstrip(b'/') + return manifest.manifestrevlog( + repo.nodeconstants, repo.svfs, tree=mandir + ) + else: + return filelog.filelog(repo.svfs, self.target_id) + @attr.s(slots=True) class StoreFile:
--- a/mercurial/upgrade_utils/engine.py Mon May 29 02:22:20 2023 +0200 +++ b/mercurial/upgrade_utils/engine.py Sat May 27 04:01:17 2023 +0200 @@ -11,10 +11,7 @@ from ..i18n import _ from ..pycompat import getattr from .. import ( - changelog, error, - filelog, - manifest, metadata, pycompat, requirements, @@ -47,22 +44,6 @@ return sidedatamod.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata) -def _revlog_from_store_entry(repo, entry): - """Obtain a revlog from a repo store entry. - - An instance of the appropriate class is returned. - """ - if entry.is_changelog: - return changelog.changelog(repo.svfs) - elif entry.is_manifestlog: - mandir = entry.target_id.rstrip(b'/') - return manifest.manifestrevlog( - repo.nodeconstants, repo.svfs, tree=mandir - ) - else: - return filelog.filelog(repo.svfs, entry.target_id) - - def _copyrevlog(tr, destrepo, oldrl, entry): """copy all relevant files for `oldrl` into `destrepo` store @@ -71,7 +52,7 @@ content is compatible with format of the destination repository. """ oldrl = getattr(oldrl, '_revlog', oldrl) - newrl = _revlog_from_store_entry(destrepo, entry) + newrl = entry.get_revlog_instance(destrepo) newrl = getattr(newrl, '_revlog', newrl) oldvfs = oldrl.opener @@ -138,7 +119,7 @@ _(b'cloning %d revisions from %s\n') % (len(old_revlog), revlog_path) ) - newrl = _revlog_from_store_entry(dstrepo, entry) + newrl = entry.get_revlog_instance(dstrepo) old_revlog.clone( tr, newrl, @@ -152,7 +133,7 @@ ui.note(msg % (revlog_path, len(old_revlog))) _copyrevlog(tr, dstrepo, old_revlog, entry) - newrl = _revlog_from_store_entry(dstrepo, entry) + newrl = entry.get_revlog_instance(dstrepo) return newrl @@ -197,7 +178,7 @@ if not entry.is_revlog: continue - rl = _revlog_from_store_entry(srcrepo, entry) + rl = entry.get_revlog_instance(srcrepo) info = rl.storageinfo( exclusivefiles=True, @@ -272,7 +253,7 @@ ) progress = srcrepo.ui.makeprogress(_(b'file revisions'), total=frevcount) for target_id, entry in sorted(filelogs.items()): - oldrl = _revlog_from_store_entry(srcrepo, entry) + oldrl = entry.get_revlog_instance(srcrepo) newrl = _perform_clone( ui, @@ -313,7 +294,7 @@ _(b'manifest revisions'), total=mrevcount ) for target_id, entry in sorted(manifests.items()): - oldrl = _revlog_from_store_entry(srcrepo, entry) + oldrl = entry.get_revlog_instance(srcrepo) newrl = _perform_clone( ui, dstrepo, @@ -352,7 +333,7 @@ _(b'changelog revisions'), total=crevcount ) for target_id, entry in sorted(changelogs.items()): - oldrl = _revlog_from_store_entry(srcrepo, entry) + oldrl = entry.get_revlog_instance(srcrepo) newrl = _perform_clone( ui, dstrepo,