# HG changeset patch # User Yuya Nishihara # Date 1451191126 -32400 # Node ID 84cc72c5771ecc26104d1207e775d2f50cbc2d6f # Parent 518a5030acba98a4e267ca364929474063ba834d dispatch: catch KeyboardInterrupt more broadly Because _runcatch() can run long operations 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 -r 518a5030acba -r 84cc72c5771e mercurial/dispatch.py --- a/mercurial/dispatch.py Sun Mar 13 16:46:49 2016 -0700 +++ b/mercurial/dispatch.py Sun Dec 27 13:38:46 2015 +0900 @@ -120,11 +120,18 @@ 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): @@ -313,11 +320,7 @@ 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: