aboutsummaryrefslogtreecommitdiff
path: root/upload-pack.c
diff options
context:
space:
mode:
Diffstat (limited to 'upload-pack.c')
-rw-r--r--upload-pack.c37
1 files changed, 15 insertions, 22 deletions
diff --git a/upload-pack.c b/upload-pack.c
index ab1981c72..c3abf7ba6 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -10,7 +10,7 @@ static const char upload_pack_usage[] = "git-upload-pack [--strict] [--timeout=n
#define THEY_HAVE (1U << 0)
#define MAX_HAS 256
#define MAX_NEEDS 256
-static int nr_has = 0, nr_needs = 0;
+static int nr_has = 0, nr_needs = 0, multi_ack = 0;
static unsigned char has_sha1[MAX_HAS][20];
static unsigned char needs_sha1[MAX_NEEDS][20];
static unsigned int timeout = 0;
@@ -124,39 +124,28 @@ static int get_common_commits(void)
reset_timeout();
if (!len) {
- packet_write(1, "NAK\n");
+ if (multi_ack || nr_has == 0)
+ packet_write(1, "NAK\n");
continue;
}
len = strip(line, len);
if (!strncmp(line, "have ", 5)) {
- if (got_sha1(line+5, sha1)) {
- packet_write(1, "ACK %s\n", sha1_to_hex(sha1));
- break;
- }
+ if (got_sha1(line+5, sha1) &&
+ (multi_ack || nr_has == 1))
+ packet_write(1, "ACK %s%s\n",
+ sha1_to_hex(sha1),
+ multi_ack && nr_has < MAX_HAS ?
+ " continue" : "");
continue;
}
if (!strcmp(line, "done")) {
+ if (nr_has > 0)
+ return 0;
packet_write(1, "NAK\n");
return -1;
}
die("git-upload-pack: expected SHA1 list, got '%s'", line);
}
-
- for (;;) {
- len = packet_read_line(0, line, sizeof(line));
- reset_timeout();
- if (!len)
- continue;
- len = strip(line, len);
- if (!strncmp(line, "have ", 5)) {
- got_sha1(line+5, sha1);
- continue;
- }
- if (!strcmp(line, "done"))
- break;
- die("git-upload-pack: expected SHA1 list, got '%s'", line);
- }
- return 0;
}
static int receive_needs(void)
@@ -185,6 +174,10 @@ static int receive_needs(void)
if (strncmp("want ", line, 5) || get_sha1_hex(line+5, sha1_buf))
die("git-upload-pack: protocol error, "
"expected to get sha, not '%s'", line);
+
+ if (strstr(line+45, "multi_ack"))
+ multi_ack = 1;
+
needs++;
}
}