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.
This commit is contained in:
Junio C Hamano 2006-02-22 01:48:49 -08:00
commit eb6b1cfcca
2 changed files with 30 additions and 12 deletions

View File

@ -256,8 +256,8 @@ static void show_commit_list(struct commit_list *list)
die("unknown pending object %s (%s)", sha1_to_hex(obj->sha1), name); die("unknown pending object %s (%s)", sha1_to_hex(obj->sha1), name);
} }
while (objects) { while (objects) {
/* An object with name "foo\n0000000000000000000000000000000000000000" /* An object with name "foo\n0000000..." can be used to
* can be used confuse downstream git-pack-objects very badly. * confuse downstream git-pack-objects very badly.
*/ */
const char *ep = strchr(objects->name, '\n'); const char *ep = strchr(objects->name, '\n');
if (ep) { if (ep) {

View File

@ -38,29 +38,47 @@ static void exec_pack_objects(void)
static void exec_rev_list(struct ref *refs) static void exec_rev_list(struct ref *refs)
{ {
struct ref *ref;
static char *args[1000]; static char *args[1000];
int i = 0; int i = 0, j;
args[i++] = "rev-list"; /* 0 */ args[i++] = "rev-list"; /* 0 */
if (use_thin_pack) /* 1 */ if (use_thin_pack) /* 1 */
args[i++] = "--objects-edge"; args[i++] = "--objects-edge";
else else
args[i++] = "--objects"; args[i++] = "--objects";
while (refs) {
char *buf = malloc(100); /* First send the ones we care about most */
if (i > 900) for (ref = refs; ref; ref = ref->next) {
if (900 < i)
die("git-rev-list environment overflow"); die("git-rev-list environment overflow");
if (!is_zero_sha1(refs->old_sha1) && if (!is_zero_sha1(ref->new_sha1)) {
has_sha1_file(refs->old_sha1)) { char *buf = malloc(100);
args[i++] = buf; 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; 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; 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; args[i] = NULL;
execv_git_cmd(args); execv_git_cmd(args);