X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=rev-list.c;h=fdb531caf6db4944f0612258697670eb00bc55ce;hb=c818566d5c585f9f82dabfbed82edcdd89ba4e5b;hp=fb3372476ca51d0569e831bd6e4ad7efa068c898;hpb=e6c3505b44e943b73a01d9d48b442f8f49b0dfad;p=git.git diff --git a/rev-list.c b/rev-list.c index fb337247..fdb531ca 100644 --- a/rev-list.c +++ b/rev-list.c @@ -9,7 +9,6 @@ #define INTERESTING (1u << 1) #define COUNTED (1u << 2) #define SHOWN (1u << 3) -#define DUPCHECK (1u << 4) static const char rev_list_usage[] = "usage: git-rev-list [OPTION] commit-id \n" @@ -204,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; @@ -225,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; } } @@ -355,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); } /* @@ -372,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; } @@ -411,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]; @@ -464,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")) { @@ -488,13 +499,14 @@ int main(int argc, char **argv) commit = get_commit_reference(arg, flags); if (!commit) continue; - if (commit->object.flags & DUPCHECK) + if (commit->object.flags & SEEN) continue; - commit->object.flags |= DUPCHECK; - insert(commit, &list); + commit->object.flags |= SEEN; + commit_list_insert(commit, &list); } if (!merge_order) { + sort_by_date(&list); if (limited) list = limit_list(list); if (topo_order)