Merge branch 'ne/futz-upload-pack'
authorJunio C Hamano <gitster@pobox.com>
Wed, 5 Aug 2009 19:38:29 +0000 (12:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Aug 2009 19:38:29 +0000 (12:38 -0700)
* ne/futz-upload-pack:
Shift object enumeration out of upload-pack

Conflicts:
upload-pack.c

1  2 
upload-pack.c
diff --combined upload-pack.c
index 841ebb534ac3393f5ee80692f1402c82a1b4a5f6,397cada43b95fb4e350b4c294ccd794a75a1acb2..f7d308a411d22cf350a6ac4512ee2ebb195f87d7
@@@ -28,7 -28,8 +28,8 @@@ static unsigned long oldest_have
  
  static int multi_ack, nr_our_refs;
  static int use_thin_pack, use_ofs_delta, use_include_tag;
 -static int no_progress;
 +static int no_progress, daemon_mode;
+ static int shallow_nr;
  static struct object_array have_obj;
  static struct object_array want_obj;
  static unsigned int timeout;
@@@ -107,8 -108,6 +108,6 @@@ static int do_rev_list(int fd, void *cr
        struct rev_info revs;
  
        pack_pipe = fdopen(fd, "w");
-       if (create_full_pack)
-               use_thin_pack = 0; /* no point doing it */
        init_revisions(&revs, NULL);
        revs.tag_objects = 1;
        revs.tree_objects = 1;
@@@ -155,13 -154,21 +154,21 @@@ static void create_pack_file(void
        const char *argv[10];
        int arg = 0;
  
-       rev_list.proc = do_rev_list;
-       /* .data is just a boolean: any non-NULL value will do */
-       rev_list.data = create_full_pack ? &rev_list : NULL;
-       if (start_async(&rev_list))
-               die("git upload-pack: unable to fork git-rev-list");
+       if (shallow_nr) {
+               rev_list.proc = do_rev_list;
+               rev_list.data = 0;
+               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++] = "--revs";
+               if (create_full_pack)
+                       argv[arg++] = "--all";
+               else if (use_thin_pack)
+                       argv[arg++] = "--thin";
+       }
  
-       argv[arg++] = "pack-objects";
        argv[arg++] = "--stdout";
        if (!no_progress)
                argv[arg++] = "--progress";
        argv[arg++] = NULL;
  
        memset(&pack_objects, 0, sizeof(pack_objects));
-       pack_objects.in = rev_list.out; /* start_command closes it */
+       pack_objects.in = shallow_nr ? rev_list.out : -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) {
+               FILE *pipe_fd = fdopen(pack_objects.in, "w");
+               if (!create_full_pack) {
+                       int i;
+                       for (i = 0; i < want_obj.nr; i++)
+                               fprintf(pipe_fd, "%s\n", sha1_to_hex(want_obj.objects[i].item->sha1));
+                       fprintf(pipe_fd, "--not\n");
+                       for (i = 0; i < have_obj.nr; i++)
+                               fprintf(pipe_fd, "%s\n", sha1_to_hex(have_obj.objects[i].item->sha1));
+               }
+               fprintf(pipe_fd, "\n");
+               fflush(pipe_fd);
+               fclose(pipe_fd);
+       }
        /* We read from pack_objects.err to capture stderr output for
         * progress bar, and pack_objects.out to capture the pack data.
         */
                error("git upload-pack: git-pack-objects died with error.");
                goto fail;
        }
-       if (finish_async(&rev_list))
+       if (shallow_nr && finish_async(&rev_list))
                goto fail;      /* error was already reported */
  
        /* flush the data */
@@@ -451,6 -476,7 +476,7 @@@ static void receive_needs(void
        static char line[1000];
        int len, depth = 0;
  
+       shallow_nr = 0;
        if (debug_fd)
                write_in_full(debug_fd, "#S\n", 3);
        for (;;) {
        }
        if (debug_fd)
                write_in_full(debug_fd, "#E\n", 3);
 +
 +      if (!use_sideband && daemon_mode)
 +              no_progress = 1;
 +
        if (depth == 0 && shallows.nr == 0)
                return;
        if (depth > 0) {
                                packet_write(1, "shallow %s",
                                                sha1_to_hex(object->sha1));
                                register_shallow(object->sha1);
+                               shallow_nr++;
                        }
                        result = result->next;
                }
                        for (i = 0; i < shallows.nr; i++)
                                register_shallow(shallows.objects[i].item->sha1);
                }
+       shallow_nr += shallows.nr;
        free(shallows.objects);
  }
  
@@@ -634,7 -659,6 +663,7 @@@ int main(int argc, char **argv
                }
                if (!prefixcmp(arg, "--timeout=")) {
                        timeout = atoi(arg+10);
 +                      daemon_mode = 1;
                        continue;
                }
                if (!strcmp(arg, "--")) {