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 69# could we soup this up to optionally check parents? So "(BA)C" would check 70# that C is shown and has parents B A. 71check_outcome () { 72 outcome=$1 73shift 74 75case"$1"in 76*"("*) 77 FMT="%P %H | %s" 78 munge_actual=" 79 s/^\([^ ]*\) \([^ ]*\) .*/(\1)\2/ 80 s/ //g 81 s/()// 82 " 83;; 84*) 85 FMT="%H | %s" 86 munge_actual="s/^\([^ ]*\) .*/\1/" 87;; 88esac&& 89printf"%s\n"$1>expect && 90shift 91 92 param="$*"&& 93 test_expect_$outcome"log$param"' 94 git log --format="$FMT"$param| 95 unnote >actual && 96 sed -e "$munge_actual" <actual >check && 97 test_cmp expect check || { 98 cat actual 99 false 100 } 101 ' 102} 103 104check_result () { 105 check_outcome success "$@" 106} 107 108# Odd merge G drops a change in F. Important that G is listed in all 109# except the most basic list. Achieving this means normal merge D will also be 110# shown in normal full-history, as we can't distinguish unless we do a 111# simplification pass. After simplification, D is dropped but G remains. 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 'M L H B A'--parents --file 117check_outcome failure 'M L J I H G F D B A'--full-history --file# drops G 118check_result 'M L K J I H G F D B A'--full-history --parents --file 119check_outcome failure 'M H L J I G F 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 'M L H' F..M --parents --file# L+H's parents rewritten to B, so more useful than it may seem 128check_outcome failure 'M L J I H G' F..M --full-history --file# drops G 129check_result 'M L K J I H G' F..M --full-history --parents --file 130check_outcome failure 'M H L J I 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 'M L K J I H G' F..M --ancestry-path --parents --file 134check_result 'M H L J I 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 'M L K J I H' E..M --ancestry-path --parents --file# includes G 143check_outcome failure 'M H L J 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 'M L 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 'F' B..F --parents --file# includes D 166check_outcome failure 'F D' B..F --full-history --file# drops D prematurely 167check_result 'F D' B..F --full-history --parents --file 168check_result '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 'F B' C..F --parents --file 185check_outcome failure 'F D B' C..F --full-history --file# drops D 186check_result 'F D B' C..F --full-history --parents --file 187check_result 'F D 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