# HG changeset patch # User Yuya Nishihara # Date 1492875089 -32400 # Node ID 12941a782928039c075ff67dbf4bbb8078c5f251 # Parent 605f124d11467c0afe65560bc6d5de4ec43c8818 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 diff -r 605f124d1146 -r 12941a782928 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):