Do not feed rev-list an invalid SHA1 expression.
The previous round to optimize fetch-pack has a small bug that feeds SHA1^ ("parent commit") before making sure SHA1 is actually a commit (or a tag that eventually dereferences to a commit). Also it did not help culling the known-to-be-common parents if the common one was a merge. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
0a8944dd48
commit
4dab94d52e
32
fetch-pack.c
32
fetch-pack.c
@ -28,22 +28,36 @@ static int find_common(int fd[2], unsigned char *result_sha1,
|
|||||||
fetching = 0;
|
fetching = 0;
|
||||||
for ( ; refs ; refs = refs->next) {
|
for ( ; refs ; refs = refs->next) {
|
||||||
unsigned char *remote = refs->old_sha1;
|
unsigned char *remote = refs->old_sha1;
|
||||||
|
struct object *o;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If that object is complete (i.e. it is a descendant of a
|
* If that object is complete (i.e. it is an ancestor of a
|
||||||
local ref), we don't want it, nor its descendants.
|
* local ref), we tell them we have it but do not have to
|
||||||
*/
|
* tell them about its ancestors, which they already know
|
||||||
if (has_sha1_file(remote)
|
* about.
|
||||||
&& parse_object(remote)->flags & COMPLETE) {
|
*/
|
||||||
if (rev_command_len + 44 < sizeof(rev_command)) {
|
if (has_sha1_file(remote) &&
|
||||||
|
((o = parse_object(remote)) != NULL) &&
|
||||||
|
(o->flags & COMPLETE)) {
|
||||||
|
struct commit_list *p;
|
||||||
|
struct commit *commit =
|
||||||
|
(struct commit *) (o = deref_tag(o));
|
||||||
|
if (!o)
|
||||||
|
goto repair;
|
||||||
|
if (o->type != commit_type)
|
||||||
|
continue;
|
||||||
|
p = commit->parents;
|
||||||
|
while (p &&
|
||||||
|
rev_command_len + 44 < sizeof(rev_command)) {
|
||||||
snprintf(rev_command + rev_command_len, 44,
|
snprintf(rev_command + rev_command_len, 44,
|
||||||
" ^%s^", sha1_to_hex(remote));
|
" ^%s",
|
||||||
|
sha1_to_hex(p->item->object.sha1));
|
||||||
rev_command_len += 43;
|
rev_command_len += 43;
|
||||||
|
p = p->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
repair:
|
||||||
packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
|
packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
|
||||||
fetching++;
|
fetching++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user