Mercurial > public > mercurial-scm > hg
comparison mercurial/utils/procutil.py @ 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 | b6afe1c52964 |
children | b4c35e439ea5 |
comparison
equal
deleted
inserted
replaced
45091:6a5dcd754842 | 45093:63196198dbf0 |
---|---|
79 return stream | 79 return stream |
80 return LineBufferedWrapper(stream) | 80 return LineBufferedWrapper(stream) |
81 | 81 |
82 | 82 |
83 if pycompat.ispy3: | 83 if pycompat.ispy3: |
84 # Python 3 implements its own I/O streams. | |
84 # TODO: .buffer might not exist if std streams were replaced; we'll need | 85 # TODO: .buffer might not exist if std streams were replaced; we'll need |
85 # a silly wrapper to make a bytes stream backed by a unicode one. | 86 # a silly wrapper to make a bytes stream backed by a unicode one. |
86 stdin = sys.stdin.buffer | 87 stdin = sys.stdin.buffer |
87 stdout = sys.stdout.buffer | 88 stdout = sys.stdout.buffer |
88 stderr = sys.stderr.buffer | 89 stderr = sys.stderr.buffer |
90 if isatty(stdout): | |
91 # The standard library doesn't offer line-buffered binary streams. | |
92 stdout = make_line_buffered(stdout) | |
89 else: | 93 else: |
94 # Python 2 uses the I/O streams provided by the C library. | |
90 stdin = sys.stdin | 95 stdin = sys.stdin |
91 stdout = sys.stdout | 96 stdout = sys.stdout |
92 stderr = sys.stderr | 97 stderr = sys.stderr |
93 | 98 if isatty(stdout): |
94 if isatty(stdout): | 99 if pycompat.iswindows: |
95 if pycompat.ispy3: | 100 # Work around size limit when writing to console. |
96 # Python 3 implements its own I/O streams. | 101 stdout = platform.winstdout(stdout) |
97 # The standard library doesn't offer line-buffered binary streams. | 102 # The Windows C runtime library doesn't support line buffering. |
98 stdout = make_line_buffered(stdout) | 103 stdout = make_line_buffered(stdout) |
99 elif pycompat.iswindows: | 104 else: |
100 # Work around size limit when writing to console. | 105 # glibc determines buffering on first write to stdout - if we |
101 stdout = platform.winstdout(stdout) | 106 # replace a TTY destined stdout with a pipe destined stdout (e.g. |
102 # Python 2 uses the I/O streams provided by the C library. | 107 # pager), we want line buffering. |
103 # The Windows C runtime library doesn't support line buffering. | 108 stdout = os.fdopen(stdout.fileno(), 'wb', 1) |
104 stdout = make_line_buffered(stdout) | |
105 else: | |
106 # glibc determines buffering on first write to stdout - if we | |
107 # replace a TTY destined stdout with a pipe destined stdout (e.g. | |
108 # pager), we want line buffering. | |
109 stdout = os.fdopen(stdout.fileno(), 'wb', 1) | |
110 | 109 |
111 | 110 |
112 findexe = platform.findexe | 111 findexe = platform.findexe |
113 _gethgcmd = platform.gethgcmd | 112 _gethgcmd = platform.gethgcmd |
114 getuser = platform.getuser | 113 getuser = platform.getuser |