Read about our upcoming Code of Conduct on this issue

This instance will be upgraded to Heptapod 0.28.1 on 2022-01-26 at 16:00 UTC+1 (a few minutes of down time)

Commit 65eefac3 authored by Manuel Jacob's avatar Manuel Jacob
Browse files

procutil: back out 8403cc54bc83 (make ....procutil.stderr unbuffered)

Changeset 8403cc54bc83 introduced code that opens a second file object
referring to the stderr file descriptor. This broke tests on Windows. The
reason is that on Windows, sys.stderr is buffered and procutil.stderr closed
the file descriptor when it got garbage collected before sys.stderr had the
chance to flush buffered data.

`procutil.stdout` had the same problem for a long time, but we didn’t realize,
as in CI test runs, stdout is not a TTY and in this case no second file object
is opened.
parent 23119371df5e
Pipeline #7771 failed with stage
in 26 minutes and 16 seconds
......@@ -106,18 +106,6 @@ if isatty(stdout):
stdout = os.fdopen(stdout.fileno(), 'wb', 1)
# stderr should be unbuffered
if pycompat.ispy3:
# On Python 3, buffered streams may expose an underlying raw stream. This is
# definitively the case for the streams initialized by the interpreter. If
# the attribute isn't present, the stream is already unbuffered or doesn't
# expose an underlying raw stream, in which case we use the stream as-is.
stderr = getattr(stderr, 'raw', stderr)
elif pycompat.iswindows:
# On Windows, stderr is buffered at least when connected to a pipe.
stderr = os.fdopen(stderr.fileno(), 'wb', 0)
# On other platforms, stderr is always unbuffered.
findexe = platform.findexe
_gethgcmd = platform.gethgcmd
......@@ -126,18 +126,6 @@ class TestStdio(unittest.TestCase):
def test_buffering_stderr_pipes(self):
self._test('stderr', _pipes, UNBUFFERED)
def test_buffering_stderr_ptys(self):
self._test('stderr', _ptys, UNBUFFERED)
def test_buffering_stderr_pipes_unbuffered(self):
self._test('stderr', _pipes, UNBUFFERED, python_args=['-u'])
def test_buffering_stderr_ptys_unbuffered(self):
self._test('stderr', _ptys, UNBUFFERED, python_args=['-u'])
if __name__ == '__main__':
import silenttestrunner
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment