Merge branch 'jk/maint-upload-pack-shallow' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 4 May 2011 21:58:13 +0000 (14:58 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 4 May 2011 21:58:13 +0000 (14:58 -0700)
* jk/maint-upload-pack-shallow:
upload-pack: start pack-objects before async rev-list

1  2 
upload-pack.c
diff --combined upload-pack.c
index bba053f0aac8eef982d6779983dc6fd979d69d69,45a60e60fc6c50793cb26fa807e3177a72453bef..ce5cbbea6be45a6dfa79bcc8c8244ae0b99c7ca3
@@@ -27,7 -27,6 +27,7 @@@ static const char upload_pack_usage[] 
  static unsigned long oldest_have;
  
  static int multi_ack, nr_our_refs;
 +static int no_done;
  static int use_thin_pack, use_ofs_delta, use_include_tag;
  static int no_progress, daemon_mode;
  static int shallow_nr;
@@@ -157,15 -156,8 +157,8 @@@ static void create_pack_file(void
        const char *argv[10];
        int arg = 0;
  
-       if (shallow_nr) {
-               memset(&rev_list, 0, sizeof(rev_list));
-               rev_list.proc = do_rev_list;
-               rev_list.out = -1;
-               if (start_async(&rev_list))
-                       die("git upload-pack: unable to fork git-rev-list");
-               argv[arg++] = "pack-objects";
-       } else {
-               argv[arg++] = "pack-objects";
+       argv[arg++] = "pack-objects";
+       if (!shallow_nr) {
                argv[arg++] = "--revs";
                if (create_full_pack)
                        argv[arg++] = "--all";
        argv[arg++] = NULL;
  
        memset(&pack_objects, 0, sizeof(pack_objects));
-       pack_objects.in = shallow_nr ? rev_list.out : -1;
+       pack_objects.in = -1;
        pack_objects.out = -1;
        pack_objects.err = -1;
        pack_objects.git_cmd = 1;
        if (start_command(&pack_objects))
                die("git upload-pack: unable to fork git-pack-objects");
  
-       /* pass on revisions we (don't) want */
-       if (!shallow_nr) {
+       if (shallow_nr) {
+               memset(&rev_list, 0, sizeof(rev_list));
+               rev_list.proc = do_rev_list;
+               rev_list.out = pack_objects.in;
+               if (start_async(&rev_list))
+                       die("git upload-pack: unable to fork git-rev-list");
+       }
+       else {
                FILE *pipe_fd = xfdopen(pack_objects.in, "w");
                if (!create_full_pack) {
                        int i;
@@@ -430,9 -428,6 +429,9 @@@ static int get_common_commits(void
        static char line[1000];
        unsigned char sha1[20];
        char last_hex[41];
 +      int got_common = 0;
 +      int got_other = 0;
 +      int sent_ready = 0;
  
        save_commit_buffer = 0;
  
                reset_timeout();
  
                if (!len) {
 +                      if (multi_ack == 2 && got_common
 +                          && !got_other && ok_to_give_up()) {
 +                              sent_ready = 1;
 +                              packet_write(1, "ACK %s ready\n", last_hex);
 +                      }
                        if (have_obj.nr == 0 || multi_ack)
                                packet_write(1, "NAK\n");
 +
 +                      if (no_done && sent_ready) {
 +                              packet_write(1, "ACK %s\n", last_hex);
 +                              return 0;
 +                      }
                        if (stateless_rpc)
                                exit(0);
 +                      got_common = 0;
 +                      got_other = 0;
                        continue;
                }
                strip(line, len);
                if (!prefixcmp(line, "have ")) {
                        switch (got_sha1(line+5, sha1)) {
                        case -1: /* they have what we do not */
 +                              got_other = 1;
                                if (multi_ack && ok_to_give_up()) {
                                        const char *hex = sha1_to_hex(sha1);
 -                                      if (multi_ack == 2)
 +                                      if (multi_ack == 2) {
 +                                              sent_ready = 1;
                                                packet_write(1, "ACK %s ready\n", hex);
 -                                      else
 +                                      else
                                                packet_write(1, "ACK %s continue\n", hex);
                                }
                                break;
                        default:
 +                              got_common = 1;
                                memcpy(last_hex, sha1_to_hex(sha1), 41);
                                if (multi_ack == 2)
                                        packet_write(1, "ACK %s common\n", last_hex);
@@@ -545,8 -525,6 +544,8 @@@ static void receive_needs(void
                        multi_ack = 2;
                else if (strstr(line+45, "multi_ack"))
                        multi_ack = 1;
 +              if (strstr(line+45, "no-done"))
 +                      no_done = 1;
                if (strstr(line+45, "thin-pack"))
                        use_thin_pack = 1;
                if (strstr(line+45, "ofs-delta"))
@@@ -647,9 -625,8 +646,9 @@@ static int send_ref(const char *refname
                die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1));
  
        if (capabilities)
 -              packet_write(1, "%s %s%c%s\n", sha1_to_hex(sha1), refname,
 -                      0, capabilities);
 +              packet_write(1, "%s %s%c%s%s\n", sha1_to_hex(sha1), refname,
 +                           0, capabilities,
 +                           stateless_rpc ? " no-done" : "");
        else
                packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname);
        capabilities = NULL;
@@@ -704,7 -681,6 +703,7 @@@ int main(int argc, char **argv
        int i;
        int strict = 0;
  
 +      packet_trace_identity("upload-pack");
        git_extract_argv0_path(argv[0]);
        read_replace_refs = 0;