Patchwork [1,of,5,V3] procutil: distribute code for stdout

login
register
mail settings
Submitter Manuel Jacob
Date July 14, 2020, 6:41 p.m.
Message ID <6f0e5c118bfd96a56bd7.1594752107@tmp>
Download mbox | patch
Permalink /patch/46742/
State Accepted
Headers show

Comments

Manuel Jacob - July 14, 2020, 6:41 p.m.
# HG changeset patch
# User Manuel Jacob <me@manueljacob.de>
# Date 1594368724 -7200
#      Fri Jul 10 10:12:04 2020 +0200
# Node ID 6f0e5c118bfd96a56bd761d8a3ec85e9d1c9e1e8
# Parent  6a5dcd75484259095abca2c5b3f7ab12421a94ad
# EXP-Topic stdio
procutil: distribute code for stdout

It makes sense to have the distinction between Python 2 and 3 at the top level,
as we have to fight a different kind of battle on each: On Python 3, we get
consistent behavior on all platforms, but need to create correctly-behaving
binary streams. On Python 2, we have to account for platform differences.
Yuya Nishihara - July 15, 2020, 11:12 a.m.
On Tue, 14 Jul 2020 20:41:47 +0200, Manuel Jacob wrote:
> # HG changeset patch
> # User Manuel Jacob <me@manueljacob.de>
> # Date 1594368724 -7200
> #      Fri Jul 10 10:12:04 2020 +0200
> # Node ID 6f0e5c118bfd96a56bd761d8a3ec85e9d1c9e1e8
> # Parent  6a5dcd75484259095abca2c5b3f7ab12421a94ad
> # EXP-Topic stdio
> procutil: distribute code for stdout

Queued, thanks.

Patch

diff --git a/mercurial/utils/procutil.py b/mercurial/utils/procutil.py
--- a/mercurial/utils/procutil.py
+++ b/mercurial/utils/procutil.py
@@ -81,32 +81,31 @@ 
 
 
 if pycompat.ispy3:
+    # Python 3 implements its own I/O streams.
     # TODO: .buffer might not exist if std streams were replaced; we'll need
     # a silly wrapper to make a bytes stream backed by a unicode one.
     stdin = sys.stdin.buffer
     stdout = sys.stdout.buffer
     stderr = sys.stderr.buffer
+    if isatty(stdout):
+        # The standard library doesn't offer line-buffered binary streams.
+        stdout = make_line_buffered(stdout)
 else:
+    # Python 2 uses the I/O streams provided by the C library.
     stdin = sys.stdin
     stdout = sys.stdout
     stderr = sys.stderr
-
-if isatty(stdout):
-    if pycompat.ispy3:
-        # Python 3 implements its own I/O streams.
-        # The standard library doesn't offer line-buffered binary streams.
-        stdout = make_line_buffered(stdout)
-    elif pycompat.iswindows:
-        # Work around size limit when writing to console.
-        stdout = platform.winstdout(stdout)
-        # Python 2 uses the I/O streams provided by the C library.
-        # The Windows C runtime library doesn't support line buffering.
-        stdout = make_line_buffered(stdout)
-    else:
-        # 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.
-        stdout = os.fdopen(stdout.fileno(), 'wb', 1)
+    if isatty(stdout):
+        if pycompat.iswindows:
+            # Work around size limit when writing to console.
+            stdout = platform.winstdout(stdout)
+            # The Windows C runtime library doesn't support line buffering.
+            stdout = make_line_buffered(stdout)
+        else:
+            # 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.
+            stdout = os.fdopen(stdout.fileno(), 'wb', 1)
 
 
 findexe = platform.findexe