changeset 42830:cf2b765cecd7

upgrade: add an argument to control manifest upgrade The argument can be used to only "clone" manifest revlog or clone all of them but this one. The selection will make more sense once we have a `--changelog` flag in the next changesets.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 30 Jul 2019 00:35:52 +0200
parents 853f70137437
children 908ff446590e
files mercurial/debugcommands.py mercurial/upgrade.py tests/test-completion.t tests/test-upgrade-repo.t
diffstat 4 files changed, 148 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/debugcommands.py	Fri Aug 30 18:11:41 2019 +0200
+++ b/mercurial/debugcommands.py	Tue Jul 30 00:35:52 2019 +0200
@@ -2848,8 +2848,9 @@
     ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')),
     ('', 'run', False, _('performs an upgrade')),
     ('', 'backup', True, _('keep the old repository content around')),
+    ('', 'manifest', None, _('select the manifest for upgrade')),
 ])
-def debugupgraderepo(ui, repo, run=False, optimize=None, backup=True):
+def debugupgraderepo(ui, repo, run=False, optimize=None, backup=True, **opts):
     """upgrade a repository to use different features
 
     If no arguments are specified, the repository is evaluated for upgrade
@@ -2867,9 +2868,15 @@
     rename some directories inside the ``.hg`` directory. On most machines, this
     should complete almost instantaneously and the chances of a consumer being
     unable to access the repository should be low.
+
+    By default, all revlog will be upgraded. You can restrict this using flag
+    such as `--manifest`:
+
+      * `--manifest`: only optimize the manifest
+      * `--no-manifest`: optimize all revlog but the manifest
     """
     return upgrade.upgraderepo(ui, repo, run=run, optimize=optimize,
-                               backup=backup)
+                               backup=backup, **opts)
 
 @command('debugwalk', cmdutil.walkopts, _('[OPTION]... [FILE]...'),
          inferrepo=True)
--- a/mercurial/upgrade.py	Fri Aug 30 18:11:41 2019 +0200
+++ b/mercurial/upgrade.py	Tue Jul 30 00:35:52 2019 +0200
@@ -864,13 +864,31 @@
 
     return backuppath
 
-def upgraderepo(ui, repo, run=False, optimize=None, backup=True):
+def upgraderepo(ui, repo, run=False, optimize=None, backup=True,
+                manifest=None):
     """Upgrade a repository in place."""
     if optimize is None:
         optimize = []
     optimize = set(legacy_opts_map.get(o, o) for o in optimize)
     repo = repo.unfiltered()
 
+    revlogs = set(UPGRADE_ALL_REVLOGS)
+    specentries = (('m', manifest),)
+    specified = [(y, x) for (y, x) in specentries if x is not None]
+    if specified:
+        # we have some limitation on revlogs to be recloned
+        if any(x for y, x in specified):
+            revlogs = set()
+            for r, enabled in specified:
+                if enabled:
+                    if r == 'm':
+                        revlogs.add(UPGRADE_MANIFEST)
+        else:
+            # none are enabled
+            for r, __ in specified:
+                if r == 'm':
+                    revlogs.discard(UPGRADE_MANIFEST)
+
     # Ensure the repository can be upgraded.
     missingreqs = requiredsourcerequirements(repo) - repo.requirements
     if missingreqs:
@@ -1020,7 +1038,7 @@
 
             with dstrepo.wlock(), dstrepo.lock():
                 backuppath = _upgraderepo(ui, repo, dstrepo, newreqs,
-                                          upgradeactions)
+                                          upgradeactions, revlogs=revlogs)
             if not (backup or backuppath is None):
                 ui.write(_('removing old repository content%s\n') % backuppath)
                 repo.vfs.rmtree(backuppath, forcibly=True)
--- a/tests/test-completion.t	Fri Aug 30 18:11:41 2019 +0200
+++ b/tests/test-completion.t	Tue Jul 30 00:35:52 2019 +0200
@@ -312,7 +312,7 @@
   debuguigetpass: prompt
   debuguiprompt: prompt
   debugupdatecaches: 
-  debugupgraderepo: optimize, run, backup
+  debugupgraderepo: optimize, run, backup, manifest
   debugwalk: include, exclude
   debugwhyunstable: 
   debugwireargs: three, four, five, ssh, remotecmd, insecure
--- a/tests/test-upgrade-repo.t	Fri Aug 30 18:11:41 2019 +0200
+++ b/tests/test-upgrade-repo.t	Tue Jul 30 00:35:52 2019 +0200
@@ -518,9 +518,126 @@
   removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob)
   $ ls -1 .hg/ | grep upgradebackup
   [1]
