in_merge_bases(): omit unnecessary redundant common ancestor reduction
authorThomas Rast <trast@student.ethz.ch>
Thu, 23 Aug 2012 14:20:41 +0000 (16:20 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 28 Aug 2012 15:37:07 +0000 (08:37 -0700)
The function get_merge_bases() needs to postprocess the result from
merge_bases_many() in order to make sure none of the commit is a
true ancestor of another commit, which is expensive. However, when
checking if a commit is an ancestor of another commit, we only need
to see if the commit is a common ancestor between the two, and do
not have to care if other common ancestors merge_bases_many() finds
are true merge bases or an ancestor of another merge base.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit.c
index 0a05a1075ad228f1f38f61cc5278edeb8604ebfb..12e5396e4c5c2d293e07870e2543f68405c3fda0 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -780,7 +780,10 @@ int in_merge_bases(struct commit *commit, struct commit *reference)
        struct commit_list *bases, *b;
        int ret = 0;
 
-       bases = get_merge_bases(commit, reference, 1);
+       bases = merge_bases_many(commit, 1, &reference);
+       clear_commit_marks(commit, all_flags);
+       clear_commit_marks(reference, all_flags);
+
        for (b = bases; b; b = b->next) {
                if (!hashcmp(commit->object.sha1, b->item->object.sha1)) {
                        ret = 1;