From: Linus Torvalds Date: Sun, 10 Jul 2005 22:09:46 +0000 (-0700) Subject: git-rev-list: allow missing objects when the parent is marked UNINTERESTING X-Git-Tag: v0.99~6 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=454fbbcde3beb5eb36a4554e5b7074f8d501a6f1;p=git.git git-rev-list: allow missing objects when the parent is marked UNINTERESTING We still want the "top-most" uninteresting object to exist, so that we know that we have reached it. --- diff --git a/rev-list.c b/rev-list.c index dfa09338..0c0bdc2f 100644 --- a/rev-list.c +++ b/rev-list.c @@ -203,6 +203,8 @@ static void mark_tree_uninteresting(struct tree *tree) if (obj->flags & UNINTERESTING) return; obj->flags |= UNINTERESTING; + if (!has_sha1_file(obj->sha1)) + return; if (parse_tree(tree) < 0) die("bad tree %s", sha1_to_hex(obj->sha1)); entry = tree->entries; @@ -224,6 +226,17 @@ static void mark_parents_uninteresting(struct commit *commit) while (parents) { struct commit *commit = parents->item; commit->object.flags |= UNINTERESTING; + + /* + * A missing commit is ok iff its parent is marked + * uninteresting. + * + * We just mark such a thing parsed, so that when + * it is popped next time around, we won't be trying + * to parse it and get an error. + */ + if (!has_sha1_file(commit->object.sha1)) + commit->object.parsed = 1; parents = parents->next; } } @@ -371,6 +384,8 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags) object->flags |= flags; if (parse_commit(commit) < 0) die("unable to parse commit %s", name); + if (flags & UNINTERESTING) + mark_parents_uninteresting(commit); return commit; }