[PATCH 5 of 9] stdio: catch StdioError in dispatch.run and clean up appropriately

Bryan O'Sullivan bos at serpentine.com
Mon Apr 10 14:51:35 EDT 2017


# HG changeset patch
# User Bryan O'Sullivan <bryano at fb.com>
# Date 1490804813 25200
#      Wed Mar 29 09:26:53 2017 -0700
# Node ID 024364c1aa2e8b247d6156208394ebf01913f85a
# Parent  935d0e5af9001f3a0730e7c477dc14ae5baf4799
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
@@ -60,7 +60,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)
 
 def _getsimilar(symbols, value):
     sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()


More information about the Mercurial-devel mailing list