diff --git a/mercurial/error.py b/mercurial/error.py --- a/mercurial/error.py +++ b/mercurial/error.py @@ -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): diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -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