| #!/bin/sh |
| |
| test_description='merge simplification' |
| |
| . ./test-lib.sh |
| |
| note () { |
| git tag "$1" |
| } |
| |
| unnote () { |
| git name-rev --tags --stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\)) |\1 |g" |
| } |
| |
| # |
| # Create a test repo with interesting commit graph: |
| # |
| # A--B----------G--H--I--K--L |
| # \ \ / / |
| # \ \ / / |
| # C------E---F J |
| # \_/ |
| # |
| # The commits are laid out from left-to-right starting with |
| # the root commit A and terminating at the tip commit L. |
| # |
| # There are a few places where we adjust the commit date or |
| # author date to make the --topo-order, --date-order, and |
| # --author-date-order flags produce different output. |
| |
| 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 && |
| |
| 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 && |
| |
| echo "Hello" >file && |
| echo "second" >lost && |
| git add file lost && |
| test_tick && GIT_AUTHOR_DATE=$(($test_tick + 120)) 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 checkout master && |
| test_tick && git merge --allow-unrelated-histories -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 |
| ' |
| } |
| |
| check_result () { |
| check_outcome success "$@" |
| } |
| |
| check_result 'L K J I H F E D C G B A' --full-history --topo-order |
| check_result 'L K I H G F E D C B J A' --full-history |
| check_result 'L K I H G F E D C B J A' --full-history --date-order |
| check_result 'L K I H G F E D B C J A' --full-history --author-date-order |
| 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 'K I H E B C A' --full-history --author-date-order -- file |
| check_result 'I E C B A' --simplify-merges -- file |
| check_result 'I E C B A' --simplify-merges --topo-order -- file |
| check_result 'I E C B A' --simplify-merges --date-order -- file |
| check_result 'I E B C A' --simplify-merges --author-date-order -- file |
| check_result 'I B A' -- file |
| check_result 'I B A' --topo-order -- file |
| check_result 'I B A' --date-order -- file |
| check_result 'I B A' --author-date-order -- file |
| check_result 'H' --first-parent -- another-file |
| check_result 'H' --first-parent --topo-order -- 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 |
| ' |
| |
| test_expect_success '--full-diff is not affected by --parents' ' |
| git log -p --pretty="%H" --full-diff -- file >expected && |
| git log -p --pretty="%H" --full-diff --parents -- file >actual && |
| test_cmp expected actual |
| ' |
| |
| test_done |