Redirect update hook stdout to stderr.
If an update hook outputs to stdout then that output will be sent back over the wire to the push client as though it were part of the git protocol. This tends to cause protocol errors on the client end of the connection, as the hook output is not expected in that context. Most hook developers work around this by making sure their hook outputs everything to stderr. But hooks shouldn't need to perform such special behavior. Instead we can just dup stderr to stdout prior to invoking the update hook. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:

committed by
Junio C Hamano

parent
9b0b50936e
commit
cd83c74cb3
@ -14,7 +14,8 @@ int run_command_v_opt(const char **argv, int flags)
|
||||
dup2(fd, 0);
|
||||
dup2(fd, 1);
|
||||
close(fd);
|
||||
}
|
||||
} else if (flags & RUN_COMMAND_STDOUT_TO_STDERR)
|
||||
dup2(2, 1);
|
||||
if (flags & RUN_GIT_CMD) {
|
||||
execv_git_cmd(argv);
|
||||
} else {
|
||||
@ -51,14 +52,12 @@ int run_command_v(const char **argv)
|
||||
return run_command_v_opt(argv, 0);
|
||||
}
|
||||
|
||||
int run_command(const char *cmd, ...)
|
||||
static int run_command_va_opt(int opt, const char *cmd, va_list param)
|
||||
{
|
||||
int argc;
|
||||
const char *argv[MAX_RUN_COMMAND_ARGS];
|
||||
const char *arg;
|
||||
va_list param;
|
||||
|
||||
va_start(param, cmd);
|
||||
argv[0] = (char*) cmd;
|
||||
argc = 1;
|
||||
while (argc < MAX_RUN_COMMAND_ARGS) {
|
||||
@ -66,8 +65,29 @@ int run_command(const char *cmd, ...)
|
||||
if (!arg)
|
||||
break;
|
||||
}
|
||||
va_end(param);
|
||||
if (MAX_RUN_COMMAND_ARGS <= argc)
|
||||
return error("too many args to run %s", cmd);
|
||||
return run_command_v_opt(argv, 0);
|
||||
return run_command_v_opt(argv, opt);
|
||||
}
|
||||
|
||||
int run_command_opt(int opt, const char *cmd, ...)
|
||||
{
|
||||
va_list params;
|
||||
int r;
|
||||
|
||||
va_start(params, cmd);
|
||||
r = run_command_va_opt(opt, cmd, params);
|
||||
va_end(params);
|
||||
return r;
|
||||
}
|
||||
|
||||
int run_command(const char *cmd, ...)
|
||||
{
|
||||
va_list params;
|
||||
int r;
|
||||
|
||||
va_start(params, cmd);
|
||||
r = run_command_va_opt(0, cmd, params);
|
||||
va_end(params);
|
||||
return r;
|
||||
}
|
||||
|
Reference in New Issue
Block a user