mirror of
https://github.com/git/git.git
synced 2024-11-15 05:33:04 +01:00
143f1eafdb
Reimplement commit4b7f53da
on top of the new simplify-merges infrastructure, tightening the condition to only consider root parents; the original version incorrectly dropped parents that were TREESAME to anything. Original log message follows. The merge simplification rule stated in6546b59
(revision traversal: show full history with merge simplification, 2008-07-31) still treated merge commits too specially. Namely, in a history with this shape: ---o---o---M / x---x---x where three 'x' were on a history completely unrelated to the main history 'o' and do not touch any of the paths we are following, we still said that after simplifying all of the parents of M, 'x' (which is the leftmost 'x' that rightmost 'x simplifies down to) and 'o' (which would be the last commit on the main history that touches the paths we are following) are independent from each other, and both need to be kept. That is incorrect; when the side branch 'x' never touches the paths, it should be removed to allow M to simplify down to the last commit on the main history that touches the paths. Suggested-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Kevin Bracey <kevin@bracey.fi> Signed-off-by: Junio C Hamano <gitster@pobox.com>
130 lines
2.8 KiB
Bash
Executable file
130 lines
2.8 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='merge simplification'
|
|
|
|
. ./test-lib.sh
|
|
|
|
note () {
|
|
git tag "$1"
|
|
}
|
|
|
|
unnote () {
|
|
git name-rev --tags --stdin | sed -e "s|$_x40 (tags/\([^)]*\)) |\1 |g"
|
|
}
|
|
|
|
test_expect_success setup '
|
|
echo "Hi there" >file &&
|
|
echo "initial" >lost &&
|
|
git add file lost &&
|
|
test_tick && git commit -m "Initial file and lost" &&
|
|
note A &&
|
|
|
|
git branch other-branch &&
|
|
|
|
echo "Hello" >file &&
|
|
echo "second" >lost &&
|
|
git add file lost &&
|
|
test_tick && git commit -m "Modified file and lost" &&
|
|
note B &&
|
|
|
|
git checkout other-branch &&
|
|
|
|
echo "Hello" >file &&
|
|
>lost &&
|
|
git add file lost &&
|
|
test_tick && git commit -m "Modified the file identically" &&
|
|
note C &&
|
|
|
|
echo "This is a stupid example" >another-file &&
|
|
git add another-file &&
|
|
test_tick && git commit -m "Add another file" &&
|
|
note D &&
|
|
|
|
test_tick &&
|
|
test_must_fail git merge -m "merge" master &&
|
|
>lost && git commit -a -m "merge" &&
|
|
note E &&
|
|
|
|
echo "Yet another" >elif &&
|
|
git add elif &&
|
|
test_tick && git commit -m "Irrelevant change" &&
|
|
note F &&
|
|
|
|
git checkout master &&
|
|
echo "Yet another" >elif &&
|
|
git add elif &&
|
|
test_tick && git commit -m "Another irrelevant change" &&
|
|
note G &&
|
|
|
|
test_tick && git merge -m "merge" other-branch &&
|
|
note H &&
|
|
|
|
echo "Final change" >file &&
|
|
test_tick && git commit -a -m "Final change" &&
|
|
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'
|
|
|
|
check_outcome () {
|
|
outcome=$1
|
|
shift
|
|
for c in $1
|
|
do
|
|
echo "$c"
|
|
done >expect &&
|
|
shift &&
|
|
param="$*" &&
|
|
test_expect_$outcome "log $param" '
|
|
git log --pretty="$FMT" --parents $param |
|
|
unnote >actual &&
|
|
sed -e "s/^.* \([^ ]*\) .*/\1/" >check <actual &&
|
|
test_cmp expect check || {
|
|
cat actual
|
|
false
|
|
}
|
|
'
|
|
}
|
|
|
|
check_result () {
|
|
check_outcome success "$@"
|
|
}
|
|
|
|
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
|
|
check_result 'H' --first-parent -- another-file
|
|
|
|
check_result 'E C B A' --full-history E -- lost
|
|
test_expect_success 'full history simplification without parent' '
|
|
printf "%s\n" E C B A >expect &&
|
|
git log --pretty="$FMT" --full-history E -- lost |
|
|
unnote >actual &&
|
|
sed -e "s/^.* \([^ ]*\) .*/\1/" >check <actual &&
|
|
test_cmp expect check || {
|
|
cat actual
|
|
false
|
|
}
|
|
'
|
|
|
|
test_done
|