Merge branch 'js/daemon-log'

* js/daemon-log:
  receive-pack: do not send error details to the client
  upload-pack: squelch progress indicator if client cannot see it
  daemon: send stderr of service programs to the syslog
This commit is contained in:
Junio C Hamano 2009-07-01 19:41:00 -07:00
commit a4103bac37
3 changed files with 76 additions and 40 deletions

View File

@ -123,27 +123,27 @@ static struct command *commands;
static const char pre_receive_hook[] = "hooks/pre-receive"; static const char pre_receive_hook[] = "hooks/pre-receive";
static const char post_receive_hook[] = "hooks/post-receive"; static const char post_receive_hook[] = "hooks/post-receive";
static int hook_status(int code, const char *hook_name) static int run_status(int code, const char *cmd_name)
{ {
switch (code) { switch (code) {
case 0: case 0:
return 0; return 0;
case -ERR_RUN_COMMAND_FORK: case -ERR_RUN_COMMAND_FORK:
return error("hook fork failed"); return error("fork of %s failed", cmd_name);
case -ERR_RUN_COMMAND_EXEC: case -ERR_RUN_COMMAND_EXEC:
return error("hook execute failed"); return error("execute of %s failed", cmd_name);
case -ERR_RUN_COMMAND_PIPE: case -ERR_RUN_COMMAND_PIPE:
return error("hook pipe failed"); return error("pipe failed");
case -ERR_RUN_COMMAND_WAITPID: case -ERR_RUN_COMMAND_WAITPID:
return error("waitpid failed"); return error("waitpid failed");
case -ERR_RUN_COMMAND_WAITPID_WRONG_PID: case -ERR_RUN_COMMAND_WAITPID_WRONG_PID:
return error("waitpid is confused"); return error("waitpid is confused");
case -ERR_RUN_COMMAND_WAITPID_SIGNAL: case -ERR_RUN_COMMAND_WAITPID_SIGNAL:
return error("%s died of signal", hook_name); return error("%s died of signal", cmd_name);
case -ERR_RUN_COMMAND_WAITPID_NOEXIT: case -ERR_RUN_COMMAND_WAITPID_NOEXIT:
return error("%s died strangely", hook_name); return error("%s died strangely", cmd_name);
default: default:
error("%s exited with error code %d", hook_name, -code); error("%s exited with error code %d", cmd_name, -code);
return -code; return -code;
} }
} }
@ -174,7 +174,7 @@ static int run_receive_hook(const char *hook_name)
code = start_command(&proc); code = start_command(&proc);
if (code) if (code)
return hook_status(code, hook_name); return run_status(code, hook_name);
for (cmd = commands; cmd; cmd = cmd->next) { for (cmd = commands; cmd; cmd = cmd->next) {
if (!cmd->error_string) { if (!cmd->error_string) {
size_t n = snprintf(buf, sizeof(buf), "%s %s %s\n", size_t n = snprintf(buf, sizeof(buf), "%s %s %s\n",
@ -186,7 +186,7 @@ static int run_receive_hook(const char *hook_name)
} }
} }
close(proc.in); close(proc.in);
return hook_status(finish_command(&proc), hook_name); return run_status(finish_command(&proc), hook_name);
} }
static int run_update_hook(struct command *cmd) static int run_update_hook(struct command *cmd)
@ -203,7 +203,7 @@ static int run_update_hook(struct command *cmd)
argv[3] = sha1_to_hex(cmd->new_sha1); argv[3] = sha1_to_hex(cmd->new_sha1);
argv[4] = NULL; argv[4] = NULL;
return hook_status(run_command_v_opt(argv, RUN_COMMAND_NO_STDIN | return run_status(run_command_v_opt(argv, RUN_COMMAND_NO_STDIN |
RUN_COMMAND_STDOUT_TO_STDERR), RUN_COMMAND_STDOUT_TO_STDERR),
update_hook); update_hook);
} }
@ -394,7 +394,7 @@ static char update_post_hook[] = "hooks/post-update";
static void run_update_post_hook(struct command *cmd) static void run_update_post_hook(struct command *cmd)
{ {
struct command *cmd_p; struct command *cmd_p;
int argc; int argc, status;
const char **argv; const char **argv;
for (argc = 0, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) { for (argc = 0, cmd_p = cmd; cmd_p; cmd_p = cmd_p->next) {
@ -417,8 +417,9 @@ static void run_update_post_hook(struct command *cmd)
argc++; argc++;
} }
argv[argc] = NULL; argv[argc] = NULL;
run_command_v_opt(argv, RUN_COMMAND_NO_STDIN status = run_command_v_opt(argv, RUN_COMMAND_NO_STDIN
| RUN_COMMAND_STDOUT_TO_STDERR); | RUN_COMMAND_STDOUT_TO_STDERR);
run_status(status, update_post_hook);
} }
static void execute_commands(const char *unpacker_error) static void execute_commands(const char *unpacker_error)
@ -534,24 +535,10 @@ static const char *unpack(void)
unpacker[i++] = hdr_arg; unpacker[i++] = hdr_arg;
unpacker[i++] = NULL; unpacker[i++] = NULL;
code = run_command_v_opt(unpacker, RUN_GIT_CMD); code = run_command_v_opt(unpacker, RUN_GIT_CMD);
switch (code) { if (!code)
case 0:
return NULL; return NULL;
case -ERR_RUN_COMMAND_FORK: run_status(code, unpacker[0]);
return "unpack fork failed"; return "unpack-objects abnormal exit";
case -ERR_RUN_COMMAND_EXEC:
return "unpack execute failed";
case -ERR_RUN_COMMAND_WAITPID:
return "waitpid failed";
case -ERR_RUN_COMMAND_WAITPID_WRONG_PID:
return "waitpid is confused";
case -ERR_RUN_COMMAND_WAITPID_SIGNAL:
return "unpacker died of signal";
case -ERR_RUN_COMMAND_WAITPID_NOEXIT:
return "unpacker died strangely";
default:
return "unpacker exited with error code";
}
} else { } else {
const char *keeper[7]; const char *keeper[7];
int s, status, i = 0; int s, status, i = 0;
@ -574,8 +561,11 @@ static const char *unpack(void)
ip.argv = keeper; ip.argv = keeper;
ip.out = -1; ip.out = -1;
ip.git_cmd = 1; ip.git_cmd = 1;
if (start_command(&ip)) status = start_command(&ip);
if (status) {
run_status(status, keeper[0]);
return "index-pack fork failed"; return "index-pack fork failed";
}
pack_lockfile = index_pack_lockfile(ip.out); pack_lockfile = index_pack_lockfile(ip.out);
close(ip.out); close(ip.out);
status = finish_command(&ip); status = finish_command(&ip);
@ -583,6 +573,7 @@ static const char *unpack(void)
reprepare_packed_git(); reprepare_packed_git();
return NULL; return NULL;
} }
run_status(status, keeper[0]);
return "index-pack abnormal exit"; return "index-pack abnormal exit";
} }
} }

