mirror of
https://github.com/git/git.git
synced 2026-02-18 21:59:08 +00:00
git-daemon wrapper to wait until daemon is ready
The shell script which is currently used to parse git daemon output does not seem to work reliably. In order to work around such issues, re-implement the same procedure in C and write the daemon pid to a file. This means that we can no longer wait on the daemon process, since it is no longer a direct child of the shell process. Signed-off-by: Clemens Buchacher <drizzd@aon.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
fdec2eb8eb
commit
4c96c7aab7
1
.gitignore
vendored
1
.gitignore
vendored
@@ -177,6 +177,7 @@
|
||||
/test-dump-cache-tree
|
||||
/test-scrap-cache-tree
|
||||
/test-genrandom
|
||||
/test-git-daemon
|
||||
/test-index-version
|
||||
/test-line-buffer
|
||||
/test-match-trees
|
||||
|
||||
1
Makefile
1
Makefile
@@ -477,6 +477,7 @@ TEST_PROGRAMS_NEED_X += test-delta
|
||||
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
|
||||
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
|
||||
TEST_PROGRAMS_NEED_X += test-genrandom
|
||||
TEST_PROGRAMS_NEED_X += test-git-daemon
|
||||
TEST_PROGRAMS_NEED_X += test-index-version
|
||||
TEST_PROGRAMS_NEED_X += test-line-buffer
|
||||
TEST_PROGRAMS_NEED_X += test-match-trees
|
||||
|
||||
@@ -23,27 +23,13 @@ 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" \
|
||||
test-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>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
|
||||
>&3 2>&4 ||
|
||||
error "git daemon failed to start"
|
||||
GIT_DAEMON_PID=$(cat git-daemon.pid)
|
||||
}
|
||||
|
||||
stop_git_daemon() {
|
||||
@@ -57,13 +43,5 @@ stop_git_daemon() {
|
||||
# kill git-daemon child of git
|
||||
say >&3 "Stopping git daemon ..."
|
||||
kill "$GIT_DAEMON_PID"
|
||||
wait "$GIT_DAEMON_PID" >&3 2>&4
|
||||
ret=$?
|
||||
# expect exit with status 143 = 128+15 for signal TERM=15
|
||||
if test $ret -ne 143
|
||||
then
|
||||
error "git daemon exited with status: $ret"
|
||||
fi
|
||||
GIT_DAEMON_PID=
|
||||
rm -f git_daemon_output
|
||||
}
|
||||
|
||||
62
test-git-daemon.c
Normal file
62
test-git-daemon.c
Normal file
@@ -0,0 +1,62 @@
|
||||
#include "git-compat-util.h"
|
||||
#include "run-command.h"
|
||||
#include "exec_cmd.h"
|
||||
#include "strbuf.h"
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
static int parse_daemon_output(char *s)
|
||||
{
|
||||
if (*s++ != '[')
|
||||
return 1;
|
||||
s = strchr(s, ']');
|
||||
if (!s)
|
||||
return 1;
|
||||
if (strcmp(s, "] Ready to rumble\n"))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct strbuf line = STRBUF_INIT;
|
||||
FILE *fp;
|
||||
struct child_process proc, cat;
|
||||
char *cat_argv[] = { "cat", NULL };
|
||||
|
||||
setup_path();
|
||||
|
||||
memset(&proc, 0, sizeof(proc));
|
||||
argv[0] = "git-daemon";
|
||||
proc.argv = (const char **)argv;
|
||||
proc.no_stdin = 1;
|
||||
proc.err = -1;
|
||||
|
||||
if (start_command(&proc) < 0)
|
||||
return 1;
|
||||
|
||||
strbuf_getwholeline_fd(&line, proc.err, '\n');
|
||||
fputs(line.buf, stderr);
|
||||
|
||||
memset(&cat, 0, sizeof(cat));
|
||||
cat.argv = (const char **)cat_argv;
|
||||
cat.in = proc.err;
|
||||
cat.out = 2;
|
||||
|
||||
if (start_command(&cat) < 0)
|
||||
return 1;
|
||||
|
||||
if (parse_daemon_output(line.buf)) {
|
||||
kill(proc.pid, SIGTERM);
|
||||
finish_command(&proc);
|
||||
finish_command(&cat);
|
||||
return 1;
|
||||
}
|
||||
|
||||
fp = fopen("git-daemon.pid", "w");
|
||||
fprintf(fp, "%"PRIuMAX"\n", (uintmax_t)proc.pid);
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user