Merge branch 'jc/remove-treesame-parent-in-simplify-merges'
The --simplify-merges logic did not cull irrelevant parents from a merge that is otherwise not interesting with respect to the paths we are following. This touches a fairly core part of the revision traversal infrastructure; even though I think this change is correct, please report immediately if you find any unintended side effect. * jc/remove-treesame-parent-in-simplify-merges: simplify-merges: drop merge from irrelevant side branch
This commit is contained in:
30
revision.c
30
revision.c
@ -1970,6 +1970,22 @@ static struct merge_simplify_state *locate_simplify_state(struct rev_info *revs,
|
||||
return st;
|
||||
}
|
||||
|
||||
static void remove_treesame_parents(struct commit *commit)
|
||||
{
|
||||
struct commit_list **pp, *p;
|
||||
|
||||
pp = &commit->parents;
|
||||
while ((p = *pp) != NULL) {
|
||||
struct commit *parent = p->item;
|
||||
if (parent->object.flags & TREESAME) {
|
||||
*pp = p->next;
|
||||
free(p);
|
||||
continue;
|
||||
}
|
||||
pp = &p->next;
|
||||
}
|
||||
}
|
||||
|
||||
static struct commit_list **simplify_one(struct rev_info *revs, struct commit *commit, struct commit_list **tail)
|
||||
{
|
||||
struct commit_list *p;
|
||||
@ -2022,10 +2038,18 @@ static struct commit_list **simplify_one(struct rev_info *revs, struct commit *c
|
||||
if (revs->first_parent_only)
|
||||
break;
|
||||
}
|
||||
if (!revs->first_parent_only)
|
||||
cnt = remove_duplicate_parents(commit);
|
||||
else
|
||||
|
||||
if (revs->first_parent_only) {
|
||||
cnt = 1;
|
||||
} else {
|
||||
/*
|
||||
* A merge with a tree-same parent is useless
|
||||
*/
|
||||
if (commit->parents && commit->parents->next)
|
||||
remove_treesame_parents(commit);
|
||||
|
||||
cnt = remove_duplicate_parents(commit);
|
||||
}
|
||||
|
||||
/*
|
||||
* It is possible that we are a merge and one side branch
|
||||
|
||||
Reference in New Issue
Block a user