View File

@ -1,6 +1,8 @@
#include "cache.h" #include "cache.h"
#include "pkt-line.h" #include "pkt-line.h"
#include "exec_cmd.h" #include "exec_cmd.h"
#include "run-command.h"
#include "strbuf.h"
#include <syslog.h> #include <syslog.h>
@ -343,28 +345,66 @@ static int run_service(char *dir, struct daemon_service *service)
return service->fn(); return service->fn();
} }
static void copy_to_log(int fd)
{
struct strbuf line = STRBUF_INIT;
FILE *fp;
fp = fdopen(fd, "r");
if (fp == NULL) {
logerror("fdopen of error channel failed");
close(fd);
return;
}
while (strbuf_getline(&line, fp, '\n') != EOF) {
logerror("%s", line.buf);
strbuf_setlen(&line, 0);
}
strbuf_release(&line);
fclose(fp);
}
static int run_service_command(const char **argv)
{
struct child_process cld;
memset(&cld, 0, sizeof(cld));
cld.argv = argv;
cld.git_cmd = 1;
cld.err = -1;
if (start_command(&cld))
return -1;
close(0);
close(1);
copy_to_log(cld.err);
return finish_command(&cld);
}
static int upload_pack(void) static int upload_pack(void)
{ {
/* Timeout as string */ /* Timeout as string */
char timeout_buf[64]; char timeout_buf[64];
const char *argv[] = { "upload-pack", "--strict", timeout_buf, ".", NULL };
snprintf(timeout_buf, sizeof timeout_buf, "--timeout=%u", timeout); snprintf(timeout_buf, sizeof timeout_buf, "--timeout=%u", timeout);
return run_service_command(argv);
/* git-upload-pack only ever reads stuff, so this is safe */
execl_git_cmd("upload-pack", "--strict", timeout_buf, ".", NULL);
return -1;
} }
static int upload_archive(void) static int upload_archive(void)
{ {
execl_git_cmd("upload-archive", ".", NULL); static const char *argv[] = { "upload-archive", ".", NULL };
return -1; return run_service_command(argv);
} }
static int receive_pack(void) static int receive_pack(void)
{ {
execl_git_cmd("receive-pack", ".", NULL); static const char *argv[] = { "receive-pack", ".", NULL };
return -1; return run_service_command(argv);
} }
static struct daemon_service daemon_service[] = { static struct daemon_service daemon_service[] = {

View File

@ -28,7 +28,7 @@ static unsigned long oldest_have;
static int multi_ack, nr_our_refs; static int multi_ack, nr_our_refs;
static int use_thin_pack, use_ofs_delta, use_include_tag; static int use_thin_pack, use_ofs_delta, use_include_tag;
static int no_progress; static int no_progress, daemon_mode;
static struct object_array have_obj; static struct object_array have_obj;
static struct object_array want_obj; static struct object_array want_obj;
static unsigned int timeout; static unsigned int timeout;
@ -521,6 +521,10 @@ static void receive_needs(void)
} }
if (debug_fd) if (debug_fd)
write_in_full(debug_fd, "#E\n", 3); write_in_full(debug_fd, "#E\n", 3);
if (!use_sideband && daemon_mode)
no_progress = 1;
if (depth == 0 && shallows.nr == 0) if (depth == 0 && shallows.nr == 0)
return; return;
if (depth > 0) { if (depth > 0) {
@ -630,6 +634,7 @@ int main(int argc, char **argv)
} }
if (!prefixcmp(arg, "--timeout=")) { if (!prefixcmp(arg, "--timeout=")) {
timeout = atoi(arg+10); timeout = atoi(arg+10);
daemon_mode = 1;
continue; continue;
} }
if (!strcmp(arg, "--")) { if (!strcmp(arg, "--")) {