1#!/bin/sh 2 3test_description='merge simplification' 4 5. ./test-lib.sh 6 7note () { 8 git tag "$1" 9} 10 11unnote () { 12 git name-rev --tags --stdin|sed-e"s|$OID_REGEX(tags/\([^)]*\)) |\1 |g" 13} 14 15# 16# Create a test repo with interesting commit graph: 17# 18# A--B----------G--H--I--K--L 19# \ \ / / 20# \ \ / / 21# C------E---F J 22# \_/ 23# 24# The commits are laid out from left-to-right starting with 25# the root commit A and terminating at the tip commit L. 26# 27# There are a few places where we adjust the commit date or 28# author date to make the --topo-order, --date-order, and 29# --author-date-order flags produce different output. 30 31test_expect_success setup ' 32 echo "Hi there" >file && 33 echo "initial" >lost && 34 git add file lost && 35 test_tick && git commit -m "Initial file and lost" && 36 note A && 37 38 git branch other-branch && 39 40 git symbolic-ref HEAD refs/heads/unrelated && 41 git rm -f "*" && 42 echo "Unrelated branch" >side && 43 git add side && 44 test_tick && git commit -m "Side root" && 45 note J && 46 git checkout master && 47 48 echo "Hello" >file && 49 echo "second" >lost && 50 git add file lost && 51 test_tick && GIT_AUTHOR_DATE=$(($test_tick + 120)) git commit -m "Modified file and lost" && 52 note B && 53 54 git checkout other-branch && 55 56 echo "Hello" >file && 57 >lost && 58 git add file lost && 59 test_tick && git commit -m "Modified the file identically" && 60 note C && 61 62 echo "This is a stupid example" >another-file && 63 git add another-file && 64 test_tick && git commit -m "Add another file" && 65 note D && 66 67 test_tick && 68 test_must_fail git merge -m "merge" master && 69 >lost && git commit -a -m "merge" && 70 note E && 71 72 echo "Yet another" >elif && 73 git add elif && 74 test_tick && git commit -m "Irrelevant change" && 75 note F && 76 77 git checkout master && 78 echo "Yet another" >elif && 79 git add elif && 80 test_tick && git commit -m "Another irrelevant change" && 81 note G && 82 83 test_tick && git merge -m "merge" other-branch && 84 note H && 85 86 echo "Final change" >file && 87 test_tick && git commit -a -m "Final change" && 88 note I && 89 90 git checkout master && 91 test_tick && git merge --allow-unrelated-histories -m "Coolest" unrelated && 92 note K && 93 94 echo "Immaterial" >elif && 95 git add elif && 96 test_tick && git commit -m "Last" && 97 note L 98' 99 100FMT='tformat:%P %H | %s' 101 102check_outcome () { 103 outcome=$1 104shift 105for c in$1 106do 107echo"$c" 108done>expect && 109shift&& 110 param="$*"&& 111 test_expect_$outcome"log$param"' 112 git log --pretty="$FMT" --parents$param| 113 unnote >actual && 114 sed -e "s/^.* \([^ ]*\) .*/\1/" >check <actual && 115 test_cmp expect check 116 ' 117} 118 119check_result () { 120 check_outcome success "$@" 121} 122 123check_result 'L K J I H F E D C G B A'--full-history --topo-order 124check_result 'L K I H G F E D C B J A'--full-history 125check_result 'L K I H G F E D C B J A'--full-history --date-order 126check_result 'L K I H G F E D B C J A'--full-history --author-date-order 127check_result 'K I H E C B A'--full-history --file 128check_result 'K I H E C B A'--full-history --topo-order --file 129check_result 'K I H E C B A'--full-history --date-order --file 130check_result 'K I H E B C A'--full-history --author-date-order --file 131check_result 'I E C B A'--simplify-merges --file 132check_result 'I E C B A'--simplify-merges --topo-order --file 133check_result 'I E C B A'--simplify-merges --date-order --file 134check_result 'I E B C A'--simplify-merges --author-date-order --file 135check_result 'I B A'--file 136check_result 'I B A'--topo-order --file 137check_result 'I B A'--date-order --file 138check_result 'I B A'--author-date-order --file 139check_result 'H'--first-parent -- another-file 140check_result 'H'--first-parent --topo-order -- another-file 141 142check_result 'E C B A'--full-history E -- lost 143test_expect_success 'full history simplification without parent'' 144 printf "%s\n" E C B A >expect && 145 git log --pretty="$FMT" --full-history E -- lost | 146 unnote >actual && 147 sed -e "s/^.* \([^ ]*\) .*/\1/" >check <actual && 148 test_cmp expect check 149' 150 151test_expect_success '--full-diff is not affected by --parents'' 152 git log -p --pretty="%H" --full-diff -- file >expected && 153 git log -p --pretty="%H" --full-diff --parents -- file >actual && 154 test_cmp expected actual 155' 156 157test_done