From b19696c2e7c3e753777189100b2ac09c9e04080b Mon Sep 17 00:00:00 2001
From: Junio C Hamano <junkio@cox.net>
Date: Mon, 20 Feb 2006 00:38:39 -0800
Subject: [PATCH] Use thin pack transfer in "git fetch".

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 fetch-pack.c  | 15 +++++++++++----
 git-fetch.sh  |  2 +-
 upload-pack.c | 11 ++++++++---
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/fetch-pack.c b/fetch-pack.c
index aa6f42ae1b..09738fee91 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -8,7 +8,7 @@ static int keep_pack;
 static int quiet;
 static int verbose;
 static const char fetch_pack_usage[] =
-"git-fetch-pack [-q] [-v] [-k] [--exec=upload-pack] [host:]directory <refs>...";
+"git-fetch-pack [-q] [-v] [-k] [--thin] [--exec=upload-pack] [host:]directory <refs>...";
 static const char *exec = "git-upload-pack";
 
 #define COMPLETE	(1U << 0)
@@ -18,7 +18,7 @@ static const char *exec = "git-upload-pack";
 #define POPPED		(1U << 4)
 
 static struct commit_list *rev_list = NULL;
-static int non_common_revs = 0, multi_ack = 0;
+static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0;
 
 static void rev_list_push(struct commit *commit, int mark)
 {
@@ -156,8 +156,9 @@ static int find_common(int fd[2], unsigned char *result_sha1,
 			continue;
 		}
 
-		packet_write(fd[1], "want %s%s\n", sha1_to_hex(remote),
-			multi_ack ? " multi_ack" : "");
+		packet_write(fd[1], "want %s%s%s\n", sha1_to_hex(remote),
+			     (multi_ack ? " multi_ack" : ""),
+			     (use_thin_pack ? " thin-pack" : ""));
 		fetching++;
 	}
 	packet_flush(fd[1]);
@@ -421,6 +422,10 @@ int main(int argc, char **argv)
 				keep_pack = 1;
 				continue;
 			}
+			if (!strcmp("--thin", arg)) {
+				use_thin_pack = 1;
+				continue;
+			}
 			if (!strcmp("-v", arg)) {
 				verbose = 1;
 				continue;
@@ -434,6 +439,8 @@ int main(int argc, char **argv)
 	}
 	if (!dest)
 		usage(fetch_pack_usage);
+	if (keep_pack)
+		use_thin_pack = 0;
 	pid = git_connect(fd, dest, exec);
 	if (pid < 0)
 		return 1;
diff --git a/git-fetch.sh b/git-fetch.sh
index b4325d9d98..23d965f327 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -320,7 +320,7 @@ fetch_main () {
     ( : subshell because we muck with IFS
       IFS=" 	$LF"
       (
-	  git-fetch-pack $exec $keep "$remote" $rref || echo failed "$remote"
+	  git-fetch-pack $exec $keep --thin "$remote" $rref || echo failed "$remote"
       ) |
       while read sha1 remote_name
       do
diff --git a/upload-pack.c b/upload-pack.c
index d1980556ca..3cdf4288b8 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -14,6 +14,7 @@ static const char upload_pack_usage[] = "git-upload-pack [--strict] [--timeout=n
 #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 @@ 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 @@ static void create_pack_file(void)
 		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 @@ 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
@@ -213,7 +218,7 @@ static int receive_needs(void)
 
 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 (capabilities)
-- 
2.40.0