From f1f0a2be9fe6e6734d900381de189c56e023be7e Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 19 Oct 2005 21:55:49 -0700 Subject: [PATCH] Be more careful tangling object chains while marking commits. Also Johannes noticed we use parse_object to look up if we know that object already -- we should just ask the in-core object registry with lookup_object() for that. Signed-off-by: Junio C Hamano --- fetch-pack.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fetch-pack.c b/fetch-pack.c index 4ee91f2ca2..8566ab1744 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -35,9 +35,12 @@ static int find_common(int fd[2], unsigned char *result_sha1, * local ref), we tell them we have it but do not have to * tell them about its ancestors, which they already know * about. + * + * We use lookup_object here because we are only + * interested in the case we *know* the object is + * reachable and we have already scanned it. */ - if (has_sha1_file(remote) && - ((o = parse_object(remote)) != NULL) && + if (((o = lookup_object(remote)) != NULL) && (o->flags & COMPLETE)) { struct commit_list *p; struct commit *commit = @@ -120,10 +123,13 @@ static int mark_complete(const char *path, const unsigned char *sha1) struct object *o = parse_object(sha1); while (o && o->type == tag_type) { + struct tag *t = (struct tag *) o; + if (!t->tagged) + break; /* broken repository */ o->flags |= COMPLETE; - o = parse_object(((struct tag *)o)->tagged->sha1); + o = parse_object(t->tagged->sha1); } - if (o->type == commit_type) { + if (o && o->type == commit_type) { struct commit *commit = (struct commit *)o; commit->object.flags |= COMPLETE; insert_by_date(commit, &complete);