mercurial/dispatch.py
changeset 31960 71dcd4a4fa2f
parent 31958 de5c9d0e02ea
child 32040 0fb78cb90ca7
--- a/mercurial/dispatch.py	Tue Apr 11 14:54:12 2017 -0700
+++ b/mercurial/dispatch.py	Tue Apr 11 14:54:12 2017 -0700
@@ -77,7 +77,22 @@
 
 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()