git-daemon tests: wait until daemon is ready

In start_daemon, git-daemon is started as a background process.  In
theory, the tests may try to connect before the daemon had a chance
to open a listening socket. Avoid this race condition by waiting
for it to output "Ready to rumble". Any other output is considered
an error and the test is aborted.

Should git-daemon produce no output at all, lib-git-daemon would
block forever. This could be fixed by introducing a timeout.  On
the other hand, we have no timeout for other git commands which
could suffer from the same problem. Since such a mechanism adds
some complexity, I have decided against it.

Signed-off-by: Clemens Buchacher <drizzd@aon.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Clemens Buchacher 2012-01-07 12:42:47 +01:00 коммит произвёл Junio C Hamano
Родитель f6a34cfbb4
Коммит 561b133c2c
1 изменённых файлов: 17 добавлений и 1 удалений

Просмотреть файл

@ -23,12 +23,27 @@ start_git_daemon() {
trap 'code=$?; stop_git_daemon; (exit $code); die' EXIT
say >&3 "Starting git daemon ..."
mkfifo git_daemon_output
git daemon --listen=127.0.0.1 --port="$LIB_GIT_DAEMON_PORT" \
--reuseaddr --verbose \
--base-path="$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
"$@" "$GIT_DAEMON_DOCUMENT_ROOT_PATH" \
>&3 2>&4 &
>&3 2>git_daemon_output &
GIT_DAEMON_PID=$!
{
read line
echo >&4 "$line"
cat >&4 &
# Check expected output
if test x"$(expr "$line" : "\[[0-9]*\] \(.*\)")" != x"Ready to rumble"
then
kill "$GIT_DAEMON_PID"
wait "$GIT_DAEMON_PID"
trap 'die' EXIT
error "git daemon failed to start"
fi
} <git_daemon_output
}
stop_git_daemon() {
@ -50,4 +65,5 @@ stop_git_daemon() {
error "git daemon exited with status: $ret"
fi
GIT_DAEMON_PID=
rm -f git_daemon_output
}