<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Aug 5, 2019 at 10:04 AM Pierre-Yves David <<a href="mailto:pierre-yves.david@ens-lyon.org">pierre-yves.david@ens-lyon.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"># HG changeset patch<br>
# User Pierre-Yves David <<a href="mailto:pierre-yves.david@octobus.net" target="_blank">pierre-yves.david@octobus.net</a>><br>
# Date 1564439752 -7200<br>
#      Tue Jul 30 00:35:52 2019 +0200<br>
# Node ID 909da55a9517693f2911793272e03cb7f108cfaf<br>
# Parent  5b8a0d3b7596be28a31faac4ffc499da46c0b62e<br>
# EXP-Topic upgrade-select<br>
# Available At <a href="https://bitbucket.org/octobus/mercurial-devel/" rel="noreferrer" target="_blank">https://bitbucket.org/octobus/mercurial-devel/</a><br>
#              hg pull <a href="https://bitbucket.org/octobus/mercurial-devel/" rel="noreferrer" target="_blank">https://bitbucket.org/octobus/mercurial-devel/</a> -r 909da55a9517<br>
upgrade: add an argument to control manifest upgrade<br></blockquote><div><br></div><div>Before we land this and the next commit, I'd like you to think about:</div><div><br></div><div>1) Filelog support. If we have a flag for manifests and changelogs, shouldn't there be one for files?</div><div>2) How the presence of multiple flags interacts. Assuming we add a flag to control files, what happens when you supply --manifest --changelog or --no-manifest --no-changelog? Does that behavior make sense?</div><div>3) How do we extend this selection to other storage primitives? Do we need to keep adding arguments for each storage primitive type?</div><div><br></div><div>I haven't thought this one through, but I have a suspicion that once someone does, we'll decide that having arguments named after actions and taking nouns will be the most scalable solution. e.g. --include manifest --exclude changeset --exclude files. (If you go this route please do not use include/exclude as we may want to reserve those for specifying a fileset of files to upgrade, like many other commands.)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
The argument can be used to only "clone" manifest revlog or clone all of them<br>
but this one. The selection will make more sense once we have a `--changelog`<br>
flag in the next changesets.<br>
<br>
diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py<br>
--- a/mercurial/debugcommands.py<br>
+++ b/mercurial/debugcommands.py<br>
@@ -2848,8 +2848,9 @@ def debugupdatecaches(ui, repo, *pats, *<br>
     ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')),<br>
     ('', 'run', False, _('performs an upgrade')),<br>
     ('', 'backup', True, _('keep the old repository content around')),<br>
+    ('', 'manifest', None, _('select the manifest for upgrade')),<br>
 ])<br>
-def debugupgraderepo(ui, repo, run=False, optimize=None, backup=True):<br>
+def debugupgraderepo(ui, repo, run=False, optimize=None, backup=True, **opts):<br>
     """upgrade a repository to use different features<br>
<br>
     If no arguments are specified, the repository is evaluated for upgrade<br>
@@ -2867,9 +2868,15 @@ def debugupgraderepo(ui, repo, run=False<br>
     rename some directories inside the ``.hg`` directory. On most machines, this<br>
     should complete almost instantaneously and the chances of a consumer being<br>
     unable to access the repository should be low.<br>
+<br>
+    By default, all revlog will be upgraded. You can restrict this using flag<br>
+    such as `--manifest`:<br>
+<br>
+      * `--manifest`: only optimize the manifest<br>
+      * `--no-manifest`: optimize all revlog but the manifest<br>
     """<br>
     return upgrade.upgraderepo(ui, repo, run=run, optimize=optimize,<br>
-                               backup=backup)<br>
+                               backup=backup, **opts)<br>
<br>
 @command('debugwalk', cmdutil.walkopts, _('[OPTION]... [FILE]...'),<br>
          inferrepo=True)<br>
diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py<br>
--- a/mercurial/upgrade.py<br>
+++ b/mercurial/upgrade.py<br>
@@ -866,13 +866,32 @@ def _upgraderepo(ui, srcrepo, dstrepo, r<br>
<br>
     return backuppath<br>
<br>
-def upgraderepo(ui, repo, run=False, optimize=None, backup=True):<br>
+def upgraderepo(ui, repo, run=False, optimize=None, backup=True,<br>
+                manifest=None):<br>
     """Upgrade a repository in place."""<br>
     if optimize is None:<br>
         optimize = []<br>
     optimize = set(legacy_opts_map.get(o, o) for o in optimize)<br>
     repo = repo.unfiltered()<br>
<br>
+    revlogs = set(UPGRADE_ALL_REVLOGS)<br>
+    specentries = (('m', manifest),)<br>
+    specified = [(y, x) for (y, x) in specentries if x is not None]<br>
+    if specified:<br>
+        # we have some limitation on revlogs to be recloned<br>
+        if any(x for y, x in specified):<br>
+            revlogs = set()<br>
+            for r, enabled in specified:<br>
+                if enabled:<br>
+                    if r == 'm':<br>
+                        revlogs.add(UPGRADE_MANIFEST)<br>
+        else:<br>
+            # none are enabled<br>
+            for r, __ in specified:<br>
+                if r == 'm':<br>
+                    revlogs.discard(UPGRADE_MANIFEST)<br>
+<br>
+<br>
     # Ensure the repository can be upgraded.<br>
     missingreqs = requiredsourcerequirements(repo) - repo.requirements<br>
     if missingreqs:<br>
@@ -1022,7 +1041,7 @@ def upgraderepo(ui, repo, run=False, opt<br>
<br>
             with dstrepo.wlock(), dstrepo.lock():<br>
                 backuppath = _upgraderepo(ui, repo, dstrepo, newreqs,<br>
-                                          upgradeactions)<br>
+                                          upgradeactions, revlogs=revlogs)<br>
             if not (backup or backuppath is None):<br>
                 ui.write(_('removing old repository content%s\n') % backuppath)<br>
                 repo.vfs.rmtree(backuppath, forcibly=True)<br>
diff --git a/tests/test-completion.t b/tests/test-completion.t<br>
--- a/tests/test-completion.t<br>
+++ b/tests/test-completion.t<br>
@@ -312,7 +312,7 @@ Show all commands + options<br>
   debuguigetpass: prompt<br>
   debuguiprompt: prompt<br>
   debugupdatecaches: <br>
-  debugupgraderepo: optimize, run, backup<br>
+  debugupgraderepo: optimize, run, backup, manifest<br>
   debugwalk: include, exclude<br>
   debugwhyunstable: <br>
   debugwireargs: three, four, five, ssh, remotecmd, insecure<br>
diff --git a/tests/test-upgrade-repo.t b/tests/test-upgrade-repo.t<br>
--- a/tests/test-upgrade-repo.t<br>
+++ b/tests/test-upgrade-repo.t<br>
@@ -518,9 +518,126 @@ unless --no-backup is passed<br>
   removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob)<br>
   $ ls -1 .hg/ | grep upgradebackup<br>
   [1]<br>
