In these cases the remote might still send us an error even if we fail to completely send the packfile. This can happen e.g. if the remote has set a max upload size. If we just consume send-pack's output and don't send anything to remote-helper, it will not update any of its structures and will report "Everything up-to-date" next to the error message. Signed-off-by: Carlos Martín Nieto <cmn@xxxxxxx> --- remote-curl.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/remote-curl.c b/remote-curl.c index 0b6d7815fdd..9e45e14afec 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -1114,15 +1114,25 @@ static int rpc_service(struct rpc_state *rpc, struct discovery *heads, close(client.in); client.in = -1; - if (!err) { - strbuf_read(rpc_result, client.out, 0); - } else { - char buf[4096]; - for (;;) - if (xread(client.out, buf, sizeof(buf)) <= 0) - break; + + /* + * If we encountered an error, we might still get a report. Consume the + * rest of the packfile and an extra flush and then we can copy + * over the report the same way as in the success case. + */ + if (err) { + int n; + do { + n = packet_read(rpc->out, rpc->buf, rpc->alloc, 0); + } while (n > 0); + + /* Read the final flush separating the payload from the report */ + packet_read(rpc->out, rpc->buf, rpc->alloc, 0); } + /* Copy the report of successes/failures */ + strbuf_read(rpc_result, client.out, 0); + close(client.out); client.out = -1; -- 2.43.0