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|$_x40(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 cat actual 97 false 98 } 99 ' 100} 101 102check_result () { 103 check_outcome success "$@" 104} 105 106# Odd merge G drops a change in F. Important that G is listed in all 107# except the most basic list. Achieving this means normal merge D will also be 108# shown in normal full-history, as we can't distinguish unless we do a 109# simplification pass. After simplification, D is dropped but G remains. 110# Also, merge simplification of G should not drop the parent B that the default 111# simple history follows. 112check_result 'M L K J I H G F E D C B A' 113check_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' 114check_result 'M H L K J I G E F D C B A'--topo-order 115check_result 'M L H B A'--file 116check_result '(LH)M (B)L (B)H (A)B A'--parents --file 117check_outcome failure 'M L J I H G F D B A'--full-history --file# drops G 118check_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 119check_outcome failure '(LH)M (G)H (J)L (I)J (G)I (FB)G (B)F (A)B A'--simplify-merges --file# drops G 120check_result 'M L K G F D B A'--first-parent 121check_result 'M L G F B A'--first-parent --file 122 123# Check that odd merge G remains shown when F is the bottom. 124check_result 'M L K J I H G E' F..M 125check_result 'M H L K J I G E' F..M --topo-order 126check_result 'M L H' F..M --file 127check_result '(LH)M (B)L (B)H'--parents F..M --file 128check_outcome failure 'M L J I H G' F..M --full-history --file# drops G 129check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G' F..M --full-history --parents --file 130check_outcome failure '(LH)M (G)H (J)L (I)J (G)I (FB)G' F..M --simplify-merges --file# drops G 131check_result 'M L K J I H G' F..M --ancestry-path 132check_outcome failure 'M L J I H G' F..M --ancestry-path --file# drops G 133check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G' F..M --ancestry-path --parents --file 134check_result '(LH)M (G)H (J)L (I)J (G)I (FE)G' F..M --ancestry-path --simplify-merges --file 135check_result 'M L K G' F..M --first-parent 136check_result 'M L G' F..M --first-parent --file 137 138# Note that G is pruned when E is the bottom, even if it's the same commit list 139# If we want history since E, then we're quite happy to ignore G that took E. 140check_result 'M L K J I H G' E..M --ancestry-path 141check_result 'M L J I H' E..M --ancestry-path --file 142check_outcome failure '(LH)M (K)L (EJ)K (I)J (E)I (E)H' E..M --ancestry-path --parents --file# includes G 143check_outcome failure '(LH)M (E)H (J)L (I)J (E)I' E..M --ancestry-path --simplify-merges --file# includes G 144 145# Should still be able to ignore I-J branch in simple log, despite limiting 146# to G. 147check_result 'M L K J I H' G..M 148check_result 'M H L K J I' G..M --topo-order 149check_outcome failure 'M L H' G..M --file# includes J I 150check_outcome failure '(LH)M (G)L (G)H' G..M --parents --file# includes J I 151check_result 'M L J I H' G..M --full-history --file 152check_result 'M L K J I H' G..M --full-history --parents --file 153check_result 'M H L J I' G..M --simplify-merges --file 154check_result 'M L K J I H' G..M --ancestry-path 155check_result 'M L J I H' G..M --ancestry-path --file 156check_result 'M L K J I H' G..M --ancestry-path --parents --file 157check_result 'M H L J I' G..M --ancestry-path --simplify-merges --file 158 159# B..F should be able to simplify the merge D from irrelevant side branch C. 160# Default log should also be free to follow B-D, and ignore C. 161# But --full-history shouldn't drop D on its own - without simplification, 162# we can't decide if the merge from INTERESTING commit C was sensible. 163check_result 'F D C' B..F 164check_result 'F' B..F --file 165check_outcome failure '(B)F' B..F --parents --file# includes D 166check_outcome failure 'F D' B..F --full-history --file# drops D prematurely 167check_result '(D)F (BA)D' B..F --full-history --parents --file 168check_result '(B)F' B..F --simplify-merges --file 169check_result 'F D' B..F --ancestry-path 170check_result 'F' B..F --ancestry-path --file 171check_outcome failure 'F' B..F --ancestry-path --parents --file# includes D 172check_outcome failure 'F' B..F --ancestry-path --simplify-merges --file# includes D 173check_result 'F D' B..F --first-parent 174check_result 'F' B..F --first-parent --file 175 176# E...F should be equivalent to E F ^B, and be able to drop D as above. 177check_result 'F' E F ^B --file 178check_result 'F' E...F --file 179 180# Any sort of full history of C..F should show D, as it's the connection to C, 181# and it differs from it. 182check_result 'F D B' C..F 183check_result 'F B' C..F --file 184check_result '(B)F (A)B' C..F --parents --file 185check_outcome failure 'F D B' C..F --full-history --file# drops D 186check_result '(D)F (BC)D (A)B' C..F --full-history --parents --file 187check_result '(D)F (BC)D (A)B' C..F --simplify-merges --file 188check_result 'F D' C..F --ancestry-path 189check_outcome failure 'F D' C..F --ancestry-path --file# drops D 190check_result 'F D' C..F --ancestry-path --parents --file 191check_result 'F D' C..F --ancestry-path --simplify-merges --file 192check_result 'F D B' C..F --first-parent 193check_result 'F B' C..F --first-parent --file 194 195 196test_done