diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-03-22 21:38:03 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-03-22 21:38:03 -0700 |
commit | 1c6a50bb41dc49883d447df17a6c575684ec04ff (patch) | |
tree | e04d02ea9d34e298cc67746527a834ca434214b6 /builtin | |
parent | 4b28cd9f2fb755cdfe1b97130e84644ae932988c (diff) | |
parent | 761ecf0bc7b6cddf311f00877c59e6381cdbdeea (diff) | |
download | git-1c6a50bb41dc49883d447df17a6c575684ec04ff.tar.gz git-1c6a50bb41dc49883d447df17a6c575684ec04ff.tar.xz |
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"
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/fetch-pack.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index 28d6900bb..0ef9a1194 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -15,6 +15,7 @@ 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", }; @@ -236,6 +237,7 @@ static int find_common(int fd[2], unsigned char *result_sha1, 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; @@ -274,6 +276,7 @@ static int find_common(int fd[2], unsigned char *result_sha1, 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 +394,10 @@ static int find_common(int fd[2], unsigned char *result_sha1, retval = 0; in_vain = 0; got_continue = 1; + if (ack == ACK_ready) { + rev_list = NULL; + got_ready = 1; + } break; } } @@ -404,8 +411,10 @@ static int find_common(int fd[2], unsigned char *result_sha1, } } 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 +717,11 @@ static struct ref *do_fetch_pack(int fd[2], 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) |