aboutsummaryrefslogtreecommitdiff
path: root/commit.c
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@frugalware.org>2008-06-27 18:22:00 +0200
committerJunio C Hamano <gitster@pobox.com>2008-06-30 22:45:51 -0700
commit5240c9d75d8e1b747da427ba6320432d3201168a (patch)
treedf51b4adadebc1f71fbb1fd3ba2fe1bdf99897db /commit.c
parent0b9a969e0fbb0a09e9de931cfe27005cbfd6cb7d (diff)
downloadgit-5240c9d75d8e1b747da427ba6320432d3201168a.tar.gz
git-5240c9d75d8e1b747da427ba6320432d3201168a.tar.xz
Introduce get_octopus_merge_bases() in commit.c
This is like get_merge_bases() but it works for multiple heads, like show-branch --merge-base. Signed-off-by: Miklos Vajna <vmiklos@frugalware.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'commit.c')
-rw-r--r--commit.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/commit.c b/commit.c
index bbf9c7541..6052ca34c 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)
+{
+ 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, 1);
+ if (!new)
+ new = bases;
+ else
+ end->next = bases;
+ for (k = bases; k; k = k->next)
+ end = k;
+ }
+ ret = new;
+ }
+ }
+ return ret;
+}
+
struct commit_list *get_merge_bases(struct commit *one,
struct commit *two, int cleanup)
{