procutil: distribute code for stdout
authorManuel Jacob <me@manueljacob.de>
Fri, 10 Jul 2020 10:12:04 +0200
changeset 45093 63196198dbf0
parent 45091 6a5dcd754842
child 45094 b4c35e439ea5
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.
mercurial/utils/procutil.py
--- a/mercurial/utils/procutil.py	Sat Jul 11 03:17:42 2020 +0200
+++ b/mercurial/utils/procutil.py	Fri Jul 10 10:12:04 2020 +0200
@@ -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