On 25.01.2018 01:55, Jeff King wrote: > When we start git-daemon for our tests, we send its stderr > log stream to a named pipe. We synchronously read the first > line to make sure that the daemon started, and then dump the > rest to descriptor 4. This is handy for debugging test > output with "--verbose", but the tests themselves can't > access the log data. > > Let's dump the log into a file, as well, so that future > tests can check the log. There are two subtleties worth > calling out here: > > - we replace "cat" with a subshell loop around "read" to > ensure that there's no buffering (so that tests can be > sure that after a request has been served, the matching > log entries will have made it to the file) POSIX specifies the -u option for that behavior, can’t you use that? (GNU coreutils’ cat ignores it, since writing without delay is apparently its default behavior already.) > > - we open the logfile for append, rather than just output. > That makes it OK for tests to truncate the logfile > without restarting the daemon (the OS will atomically > seek to the end of the file when outputting each line). > That allows tests to look at the log without worrying > about pollution from earlier tests. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > t/lib-git-daemon.sh | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/t/lib-git-daemon.sh b/t/lib-git-daemon.sh > index 987d40680b..19f3ffdbb1 100644 > --- a/t/lib-git-daemon.sh > +++ b/t/lib-git-daemon.sh > @@ -53,11 +53,19 @@ start_git_daemon() { > "$@" "$GIT_DAEMON_DOCUMENT_ROOT_PATH" \ > >&3 2>git_daemon_output & > GIT_DAEMON_PID=$! > + >daemon.log > { > read line <&7 > + echo "$line" > echo >&4 "$line" > - cat <&7 >&4 & > - } 7<git_daemon_output && > + ( > + while read line <&7 > + do > + echo "$line" > + echo >&4 "$line" > + done > + ) & > + } 7<git_daemon_output >>"$TRASH_DIRECTORY/daemon.log" && > > # Check expected output > if test x"$(expr "$line" : "\[[0-9]*\] \(.*\)")" != x"Ready to rumble" > read without -r clobbers backslashes, and echo may interpret escape sequences. To faithfully reproduce the output, it would be better to use read -r and printf '%s\n' "$line", I think. (However, it looks like the existing code already uses read+echo, so I guess you could also keep that pattern in this change and then fix it in a later one.)