changeset 47291:d9c71bbe20f7

errors: make InterventionRequired subclass Abort The docstring for `Abort` says that it's for errors raised by commands and `InterventionRequired` is definitely something raised by commands, so it seems that it should be an `Abort`. This patch makes it so. It adds a `coarse_exit_code` (in addition to the already existing `detailed_exit_code`) to `Abort` to achieve that, since `InterventionRequired` should result in a special exit code even when the `ui.detailed-exit-code` config is not set. Differential Revision: https://phab.mercurial-scm.org/D10737
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 18 May 2021 22:07:16 -0700
parents 5e736d2e9703
children 5a75be916316
files mercurial/error.py mercurial/scmutil.py
diffstat 2 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/error.py	Tue May 18 21:58:12 2021 -0700
+++ b/mercurial/error.py	Tue May 18 22:07:16 2021 -0700
@@ -54,10 +54,13 @@
 class Abort(Hint, Exception):
     """Raised if a command needs to print an error and exit."""
 
-    def __init__(self, message, hint=None, detailed_exit_code=None):
+    def __init__(
+        self, message, hint=None, coarse_exit_code=None, detailed_exit_code=None
+    ):
         # type: (bytes, Optional[bytes]) -> None
         self.message = message
         self.hint = hint
+        self.coarse_exit_code = coarse_exit_code
         self.detailed_exit_code = detailed_exit_code
         # Pass the message into the Exception constructor to help extensions
         # that look for exc.args[0].
@@ -192,10 +195,22 @@
     __bytes__ = _tobytes
 
 
-class InterventionRequired(Hint, Exception):
+class InterventionRequired(Abort):
     """Exception raised when a command requires human intervention."""
 
-    __bytes__ = _tobytes
+    def __init__(self, message, hint=None):
+        super(InterventionRequired, self).__init__(
+            message, hint=hint, coarse_exit_code=1, detailed_exit_code=240
+        )
+
+    def format(self):
+        # type: () -> bytes
+        from .i18n import _
+
+        message = _(b"%s\n") % self.message
+        if self.hint:
+            message += _(b"(%s)\n") % self.hint
+        return message
 
 
 class ConflictResolutionRequired(InterventionRequired):
--- a/mercurial/scmutil.py	Tue May 18 21:58:12 2021 -0700
+++ b/mercurial/scmutil.py	Tue May 18 22:07:16 2021 -0700
@@ -203,17 +203,13 @@
         if inst.hint:
             ui.error(_(b"(%s)\n") % inst.hint)
         detailed_exit_code = 50
-    except error.InterventionRequired as inst:
-        ui.error(b"%s\n" % inst)
-        if inst.hint:
-            ui.error(_(b"(%s)\n") % inst.hint)
-        detailed_exit_code = 240
-        coarse_exit_code = 1
     except error.WdirUnsupported:
         ui.error(_(b"abort: working directory revision cannot be specified\n"))
     except error.Abort as inst:
         if inst.detailed_exit_code is not None:
             detailed_exit_code = inst.detailed_exit_code
+        if inst.coarse_exit_code is not None:
+            coarse_exit_code = inst.coarse_exit_code
         ui.error(inst.format())
     except error.WorkerError as inst:
         # Don't print a message -- the worker already should have