+<br>
+We can restrict optimization to some revlog:<br>
+<br>
+  $ hg debugupgrade --optimize re-delta-parent --run --manifest --no-backup --debug --traceback<br>
+  upgrade will perform the following actions:<br>
+  <br>
+  requirements<br>
+     preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store<br>
+  <br>
+  re-delta-parent<br>
+     deltas within internal storage will choose a new base revision if needed<br>
+  <br>
+  beginning upgrade...<br>
+  repository locked and read-only<br>
+  creating temporary repository to stage migrated data: $TESTTMP/upgradegd/.hg/upgrade.* (glob)<br>
+  (it is safe to interrupt this process any time before data migration completes)<br>
+  migrating 9 total revisions (3 in filelogs, 3 in manifests, 3 in changelog)<br>
+  migrating 917 bytes in store; 401 bytes tracked data<br>
+  migrating 3 filelogs containing 3 revisions (192 bytes in store; 0 bytes tracked data)<br>
+  blindly copying data/f0.i containing 1 revisions<br>
+  blindly copying data/f1.i containing 1 revisions<br>
+  blindly copying data/f2.i containing 1 revisions<br>
+  finished migrating 3 filelog revisions across 3 filelogs; change in size: 0 bytes<br>
+  migrating 1 manifests containing 3 revisions (349 bytes in store; 220 bytes tracked data)<br>
+  cloning 3 revisions from 00manifest.i<br>
+  finished migrating 3 manifest revisions across 1 manifests; change in size: 0 bytes<br>
+  migrating changelog containing 3 revisions (376 bytes in store; 181 bytes tracked data)<br>
+  blindly copying 00changelog.i containing 3 revisions<br>
+  finished migrating 3 changelog revisions; change in size: 0 bytes<br>
+  finished migrating 9 total revisions; total change in store size: 0 bytes<br>
+  copying phaseroots<br>
+  data fully migrated to temporary repository<br>
+  marking source repository as being upgraded; clients will be unable to read from repository<br>
+  starting in-place swap of repository data<br>
+  replaced files will be backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob)<br>
+  replacing store...<br>
+  store replacement complete; repository was inconsistent for *s (glob)<br>
+  finalizing requirements file and making repository readable again<br>
+  removing old repository content$TESTTMP/upgradegd/.hg/upgradebackup.* (glob)<br>
+  removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob)<br>
+<br>
+Check that the repo still works fine<br>
+<br>
+  $ hg log -G --patch<br>
+  @  changeset:   2:b5a3b78015e5<br>
+  |  tag:         tip<br>
+  |  parent:      0:ba592bf28da2<br>
+  |  user:        test<br>
+  |  date:        Thu Jan 01 00:00:00 1970 +0000<br>
+  |  summary:     add f2<br>
+  |<br>
+  |<br>
+  | o  changeset:   1:da8c0fc4833c<br>
+  |/   user:        test<br>
+  |    date:        Thu Jan 01 00:00:00 1970 +0000<br>
+  |    summary:     add f1<br>
+  |<br>
+  |<br>
+  o  changeset:   0:ba592bf28da2<br>
+     user:        test<br>
+     date:        Thu Jan 01 00:00:00 1970 +0000<br>
+     summary:     initial<br>
+  <br>
+  <br>
+<br>
+  $ hg verify<br>
+  checking changesets<br>
+  checking manifests<br>
+  crosschecking files in changesets and manifests<br>
+  checking files<br>
+  checked 3 changesets with 3 changes to 3 files<br>
+<br>
+Check we can select negatively<br>
+<br>
+  $ hg debugupgrade --optimize re-delta-parent --run --no-manifest --no-backup --debug --traceback<br>
+  upgrade will perform the following actions:<br>
+  <br>
+  requirements<br>
+     preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store<br>
+  <br>
+  re-delta-parent<br>
+     deltas within internal storage will choose a new base revision if needed<br>
+  <br>
+  beginning upgrade...<br>
+  repository locked and read-only<br>
+  creating temporary repository to stage migrated data: $TESTTMP/upgradegd/.hg/upgrade.* (glob)<br>
+  (it is safe to interrupt this process any time before data migration completes)<br>
+  migrating 9 total revisions (3 in filelogs, 3 in manifests, 3 in changelog)<br>
+  migrating 917 bytes in store; 401 bytes tracked data<br>
+  migrating 3 filelogs containing 3 revisions (192 bytes in store; 0 bytes tracked data)<br>
+  cloning 1 revisions from data/f0.i<br>
+  cloning 1 revisions from data/f1.i<br>
+  cloning 1 revisions from data/f2.i<br>
+  finished migrating 3 filelog revisions across 3 filelogs; change in size: 0 bytes<br>
+  migrating 1 manifests containing 3 revisions (349 bytes in store; 220 bytes tracked data)<br>
+  blindly copying 00manifest.i containing 3 revisions<br>
+  finished migrating 3 manifest revisions across 1 manifests; change in size: 0 bytes<br>
+  migrating changelog containing 3 revisions (376 bytes in store; 181 bytes tracked data)<br>
+  cloning 3 revisions from 00changelog.i<br>
+  finished migrating 3 changelog revisions; change in size: 0 bytes<br>
+  finished migrating 9 total revisions; total change in store size: 0 bytes<br>
+  copying phaseroots<br>
+  data fully migrated to temporary repository<br>
+  marking source repository as being upgraded; clients will be unable to read from repository<br>
+  starting in-place swap of repository data<br>
+  replaced files will be backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob)<br>
+  replacing store...<br>
+  store replacement complete; repository was inconsistent for *s (glob)<br>
+  finalizing requirements file and making repository readable again<br>
+  removing old repository content$TESTTMP/upgradegd/.hg/upgradebackup.* (glob)<br>
+  removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob)<br>
+  $ hg verify<br>
+  checking changesets<br>
+  checking manifests<br>
+  crosschecking files in changesets and manifests<br>
+  checking files<br>
+  checked 3 changesets with 3 changes to 3 files<br>
+<br>
   $ cd ..<br>
<br>
-<br>
 store files with special filenames aren't encoded during copy<br>
<br>
   $ hg init store-filenames<br>
_______________________________________________<br>
Mercurial-devel mailing list<br>
<a href="mailto:Mercurial-devel@mercurial-scm.org" target="_blank">Mercurial-devel@mercurial-scm.org</a><br>
<a href="https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel" rel="noreferrer" target="_blank">https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel</a><br>
</blockquote></div></div>