Miklos Vajna <vmiklos@xxxxxxxxxxxxxx> writes: > diff --git a/commit.c b/commit.c > index bbf9c75..f9410d8 100644 > --- a/commit.c > +++ b/commit.c > @@ -600,6 +600,33 @@ static struct commit_list *merge_bases(struct commit *one, struct commit *two) > return result; > } > > +struct commit_list *get_octopus_merge_bases(struct commit_list *in, int cleanup) > +{ > + struct commit_list *i, *j, *k, *ret = NULL; > + struct commit_list **pptr = &ret; > + > + for (i = in; i; i = i->next) { > + if (!ret) > + pptr = &commit_list_insert(i->item, pptr)->next; > + else { > + struct commit_list *new = NULL, *end = NULL; > + > + for (j = ret; j; j = j->next) { > + struct commit_list *bases; > + bases = get_merge_bases(i->item, j->item, cleanup); Why is passing "cleanup" through to get_merge_bases() safe, even when you are running it more than once? get_merge_bases() uses PARENT1, PARENT2 and other flags internally, and the information necessary to clean them efficiently (i.e. the set of commits that could be smudged with these flags due to its operation) is known only to it _after it finishes_. You cannot even say "previous run did not clean things up, so please clean-up before starting this round" upfront. That is why we have clean-up loops at the _end_ of the function after it finishes computing what it wants to return. The only reason clean-up is optional to the function is because there are one-shot callers such as "git merge-base" that do not want to pay penalty for cleaning up (the only time you do not have to tell it to clean up is when you know the invocation is the _last_ invocation of the function, iow there is no later invocation that will be harmed by leftover flags). -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html