[PATCH 4 of 8] upgrade: introduce a _copyrevlog method

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Aug 6 05:54:23 EDT 2019

On 8/6/19 4:33 AM, Gregory Szorc wrote:
> On Mon, Aug 5, 2019 at 9:55 AM Pierre-Yves David 
> <pierre-yves.david at ens-lyon.org <mailto:pierre-yves.david at ens-lyon.org>> 
> wrote:
>     # HG changeset patch
>     # User Pierre-Yves David <pierre-yves.david at octobus.net
>     <mailto:pierre-yves.david at octobus.net>>
>     # Date 1564509524 -7200
>     #      Tue Jul 30 19:58:44 2019 +0200
>     # Node ID 71edc0b44b7108cddee33d99f0ec586a0b0405c9
>     # Parent  aa19f478cfdfe781acc15cd26339644757156355
>     # EXP-Topic upgrade-select
>     # Available At https://bitbucket.org/octobus/mercurial-devel/
>     #              hg pull
>     https://bitbucket.org/octobus/mercurial-devel/ -r 71edc0b44b71
>     upgrade: introduce a _copyrevlog method
>     This function copies a revlog from the old store to the new one, without
>     re-adding all deltas manually. This will eventually save a lot of
>     time when some
>     revlog does not needs any conversions.
>     Code actually using this will be introduced in later changesets.
>     diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py
>     --- a/mercurial/upgrade.py
>     +++ b/mercurial/upgrade.py
>     @@ -533,6 +533,35 @@ def _revlogfrompath(repo, path):
>               #reverse of "/".join(("data", path + ".i"))
>               return filelog.filelog(repo.svfs, path[5:-2])
>     +def _copyrevlog(tr, destrepo, oldrl, unencodedname):
>     +    """copy all relevant files for `oldrl` into `destrepo` store
> I'd like to point out that low-level code like this is a violation of 
> storage abstractions. In this case, the upgrade code is making 
> assumptions about which revlogs exist and what they are named. The 
> proper way to implement this feature is to implement a `copystorage()` 
> method or some such on the per-primitive storage interfaces (changelog, 
> manifestlog, filelog, etc) and to have the upgrade code call it when 
> copying between compatible repo types.

I tried that route first, but I lacked access to a couple of important 
bit at the storage layer. So I took a simpler approach. (Not saying it 
is impossible, but that was not trivial when I tried)

> That being said, the storage interfaces aren't fully flushed out yet and 
> my recollection is the upgrade code is full of cases that assume 
> revlogs. So it is probably acceptable to take this technical debt until 
> we can devise a way to better handle repo upgrades in the storage 
> interfaces.

Yeah, the upgrade code is already assuming revlog all over the place, so 
it seems fine to add another one. For example `_revlogfrompath` has a 
similar logic than the matchrevlog function.

Pierre-Yves David

More information about the Mercurial-devel mailing list