t6111: new TREESAME test set
[git/git.git] / t / t6111-rev-list-treesame.sh
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