Patchwork [4,of,6,v2] procutil: make stdout line-buffered on Windows if connected to TTY

login
register
mail settings
Submitter Manuel Jacob
Date July 6, 2020, 12:03 p.m.
Message ID <7d5c94b54fe59e9ec0f3.1594036996@tmp>
Download mbox | patch
Permalink /patch/46633/
State Accepted
Headers show

Comments

Manuel Jacob - July 6, 2020, 12:03 p.m.
# HG changeset patch
# User Manuel Jacob <me@manueljacob.de>
# Date 1593855699 -7200
#      Sat Jul 04 11:41:39 2020 +0200
# Node ID 7d5c94b54fe59e9ec0f3c0bab0dadd816f75cccb
# Parent  56b835bd7cb4c166703046300562ce3bd3e4088c
# 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.

Patch

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
@@ -89,7 +89,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