Merge branch 'jc/pack-thin' into next
authorJunio C Hamano <junkio@cox.net>
Mon, 20 Feb 2006 08:45:38 +0000 (00:45 -0800)
committerJunio C Hamano <junkio@cox.net>
Mon, 20 Feb 2006 08:45:38 +0000 (00:45 -0800)
* jc/pack-thin:
  Use thin pack transfer in "git fetch".
  Add git-push --thin.

1  2 
upload-pack.c

diff --combined upload-pack.c
@@@ -14,6 -14,7 +14,7 @@@ static const char upload_pack_usage[] 
  #define MAX_HAS 256
  #define MAX_NEEDS 256
  static int nr_has = 0, nr_needs = 0, multi_ack = 0, nr_our_refs = 0;
+ static int use_thin_pack = 0;
  static unsigned char has_sha1[MAX_HAS][20];
  static unsigned char needs_sha1[MAX_NEEDS][20];
  static unsigned int timeout = 0;
@@@ -49,8 -50,10 +50,10 @@@ static void create_pack_file(void
                char *buf;
                char **p;
  
-               if (create_full_pack)
+               if (create_full_pack) {
                        args = 10;
+                       use_thin_pack = 0; /* no point doing it */
+               }
                else
                        args = nr_has + nr_needs + 5;
                argv = xmalloc(args * sizeof(char *));
@@@ -62,7 -65,7 +65,7 @@@
                close(fd[0]);
                close(fd[1]);
                *p++ = "rev-list";
-               *p++ = "--objects";
+               *p++ = use_thin_pack ? "--objects-edge" : "--objects";
                if (create_full_pack || MAX_NEEDS <= nr_needs)
                        *p++ = "--all";
                else {
@@@ -192,6 -195,8 +195,8 @@@ static int receive_needs(void
                            "expected to get sha, not '%s'", line);
                if (strstr(line+45, "multi_ack"))
                        multi_ack = 1;
+               if (strstr(line+45, "thin-pack"))
+                       use_thin_pack = 1;
  
                /* We have sent all our refs already, and the other end
                 * should have chosen out of them; otherwise they are
  
  static int send_ref(const char *refname, const unsigned char *sha1)
  {
-       static char *capabilities = "multi_ack";
+       static char *capabilities = "multi_ack thin-pack";
        struct object *o = parse_object(sha1);
  
 +      if (!o)
 +              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);