notes: make expand_notes_ref globally accessible
[gitweb.git] / builtin / fetch-pack.c
index 1abe624dc8a850f63dfc814950c1aadab97e5fbb..1724b76052a004d8cc364d367299b2d2bcda3162 100644 (file)
@@ -1,4 +1,4 @@
-#include "cache.h"
+#include "builtin.h"
 #include "refs.h"
 #include "pkt-line.h"
 #include "commit.h"
@@ -9,12 +9,12 @@
 #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,11 +218,28 @@ static void send_request(int fd, struct strbuf *buf)
                safe_write(fd, buf->buf, buf->len);
 }
 
-#define INITIAL_FLUSH 32
+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);
+}
+
+#define INITIAL_FLUSH 16
+#define LARGE_FLUSH 1024
 
 static int next_flush(int count)
 {
-       return INITIAL_FLUSH + count;
+       if (count < INITIAL_FLUSH * 2)
+               count += INITIAL_FLUSH;
+       else if (count < LARGE_FLUSH)
+               count <<= 1;
+       else
+               count += LARGE_FLUSH;
+       return count;
 }
 
 static int find_common(int fd[2], unsigned char *result_sha1,
@@ -233,7 +250,6 @@ 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;
 
@@ -244,6 +260,7 @@ static int find_common(int fd[2], unsigned char *result_sha1,
        marked = 1;
 
        for_each_ref(rev_list_insert_ref, NULL);
+       insert_alternate_refs();
 
        fetching = 0;
        for ( ; refs ; refs = refs->next) {
@@ -271,7 +288,6 @@ 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");
@@ -390,10 +406,8 @@ static int find_common(int fd[2], unsigned char *result_sha1,
                                        retval = 0;
                                        in_vain = 0;
                                        got_continue = 1;
-                                       if (ack == ACK_ready) {
+                                       if (ack == ACK_ready)
                                                rev_list = NULL;
-                                               got_ready = 1;
-                                       }
                                        break;
                                        }
                                }
@@ -407,10 +421,8 @@ static int find_common(int fd[2], unsigned char *result_sha1,
                }
        }
 done:
-       if (!got_ready || !no_done) {
-               packet_buf_write(&req_buf, "done\n");
-               send_request(fd[1], &req_buf);
-       }
+       packet_buf_write(&req_buf, "done\n");
+       send_request(fd[1], &req_buf);
        if (args.verbose)
                fprintf(stderr, "done\n");
        if (retval != 0) {
@@ -713,11 +725,6 @@ 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)
@@ -826,6 +833,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
        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++) {