From: Junio C Hamano Date: Wed, 22 Feb 2006 09:48:49 +0000 (-0800) Subject: Merge branch 'jc/send-insane-refs' into next X-Git-Tag: v1.3.0-rc1~54^2~46 X-Git-Url: https://git.octo.it/?p=git.git;a=commitdiff_plain;h=eb6b1cfccaacee5250f56a6027d67299e06d956b Merge branch 'jc/send-insane-refs' into next * jc/send-insane-refs: send-pack: do not give up when remote has insanely large number of refs. rev-list.c: fix non-grammatical comments. --- eb6b1cfccaacee5250f56a6027d67299e06d956b diff --cc send-pack.c index ad22da56,b58bbabc..f5583861 --- a/send-pack.c +++ b/send-pack.c @@@ -38,29 -37,44 +38,47 @@@ 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 */ + if (use_thin_pack) /* 1 */ + args[i++] = "--objects-edge"; + else + args[i++] = "--objects"; - 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);