[PATCH 1 of 2] py3: keep stdout as defined by pycompat in procutil

Denis Laxalde denis at laxalde.org
Thu Oct 10 14:16:25 UTC 2019


# HG changeset patch
# User Denis Laxalde <denis.laxalde at logilab.fr>
# Date 1570716002 -7200
#      Thu Oct 10 16:00:02 2019 +0200
# Node ID 63da27176ab9d0ac5dd58e0a6037469ce4bf5435
# Parent  b0238700551593257f293fd838f2ac030d00cede
py3: keep stdout as defined by pycompat in procutil

According to https://docs.python.org/3/library/functions.html#open, it's
not possible to use 1 as buffering argument value in binary mode. This
is probably why line buffering does not work well in python3.

On the other hand, sys.stdout.buffer appears to be line-buffered already
on python3. So by not replacing it, there should be no behavior change.

This fixes buffering issue in "hg email" (confirmation prompt shown
before information to be confirmed).

diff --git a/mercurial/utils/procutil.py b/mercurial/utils/procutil.py
index e779dc4..124c93e 100644
--- a/mercurial/utils/procutil.py
+++ b/mercurial/utils/procutil.py
@@ -53,7 +53,9 @@ if isatty(stdout):
     if pycompat.iswindows:
         # Windows doesn't support line buffering
         stdout = os.fdopen(stdout.fileno(), r'wb', 0)
-    else:
+    elif not pycompat.ispy3:
+        # on Python 3, stdout (sys.stdout.buffer) is already line buffered and
+        # buffering=1 is not handled in binary mode
         stdout = os.fdopen(stdout.fileno(), r'wb', 1)
 
 if pycompat.iswindows:


More information about the Mercurial-devel mailing list