diff options
Diffstat (limited to 'revision.c')
-rw-r--r-- | revision.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/revision.c b/revision.c index 33cb207f28..3536635a88 100644 --- a/revision.c +++ b/revision.c @@ -1424,6 +1424,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; @@ -1469,6 +1485,13 @@ static struct commit_list **simplify_one(struct rev_info *revs, struct commit *c pst = locate_simplify_state(revs, p->item); p->item = pst->simplified; } + + /* + * A merge with a tree-same parent is useless + */ + if (commit->parents && commit->parents->next) + remove_treesame_parents(commit); + cnt = remove_duplicate_parents(commit); /* |