This is like get_merge_bases() but it works for multiple heads. Internally it uses merge_bases_many() but it has the ability to clear commit marks like get_merge_bases(). Signed-off-by: Miklos Vajna <vmiklos@xxxxxxxxxxxxxx> --- On Mon, Jun 09, 2008 at 03:02:07PM +0100, Johannes Schindelin <Johannes.Schindelin@xxxxxx> wrote: > > + int n = 0; > > + struct commit **commits = xmalloc(n*sizeof(struct commit *)); > > Here, n will be 0 and therefore commits will be xmalloc(0), right? > > > + struct commit_list *ret, *i; > > + > > + for(i = in; i; i = i->next, n++) > > + commits[n] = i->item; > > And here, commits will never be realloc()ed. Ouch, yes. > > + ret = merge_bases_many(head, n, commits); > > If merge_bases_many took a commit_list (yes, as I suggested to Junio), > this transformation would not be necessary. > > IIRC nothing in merge_bases_many() needed a commit array. Exactly. I modified merge_bases_many() to use a commit list. > Oh, and whose responsibility is it to free "in"? Caller or callee? > (Because it is a non-const parameter, I would have expected the > callee, > but I think it makes more sense if the caller can do whatever she > wants > with the heads after calling octopus_merge_bases()). The previous. I think using const would be a mistake since we do modify the flags, but I still would prefer free the list in the caller, since the list is still usable. That's exactly why the cleanup flag is there: in case the non-empty objects flags would cause any problem later in the caller. commit.c | 11 +++++++++++ commit.h | 1 + 2 files changed, 12 insertions(+), 0 deletions(-) diff --git a/commit.c b/commit.c index 033c1e8..f3ca099 100644 --- a/commit.c +++ b/commit.c @@ -615,6 +615,17 @@ static struct commit_list *merge_bases(struct commit *one, struct commit *two) return merge_bases_many(one, list); } +struct commit_list *get_octopus_merge_bases(struct commit_list *in, int cleanup) +{ + struct commit_list *ret, *i; + + ret = merge_bases_many(in->item, in->next); + if (cleanup) + for(i = in; i; i = i->next) + clear_commit_marks(i->item, all_flags); + return ret; +} + struct commit_list *get_merge_bases(struct commit *one, struct commit *two, int cleanup) { diff --git a/commit.h b/commit.h index 7f8c5ee..ca858ed 100644 --- a/commit.h +++ b/commit.h @@ -121,6 +121,7 @@ int read_graft_file(const char *graft_file); struct commit_graft *lookup_commit_graft(const unsigned char *sha1); extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup); +extern struct commit_list *get_octopus_merge_bases(struct commit_list *in, int cleanup); extern int register_shallow(const unsigned char *sha1); extern int unregister_shallow(const unsigned char *sha1); -- 1.5.6.rc2.dirty -- 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