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