summaryrefslogtreecommitdiff
path: root/rev-list.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2005-07-10 15:09:46 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-10 15:09:46 -0700
commit454fbbcde3beb5eb36a4554e5b7074f8d501a6f1 (patch)
tree4049b0a8cba4bd0d4bb436bc1641ce54b4d61ac3 /rev-list.c
parent167a4a3308f4a1606e268c2204c98d6999046ae0 (diff)
downloadgit-454fbbcde3beb5eb36a4554e5b7074f8d501a6f1.tar.gz
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.
Diffstat (limited to 'rev-list.c')
-rw-r--r--rev-list.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/rev-list.c b/rev-list.c
index dfa0933825..0c0bdc2fd8 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;
}