|
| 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 | + |
| 14 | +test_description='TREESAME and limiting' |
| 15 | + |
| 16 | +. ./test-lib.sh |
| 17 | + |
| 18 | +note () { |
| 19 | + git tag "$1" |
| 20 | +} |
| 21 | + |
| 22 | +unnote () { |
| 23 | + git name-rev --tags --stdin | sed -e "s|$_x40 (tags/\([^)]*\)) |\1 |g" |
| 24 | +} |
| 25 | + |
| 26 | +test_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 | +FMT='tformat:%P %H | %s' |
| 70 | + |
| 71 | +# could we soup this up to optionally check parents? So "(BA)C" would check |
| 72 | +# that C is shown and has parents B A. |
| 73 | +check_outcome () { |
| 74 | + outcome=$1 |
| 75 | + shift |
| 76 | + for c in $1 |
| 77 | + do |
| 78 | + echo "$c" |
| 79 | + done >expect && |
| 80 | + shift && |
| 81 | + param="$*" && |
| 82 | + test_expect_$outcome "log $param" ' |
| 83 | + git log --format="$FMT" $param | |
| 84 | + unnote >actual && |
| 85 | + sed -e "s/^.* \([^ ]*\) .*/\1/" >check <actual && |
| 86 | + test_cmp expect check || { |
| 87 | + cat actual |
| 88 | + false |
| 89 | + } |
| 90 | + ' |
| 91 | +} |
| 92 | + |
| 93 | +check_result () { |
| 94 | + check_outcome success "$@" |
| 95 | +} |
| 96 | + |
| 97 | +# Odd merge G drops a change in F. Important that G is listed in all |
| 98 | +# except the most basic list. Achieving this means normal merge D will also be |
| 99 | +# shown in normal full-history, as we can't distinguish unless we do a |
| 100 | +# simplification pass. After simplification, D is dropped but G remains. |
| 101 | +check_result 'M L K J I H G F E D C B A' |
| 102 | +check_result 'M H L K J I G E F D C B A' --topo-order |
| 103 | +check_result 'M L H B A' -- file |
| 104 | +check_result 'M L H B A' --parents -- file |
| 105 | +check_outcome failure 'M L J I H G F D B A' --full-history -- file # drops G |
| 106 | +check_result 'M L K J I H G F D B A' --full-history --parents -- file |
| 107 | +check_outcome failure 'M H L J I G F B A' --simplify-merges -- file # drops G |
| 108 | +check_result 'M L K G F D B A' --first-parent |
| 109 | +check_result 'M L G F B A' --first-parent -- file |
| 110 | + |
| 111 | +# Check that odd merge G remains shown when F is the bottom. |
| 112 | +check_result 'M L K J I H G E' F..M |
| 113 | +check_result 'M H L K J I G E' F..M --topo-order |
| 114 | +check_result 'M L H' F..M -- file |
| 115 | +check_result 'M L H' F..M --parents -- file # L+H's parents rewritten to B, so more useful than it may seem |
| 116 | +check_outcome failure 'M L J I H G' F..M --full-history -- file # drops G |
| 117 | +check_result 'M L K J I H G' F..M --full-history --parents -- file |
| 118 | +check_outcome failure 'M H L J I G' F..M --simplify-merges -- file # drops G |
| 119 | +check_result 'M L K J I H G' F..M --ancestry-path |
| 120 | +check_outcome failure 'M L J I H G' F..M --ancestry-path -- file # drops G |
| 121 | +check_result 'M L K J I H G' F..M --ancestry-path --parents -- file |
| 122 | +check_result 'M H L J I G' F..M --ancestry-path --simplify-merges -- file |
| 123 | +check_result 'M L K G' F..M --first-parent |
| 124 | +check_result 'M L G' F..M --first-parent -- file |
| 125 | + |
| 126 | +# Note that G is pruned when E is the bottom, even if it's the same commit list |
| 127 | +# If we want history since E, then we're quite happy to ignore G that took E. |
| 128 | +check_result 'M L K J I H G' E..M --ancestry-path |
| 129 | +check_result 'M L J I H' E..M --ancestry-path -- file |
| 130 | +check_outcome failure 'M L K J I H' E..M --ancestry-path --parents -- file # includes G |
| 131 | +check_outcome failure 'M H L J I' E..M --ancestry-path --simplify-merges -- file # includes G |
| 132 | + |
| 133 | +# Should still be able to ignore I-J branch in simple log, despite limiting |
| 134 | +# to G. |
| 135 | +check_result 'M L K J I H' G..M |
| 136 | +check_result 'M H L K J I' G..M --topo-order |
| 137 | +check_outcome failure 'M L H' G..M -- file # includes J I |
| 138 | +check_outcome failure 'M L H' G..M --parents -- file # includes J I |
| 139 | +check_result 'M L J I H' G..M --full-history -- file |
| 140 | +check_result 'M L K J I H' G..M --full-history --parents -- file |
| 141 | +check_result 'M H L J I' G..M --simplify-merges -- file |
| 142 | +check_result 'M L K J I H' G..M --ancestry-path |
| 143 | +check_result 'M L J I H' G..M --ancestry-path -- file |
| 144 | +check_result 'M L K J I H' G..M --ancestry-path --parents -- file |
| 145 | +check_result 'M H L J I' G..M --ancestry-path --simplify-merges -- file |
| 146 | + |
| 147 | +# B..F should be able to simplify the merge D from irrelevant side branch C. |
| 148 | +# Default log should also be free to follow B-D, and ignore C. |
| 149 | +# But --full-history shouldn't drop D on its own - without simplification, |
| 150 | +# we can't decide if the merge from INTERESTING commit C was sensible. |
| 151 | +check_result 'F D C' B..F |
| 152 | +check_result 'F' B..F -- file |
| 153 | +check_outcome failure 'F' B..F --parents -- file # includes D |
| 154 | +check_outcome failure 'F D' B..F --full-history -- file # drops D prematurely |
| 155 | +check_result 'F D' B..F --full-history --parents -- file |
| 156 | +check_result 'F' B..F --simplify-merges -- file |
| 157 | +check_result 'F D' B..F --ancestry-path |
| 158 | +check_result 'F' B..F --ancestry-path -- file |
| 159 | +check_outcome failure 'F' B..F --ancestry-path --parents -- file # includes D |
| 160 | +check_outcome failure 'F' B..F --ancestry-path --simplify-merges -- file # includes D |
| 161 | +check_result 'F D' B..F --first-parent |
| 162 | +check_result 'F' B..F --first-parent -- file |
| 163 | + |
| 164 | +# E...F should be equivalent to E F ^B, and be able to drop D as above. |
| 165 | +check_result 'F' E F ^B -- file |
| 166 | +check_result 'F' E...F -- file |
| 167 | + |
| 168 | +# Any sort of full history of C..F should show D, as it's the connection to C, |
| 169 | +# and it differs from it. |
| 170 | +check_result 'F D B' C..F |
| 171 | +check_result 'F B' C..F -- file |
| 172 | +check_result 'F B' C..F --parents -- file |
| 173 | +check_outcome failure 'F D B' C..F --full-history -- file # drops D |
| 174 | +check_result 'F D B' C..F --full-history --parents -- file |
| 175 | +check_result 'F D B' C..F --simplify-merges -- file |
| 176 | +check_result 'F D' C..F --ancestry-path |
| 177 | +check_outcome failure 'F D' C..F --ancestry-path -- file # drops D |
| 178 | +check_result 'F D' C..F --ancestry-path --parents -- file |
| 179 | +check_result 'F D' C..F --ancestry-path --simplify-merges -- file |
| 180 | +check_result 'F D B' C..F --first-parent |
| 181 | +check_result 'F B' C..F --first-parent -- file |
| 182 | + |
| 183 | + |
| 184 | +test_done |
0 commit comments