Merge branch 'jc/calloc-fix'
[git] / t / t6012-rev-list-simplify.sh
1 #!/bin/sh
2
3 test_description='merge simplification'
4
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8 . ./test-lib.sh
9
10 note () {
11         git tag "$1"
12 }
13
14 unnote () {
15         git name-rev --tags --stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\)) |\1 |g"
16 }
17
18 #
19 # Create a test repo with interesting commit graph:
20 #
21 # A--B----------G--H--I--K--L
22 #  \  \           /     /
23 #   \  \         /     /
24 #    C------E---F     J
25 #        \_/
26 #
27 # The commits are laid out from left-to-right starting with
28 # the root commit A and terminating at the tip commit L.
29 #
30 # There are a few places where we adjust the commit date or
31 # author date to make the --topo-order, --date-order, and
32 # --author-date-order flags produce different output.
33
34 test_expect_success setup '
35         echo "Hi there" >file &&
36         echo "initial" >lost &&
37         git add file lost &&
38         test_tick && git commit -m "Initial file and lost" &&
39         note A &&
40
41         git branch other-branch &&
42
43         git symbolic-ref HEAD refs/heads/unrelated &&
44         git rm -f "*" &&
45         echo "Unrelated branch" >side &&
46         git add side &&
47         test_tick && git commit -m "Side root" &&
48         note J &&
49         git checkout main &&
50
51         echo "Hello" >file &&
52         echo "second" >lost &&
53         git add file lost &&
54         test_tick && GIT_AUTHOR_DATE=$(($test_tick + 120)) git commit -m "Modified file and lost" &&
55         note B &&
56
57         git checkout other-branch &&
58
59         echo "Hello" >file &&
60         >lost &&
61         git add file lost &&
62         test_tick && git commit -m "Modified the file identically" &&
63         note C &&
64
65         echo "This is a stupid example" >another-file &&
66         git add another-file &&
67         test_tick && git commit -m "Add another file" &&
68         note D &&
69
70         test_tick &&
71         test_must_fail git merge -m "merge" main &&
72         >lost && git commit -a -m "merge" &&
73         note E &&
74
75         echo "Yet another" >elif &&
76         git add elif &&
77         test_tick && git commit -m "Irrelevant change" &&
78         note F &&
79
80         git checkout main &&
81         echo "Yet another" >elif &&
82         git add elif &&
83         test_tick && git commit -m "Another irrelevant change" &&
84         note G &&
85
86         test_tick && git merge -m "merge" other-branch &&
87         note H &&
88
89         echo "Final change" >file &&
90         test_tick && git commit -a -m "Final change" &&
91         note I &&
92
93         git checkout main &&
94         test_tick && git merge --allow-unrelated-histories -m "Coolest" unrelated &&
95         note K &&
96
97         echo "Immaterial" >elif &&
98         git add elif &&
99         test_tick && git commit -m "Last" &&
100         note L
101 '
102
103 FMT='tformat:%P         %H | %s'
104
105 check_outcome () {
106         outcome=$1
107         shift
108         for c in $1
109         do
110                 echo "$c"
111         done >expect &&
112         shift &&
113         param="$*" &&
114         test_expect_$outcome "log $param" '
115                 git log --pretty="$FMT" --parents $param |
116                 unnote >actual &&
117                 sed -e "s/^.*   \([^ ]*\) .*/\1/" >check <actual &&
118                 test_cmp expect check
119         '
120 }
121
122 check_result () {
123         check_outcome success "$@"
124 }
125
126 check_result 'L K J I H F E D C G B A' --full-history --topo-order
127 check_result 'L K I H G F E D C B J A' --full-history
128 check_result 'L K I H G F E D C B J A' --full-history --date-order
129 check_result 'L K I H G F E D B C J A' --full-history --author-date-order
130 check_result 'K I H E C B A' --full-history -- file
131 check_result 'K I H E C B A' --full-history --topo-order -- file
132 check_result 'K I H E C B A' --full-history --date-order -- file
133 check_result 'K I H E B C A' --full-history --author-date-order -- file
134 check_result 'I E C B A' --simplify-merges -- file
135 check_result 'I E C B A' --simplify-merges --topo-order -- file
136 check_result 'I E C B A' --simplify-merges --date-order -- file
137 check_result 'I E B C A' --simplify-merges --author-date-order -- file
138 check_result 'I B A' -- file
139 check_result 'I B A' --topo-order -- file
140 check_result 'I B A' --date-order -- file
141 check_result 'I B A' --author-date-order -- file
142 check_result 'H' --first-parent -- another-file
143 check_result 'H' --first-parent --topo-order -- another-file
144
145 check_result 'E C B A' --full-history E -- lost
146 test_expect_success 'full history simplification without parent' '
147         printf "%s\n" E C B A >expect &&
148         git log --pretty="$FMT" --full-history E -- lost |
149         unnote >actual &&
150         sed -e "s/^.*   \([^ ]*\) .*/\1/" >check <actual &&
151         test_cmp expect check
152 '
153
154 test_expect_success '--full-diff is not affected by --parents' '
155         git log -p --pretty="%H" --full-diff -- file >expected &&
156         git log -p --pretty="%H" --full-diff --parents -- file >actual &&
157         test_cmp expected actual
158 '
159
160 #
161 # Create a new history to demonstrate the value of --show-pulls
162 # with respect to the subtleties of simplified history, --full-history,
163 # and --simplify-merges.
164 #
165 #   .-A---M-----C--N---O---P
166 #  /     / \  \  \/   /   /
167 # I     B   \  R-'`-Z'   /
168 #  \   /     \/         /
169 #   \ /      /\        /
170 #    `---X--'  `---Y--'
171 #
172 # This example is explained in Documentation/rev-list-options.txt
173
174 test_expect_success 'setup rebuild repo' '
175         rm -rf .git * &&
176         git init &&
177         git switch -c topic &&
178
179         echo base >file &&
180         git add file &&
181         test_commit I &&
182
183         echo A >file &&
184         git add file &&
185         test_commit A &&
186
187         git switch -c branchB I &&
188         echo B >file &&
189         git add file &&
190         test_commit B &&
191
192         git switch topic &&
193         test_must_fail git merge -m "M" B &&
194         echo A >file &&
195         echo B >>file &&
196         git add file &&
197         git merge --continue &&
198         note M &&
199
200         echo C >other &&
201         git add other &&
202         test_commit C &&
203
204         git switch -c branchX I &&
205         echo X >file &&
206         git add file &&
207         test_commit X &&
208
209         git switch -c branchR M &&
210         git merge -m R -Xtheirs X &&
211         note R &&
212
213         git switch topic &&
214         git merge -m N R &&
215         note N &&
216
217         git switch -c branchY M &&
218         echo Y >y &&
219         git add y &&
220         test_commit Y &&
221
222         git switch -c branchZ C &&
223         echo Z >z &&
224         git add z &&
225         test_commit Z &&
226
227         git switch topic &&
228         git merge -m O Z &&
229         note O &&
230
231         git merge -m P Y &&
232         note P
233 '
234
235 check_result 'X I' -- file
236 check_result 'N R X I' --show-pulls -- file
237
238 check_result 'P O N R X M B A I' --full-history --topo-order -- file
239 check_result 'N R X M B A I' --simplify-merges --topo-order --show-pulls -- file
240 check_result 'R X M B A I' --simplify-merges --topo-order -- file
241 check_result 'N M A I' --first-parent -- file
242 check_result 'N M A I' --first-parent --show-pulls -- file
243
244 # --ancestry-path implies --full-history
245 check_result 'P O N R M' --topo-order \
246         --ancestry-path A..HEAD -- file
247 check_result 'P O N R M' --topo-order \
248         --show-pulls \
249         --ancestry-path A..HEAD -- file
250 check_result 'P O N R M' --topo-order \
251         --full-history \
252         --ancestry-path A..HEAD -- file
253 check_result 'R M' --topo-order \
254         --simplify-merges \
255         --ancestry-path A..HEAD -- file
256 check_result 'N R M' --topo-order \
257         --simplify-merges --show-pulls \
258         --ancestry-path A..HEAD -- file
259
260 test_expect_success 'log --graph --simplify-merges --show-pulls' '
261         cat >expect <<-\EOF &&
262         * N
263         *   R
264         |\  
265         | * X
266         * |   M
267         |\ \  
268         | * | B
269         | |/  
270         * / A
271         |/  
272         * I
273         EOF
274         git log --graph --pretty="%s" \
275                 --simplify-merges --show-pulls \
276                 -- file >actual &&
277         test_cmp expect actual
278 '
279
280 test_done