mirror of
https://github.com/git/git.git
synced 2024-11-05 08:47:56 +01:00
Merge branch 'jc/send-insane-refs'
* jc/send-insane-refs: send-pack: do not give up when remote has insanely large number of refs.
This commit is contained in:
commit
aa01568dc7
1 changed files with 28 additions and 10 deletions
38
send-pack.c
38
send-pack.c
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue