Merge branch 'jc/fetchupload' into next
* 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
This commit is contained in:
commit
84138845c5
1
.gitignore
vendored
1
.gitignore
vendored
@ -116,6 +116,7 @@ git-update-index
|
|||||||
git-update-ref
|
git-update-ref
|
||||||
git-update-server-info
|
git-update-server-info
|
||||||
git-upload-pack
|
git-upload-pack
|
||||||
|
git-upload-tar
|
||||||
git-var
|
git-var
|
||||||
git-verify-pack
|
git-verify-pack
|
||||||
git-verify-tag
|
git-verify-tag
|
||||||
|
@ -8,12 +8,12 @@ git-cat-file - Provide content or type information for repository objects
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
'git-cat-file' [-t | -s | -e | <type>] <object>
|
'git-cat-file' [-t | -s | -e | -p | <type>] <object>
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
Provides content or type of objects in the repository. The type
|
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.
|
or '-s' is used to find the object size.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
@ -33,6 +33,9 @@ OPTIONS
|
|||||||
Suppress all output; instead exit with zero status if <object>
|
Suppress all output; instead exit with zero status if <object>
|
||||||
exists and is a valid object.
|
exists and is a valid object.
|
||||||
|
|
||||||
|
-p::
|
||||||
|
Pretty-print the contents of <object> based on its type.
|
||||||
|
|
||||||
<type>::
|
<type>::
|
||||||
Typically this matches the real type of <object> but asking
|
Typically this matches the real type of <object> but asking
|
||||||
for a type that can trivially be dereferenced from the given
|
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 '-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
|
Otherwise the raw (though uncompressed) contents of the <object> will
|
||||||
be returned.
|
be returned.
|
||||||
|
|
||||||
|
16
fetch-pack.c
16
fetch-pack.c
@ -18,6 +18,12 @@ static const char *exec = "git-upload-pack";
|
|||||||
#define SEEN (1U << 3)
|
#define SEEN (1U << 3)
|
||||||
#define POPPED (1U << 4)
|
#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 struct commit_list *rev_list = NULL;
|
||||||
static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0;
|
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 fetching;
|
||||||
int count = 0, flushes = 0, retval;
|
int count = 0, flushes = 0, retval;
|
||||||
const unsigned char *sha1;
|
const unsigned char *sha1;
|
||||||
|
unsigned in_vain = 0;
|
||||||
|
int got_continue = 0;
|
||||||
|
|
||||||
for_each_ref(rev_list_insert_ref);
|
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));
|
packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
|
fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
|
||||||
|
in_vain++;
|
||||||
if (!(31 & ++count)) {
|
if (!(31 & ++count)) {
|
||||||
int ack;
|
int ack;
|
||||||
|
|
||||||
@ -200,9 +209,16 @@ static int find_common(int fd[2], unsigned char *result_sha1,
|
|||||||
lookup_commit(result_sha1);
|
lookup_commit(result_sha1);
|
||||||
mark_common(commit, 0, 1);
|
mark_common(commit, 0, 1);
|
||||||
retval = 0;
|
retval = 0;
|
||||||
|
in_vain = 0;
|
||||||
|
got_continue = 1;
|
||||||
}
|
}
|
||||||
} while (ack);
|
} while (ack);
|
||||||
flushes--;
|
flushes--;
|
||||||
|
if (got_continue && MAX_IN_VAIN < in_vain) {
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr, "giving up\n");
|
||||||
|
break; /* give up */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
done:
|
done:
|
||||||
|
@ -58,11 +58,19 @@ http://* | https://* )
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
rsync://* )
|
rsync://* )
|
||||||
mkdir $tmpdir
|
mkdir $tmpdir &&
|
||||||
|
rsync -rlq "$peek_repo/HEAD" $tmpdir &&
|
||||||
rsync -rq "$peek_repo/refs" $tmpdir || {
|
rsync -rq "$peek_repo/refs" $tmpdir || {
|
||||||
echo "failed slurping"
|
echo "failed slurping"
|
||||||
exit
|
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) |
|
(cd $tmpdir && find refs -type f) |
|
||||||
while read path
|
while read path
|
||||||
do
|
do
|
||||||
|
Loading…
Reference in New Issue
Block a user