From patchwork Sun Jul 5 02:51:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [6, of, 6] procutil: make stdout line-buffered on Windows if connected to TTY From: Manuel Jacob X-Patchwork-Id: 46624 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Sun, 05 Jul 2020 04:51:42 +0200 # HG changeset patch # User Manuel Jacob # Date 1593855699 -7200 # Sat Jul 04 11:41:39 2020 +0200 # Node ID f330f7c409a975aa8dfad6161d798192ac801ef7 # Parent 7fb9114235241b6d4354b22e2ba08138bde58642 # EXP-Topic stdio procutil: make stdout line-buffered on Windows if connected to TTY Windows doesn’t support line buffering. Previously, we worked around that by setting the stream unbuffered. Instead, we can use our own line buffering we already use on Python 3. diff --git a/mercurial/utils/procutil.py b/mercurial/utils/procutil.py --- a/mercurial/utils/procutil.py +++ b/mercurial/utils/procutil.py @@ -84,23 +84,21 @@ stdin = pycompat.stdin stdout = pycompat.stdout +if pycompat.iswindows: + stdout = platform.winstdout(stdout) + # glibc determines buffering on first write to stdout - if we replace a TTY # destined stdout with a pipe destined stdout (e.g. pager), we want line -# buffering (or unbuffered, on Windows) +# buffering. if isatty(stdout): - if pycompat.iswindows: - # Windows doesn't support line buffering - stdout = os.fdopen(stdout.fileno(), 'wb', 0) - elif pycompat.ispy3: + if pycompat.ispy3 or pycompat.iswindows: # On Python 3, buffered binary streams can't be set line-buffered. + # On Python 2, Windows doesn't support line buffering. # Therefore we have a wrapper that implements line buffering. stdout = make_line_buffered(stdout) else: stdout = os.fdopen(stdout.fileno(), 'wb', 1) -if pycompat.iswindows: - stdout = platform.winstdout(stdout) - findexe = platform.findexe _gethgcmd = platform.gethgcmd diff --git a/tests/test-stdio.py b/tests/test-stdio.py --- a/tests/test-stdio.py +++ b/tests/test-stdio.py @@ -88,7 +88,6 @@ def test_stdout_ptys_unbuffered(self): self._test(_ptys, UNBUFFERED, python_args=['-u']) - # On Windows, test_stdout_ptys wouldn't pass, but it's skipped anyway. if not pycompat.ispy3 and not pycompat.iswindows: # On Python 2 on non-Windows, we manually open stdout in line-buffered # mode if connected to a TTY. We should check if Python was configured