From e686eba41f1d19a5731dd12cabe259fd3c17eed6 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 24 May 2006 21:36:14 -0700 Subject: [PATCH 1/4] ls-remote: fix rsync:// to report HEAD This prevented recent git-clone from checking out the working tree files in the cloned repository. Signed-off-by: Junio C Hamano --- git-ls-remote.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/git-ls-remote.sh b/git-ls-remote.sh index b6882a90c1..2fdcaf7886 100755 --- a/git-ls-remote.sh +++ b/git-ls-remote.sh @@ -58,11 +58,19 @@ http://* | https://* ) ;; rsync://* ) - mkdir $tmpdir + mkdir $tmpdir && + rsync -rlq "$peek_repo/HEAD" $tmpdir && rsync -rq "$peek_repo/refs" $tmpdir || { echo "failed slurping" exit } + head=$(cat "$tmpdir/HEAD") && + case "$head" in + ref:' '*) + head=$(expr "z$head" : 'zref: \(.*\)') && + head=$(cat "$tmpdir/$head") || exit + esac && + echo "$head HEAD" (cd $tmpdir && find refs -type f) | while read path do From 4acdeafe5e0eb3c7ccea0608032346ca6ffbb810 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 24 May 2006 22:48:39 -0400 Subject: [PATCH 2/4] Built git-upload-tar should be ignored. Signed-off-by: Shawn O. Pearce Signed-off-by: Junio C Hamano --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 199cc310a2..ec4c0dc3df 100644 --- a/.gitignore +++ b/.gitignore @@ -116,6 +116,7 @@ git-update-index git-update-ref git-update-server-info git-upload-pack +git-upload-tar git-var git-verify-pack git-verify-tag From ed90cbf5f681c0144909457be3f4792b47604a5b Mon Sep 17 00:00:00 2001 From: Jeff King Date: Wed, 24 May 2006 21:22:32 -0400 Subject: [PATCH 3/4] cat-file: document -p option Signed-off-by: Junio C Hamano --- Documentation/git-cat-file.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt index 504eb1b16a..5e9cbf875d 100644 --- a/Documentation/git-cat-file.txt +++ b/Documentation/git-cat-file.txt @@ -8,12 +8,12 @@ git-cat-file - Provide content or type information for repository objects SYNOPSIS -------- -'git-cat-file' [-t | -s | -e | ] +'git-cat-file' [-t | -s | -e | -p | ] DESCRIPTION ----------- Provides content or type of objects in the repository. The type -is required unless '-t' is used to find the object type, +is required unless '-t' or '-p' is used to find the object type, or '-s' is used to find the object size. OPTIONS @@ -33,6 +33,9 @@ OPTIONS Suppress all output; instead exit with zero status if exists and is a valid object. +-p:: + Pretty-print the contents of based on its type. + :: Typically this matches the real type of but asking for a type that can trivially be dereferenced from the given @@ -49,6 +52,8 @@ If '-s' is specified, the size of the in bytes. If '-e' is specified, no output. +If '-p' is specified, the contents of are pretty-printed. + Otherwise the raw (though uncompressed) contents of the will be returned. From f061e5fdd6a65216976a8bd547b2340e6297217b Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 24 May 2006 21:48:34 -0700 Subject: [PATCH 4/4] fetch-pack: give up after getting too many "ack continue" If your repository have more roots than the remote repository you ask an object for, the remote upload-pack keeps responding "ack continue" until it fills up its received-have buffer (currently 256 entries). Usually this is not a problem because the requester stops traversing the ancestry chain from the commit it gets "ack continue" for, but this mechanism does not work as a roadblock when it traverses down the path to the root the other side does not have. Signed-off-by: Junio C Hamano --- fetch-pack.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/fetch-pack.c b/fetch-pack.c index 8daa93d024..8371348556 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -18,6 +18,12 @@ static const char *exec = "git-upload-pack"; #define SEEN (1U << 3) #define POPPED (1U << 4) +/* + * After sending this many "have"s if we do not get any new ACK , we + * give up traversing our history. + */ +#define MAX_IN_VAIN 256 + static struct commit_list *rev_list = NULL; static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0; @@ -134,6 +140,8 @@ static int find_common(int fd[2], unsigned char *result_sha1, int fetching; int count = 0, flushes = 0, retval; const unsigned char *sha1; + unsigned in_vain = 0; + int got_continue = 0; for_each_ref(rev_list_insert_ref); @@ -172,6 +180,7 @@ static int find_common(int fd[2], unsigned char *result_sha1, packet_write(fd[1], "have %s\n", sha1_to_hex(sha1)); if (verbose) fprintf(stderr, "have %s\n", sha1_to_hex(sha1)); + in_vain++; if (!(31 & ++count)) { int ack; @@ -200,9 +209,16 @@ static int find_common(int fd[2], unsigned char *result_sha1, lookup_commit(result_sha1); mark_common(commit, 0, 1); retval = 0; + in_vain = 0; + got_continue = 1; } } while (ack); flushes--; + if (got_continue && MAX_IN_VAIN < in_vain) { + if (verbose) + fprintf(stderr, "giving up\n"); + break; /* give up */ + } } } done: