diff options
Diffstat (limited to 'upload-pack.c')
-rw-r--r-- | upload-pack.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/upload-pack.c b/upload-pack.c index b40a43f27d..11c3849a79 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -429,6 +429,8 @@ static int get_common_commits(void) static char line[1000]; unsigned char sha1[20]; char last_hex[41]; + int got_common = 0; + int got_other = 0; save_commit_buffer = 0; @@ -437,16 +439,22 @@ static int get_common_commits(void) reset_timeout(); if (!len) { + if (multi_ack == 2 && got_common + && !got_other && ok_to_give_up()) + packet_write(1, "ACK %s ready\n", last_hex); if (have_obj.nr == 0 || multi_ack) packet_write(1, "NAK\n"); if (stateless_rpc) exit(0); + got_common = 0; + got_other = 0; continue; } strip(line, len); if (!prefixcmp(line, "have ")) { switch (got_sha1(line+5, sha1)) { case -1: /* they have what we do not */ + got_other = 1; if (multi_ack && ok_to_give_up()) { const char *hex = sha1_to_hex(sha1); if (multi_ack == 2) @@ -456,6 +464,7 @@ static int get_common_commits(void) } break; default: + got_common = 1; memcpy(last_hex, sha1_to_hex(sha1), 41); if (multi_ack == 2) packet_write(1, "ACK %s common\n", last_hex); |