diff mercurial/upgrade.py @ 42832:a3c2ffcd266f

upgrade: make sure we reclone all revlogs when updating to some format Adding or removing some requirement (eg: sparserevlog), requires to reclone revlog to use the new format. We cannot simply copy the original files. In this case, we issue a warning to proceed with clone every revlogs.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 05 Aug 2019 17:25:24 +0200
parents 908ff446590e
children bb6902cbbe23
line wrap: on
line diff
--- a/mercurial/upgrade.py	Tue Jul 30 17:25:16 2019 +0200
+++ b/mercurial/upgrade.py	Mon Aug 05 17:25:24 2019 +0200
@@ -28,6 +28,12 @@
     compression,
 )
 
+# list of requirements that request a clone of all revlog if added/removed
+RECLONES_REQUIREMENTS = {
+    'generaldelta',
+    localrepo.SPARSEREVLOG_REQUIREMENT,
+}
+
 def requiredsourcerequirements(repo):
     """Obtain requirements required to be present to upgrade a repo.
 
@@ -952,6 +958,17 @@
                    # determineactions could have added optimisation
                    if o not in actions)
 
+    removedreqs = repo.requirements - newreqs
+    addedreqs = newreqs - repo.requirements
+
+    if revlogs != UPGRADE_ALL_REVLOGS:
+        incompatible = RECLONES_REQUIREMENTS & (removedreqs | addedreqs)
+        if incompatible:
+            msg = _('ignoring revlogs selection flags, format requirements '
+                    'change: %s\n')
+            ui.warn(msg % ', '.join(sorted(incompatible)))
+            revlogs = UPGRADE_ALL_REVLOGS
+
     def printrequirements():
         ui.write(_('requirements\n'))
         ui.write(_('   preserved: %s\n') %