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:
commit
a4103bac37
@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
56
daemon.c
56
daemon.c
@ -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[] = {
|
||||||
|
@ -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, "--")) {
|
||||||
|
Loading…
Reference in New Issue
Block a user