mercurial/upgrade.py
changeset 46335 25be21ec6c65
parent 46330 02f3badf9011
child 46333 2eb5fe13461b
--- a/mercurial/upgrade.py	Thu Jan 14 21:34:12 2021 +0530
+++ b/mercurial/upgrade.py	Mon Jan 18 21:37:20 2021 +0530
@@ -241,7 +241,9 @@
             upgrade_op.print_post_op_messages()
 
 
-def upgrade_share_to_safe(ui, hgvfs, storevfs, current_requirements):
+def upgrade_share_to_safe(
+    ui, hgvfs, storevfs, current_requirements, mismatch_config
+):
     """Upgrades a share to use share-safe mechanism"""
     wlock = None
     store_requirements = localrepo._readrequires(storevfs, False)
@@ -253,6 +255,10 @@
     # add share-safe requirement as it will mark the share as share-safe
     diffrequires.add(requirementsmod.SHARESAFE_REQUIREMENT)
     current_requirements.add(requirementsmod.SHARESAFE_REQUIREMENT)
+    # in `allow` case, we don't try to upgrade, we just respect the source
+    # state, update requirements and continue
+    if mismatch_config == b'allow':
+        return
     try:
         wlock = lockmod.trylock(ui, hgvfs, b'wlock', 0, 0)
         # some process might change the requirement in between, re-read
@@ -271,7 +277,7 @@
         scmutil.writerequires(hgvfs, diffrequires)
         ui.warn(_(b'repository upgraded to use share-safe mode\n'))
     except error.LockError as e:
-        if ui.configbool(b'experimental', b'sharesafe-auto-upgrade-fail-error'):
+        if mismatch_config == b'upgrade-abort':
             raise error.Abort(
                 _(b'failed to upgrade share, got error: %s')
                 % stringutil.forcebytestr(e.strerror)
@@ -291,6 +297,7 @@
     hgvfs,
     sharedvfs,
     current_requirements,
+    mismatch_config,
 ):
     """Downgrades a share which use share-safe to not use it"""
     wlock = None
@@ -302,6 +309,8 @@
     source_requirements -= requirementsmod.WORKING_DIR_REQUIREMENTS
     current_requirements |= source_requirements
     current_requirements.remove(requirementsmod.SHARESAFE_REQUIREMENT)
+    if mismatch_config == b'allow':
+        return
 
     try:
         wlock = lockmod.trylock(ui, hgvfs, b'wlock', 0, 0)
@@ -319,12 +328,13 @@
         scmutil.writerequires(hgvfs, current_requirements)
         ui.warn(_(b'repository downgraded to not use share-safe mode\n'))
     except error.LockError as e:
-        # raise error right away because if downgrade failed, we cannot load
-        # the repository because it does not have complete set of requirements
-        raise error.Abort(
-            _(b'failed to downgrade share, got error: %s')
-            % stringutil.forcebytestr(e.strerror)
-        )
+        # If upgrade-abort is set, abort when upgrade fails, else let the
+        # process continue as `upgrade-allow` is set
+        if mismatch_config == b'downgrade-abort':
+            raise error.Abort(
+                _(b'failed to downgrade share, got error: %s')
+                % stringutil.forcebytestr(e.strerror)
+            )
     finally:
         if wlock:
             wlock.release()