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:
commit
eb6b1cfcca
@ -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) {
|
||||||
|
38
send-pack.c
38
send-pack.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user