dispatch: do not close stdout and stderr, just flush() instead
authorYuya Nishihara <yuya@tcha.org>
Sun, 23 Apr 2017 00:31:29 +0900
changeset 32687 12941a782928
parent 32686 605f124d1146
child 32688 2c1400d43fd2
dispatch: do not close stdout and stderr, just flush() instead Since 3a4c0905f357 "util: always force line buffered stdout when stdout is a tty", we have two file objects attached to the same STDOUT_FILENO. If one is closed, the underlying file descriptor is also closed, and writing to the other file object would crash the Python interpreter in a hard way, at least on Windows. So, it seems safer to not close the standard streams. This also matches the behavior of the default sys.stdout/stderr.close(), which never close the FILE* streams in C layer. https://hg.python.org/cpython/file/v2.7.13/Python/sysmodule.c#l1401
mercurial/dispatch.py
--- a/mercurial/dispatch.py	Mon Jun 05 23:36:35 2017 +0900
+++ b/mercurial/dispatch.py	Sun Apr 23 00:31:29 2017 +0900
@@ -88,13 +88,13 @@
         status = -1
     if util.safehasattr(req.ui, 'fout'):
         try:
-            req.ui.fout.close()
+            req.ui.fout.flush()
         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()
+        req.ui.ferr.flush()
     sys.exit(status & 255)
 
 def _getsimilar(symbols, value):