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:
Junio C Hamano 2005-10-19 18:28:17 -07:00
parent 0a8944dd48
commit 4dab94d52e

View file

@ -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++;
} }