[PATCH] dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara
yuya at tcha.org
Sat Mar 12 15:35:43 UTC 2016
# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1451191126 -32400
# Sun Dec 27 13:38:46 2015 +0900
# Node ID f63115ce65dfae3da44c1a008dfb02f72d194e0c
# Parent ac410dea1b240854b5f0c99dddde66c5b19f6d36
dispatch: catch KeyboardInterrupt more broadly
Because _runcatch() can run long operation in its exception handler, it wasn't
enough to catch KeyboardInterrupt at the same level. For example, "hg unknown"
will load all extension modules, so we could easily make it crashed by Ctrl-C.
diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
--- a/mercurial/dispatch.py
+++ b/mercurial/dispatch.py
@@ -120,11 +120,18 @@ def dispatch(req):
ret = None
try:
ret = _runcatch(req)
- return ret
+ except KeyboardInterrupt:
+ try:
+ req.ui.warn(_("interrupted!\n"))
+ except IOError as inst:
+ if inst.errno != errno.EPIPE:
+ raise
+ ret = -1
finally:
duration = time.time() - starttime
req.ui.log("commandfinish", "%s exited %s after %0.2f seconds\n",
msg, ret or 0, duration)
+ return ret
def _runcatch(req):
def catchterm(*args):
@@ -315,11 +322,7 @@ def _runcatch(req):
else:
ui.warn(_("abort: %s\n") % inst.strerror)
except KeyboardInterrupt:
- try:
- ui.warn(_("interrupted!\n"))
- except IOError as inst:
- if inst.errno != errno.EPIPE:
- raise
+ raise
except MemoryError:
ui.warn(_("abort: out of memory\n"))
except SystemExit as inst:
More information about the Mercurial-devel
mailing list