X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=rev-list.c;h=fdb531caf6db4944f0612258697670eb00bc55ce;hb=6aa33f4035d547ac2bd629b1cfd9c46262809d73;hp=0dd45129e6678415f6578b4fc4a1234c6035fc77;hpb=960cea2dd108b425fdc4470b48f5eb02963a9be9;p=git.git diff --git a/rev-list.c b/rev-list.c index 0dd45129..fdb531ca 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; } } @@ -354,12 +367,12 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags) /* * Tag object? Look what it points to.. */ - if (object->type == tag_type) { + while (object->type == tag_type) { struct tag *tag = (struct tag *) object; object->flags |= flags; if (tag_objects && !(object->flags & UNINTERESTING)) add_pending_object(object, tag->tag); - object = tag->tagged; + object = parse_object(tag->tagged->sha1); } /* @@ -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; } @@ -410,10 +425,8 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags) int main(int argc, char **argv) { struct commit_list *list = NULL; - struct commit_list *(*insert)(struct commit *, struct commit_list **); int i, limited = 0; - insert = insert_by_date; for (i = 1 ; i < argc; i++) { int flags; char *arg = argv[i]; @@ -463,7 +476,6 @@ int main(int argc, char **argv) } if (!strcmp(arg, "--merge-order")) { merge_order = 1; - insert = commit_list_insert; continue; } if (!strcmp(arg, "--show-breaks")) { @@ -490,10 +502,11 @@ int main(int argc, char **argv) if (commit->object.flags & SEEN) continue; commit->object.flags |= SEEN; - insert(commit, &list); + commit_list_insert(commit, &list); } if (!merge_order) { + sort_by_date(&list); if (limited) list = limit_list(list); if (topo_order)