1#!/bin/sh 2# 3# ,---E--. *H----------. * marks !TREESAME parent paths 4# / \ / \* 5# *A--*B---D--*F-*G---------K-*L-*M 6# \ /* \ / 7# `-C-' `-*I-*J 8# 9# A creates "file", B and F change it. 10# Odd merge G takes the old version from B. 11# I changes it, but J reverts it, so K is TREESAME to both parents. 12# H and L both change "file", and M merges those changes. 13 14test_description='TREESAME and limiting' 15 16. ./test-lib.sh 17 18note () { 19 git tag "$1" 20} 21 22unnote () { 23 git name-rev --tags --stdin|sed-e"s|$OID_REGEX(tags/\([^)]*\))\([ ]\)|\1\2|g" 24} 25 26test_expect_success setup ' 27 test_commit "Initial file" file "Hi there" A && 28 git branch other-branch && 29 30 test_commit "file=Hello" file "Hello" B && 31 git branch third-branch && 32 33 git checkout other-branch && 34 test_commit "Added other" other "Hello" C && 35 36 git checkout master && 37 test_merge D other-branch && 38 39 git checkout third-branch && 40 test_commit "Third file" third "Nothing" E && 41 42 git checkout master && 43 test_commit "file=Blah" file "Blah" F && 44 45 test_tick && git merge --no-commit third-branch && 46 git checkout third-branch file && 47 git commit && 48 note G && 49 git branch fiddler-branch && 50 51 git checkout -b part2-branch && 52 test_commit "file=Part 2" file "Part 2" H && 53 54 git checkout fiddler-branch && 55 test_commit "Bad commit" file "Silly" I && 56 57 test_tick && git revert I && note J && 58 59 git checkout master && 60 test_tick && git merge --no-ff fiddler-branch && 61 note K && 62 63 test_commit "file=Part 1" file "Part 1" L && 64 65 test_tick && test_must_fail git merge part2-branch && 66 test_commit M file "Parts 1+2" 67' 68 69check_outcome () { 70 outcome=$1 71shift 72 73case"$1"in 74*"("*) 75 FMT="%P %H | %s" 76 munge_actual=" 77 s/^\([^ ]*\) \([^ ]*\) .*/(\1)\2/ 78 s/ //g 79 s/()// 80 " 81;; 82*) 83 FMT="%H | %s" 84 munge_actual="s/^\([^ ]*\) .*/\1/" 85;; 86esac&& 87printf"%s\n"$1>expect && 88shift 89 90 param="$*"&& 91 test_expect_$outcome"log$param"' 92 git log --format="$FMT"$param| 93 unnote >actual && 94 sed -e "$munge_actual" <actual >check && 95 test_cmp expect check 96 ' 97} 98 99check_result () { 100 check_outcome success "$@" 101} 102 103# Odd merge G drops a change in F. Important that G is listed in all 104# except the most basic list. Achieving this means normal merge D will also be 105# shown in normal full-history, as we can't distinguish unless we do a 106# simplification pass. After simplification, D is dropped but G remains. 107# Also, merge simplification of G should not drop the parent B that the default 108# simple history follows. 109check_result 'M L K J I H G F E D C B A' 110check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G (D)F (B)E (BC)D (A)C (A)B A' 111check_result 'M H L K J I G E F D C B A'--topo-order 112check_result 'M L H B A'--file 113check_result '(LH)M (B)L (B)H (A)B A'--parents --file 114check_result 'M L J I H G F D B A'--full-history --file 115check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G (D)F (BA)D (A)B A'--full-history --parents --file 116check_result '(LH)M (G)H (J)L (I)J (G)I (FB)G (B)F (A)B A'--simplify-merges --file 117check_result 'M L K G F D B A'--first-parent 118check_result 'M L G F B A'--first-parent --file 119 120# Check that odd merge G remains shown when F is the bottom. 121check_result 'M L K J I H G E' F..M 122check_result 'M H L K J I G E' F..M --topo-order 123check_result 'M L H' F..M --file 124check_result '(LH)M (B)L (B)H'--parents F..M --file 125check_result 'M L J I H G' F..M --full-history --file 126check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G' F..M --full-history --parents --file 127check_result '(LH)M (G)H (J)L (I)J (G)I (FB)G' F..M --simplify-merges --file 128check_result 'M L K J I H G' F..M --ancestry-path 129check_result 'M L J I H G' F..M --ancestry-path --file 130check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G' F..M --ancestry-path --parents --file 131check_result '(LH)M (G)H (J)L (I)J (G)I (FE)G' F..M --ancestry-path --simplify-merges --file 132check_result 'M L K G' F..M --first-parent 133check_result 'M L G' F..M --first-parent --file 134 135# Note that G is pruned when E is the bottom, even if it's the same commit list 136# If we want history since E, then we're quite happy to ignore G that took E. 137check_result 'M L K J I H G' E..M --ancestry-path 138check_result 'M L J I H' E..M --ancestry-path --file 139check_result '(LH)M (K)L (EJ)K (I)J (E)I (E)H' E..M --ancestry-path --parents --file 140check_result '(LH)M (E)H (J)L (I)J (E)I' E..M --ancestry-path --simplify-merges --file 141 142# Should still be able to ignore I-J branch in simple log, despite limiting 143# to G. 144check_result 'M L K J I H' G..M 145check_result 'M H L K J I' G..M --topo-order 146check_result 'M L H' G..M --file 147check_result '(LH)M (G)L (G)H' G..M --parents --file 148check_result 'M L J I H' G..M --full-history --file 149check_result 'M L K J I H' G..M --full-history --parents --file 150check_result 'M H L J I' G..M --simplify-merges --file 151check_result 'M L K J I H' G..M --ancestry-path 152check_result 'M L J I H' G..M --ancestry-path --file 153check_result 'M L K J I H' G..M --ancestry-path --parents --file 154check_result 'M H L J I' G..M --ancestry-path --simplify-merges --file 155 156# B..F should be able to simplify the merge D from irrelevant side branch C. 157# Default log should also be free to follow B-D, and ignore C. 158# But --full-history shouldn't drop D on its own - without simplification, 159# we can't decide if the merge from INTERESTING commit C was sensible. 160check_result 'F D C' B..F 161check_result 'F' B..F --file 162check_result '(B)F' B..F --parents --file 163check_result 'F D' B..F --full-history --file 164check_result '(D)F (BA)D' B..F --full-history --parents --file 165check_result '(B)F' B..F --simplify-merges --file 166check_result 'F D' B..F --ancestry-path 167check_result 'F' B..F --ancestry-path --file 168check_result 'F' B..F --ancestry-path --parents --file 169check_result 'F' B..F --ancestry-path --simplify-merges --file 170check_result 'F D' B..F --first-parent 171check_result 'F' B..F --first-parent --file 172 173# E...F should be equivalent to E F ^B, and be able to drop D as above. 174check_result 'F' E F ^B --file# includes D 175check_result 'F' E...F --file# includes D 176 177# Any sort of full history of C..F should show D, as it's the connection to C, 178# and it differs from it. 179check_result 'F D B' C..F 180check_result 'F B' C..F --file 181check_result '(B)F (A)B' C..F --parents --file 182check_result 'F D B' C..F --full-history --file 183check_result '(D)F (BC)D (A)B' C..F --full-history --parents --file 184check_result '(D)F (BC)D (A)B' C..F --simplify-merges --file 185check_result 'F D' C..F --ancestry-path 186check_result 'F D' C..F --ancestry-path --file 187check_result 'F D' C..F --ancestry-path --parents --file 188check_result 'F D' C..F --ancestry-path --simplify-merges --file 189check_result 'F D B' C..F --first-parent 190check_result 'F B' C..F --first-parent --file 191 192 193test_done