# HG changeset patch # User Manuel Jacob # Date 1594440202 -7200 # Node ID fa270dcbdb551766b3f244cd9e99b663e62e7696 # Parent 23119371df5e568939b0914f5eea399483fb3e0e 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. diff -r 23119371df5e -r fa270dcbdb55 mercurial/utils/procutil.py --- a/mercurial/utils/procutil.py Thu Jul 09 02:16:26 2020 +0200 +++ b/mercurial/utils/procutil.py Sat Jul 11 06:03:22 2020 +0200 @@ -106,18 +106,6 @@ else: 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 diff -r 23119371df5e -r fa270dcbdb55 tests/test-stdio.py --- a/tests/test-stdio.py Thu Jul 09 02:16:26 2020 +0200 +++ b/tests/test-stdio.py Sat Jul 11 06:03:22 2020 +0200 @@ -126,18 +126,6 @@ test_buffering_stdout_ptys_unbuffered ) - 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