[PATCH 4/5] in_merge_bases(): omit unnecessary redundant common ancestor reduction
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 27, 2012, 23:12 UTC
- Message-ID
- <1346109123-12357-5-git-send-email-gitster@pobox.com>
- In-Reply-To
- <1346109123-12357-1-git-send-email-gitster@pobox.com>
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: Junio C Hamano <gitster@pobox.com> --- commit.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/commit.c b/commit.c index 74ec5f1..f5211bd 100644 --- a/commit.c +++ b/commit.c @@ -806,7 +806,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;
-- 1.7.12.116.g31e0100