1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-10-28 04:49:43 +01:00

Merge branch 'jk/diag-unexpected-remote-helper-death'

When a remote-helper dies before Git writes to it, SIGPIPE killed
Git silently.  We now explain the situation a bit better to the end
user in our error message.

* jk/diag-unexpected-remote-helper-death:
  print an error when remote helpers die during capabilities
This commit is contained in:
Junio C Hamano 2024-09-23 10:35:06 -07:00
commit a4f062bdcf
2 changed files with 24 additions and 3 deletions

View file

@ -344,4 +344,15 @@ test_expect_success 'fetch tag' '
compare_refs local v1.0 server v1.0
'
test_expect_success 'totally broken helper reports failure message' '
write_script git-remote-broken <<-\EOF &&
read cap_cmd
exit 1
EOF
test_must_fail \
env PATH="$PWD:$PATH" \
git clone broken://example.com/foo.git 2>stderr &&
grep aborted stderr
'
test_done

View file

@ -89,11 +89,18 @@ static int recvline(struct helper_data *helper, struct strbuf *buffer)
return recvline_fh(helper->out, buffer);
}
static void write_constant(int fd, const char *str)
static int write_constant_gently(int fd, const char *str)
{
if (debug)
fprintf(stderr, "Debug: Remote helper: -> %s", str);
if (write_in_full(fd, str, strlen(str)) < 0)
return -1;
return 0;
}
static void write_constant(int fd, const char *str)
{
if (write_constant_gently(fd, str) < 0)
die_errno(_("full write to remote helper failed"));
}
@ -168,13 +175,16 @@ static struct child_process *get_helper(struct transport *transport)
die_errno(_("can't dup helper output fd"));
data->out = xfdopen(duped, "r");
write_constant(helper->in, "capabilities\n");
sigchain_push(SIGPIPE, SIG_IGN);
if (write_constant_gently(helper->in, "capabilities\n") < 0)
die("remote helper '%s' aborted session", data->name);
sigchain_pop(SIGPIPE);
while (1) {
const char *capname, *arg;
int mandatory = 0;
if (recvline(data, &buf))
exit(128);
die("remote helper '%s' aborted session", data->name);
if (!*buf.buf)
break;