aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--upload-pack.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/upload-pack.c b/upload-pack.c
index b40a43f27..11c3849a7 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);