dispatch: making all hg abortions be output with a specific label
This allows abortions to be highlighted specially and separately
from warnings - for instance, red is a reasonable color for when hg
aborts, but is overly dramatic for most warnings produced elsewhere.
Differential Revision: https://phab.mercurial-scm.org/D3967
--- a/mercurial/color.py Thu Jul 19 15:21:28 2018 -0400
+++ b/mercurial/color.py Thu Jul 19 23:22:05 2018 -0700
@@ -117,6 +117,7 @@
'formatvariant.config.default': 'green',
'formatvariant.default': '',
'histedit.remaining': 'red bold',
+ 'ui.error': 'red',
'ui.prompt': 'yellow',
'log.changeset': 'yellow',
'patchbomb.finalsummary': '',
--- a/mercurial/commandserver.py Thu Jul 19 15:21:28 2018 -0400
+++ b/mercurial/commandserver.py Thu Jul 19 23:22:05 2018 -0700
@@ -353,7 +353,7 @@
# handle exceptions that may be raised by command server. most of
# known exceptions are caught by dispatch.
except error.Abort as inst:
- ui.warn(_('abort: %s\n') % inst)
+ ui.error(_('abort: %s\n') % inst)
except IOError as inst:
if inst.errno != errno.EPIPE:
raise
--- a/mercurial/dispatch.py Thu Jul 19 15:21:28 2018 -0400
+++ b/mercurial/dispatch.py Thu Jul 19 23:22:05 2018 -0700
@@ -212,9 +212,9 @@
try:
ret = _runcatch(req) or 0
except error.ProgrammingError as inst:
- req.ui.warn(_('** ProgrammingError: %s\n') % inst)
+ req.ui.error(_('** ProgrammingError: %s\n') % inst)
if inst.hint:
- req.ui.warn(_('** (%s)\n') % inst.hint)
+ req.ui.error(_('** (%s)\n') % inst.hint)
raise
except KeyboardInterrupt as inst:
try:
@@ -222,7 +222,7 @@
msg = _("killed!\n")
else:
msg = _("interrupted!\n")
- req.ui.warn(msg)
+ req.ui.error(msg)
except error.SignalInterrupt:
# maybe pager would quit without consuming all the output, and
# SIGPIPE was raised. we cannot print anything in this case.
--- a/mercurial/scmutil.py Thu Jul 19 15:21:28 2018 -0400
+++ b/mercurial/scmutil.py Thu Jul 19 23:22:05 2018 -0700
@@ -169,64 +169,64 @@
reason = _('timed out waiting for lock held by %r') % inst.locker
else:
reason = _('lock held by %r') % inst.locker
- ui.warn(_("abort: %s: %s\n")
- % (inst.desc or stringutil.forcebytestr(inst.filename), reason))
+ ui.error(_("abort: %s: %s\n") % (
+ inst.desc or stringutil.forcebytestr(inst.filename), reason))
if not inst.locker:
- ui.warn(_("(lock might be very busy)\n"))
+ ui.error(_("(lock might be very busy)\n"))
except error.LockUnavailable as inst:
- ui.warn(_("abort: could not lock %s: %s\n") %
- (inst.desc or stringutil.forcebytestr(inst.filename),
- encoding.strtolocal(inst.strerror)))
+ ui.error(_("abort: could not lock %s: %s\n") %
+ (inst.desc or stringutil.forcebytestr(inst.filename),
+ encoding.strtolocal(inst.strerror)))
except error.OutOfBandError as inst:
if inst.args:
msg = _("abort: remote error:\n")
else:
msg = _("abort: remote error\n")
- ui.warn(msg)
+ ui.error(msg)
if inst.args:
- ui.warn(''.join(inst.args))
+ ui.error(''.join(inst.args))
if inst.hint:
- ui.warn('(%s)\n' % inst.hint)
+ ui.error('(%s)\n' % inst.hint)
except error.RepoError as inst:
- ui.warn(_("abort: %s!\n") % inst)
+ ui.error(_("abort: %s!\n") % inst)
if inst.hint:
- ui.warn(_("(%s)\n") % inst.hint)
+ ui.error(_("(%s)\n") % inst.hint)
except error.ResponseError as inst:
- ui.warn(_("abort: %s") % inst.args[0])
+ ui.error(_("abort: %s") % inst.args[0])
msg = inst.args[1]
if isinstance(msg, type(u'')):
msg = pycompat.sysbytes(msg)
if not isinstance(msg, bytes):
- ui.warn(" %r\n" % (msg,))
+ ui.error(" %r\n" % (msg,))
elif not msg:
- ui.warn(_(" empty string\n"))
+ ui.error(_(" empty string\n"))
else:
- ui.warn("\n%r\n" % pycompat.bytestr(stringutil.ellipsis(msg)))
+ ui.error("\n%r\n" % pycompat.bytestr(stringutil.ellipsis(msg)))
except error.CensoredNodeError as inst:
- ui.warn(_("abort: file censored %s!\n") % inst)
+ ui.error(_("abort: file censored %s!\n") % inst)
except error.RevlogError as inst:
- ui.warn(_("abort: %s!\n") % inst)
+ ui.error(_("abort: %s!\n") % inst)
except error.InterventionRequired as inst:
- ui.warn("%s\n" % inst)
+ ui.error("%s\n" % inst)
if inst.hint:
- ui.warn(_("(%s)\n") % inst.hint)
+ ui.error(_("(%s)\n") % inst.hint)
return 1
except error.WdirUnsupported:
- ui.warn(_("abort: working directory revision cannot be specified\n"))
+ ui.error(_("abort: working directory revision cannot be specified\n"))
except error.Abort as inst:
- ui.warn(_("abort: %s\n") % inst)
+ ui.error(_("abort: %s\n") % inst)
if inst.hint:
- ui.warn(_("(%s)\n") % inst.hint)
+ ui.error(_("(%s)\n") % inst.hint)
except ImportError as inst:
- ui.warn(_("abort: %s!\n") % stringutil.forcebytestr(inst))
+ ui.error(_("abort: %s!\n") % stringutil.forcebytestr(inst))
m = stringutil.forcebytestr(inst).split()[-1]
if m in "mpatch bdiff".split():
- ui.warn(_("(did you forget to compile extensions?)\n"))
+ ui.error(_("(did you forget to compile extensions?)\n"))
elif m in "zlib".split():
- ui.warn(_("(is your Python install correct?)\n"))
+ ui.error(_("(is your Python install correct?)\n"))
except IOError as inst:
if util.safehasattr(inst, "code"):
- ui.warn(_("abort: %s\n") % stringutil.forcebytestr(inst))
+ ui.error(_("abort: %s\n") % stringutil.forcebytestr(inst))
elif util.safehasattr(inst, "reason"):
try: # usually it is in the form (errno, strerror)
reason = inst.reason.args[1]
@@ -236,34 +236,34 @@
if isinstance(reason, pycompat.unicode):
# SSLError of Python 2.7.9 contains a unicode
reason = encoding.unitolocal(reason)
- ui.warn(_("abort: error: %s\n") % reason)
+ ui.error(_("abort: error: %s\n") % reason)
elif (util.safehasattr(inst, "args")
and inst.args and inst.args[0] == errno.EPIPE):
pass
elif getattr(inst, "strerror", None):
if getattr(inst, "filename", None):
- ui.warn(_("abort: %s: %s\n") % (
+ ui.error(_("abort: %s: %s\n") % (
encoding.strtolocal(inst.strerror),
stringutil.forcebytestr(inst.filename)))
else:
- ui.warn(_("abort: %s\n") % encoding.strtolocal(inst.strerror))
+ ui.error(_("abort: %s\n") % encoding.strtolocal(inst.strerror))
else:
raise
except OSError as inst:
if getattr(inst, "filename", None) is not None:
- ui.warn(_("abort: %s: '%s'\n") % (
+ ui.error(_("abort: %s: '%s'\n") % (
encoding.strtolocal(inst.strerror),
stringutil.forcebytestr(inst.filename)))
else:
- ui.warn(_("abort: %s\n") % encoding.strtolocal(inst.strerror))
+ ui.error(_("abort: %s\n") % encoding.strtolocal(inst.strerror))
except MemoryError:
- ui.warn(_("abort: out of memory\n"))
+ ui.error(_("abort: out of memory\n"))
except SystemExit as inst:
# Commands shouldn't sys.exit directly, but give a return code.
# Just in case catch this and and pass exit code to caller.
return inst.code
except socket.error as inst:
- ui.warn(_("abort: %s\n") % stringutil.forcebytestr(inst.args[-1]))
+ ui.error(_("abort: %s\n") % stringutil.forcebytestr(inst.args[-1]))
return -1
--- a/mercurial/ui.py Thu Jul 19 15:21:28 2018 -0400
+++ b/mercurial/ui.py Thu Jul 19 23:22:05 2018 -0700
@@ -1420,6 +1420,7 @@
return getpass.getpass('')
except EOFError:
raise error.ResponseExpected()
+
def status(self, *msg, **opts):
'''write status message to output (if ui.quiet is False)
@@ -1428,6 +1429,7 @@
if not self.quiet:
opts[r'label'] = opts.get(r'label', '') + ' ui.status'
self.write(*msg, **opts)
+
def warn(self, *msg, **opts):
'''write warning message to output (stderr)
@@ -1435,6 +1437,15 @@
'''
opts[r'label'] = opts.get(r'label', '') + ' ui.warning'
self.write_err(*msg, **opts)
+
+ def error(self, *msg, **opts):
+ '''write error message to output (stderr)
+
+ This adds an output label of "ui.error".
+ '''
+ opts[r'label'] = opts.get(r'label', '') + ' ui.error'
+ self.write_err(*msg, **opts)
+
def note(self, *msg, **opts):
'''write note to output (if ui.verbose is True)
@@ -1443,6 +1454,7 @@
if self.verbose:
opts[r'label'] = opts.get(r'label', '') + ' ui.note'
self.write(*msg, **opts)
+
def debug(self, *msg, **opts):
'''write debug message to output (if ui.debugflag is True)