Raw
1 #!/bin/sh
2
3 test_description='remerge-diff handling'
4
5 . ./test-lib.sh
6
7 test_expect_success 'setup basic merges' '
8 test_write_lines 1 2 3 4 5 6 7 8 9 >numbers &&
9 git add numbers &&
10 git commit -m base &&
11
12 git branch feature_a &&
13 git branch feature_b &&
14 git branch feature_c &&
15
16 git branch ab_resolution &&
17 git branch bc_resolution &&
18
19 git checkout feature_a &&
20 test_write_lines 1 2 three 4 5 6 7 eight 9 >numbers &&
21 git commit -a -m change_a &&
22
23 git checkout feature_b &&
24 test_write_lines 1 2 tres 4 5 6 7 8 9 >numbers &&
25 git commit -a -m change_b &&
26
27 git checkout feature_c &&
28 test_write_lines 1 2 3 4 5 6 7 8 9 10 >numbers &&
29 git commit -a -m change_c &&
30
31 git checkout bc_resolution &&
32 git merge --ff-only feature_b &&
33 # no conflict
34 git merge feature_c &&
35
36 git checkout ab_resolution &&
37 git merge --ff-only feature_a &&
38 # conflicts!
39 test_must_fail git merge feature_b &&
40 # Resolve conflict...and make another change elsewhere
41 test_write_lines 1 2 drei 4 5 6 7 acht 9 >numbers &&
42 git add numbers &&
43 git merge --continue
44 '
45
46 test_expect_success 'remerge-diff on a clean merge' '
47 git log -1 --oneline bc_resolution >expect &&
48 git show --oneline --remerge-diff bc_resolution >actual &&
49 test_cmp expect actual
50 '
51
52 test_expect_success 'remerge-diff on a clean merge with a filter' '
53 git show --oneline --remerge-diff --diff-filter=U bc_resolution >actual &&
54 test_must_be_empty actual
55 '
56
57 test_expect_success 'remerge-diff with both a resolved conflict and an unrelated change' '
58 git log -1 --oneline ab_resolution >tmp &&
59 cat <<-EOF >>tmp &&
60 diff --git a/numbers b/numbers
61 remerge CONFLICT (content): Merge conflict in numbers
62 index a1fb731..6875544 100644
63 --- a/numbers
64 +++ b/numbers
65 @@ -1,13 +1,9 @@
66 1
67 2
68 -<<<<<<< b0ed5cb (change_a)
69 -three
70 -=======
71 -tres
72 ->>>>>>> 6cd3f82 (change_b)
73 +drei
74 4
75 5
76 6
77 7
78 -eight
79 +acht
80 9
81 EOF
82 # Hashes above are sha1; rip them out so test works with sha256
83 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
84
85 git show --oneline --remerge-diff ab_resolution >tmp &&
86 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
87 test_cmp expect actual
88 '
89
90 test_expect_success 'pickaxe still includes additional headers for relevant changes' '
91 # reuses "expect" from the previous testcase
92
93 git log --oneline --remerge-diff -Sacht ab_resolution >tmp &&
94 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
95 test_cmp expect actual
96 '
97
98 test_expect_success 'can filter out additional headers with pickaxe' '
99 git show --remerge-diff --submodule=log --find-object=HEAD ab_resolution >actual &&
100 test_must_be_empty actual &&
101
102 git show --remerge-diff -S"not present" --all >actual &&
103 test_must_be_empty actual
104 '
105
106 test_expect_success 'remerge-diff also works for git-diff-tree' '
107 # With a clean merge
108 git diff-tree -r -p --remerge-diff --no-commit-id bc_resolution >actual &&
109 test_must_be_empty actual &&
110
111 # With both a resolved conflict and an unrelated change
112 cat <<-EOF >tmp &&
113 diff --git a/numbers b/numbers
114 remerge CONFLICT (content): Merge conflict in numbers
115 index a1fb731..6875544 100644
116 --- a/numbers
117 +++ b/numbers
118 @@ -1,13 +1,9 @@
119 1
120 2
121 -<<<<<<< b0ed5cb (change_a)
122 -three
123 -=======
124 -tres
125 ->>>>>>> 6cd3f82 (change_b)
126 +drei
127 4
128 5
129 6
130 7
131 -eight
132 +acht
133 9
134 EOF
135 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
136 git diff-tree -r -p --remerge-diff --no-commit-id ab_resolution >tmp &&
137 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
138 test_cmp expect actual
139 '
140
141 test_expect_success 'setup non-content conflicts' '
142 git switch --orphan base &&
143
144 test_write_lines 1 2 3 4 5 6 7 8 9 >numbers &&
145 test_write_lines a b c d e f g h i >letters &&
146 test_write_lines in the way >content &&
147 git add numbers letters content &&
148 git commit -m base &&
149
150 git branch side1 &&
151 git branch side2 &&
152
153 git checkout side1 &&
154 test_write_lines 1 2 three 4 5 6 7 8 9 >numbers &&
155 git mv letters letters_side1 &&
156 git mv content file_or_directory &&
157 git add numbers &&
158 git commit -m side1 &&
159
160 git checkout side2 &&
161 git rm numbers &&
162 git mv letters letters_side2 &&
163 mkdir file_or_directory &&
164 echo hello >file_or_directory/world &&
165 git add file_or_directory/world &&
166 git commit -m side2 &&
167
168 git checkout -b resolution side1 &&
169 test_must_fail git merge side2 &&
170 test_write_lines 1 2 three 4 5 6 7 8 9 >numbers &&
171 git add numbers &&
172 git add letters_side1 &&
173 git rm letters &&
174 git rm letters_side2 &&
175 git add file_or_directory~HEAD &&
176 git mv file_or_directory~HEAD wanted_content &&
177 git commit -m resolved
178 '
179
180 test_expect_success 'remerge-diff with non-content conflicts' '
181 git log -1 --oneline resolution >tmp &&
182 cat <<-EOF >>tmp &&
183 diff --git a/file_or_directory~HASH (side1) b/wanted_content
184 similarity index 100%
185 rename from file_or_directory~HASH (side1)
186 rename to wanted_content
187 remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead.
188 diff --git a/letters b/letters
189 remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2).
190 diff --git a/letters_side2 b/letters_side2
191 deleted file mode 100644
192 index b236ae5..0000000
193 --- a/letters_side2
194 +++ /dev/null
195 @@ -1,9 +0,0 @@
196 -a
197 -b
198 -c
199 -d
200 -e
201 -f
202 -g
203 -h
204 -i
205 diff --git a/numbers b/numbers
206 remerge CONFLICT (modify/delete): numbers deleted in HASH (side2) and modified in HASH (side1). Version HASH (side1) of numbers left in tree.
207 EOF
208 # We still have some sha1 hashes above; rip them out so test works
209 # with sha256
210 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
211
212 git show --oneline --remerge-diff resolution >tmp &&
213 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
214 test_cmp expect actual
215 '
216
217 test_expect_success 'remerge-diff w/ diff-filter=U: all conflict headers, no diff content' '
218 git log -1 --oneline resolution >tmp &&
219 cat <<-EOF >>tmp &&
220 diff --git a/file_or_directory~HASH (side1) b/file_or_directory~HASH (side1)
221 remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead.
222 diff --git a/letters b/letters
223 remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2).
224 diff --git a/numbers b/numbers
225 remerge CONFLICT (modify/delete): numbers deleted in HASH (side2) and modified in HASH (side1). Version HASH (side1) of numbers left in tree.
226 EOF
227 # We still have some sha1 hashes above; rip them out so test works
228 # with sha256
229 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
230
231 git show --oneline --remerge-diff --diff-filter=U resolution >tmp &&
232 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
233 test_cmp expect actual
234 '
235
236 test_expect_success 'submodule formatting ignores additional headers' '
237 # Reuses "expect" from last testcase
238
239 git show --oneline --remerge-diff --diff-filter=U --submodule=log >tmp &&
240 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
241 test_cmp expect actual
242 '
243
244 test_expect_success 'remerge-diff w/ diff-filter=R: relevant file + conflict header' '
245 git log -1 --oneline resolution >tmp &&
246 cat <<-EOF >>tmp &&
247 diff --git a/file_or_directory~HASH (side1) b/wanted_content
248 similarity index 100%
249 rename from file_or_directory~HASH (side1)
250 rename to wanted_content
251 remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead.
252 EOF
253 # We still have some sha1 hashes above; rip them out so test works
254 # with sha256
255 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
256
257 git show --oneline --remerge-diff --diff-filter=R resolution >tmp &&
258 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
259 test_cmp expect actual
260 '
261
262 test_expect_success 'remerge-diff w/ pathspec: limits to relevant file including conflict header' '
263 git log -1 --oneline resolution >tmp &&
264 cat <<-EOF >>tmp &&
265 diff --git a/letters b/letters
266 remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2).
267 diff --git a/letters_side2 b/letters_side2
268 deleted file mode 100644
269 index b236ae5..0000000
270 --- a/letters_side2
271 +++ /dev/null
272 @@ -1,9 +0,0 @@
273 -a
274 -b
275 -c
276 -d
277 -e
278 -f
279 -g
280 -h
281 -i
282 EOF
283 # We still have some sha1 hashes above; rip them out so test works
284 # with sha256
285 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
286
287 git show --oneline --remerge-diff resolution -- "letters*" >tmp &&
288 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
289 test_cmp expect actual
290 '
291
292 test_expect_success 'setup non-content conflicts' '
293 git switch --orphan newbase &&
294
295 test_write_lines 1 2 3 4 5 6 7 8 9 >numbers &&
296 git add numbers &&
297 git commit -m base &&
298
299 git branch newside1 &&
300 git branch newside2 &&
301
302 git checkout newside1 &&
303 test_write_lines 1 2 three 4 5 6 7 8 9 >numbers &&
304 git add numbers &&
305 git commit -m side1 &&
306
307 git checkout newside2 &&
308 test_write_lines 1 2 drei 4 5 6 7 8 9 >numbers &&
309 git add numbers &&
310 git commit -m side2 &&
311
312 git checkout -b newresolution newside1 &&
313 test_must_fail git merge newside2 &&
314 git checkout --theirs numbers &&
315 git add -u numbers &&
316 git commit -m resolved
317 '
318
319 test_expect_success 'remerge-diff turns off history simplification' '
320 git log -1 --oneline newresolution >tmp &&
321 cat <<-EOF >>tmp &&
322 diff --git a/numbers b/numbers
323 remerge CONFLICT (content): Merge conflict in numbers
324 index 070e9e7..5335e78 100644
325 --- a/numbers
326 +++ b/numbers
327 @@ -1,10 +1,6 @@
328 1
329 2
330 -<<<<<<< 96f1e45 (side1)
331 -three
332 -=======
333 drei
334 ->>>>>>> 4fd522f (side2)
335 4
336 5
337 6
338 EOF
339 # We still have some sha1 hashes above; rip them out so test works
340 # with sha256
341 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
342
343 git show --oneline --remerge-diff newresolution -- numbers >tmp &&
344 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
345 test_cmp expect actual
346 '
347
348 test_expect_success 'remerge-diff with --reverse' '
349 git log -1 --remerge-diff --oneline ab_resolution^ >expect &&
350 git log -1 --remerge-diff --oneline ab_resolution >>expect &&
351 git log -2 --remerge-diff --oneline ab_resolution --reverse >actual &&
352 test_cmp expect actual
353 '
354
355 test_done