Merge branch 'jc/fetchupload' into next
authorJunio C Hamano <junkio@cox.net>
Thu, 25 May 2006 05:32:38 +0000 (22:32 -0700)
committerJunio C Hamano <junkio@cox.net>
Thu, 25 May 2006 05:32:38 +0000 (22:32 -0700)
* jc/fetchupload:
fetch-pack: give up after getting too many "ack continue"
cat-file: document -p option
Built git-upload-tar should be ignored.
ls-remote: fix rsync:// to report HEAD

.gitignore
Documentation/git-cat-file.txt
fetch-pack.c
git-ls-remote.sh
index 18a7295e6ca864e416a02dc12d7dff4cd9b9748d..afd0876218686c14834ff27b3ad6f0da307da601 100644 (file)
@@ -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
index 504eb1b16a59c5af43fa1206723dece9207ee0eb..5e9cbf875d72ae4a537467197ddde98dbec3cf3b 100644 (file)
@@ -8,12 +8,12 @@ git-cat-file - Provide content or type information for repository objects
 
 SYNOPSIS
 --------
-'git-cat-file' [-t | -s | -e | <type>] <object>
+'git-cat-file' [-t | -s | -e | -p | <type>] <object>
 
 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 <object>
        exists and is a valid object.
 
+-p::
+       Pretty-print the contents of <object> based on its type.
+
 <type>::
        Typically this matches the real type of <object> 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 <object> in bytes.
 
 If '-e' is specified, no output.
 
+If '-p' is specified, the contents of <object> are pretty-printed.
+
 Otherwise the raw (though uncompressed) contents of the <object> will
 be returned.
 
index 8daa93d024158e6d8daff304db57ac80d1803c65..83713485562fd340a67e5073b443679d0b2a4c24 100644 (file)
@@ -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:
index b6882a90c15a7b706966e608e00facbb80f26422..2fdcaf7886850b1f59a1775bffc23948d1b62c6a 100755 (executable)
@@ -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