From: Junio C Hamano Date: Wed, 23 Mar 2011 04:38:03 +0000 (-0700) Subject: Merge branch 'sp/maint-fetch-pack-stop-early' X-Git-Tag: v1.7.5-rc0~42 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/1c6a50bb41dc49883d447df17a6c575684ec04ff?hp=-c Merge branch 'sp/maint-fetch-pack-stop-early' * sp/maint-fetch-pack-stop-early: fetch-pack: Implement no-done capability fetch-pack: Finish negotation if remote replies "ACK %s ready" --- 1c6a50bb41dc49883d447df17a6c575684ec04ff diff --combined builtin/fetch-pack.c index 28d6900bb0,59fbda522b..0ef9a11940 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@@ -1,4 -1,4 +1,4 @@@ -#include "cache.h" +#include "builtin.h" #include "refs.h" #include "pkt-line.h" #include "commit.h" @@@ -9,12 -9,12 +9,13 @@@ #include "fetch-pack.h" #include "remote.h" #include "run-command.h" +#include "transport.h" static int transfer_unpack_limit = -1; static int fetch_unpack_limit = -1; static int unpack_limit = 100; static int prefer_ofs_delta = 1; + static int no_done = 0; static struct fetch_pack_args args = { /* .uploadpack = */ "git-upload-pack", }; @@@ -218,16 -218,6 +219,16 @@@ static void send_request(int fd, struc safe_write(fd, buf->buf, buf->len); } +static void insert_one_alternate_ref(const struct ref *ref, void *unused) +{ + rev_list_insert_ref(NULL, ref->old_sha1, 0, NULL); +} + +static void insert_alternate_refs(void) +{ + foreach_alt_odb(refs_from_alternate_cb, insert_one_alternate_ref); +} + static int find_common(int fd[2], unsigned char *result_sha1, struct ref *refs) { @@@ -236,6 -226,7 +237,7 @@@ const unsigned char *sha1; unsigned in_vain = 0; int got_continue = 0; + int got_ready = 0; struct strbuf req_buf = STRBUF_INIT; size_t state_len = 0; @@@ -246,7 -237,6 +248,7 @@@ marked = 1; for_each_ref(rev_list_insert_ref, NULL); + insert_alternate_refs(); fetching = 0; for ( ; refs ; refs = refs->next) { @@@ -274,6 -264,7 +276,7 @@@ struct strbuf c = STRBUF_INIT; if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed"); if (multi_ack == 1) strbuf_addstr(&c, " multi_ack"); + if (no_done) strbuf_addstr(&c, " no-done"); if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k"); if (use_sideband == 1) strbuf_addstr(&c, " side-band"); if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack"); @@@ -391,6 -382,10 +394,10 @@@ retval = 0; in_vain = 0; got_continue = 1; + if (ack == ACK_ready) { + rev_list = NULL; + got_ready = 1; + } break; } } @@@ -404,8 -399,10 +411,10 @@@ } } done: - packet_buf_write(&req_buf, "done\n"); - send_request(fd[1], &req_buf); + if (!got_ready || !no_done) { + packet_buf_write(&req_buf, "done\n"); + send_request(fd[1], &req_buf); + } if (args.verbose) fprintf(stderr, "done\n"); if (retval != 0) { @@@ -708,6 -705,11 +717,11 @@@ static struct ref *do_fetch_pack(int fd if (args.verbose) fprintf(stderr, "Server supports multi_ack_detailed\n"); multi_ack = 2; + if (server_supports("no-done")) { + if (args.verbose) + fprintf(stderr, "Server supports no-done\n"); + no_done = 1; + } } else if (server_supports("multi_ack")) { if (args.verbose) @@@ -816,8 -818,6 +830,8 @@@ int cmd_fetch_pack(int argc, const cha char **pack_lockfile_ptr = NULL; struct child_process *conn; + packet_trace_identity("fetch-pack"); + nr_heads = 0; heads = NULL; for (i = 1; i < argc; i++) {