1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-11-09 22:36:14 +01:00

Make stderr line buffered if it does not refer to a tty

If osc is invoked, for instance, via "osc -d rbl ... > log.txt 2>&1",
writes to stderr and stdout do not necessarily appear in program order
in the log.txt file. More precisely, it is possible that the buildlog
comes first and the http debug output is at the end of the
file.
During osc/python3 startup (with the redirection from above), the
following is done:
- make stdout line buffered (due to the code in osc-wrapper.py)
- make stderr buffered (but not line buffered) because stderr does
  not refer to a tty (python3 startup)

Consequently, if osc has code like

print("foo")
print("bar", file=sys.stderr)
print("baz")

it is possible that the contents of the log.txt is

foo
baz
bar

because stderr is buffered (but not line buffered). In order to fix
this, make stderr line buffered, too.
This commit is contained in:
Marcus Huewe 2021-03-24 12:58:35 +01:00
parent 4e9dde71b8
commit 5d6a1cef4d

View File

@ -23,6 +23,7 @@ except NameError:
pass
# avoid buffering output on pipes (bnc#930137)
# Note: the following only applies to python2
# Basically, a "print('foo')" call is translated to a corresponding
# fwrite call that writes to the stdout stream (cf. string_print
# (Objects/stringobject.c) and builtin_print (Python/bltinmodule.c));
@ -36,6 +37,9 @@ except NameError:
if not os.isatty(sys.stdout.fileno()):
sys.stdout = os.fdopen(sys.stdout.fileno(), sys.stdout.mode, 1)
if not os.isatty(sys.stderr.fileno()):
sys.stderr = os.fdopen(sys.stderr.fileno(), sys.stderr.mode, 1)
osccli = commandline.Osc()
r = babysitter.run(osccli)