diff: have submodule_format logic avoid additional diff headers
[git.git] / t / t4069-remerge-diff.sh
blobe3e6fbd97b215cb1823818c1b791eb1bce23d01e
1 #!/bin/sh
3 test_description='remerge-diff handling'
5 TEST_PASSES_SANITIZE_LEAK=true
6 . ./test-lib.sh
8 # This test is ort-specific
9 if test "${GIT_TEST_MERGE_ALGORITHM}" != ort
10 then
11 skip_all="GIT_TEST_MERGE_ALGORITHM != ort"
12 test_done
15 test_expect_success 'setup basic merges' '
16 test_write_lines 1 2 3 4 5 6 7 8 9 >numbers &&
17 git add numbers &&
18 git commit -m base &&
20 git branch feature_a &&
21 git branch feature_b &&
22 git branch feature_c &&
24 git branch ab_resolution &&
25 git branch bc_resolution &&
27 git checkout feature_a &&
28 test_write_lines 1 2 three 4 5 6 7 eight 9 >numbers &&
29 git commit -a -m change_a &&
31 git checkout feature_b &&
32 test_write_lines 1 2 tres 4 5 6 7 8 9 >numbers &&
33 git commit -a -m change_b &&
35 git checkout feature_c &&
36 test_write_lines 1 2 3 4 5 6 7 8 9 10 >numbers &&
37 git commit -a -m change_c &&
39 git checkout bc_resolution &&
40 git merge --ff-only feature_b &&
41 # no conflict
42 git merge feature_c &&
44 git checkout ab_resolution &&
45 git merge --ff-only feature_a &&
46 # conflicts!
47 test_must_fail git merge feature_b &&
48 # Resolve conflict...and make another change elsewhere
49 test_write_lines 1 2 drei 4 5 6 7 acht 9 >numbers &&
50 git add numbers &&
51 git merge --continue
54 test_expect_success 'remerge-diff on a clean merge' '
55 git log -1 --oneline bc_resolution >expect &&
56 git show --oneline --remerge-diff bc_resolution >actual &&
57 test_cmp expect actual
60 test_expect_success 'remerge-diff with both a resolved conflict and an unrelated change' '
61 git log -1 --oneline ab_resolution >tmp &&
62 cat <<-EOF >>tmp &&
63 diff --git a/numbers b/numbers
64 remerge CONFLICT (content): Merge conflict in numbers
65 index a1fb731..6875544 100644
66 --- a/numbers
67 +++ b/numbers
68 @@ -1,13 +1,9 @@
71 -<<<<<<< b0ed5cb (change_a)
72 -three
73 -=======
74 -tres
75 ->>>>>>> 6cd3f82 (change_b)
76 +drei
81 -eight
82 +acht
84 EOF
85 # Hashes above are sha1; rip them out so test works with sha256
86 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
88 git show --oneline --remerge-diff ab_resolution >tmp &&
89 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
90 test_cmp expect actual
93 test_expect_success 'setup non-content conflicts' '
94 git switch --orphan base &&
96 test_write_lines 1 2 3 4 5 6 7 8 9 >numbers &&
97 test_write_lines a b c d e f g h i >letters &&
98 test_write_lines in the way >content &&
99 git add numbers letters content &&
100 git commit -m base &&
102 git branch side1 &&
103 git branch side2 &&
105 git checkout side1 &&
106 test_write_lines 1 2 three 4 5 6 7 8 9 >numbers &&
107 git mv letters letters_side1 &&
108 git mv content file_or_directory &&
109 git add numbers &&
110 git commit -m side1 &&
112 git checkout side2 &&
113 git rm numbers &&
114 git mv letters letters_side2 &&
115 mkdir file_or_directory &&
116 echo hello >file_or_directory/world &&
117 git add file_or_directory/world &&
118 git commit -m side2 &&
120 git checkout -b resolution side1 &&
121 test_must_fail git merge side2 &&
122 test_write_lines 1 2 three 4 5 6 7 8 9 >numbers &&
123 git add numbers &&
124 git add letters_side1 &&
125 git rm letters &&
126 git rm letters_side2 &&
127 git add file_or_directory~HEAD &&
128 git mv file_or_directory~HEAD wanted_content &&
129 git commit -m resolved
132 test_expect_success 'remerge-diff with non-content conflicts' '
133 git log -1 --oneline resolution >tmp &&
134 cat <<-EOF >>tmp &&
135 diff --git a/file_or_directory~HASH (side1) b/wanted_content
136 similarity index 100%
137 rename from file_or_directory~HASH (side1)
138 rename to wanted_content
139 remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead.
140 diff --git a/letters b/letters
141 remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2).
142 diff --git a/letters_side2 b/letters_side2
143 deleted file mode 100644
144 index b236ae5..0000000
145 --- a/letters_side2
146 +++ /dev/null
147 @@ -1,9 +0,0 @@
157 diff --git a/numbers b/numbers
158 remerge CONFLICT (modify/delete): numbers deleted in HASH (side2) and modified in HASH (side1). Version HASH (side1) of numbers left in tree.
160 # We still have some sha1 hashes above; rip them out so test works
161 # with sha256
162 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
164 git show --oneline --remerge-diff resolution >tmp &&
165 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
166 test_cmp expect actual
169 test_expect_success 'remerge-diff w/ diff-filter=U: all conflict headers, no diff content' '
170 git log -1 --oneline resolution >tmp &&
171 cat <<-EOF >>tmp &&
172 diff --git a/file_or_directory~HASH (side1) b/file_or_directory~HASH (side1)
173 remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead.
174 diff --git a/letters b/letters
175 remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2).
176 diff --git a/numbers b/numbers
177 remerge CONFLICT (modify/delete): numbers deleted in HASH (side2) and modified in HASH (side1). Version HASH (side1) of numbers left in tree.
179 # We still have some sha1 hashes above; rip them out so test works
180 # with sha256
181 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
183 git show --oneline --remerge-diff --diff-filter=U resolution >tmp &&
184 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
185 test_cmp expect actual
188 test_expect_success 'submodule formatting ignores additional headers' '
189 # Reuses "expect" from last testcase
191 git show --oneline --remerge-diff --diff-filter=U --submodule=log >tmp &&
192 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
193 test_cmp expect actual
196 test_expect_success 'remerge-diff w/ diff-filter=R: relevant file + conflict header' '
197 git log -1 --oneline resolution >tmp &&
198 cat <<-EOF >>tmp &&
199 diff --git a/file_or_directory~HASH (side1) b/wanted_content
200 similarity index 100%
201 rename from file_or_directory~HASH (side1)
202 rename to wanted_content
203 remerge CONFLICT (file/directory): directory in the way of file_or_directory from HASH (side1); moving it to file_or_directory~HASH (side1) instead.
205 # We still have some sha1 hashes above; rip them out so test works
206 # with sha256
207 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
209 git show --oneline --remerge-diff --diff-filter=R resolution >tmp &&
210 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
211 test_cmp expect actual
214 test_expect_success 'remerge-diff w/ pathspec: limits to relevant file including conflict header' '
215 git log -1 --oneline resolution >tmp &&
216 cat <<-EOF >>tmp &&
217 diff --git a/letters b/letters
218 remerge CONFLICT (rename/rename): letters renamed to letters_side1 in HASH (side1) and to letters_side2 in HASH (side2).
219 diff --git a/letters_side2 b/letters_side2
220 deleted file mode 100644
221 index b236ae5..0000000
222 --- a/letters_side2
223 +++ /dev/null
224 @@ -1,9 +0,0 @@
235 # We still have some sha1 hashes above; rip them out so test works
236 # with sha256
237 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
239 git show --oneline --remerge-diff resolution -- "letters*" >tmp &&
240 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
241 test_cmp expect actual
244 test_expect_success 'setup non-content conflicts' '
245 git switch --orphan newbase &&
247 test_write_lines 1 2 3 4 5 6 7 8 9 >numbers &&
248 git add numbers &&
249 git commit -m base &&
251 git branch newside1 &&
252 git branch newside2 &&
254 git checkout newside1 &&
255 test_write_lines 1 2 three 4 5 6 7 8 9 >numbers &&
256 git add numbers &&
257 git commit -m side1 &&
259 git checkout newside2 &&
260 test_write_lines 1 2 drei 4 5 6 7 8 9 >numbers &&
261 git add numbers &&
262 git commit -m side2 &&
264 git checkout -b newresolution newside1 &&
265 test_must_fail git merge newside2 &&
266 git checkout --theirs numbers &&
267 git add -u numbers &&
268 git commit -m resolved
271 test_expect_success 'remerge-diff turns off history simplification' '
272 git log -1 --oneline newresolution >tmp &&
273 cat <<-EOF >>tmp &&
274 diff --git a/numbers b/numbers
275 remerge CONFLICT (content): Merge conflict in numbers
276 index 070e9e7..5335e78 100644
277 --- a/numbers
278 +++ b/numbers
279 @@ -1,10 +1,6 @@
282 -<<<<<<< 96f1e45 (side1)
283 -three
284 -=======
285 drei
286 ->>>>>>> 4fd522f (side2)
291 # We still have some sha1 hashes above; rip them out so test works
292 # with sha256
293 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >expect &&
295 git show --oneline --remerge-diff newresolution -- numbers >tmp &&
296 sed -e "s/[0-9a-f]\{7,\}/HASH/g" tmp >actual &&
297 test_cmp expect actual
300 test_done