+
+We can restrict optimization to some revlog:
+
+  $ hg debugupgrade --optimize re-delta-parent --run --manifest --no-backup --debug --traceback
+  upgrade will perform the following actions:
+  
+  requirements
+     preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store
+  
+  re-delta-parent
+     deltas within internal storage will choose a new base revision if needed
+  
+  beginning upgrade...
+  repository locked and read-only
+  creating temporary repository to stage migrated data: $TESTTMP/upgradegd/.hg/upgrade.* (glob)
+  (it is safe to interrupt this process any time before data migration completes)
+  migrating 9 total revisions (3 in filelogs, 3 in manifests, 3 in changelog)
+  migrating 917 bytes in store; 401 bytes tracked data
+  migrating 3 filelogs containing 3 revisions (192 bytes in store; 0 bytes tracked data)
+  blindly copying data/f0.i containing 1 revisions
+  blindly copying data/f1.i containing 1 revisions
+  blindly copying data/f2.i containing 1 revisions
+  finished migrating 3 filelog revisions across 3 filelogs; change in size: 0 bytes
+  migrating 1 manifests containing 3 revisions (349 bytes in store; 220 bytes tracked data)
+  cloning 3 revisions from 00manifest.i
+  finished migrating 3 manifest revisions across 1 manifests; change in size: 0 bytes
+  migrating changelog containing 3 revisions (376 bytes in store; 181 bytes tracked data)
+  blindly copying 00changelog.i containing 3 revisions
+  finished migrating 3 changelog revisions; change in size: 0 bytes
+  finished migrating 9 total revisions; total change in store size: 0 bytes
+  copying phaseroots
+  data fully migrated to temporary repository
+  marking source repository as being upgraded; clients will be unable to read from repository
+  starting in-place swap of repository data
+  replaced files will be backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob)
+  replacing store...
+  store replacement complete; repository was inconsistent for *s (glob)
+  finalizing requirements file and making repository readable again
+  removing old repository content$TESTTMP/upgradegd/.hg/upgradebackup.* (glob)
+  removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob)
+
+Check that the repo still works fine
+
+  $ hg log -G --patch
+  @  changeset:   2:b5a3b78015e5
+  |  tag:         tip
+  |  parent:      0:ba592bf28da2
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add f2
+  |
+  |
+  | o  changeset:   1:da8c0fc4833c
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     add f1
+  |
+  |
+  o  changeset:   0:ba592bf28da2
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     initial
+  
+  
+
+  $ hg verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  checked 3 changesets with 3 changes to 3 files
+
+Check we can select negatively
+
+  $ hg debugupgrade --optimize re-delta-parent --run --no-manifest --no-backup --debug --traceback
+  upgrade will perform the following actions:
+  
+  requirements
+     preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store
+  
+  re-delta-parent
+     deltas within internal storage will choose a new base revision if needed
+  
+  beginning upgrade...
+  repository locked and read-only
+  creating temporary repository to stage migrated data: $TESTTMP/upgradegd/.hg/upgrade.* (glob)
+  (it is safe to interrupt this process any time before data migration completes)
+  migrating 9 total revisions (3 in filelogs, 3 in manifests, 3 in changelog)
+  migrating 917 bytes in store; 401 bytes tracked data
+  migrating 3 filelogs containing 3 revisions (192 bytes in store; 0 bytes tracked data)
+  cloning 1 revisions from data/f0.i
+  cloning 1 revisions from data/f1.i
+  cloning 1 revisions from data/f2.i
+  finished migrating 3 filelog revisions across 3 filelogs; change in size: 0 bytes
+  migrating 1 manifests containing 3 revisions (349 bytes in store; 220 bytes tracked data)
+  blindly copying 00manifest.i containing 3 revisions
+  finished migrating 3 manifest revisions across 1 manifests; change in size: 0 bytes
+  migrating changelog containing 3 revisions (376 bytes in store; 181 bytes tracked data)
+  cloning 3 revisions from 00changelog.i
+  finished migrating 3 changelog revisions; change in size: 0 bytes
+  finished migrating 9 total revisions; total change in store size: 0 bytes
+  copying phaseroots
+  data fully migrated to temporary repository
+  marking source repository as being upgraded; clients will be unable to read from repository
+  starting in-place swap of repository data
+  replaced files will be backed up at $TESTTMP/upgradegd/.hg/upgradebackup.* (glob)
+  replacing store...
+  store replacement complete; repository was inconsistent for *s (glob)
+  finalizing requirements file and making repository readable again
+  removing old repository content$TESTTMP/upgradegd/.hg/upgradebackup.* (glob)
+  removing temporary repository $TESTTMP/upgradegd/.hg/upgrade.* (glob)
+  $ hg verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  checked 3 changesets with 3 changes to 3 files
+
   $ cd ..
 
-
 store files with special filenames aren't encoded during copy
 
   $ hg init store-filenames