diff options
| author | Thomas Rast <trast@student.ethz.ch> | 2012-08-23 16:20:41 +0200 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2012-08-28 08:37:07 -0700 | 
| commit | b0f9e9eeef0ed4f21fc9bfa92f1314e3112d5cc1 (patch) | |
| tree | e0983e31157fd5c62fc43b880c1192169b3e8fe0 /commit.c | |
| parent | 6571225137b1ba270b49a0dfc6a30aab6f4b86ba (diff) | |
| download | git-b0f9e9eeef0ed4f21fc9bfa92f1314e3112d5cc1.tar.gz | |
in_merge_bases(): omit unnecessary redundant common ancestor reduction
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>
Diffstat (limited to 'commit.c')
| -rw-r--r-- | commit.c | 5 | 
1 files changed, 4 insertions, 1 deletions
| @@ -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; | 
