]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'sp/maint-fetch-pack-stop-early'
authorJunio C Hamano <gitster@pobox.com>
Wed, 23 Mar 2011 04:38:03 +0000 (21:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 Mar 2011 04:38:03 +0000 (21:38 -0700)
* sp/maint-fetch-pack-stop-early:
  fetch-pack: Implement no-done capability
  fetch-pack: Finish negotation if remote replies "ACK %s ready"

1  2 
builtin/fetch-pack.c

diff --combined builtin/fetch-pack.c
index 28d6900bb0e2a4deb036013236e489f1ffaa9e41,59fbda522b7ba0ce4308aa85fac1a7b1b51c1550..0ef9a119405160ddacfb7a80a119ff749bb3a4f8
@@@ -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)
  {
        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;
  
        marked = 1;
  
        for_each_ref(rev_list_insert_ref, NULL);
 +      insert_alternate_refs();
  
        fetching = 0;
        for ( ; refs ; refs = refs->next) {
                        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");
                                        retval = 0;
                                        in_vain = 0;
                                        got_continue = 1;
+                                       if (ack == ACK_ready) {
+                                               rev_list = NULL;
+                                               got_ready = 1;
+                                       }
                                        break;
                                        }
                                }
                }
        }
  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++) {