X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=merge-base.c;h=e73fca7453e8141b3f371a1aeba483c9ed946ccc;hb=ac5a85181ac18b0119705f46cfa825389643df33;hp=43a6818369a71078a61fc223339c4918699e052d;hpb=ed9a540b2b351ea305e26bb0d9028f21c976b67c;p=git.git diff --git a/merge-base.c b/merge-base.c index 43a68183..e73fca74 100644 --- a/merge-base.c +++ b/merge-base.c @@ -123,6 +123,47 @@ static struct commit *interesting(struct commit_list *list) static int show_all = 0; +static void mark_reachable_commits(struct commit_list *result, + struct commit_list *list) +{ + struct commit_list *tmp; + + /* + * Postprocess to fully contaminate the well. + */ + for (tmp = result; tmp; tmp = tmp->next) { + struct commit *c = tmp->item; + /* Reinject uninteresting ones to list, + * so we can scan their parents. + */ + if (c->object.flags & UNINTERESTING) + commit_list_insert(c, &list); + } + while (list) { + struct commit *c = list->item; + struct commit_list *parents; + + tmp = list; + list = list->next; + free(tmp); + + /* Anything taken out of the list is uninteresting, so + * mark all its parents uninteresting. We do not + * parse new ones (we already parsed all the relevant + * ones). + */ + parents = c->parents; + while (parents) { + struct commit *p = parents->item; + parents = parents->next; + if (!(p->object.flags & UNINTERESTING)) { + p->object.flags |= UNINTERESTING; + commit_list_insert(p, &list); + } + } + } +} + static int merge_base(struct commit *rev1, struct commit *rev2) { struct commit_list *list = NULL; @@ -171,40 +212,8 @@ static int merge_base(struct commit *rev1, struct commit *rev2) if (!result) return 1; - /* - * Postprocess to fully contaminate the well. - */ - for (tmp = result; tmp; tmp = tmp->next) { - struct commit *c = tmp->item; - /* Reinject uninteresting ones to list, - * so we can scan their parents. - */ - if (c->object.flags & UNINTERESTING) - commit_list_insert(c, &list); - } - while (list) { - struct commit *c = list->item; - struct commit_list *parents; - - tmp = list; - list = list->next; - free(tmp); - - /* Anything taken out of the list is uninteresting, so - * mark all its parents uninteresting. We do not - * parse new ones (we already parsed all the relevant - * ones). - */ - parents = c->parents; - while (parents) { - struct commit *p = parents->item; - parents = parents->next; - if (!(p->object.flags & UNINTERESTING)) { - p->object.flags |= UNINTERESTING; - commit_list_insert(p, &list); - } - } - } + if (result->next && list) + mark_reachable_commits(result, list); while (result) { struct commit *commit = result->item; @@ -227,6 +236,8 @@ int main(int argc, char **argv) struct commit *rev1, *rev2; unsigned char rev1key[20], rev2key[20]; + setup_git_directory(); + while (1 < argc && argv[1][0] == '-') { char *arg = argv[1]; if (!strcmp(arg, "-a") || !strcmp(arg, "--all"))