Mercurial > hg-stable
changeset 45093:63196198dbf0
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.
author | Manuel Jacob <me@manueljacob.de> |
---|---|
date | Fri, 10 Jul 2020 10:12:04 +0200 |
parents | 6a5dcd754842 |
children | b4c35e439ea5 |
files | mercurial/utils/procutil.py |
diffstat | 1 files changed, 16 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- 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