Skip to content

Commit

Permalink
Merge branch 'jc/remove-treesame-parent-in-simplify-merges'
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Junio C Hamano committed Mar 28, 2013
2 parents 39c5835 + 4b7f53d commit 436b60c
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 8 deletions.
30 changes: 27 additions & 3 deletions revision.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
26 changes: 21 additions & 5 deletions t/t6012-rev-list-simplify.sh
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,23 @@ test_expect_success setup '
echo "Final change" >file &&
test_tick && git commit -a -m "Final change" &&
note I
note I &&
git symbolic-ref HEAD refs/heads/unrelated &&
git rm -f "*" &&
echo "Unrelated branch" >side &&
git add side &&
test_tick && git commit -m "Side root" &&
note J &&
git checkout master &&
test_tick && git merge -m "Coolest" unrelated &&
note K &&
echo "Immaterial" >elif &&
git add elif &&
test_tick && git commit -m "Last" &&
note L
'

FMT='tformat:%P %H | %s'
Expand All @@ -79,10 +95,10 @@ check_result () {
'
}

check_result 'I H G F E D C B A' --full-history
check_result 'I H E C B A' --full-history -- file
check_result 'I H E C B A' --full-history --topo-order -- file
check_result 'I H E C B A' --full-history --date-order -- file
check_result 'L K J I H G F E D C B A' --full-history
check_result 'K I H E C B A' --full-history -- file
check_result 'K I H E C B A' --full-history --topo-order -- file
check_result 'K I H E C B A' --full-history --date-order -- file
check_result 'I E C B A' --simplify-merges -- file
check_result 'I B A' -- file
check_result 'I B A' --topo-order -- file
Expand Down

0 comments on commit 436b60c

Please sign in to comment.