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 dfa0933..0c0bdc2 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -203,6 +203,8 @@
 	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 @@
 	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 @@
 		object->flags |= flags;
 		if (parse_commit(commit) < 0)
 			die("unable to parse commit %s", name);
+		if (flags & UNINTERESTING)
+			mark_parents_uninteresting(commit);
 		return commit;
 	}