{"thread":{"id":"2254","subject":"[PATCH 8/8] git-fetch-pack: Support multi_ack extension","startedAt":"2005-10-28T02:50:26Z","lastAt":"2005-10-28T03:56:41Z","messageCount":3,"participants":["Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":8},"messages":[{"id":"10741","messageId":"Pine.LNX.4.63.0510280449240.20516@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"2254","inReplyTo":null,"subject":"[PATCH 8/8] git-fetch-pack: Support multi_ack extension","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2005-10-28T02:50:26Z","receivedAt":"2005-10-28T02:50:26Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nThe client side support for multi_ack.\n\nSigned-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>\n\n---\n\n\tSo yes, I forgot to rewrite the \"Subject: [PATCH]\" of the first \n\tpatch of this series. Please be gentle, I am going to bed now.\n\n connect.c    |    5 ++++-\n fetch-pack.c |   58 ++++++++++++++++++++++++++++++++++++++++++----------------\n 2 files changed, 46 insertions(+), 17 deletions(-)\n\napplies-to: e91233a8f0446016384e8f2c8faafc9c129b95d3\nb851d9a0cad95cedc6082e6de00c25d9588519e7\ndiff --git a/connect.c b/connect.c\nindex 5cc49f9..b8aea35 100644\n--- a/connect.c\n+++ b/connect.c\n@@ -73,8 +73,11 @@ int get_ack(int fd, unsigned char *resul\n \tif (!strcmp(line, \"NAK\"))\n \t\treturn 0;\n \tif (!strncmp(line, \"ACK \", 3)) {\n-\t\tif (!get_sha1_hex(line+4, result_sha1))\n+\t\tif (!get_sha1_hex(line+4, result_sha1)) {\n+\t\t\tif (strstr(line+45, \"continue\"))\n+\t\t\t\treturn 2;\n \t\t\treturn 1;\n+\t\t}\n \t}\n \tdie(\"git-fetch_pack: expected ACK/NAK, got '%s'\", line);\n }\ndiff --git a/fetch-pack.c b/fetch-pack.c\nindex b584264..3df9911 100644\n--- a/fetch-pack.c\n+++ b/fetch-pack.c\n@@ -19,7 +19,7 @@ static const char *exec = \"git-upload-pa\n #define POPPED\t\t(1U << 4)\n \n static struct commit_list *rev_list = NULL;\n-static int non_common_revs = 0;\n+static int non_common_revs = 0, multi_ack = 0;\n \n static void rev_list_push(struct commit *commit, int mark)\n {\n@@ -157,7 +157,8 @@ static int find_common(int fd[2], unsign\n \t\t\tcontinue;\n \t\t}\n \n-\t\tpacket_write(fd[1], \"want %s\\n\", sha1_to_hex(remote));\n+\t\tpacket_write(fd[1], \"want %s%s\\n\", sha1_to_hex(remote),\n+\t\t\tmulti_ack ? \" multi_ack\" : \"\");\n \t\tfetching++;\n \t}\n \tpacket_flush(fd[1]);\n@@ -171,6 +172,8 @@ static int find_common(int fd[2], unsign\n \t\tif (verbose)\n \t\t\tfprintf(stderr, \"have %s\\n\", sha1_to_hex(sha1));\n \t\tif (!(31 & ++count)) {\n+\t\t\tint ack;\n+\n \t\t\tpacket_flush(fd[1]);\n \t\t\tflushes++;\n \n@@ -180,29 +183,47 @@ static int find_common(int fd[2], unsign\n \t\t\t */\n \t\t\tif (count == 32)\n \t\t\t\tcontinue;\n-\t\t\tif (get_ack(fd[0], result_sha1)) {\n-\t\t\t\tflushes = 0;\n-\t\t\t\tretval = 0;\n-\t\t\t\tif (verbose)\n-\t\t\t\t\tfprintf(stderr, \"got ack\\n\");\n-\t\t\t\tbreak;\n-\t\t\t}\n+\n+\t\t\tdo {\n+\t\t\t\tack = get_ack(fd[0], result_sha1);\n+\t\t\t\tif (verbose && ack)\n+\t\t\t\t\tfprintf(stderr, \"got ack %d %s\\n\", ack,\n+\t\t\t\t\t\t\tsha1_to_hex(result_sha1));\n+\t\t\t\tif (ack == 1) {\n+\t\t\t\t\tflushes = 0;\n+\t\t\t\t\tmulti_ack = 0;\n+\t\t\t\t\tretval = 0;\n+\t\t\t\t\tgoto done;\n+\t\t\t\t} else if (ack == 2) {\n+\t\t\t\t\tstruct commit *commit =\n+\t\t\t\t\t\tlookup_commit(result_sha1);\n+\t\t\t\t\tmark_common(commit, 0, 1);\n+\t\t\t\t\tretval = 0;\n+\t\t\t\t}\n+\t\t\t} while (ack);\n \t\t\tflushes--;\n \t\t}\n \t}\n-\n+done:\n \tpacket_write(fd[1], \"done\\n\");\n \tif (verbose)\n \t\tfprintf(stderr, \"done\\n\");\n-\tif (retval != 0)\n+\tif (retval != 0) {\n+\t\tmulti_ack = 0;\n \t\tflushes++;\n-\twhile (flushes) {\n-\t\tflushes--;\n-\t\tif (get_ack(fd[0], result_sha1)) {\n+\t}\n+\twhile (flushes || multi_ack) {\n+\t\tint ack = get_ack(fd[0], result_sha1);\n+\t\tif (ack) {\n \t\t\tif (verbose)\n-\t\t\t\tfprintf(stderr, \"got ack\\n\");\n-\t\t\treturn 0;\n+\t\t\t\tfprintf(stderr, \"got ack (%d) %s\\n\", ack,\n+\t\t\t\t\tsha1_to_hex(result_sha1));\n+\t\t\tif (ack == 1)\n+\t\t\t\treturn 0;\n+\t\t\tmulti_ack = 1;\n+\t\t\tcontinue;\n \t\t}\n+\t\tflushes--;\n \t}\n \treturn retval;\n }\n@@ -344,6 +365,11 @@ static int fetch_pack(int fd[2], int nr_\n \tpid_t pid;\n \n \tget_remote_heads(fd[0], &ref, 0, NULL, 0);\n+\tif (server_supports(\"multi_ack\")) {\n+\t\tif (verbose)\n+\t\t\tfprintf(stderr, \"Server supports multi_ack\\n\");\n+\t\tmulti_ack = 1;\n+\t}\n \tif (!ref) {\n \t\tpacket_flush(fd[1]);\n \t\tdie(\"no matching remote head\");\n---\n0.99.8.GIT\n"},{"id":"10744","messageId":"Pine.LNX.4.63.0510280535480.1460@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"2254","inReplyTo":"Pine.LNX.4.63.0510280449240.20516@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH 8/8] git-fetch-pack: Support multi_ack extension","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2005-10-28T03:36:32Z","receivedAt":"2005-10-28T03:36:32Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nnever mind patch 7 and 8. I succeeded in fscking up again. Will patch \ntomorrow.\n\nCiao,\nDscho\n"},{"id":"10746","messageId":"Pine.LNX.4.63.0510280555070.5054@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"2254","inReplyTo":"Pine.LNX.4.63.0510280535480.1460@wbgn013.biozentrum.uni-wuerzburg.de","subject":"[PATCH] fix multi_ack, was Re: [PATCH 8/8] git-fetch-pack: Support multi_ack extension","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2005-10-28T03:56:41Z","receivedAt":"2005-10-28T03:56:41Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nSigned-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>\n---\n\n\tI was already half asleep when I realized that\n\n\t\tprintf(\"%s\", \"\\0multi_ack\");\n\n\tcould not work. All the more astounding, that my tests\n\tsaid that the server has multi_ack capability. But that\n\twas my mixing up arguments to strstr().\n\n\tAargh.\n\n\tOn Fri, 28 Oct 2005, Johannes Schindelin wrote:\n\n\t> never mind patch 7 and 8. I succeeded in fscking up again.\n\t> Will patch tomorrow.\n\n\tWell, I could not sleep with such silly a bug.\n\n connect.c     |    5 +++--\n upload-pack.c |   10 +++++++---\n 2 files changed, 10 insertions(+), 5 deletions(-)\n\napplies-to: c45879487343238adc4e926abf0e6280a3f4291c\n2c3e9bb8ab663976132315c970c0feea5176fb81\ndiff --git a/connect.c b/connect.c\nindex b8aea35..c2badc7 100644\n--- a/connect.c\n+++ b/connect.c\n@@ -8,7 +8,7 @@\n #include <arpa/inet.h>\n #include <netdb.h>\n \n-static char *server_capabilities = \"\";\n+static char *server_capabilities = NULL;\n \n /*\n  * Read all the refs from the other end\n@@ -58,7 +58,8 @@ struct ref **get_remote_heads(int in, st\n \n int server_supports(const char *feature)\n {\n-\treturn strstr(feature, server_capabilities) != NULL;\n+\treturn server_capabilities &&\n+\t\tstrstr(server_capabilities, feature) != NULL;\n }\n \n int get_ack(int fd, unsigned char *result_sha1)\ndiff --git a/upload-pack.c b/upload-pack.c\nindex 686445e..c5eff21 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -212,11 +212,15 @@ static int receive_needs(void)\n \n static int send_ref(const char *refname, const unsigned char *sha1)\n {\n-\tstatic char *capabilities = \"\\0multi_ack\";\n+\tstatic char *capabilities = \"multi_ack\";\n \tstruct object *o = parse_object(sha1);\n \n-\tpacket_write(1, \"%s %s%s\\n\", sha1_to_hex(sha1), refname, capabilities);\n-\tcapabilities = \"\";\n+\tif (capabilities)\n+\t\tpacket_write(1, \"%s %s%c%s\\n\", sha1_to_hex(sha1), refname,\n+\t\t\t0, capabilities);\n+\telse\n+\t\tpacket_write(1, \"%s %s\\n\", sha1_to_hex(sha1), refname);\n+\tcapabilities = NULL;\n \tif (!(o->flags & OUR_REF)) {\n \t\to->flags |= OUR_REF;\n \t\tnr_our_refs++;\n---\n0.99.8.GIT\n"}]}