Skip to content

Commit

Permalink
send-pack: do not give up when remote has insanely large number of refs.
Browse files Browse the repository at this point in the history
Stephen C. Tweedie noticed that we give up running rev-list when
we see too many refs on the remote side.  Limit the number of
negative references we give to rev-list and continue.

Not sending any negative references to rev-list is very bad --
we may be pushing a ref that is new to the other end.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Feb 22, 2006
1 parent 5031985 commit 797656e
Showing 1 changed file with 28 additions and 10 deletions.
38 changes: 28 additions & 10 deletions send-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,26 +37,44 @@ static void exec_pack_objects(void)

static void exec_rev_list(struct ref *refs)
{
struct ref *ref;
static char *args[1000];
int i = 0;
int i = 0, j;

args[i++] = "rev-list"; /* 0 */
args[i++] = "--objects"; /* 1 */
while (refs) {
char *buf = malloc(100);
if (i > 900)

/* First send the ones we care about most */
for (ref = refs; ref; ref = ref->next) {
if (900 < i)
die("git-rev-list environment overflow");
if (!is_zero_sha1(refs->old_sha1) &&
has_sha1_file(refs->old_sha1)) {
if (!is_zero_sha1(ref->new_sha1)) {
char *buf = malloc(100);
args[i++] = buf;
snprintf(buf, 50, "^%s", sha1_to_hex(refs->old_sha1));
snprintf(buf, 50, "%s", sha1_to_hex(ref->new_sha1));
buf += 50;
if (!is_zero_sha1(ref->old_sha1) &&
has_sha1_file(ref->old_sha1)) {
args[i++] = buf;
snprintf(buf, 50, "^%s",
sha1_to_hex(ref->old_sha1));
}
}
if (!is_zero_sha1(refs->new_sha1)) {
}

/* Then a handful of the remainder
* NEEDSWORK: we would be better off if used the newer ones first.
*/
for (ref = refs, j = i + 16;
i < 900 && i < j && ref;
ref = ref->next) {
if (is_zero_sha1(ref->new_sha1) &&
!is_zero_sha1(ref->old_sha1) &&
has_sha1_file(ref->old_sha1)) {
char *buf = malloc(42);
args[i++] = buf;
snprintf(buf, 50, "%s", sha1_to_hex(refs->new_sha1));
snprintf(buf, 42, "^%s", sha1_to_hex(ref->old_sha1));
}
refs = refs->next;
}
args[i] = NULL;
execv_git_cmd(args);
Expand Down

0 comments on commit 797656e

Please sign in to comment.