receive-pack: relay connectivity errors to sideband
If the connectivity check encounters a problem when receiving a push, the error output goes to receive-pack's stderr, whose destination depends on the protocol used (ssh tends to send it to the user, though without a "remote" prefix; http will generally eat it in the server's error log). The information should consistently go back to the user, as there is a reasonable chance their client is buggy and generating a bad pack. We can do so by muxing it over the sideband as we do with other sub-process stderr. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
d06303bb9a
commit
d415092ac4
@ -1317,9 +1317,12 @@ static void execute_commands(struct command *commands,
|
|||||||
const char *unpacker_error,
|
const char *unpacker_error,
|
||||||
struct shallow_info *si)
|
struct shallow_info *si)
|
||||||
{
|
{
|
||||||
|
struct check_connected_options opt = CHECK_CONNECTED_INIT;
|
||||||
struct command *cmd;
|
struct command *cmd;
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
struct iterate_data data;
|
struct iterate_data data;
|
||||||
|
struct async muxer;
|
||||||
|
int err_fd = 0;
|
||||||
|
|
||||||
if (unpacker_error) {
|
if (unpacker_error) {
|
||||||
for (cmd = commands; cmd; cmd = cmd->next)
|
for (cmd = commands; cmd; cmd = cmd->next)
|
||||||
@ -1327,11 +1330,24 @@ static void execute_commands(struct command *commands,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (use_sideband) {
|
||||||
|
memset(&muxer, 0, sizeof(muxer));
|
||||||
|
muxer.proc = copy_to_sideband;
|
||||||
|
muxer.in = -1;
|
||||||
|
if (!start_async(&muxer))
|
||||||
|
err_fd = muxer.in;
|
||||||
|
/* ...else, continue without relaying sideband */
|
||||||
|
}
|
||||||
|
|
||||||
data.cmds = commands;
|
data.cmds = commands;
|
||||||
data.si = si;
|
data.si = si;
|
||||||
if (check_connected(iterate_receive_command_list, &data, NULL))
|
opt.err_fd = err_fd;
|
||||||
|
if (check_connected(iterate_receive_command_list, &data, &opt))
|
||||||
set_connectivity_errors(commands, si);
|
set_connectivity_errors(commands, si);
|
||||||
|
|
||||||
|
if (use_sideband)
|
||||||
|
finish_async(&muxer);
|
||||||
|
|
||||||
reject_updates_to_hidden(commands);
|
reject_updates_to_hidden(commands);
|
||||||
|
|
||||||
if (run_receive_hook(commands, "pre-receive", 0)) {
|
if (run_receive_hook(commands, "pre-receive", 0)) {
|
||||||
|
Reference in New Issue
Block a user