# HG changeset patch # User Bryan O'Sullivan # Date 2017-04-11 21:54:12 # Node ID 71dcd4a4fa2fe7b5c5d0ddd592c3efe6d9651890 # Parent b445a3f0052847439b374eae79d86560d00d8b4f stdio: catch StdioError in dispatch.run and clean up appropriately We attempt to report what went wrong, and more importantly exit the program with an error code. (The exception we catch is not yet raised anywhere in the code.) diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -77,7 +77,22 @@ class request(object): def run(): "run the command in sys.argv" - sys.exit((dispatch(request(pycompat.sysargv[1:])) or 0) & 255) + req = request(pycompat.sysargv[1:]) + err = None + try: + status = (dispatch(req) or 0) & 255 + except error.StdioError as err: + status = -1 + if util.safehasattr(req.ui, 'fout'): + try: + req.ui.fout.close() + except IOError as err: + status = -1 + if util.safehasattr(req.ui, 'ferr'): + if err is not None and err.errno != errno.EPIPE: + req.ui.ferr.write('abort: %s\n' % err.strerror) + req.ui.ferr.close() + sys.exit(status & 255) def _getsimilar(symbols, value): sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()