]>
Commit | Line | Data |
---|---|---|
ece3c67f JH |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2006 Junio C Hamano | |
4 | # | |
5 | ||
9800a754 | 6 | test_description='various format-patch tests' |
ece3c67f | 7 | |
8f37854b | 8 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
334afbc7 JS |
9 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
10 | ||
ece3c67f | 11 | . ./test-lib.sh |
38a94bb6 | 12 | . "$TEST_DIRECTORY"/lib-terminal.sh |
ece3c67f JH |
13 | |
14 | test_expect_success setup ' | |
08495412 | 15 | test_write_lines 1 2 3 4 5 6 7 8 9 10 >file && |
cd894ee9 JH |
16 | cat file >elif && |
17 | git add file elif && | |
6426f2d2 | 18 | test_tick && |
ece3c67f JH |
19 | git commit -m Initial && |
20 | git checkout -b side && | |
21 | ||
08495412 | 22 | test_write_lines 1 2 5 6 A B C 7 8 9 10 >file && |
1f553918 | 23 | test_chmod +x elif && |
6426f2d2 | 24 | test_tick && |
816366e2 | 25 | git commit -m "Side changes #1" && |
ece3c67f | 26 | |
08495412 | 27 | test_write_lines D E F >>file && |
ece3c67f | 28 | git update-index file && |
6426f2d2 | 29 | test_tick && |
816366e2 | 30 | git commit -m "Side changes #2" && |
982b64e4 | 31 | git tag C2 && |
ece3c67f | 32 | |
08495412 | 33 | test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >file && |
ece3c67f | 34 | git update-index file && |
6426f2d2 | 35 | test_tick && |
816366e2 | 36 | git commit -m "Side changes #3 with \\n backslash-n in it." && |
ece3c67f | 37 | |
8f37854b | 38 | git checkout main && |
854b5cb4 DL |
39 | git diff-tree -p C2 >patch && |
40 | git apply --index <patch && | |
6426f2d2 | 41 | test_tick && |
8f37854b | 42 | git commit -m "Main accepts moral equivalent of #2" && |
ece3c67f | 43 | |
6f93d261 SB |
44 | git checkout side && |
45 | git checkout -b patchid && | |
08495412 ES |
46 | test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >file2 && |
47 | test_write_lines 1 2 3 A 4 B C 7 8 9 10 D E F 5 6 >file3 && | |
48 | test_write_lines 8 9 10 >file && | |
6f93d261 SB |
49 | git add file file2 file3 && |
50 | test_tick && | |
51 | git commit -m "patchid 1" && | |
08495412 ES |
52 | test_write_lines 4 A B 7 8 9 10 >file2 && |
53 | test_write_lines 8 9 10 5 6 >file3 && | |
6f93d261 SB |
54 | git add file2 file3 && |
55 | test_tick && | |
56 | git commit -m "patchid 2" && | |
08495412 | 57 | test_write_lines 10 5 6 >file && |
6f93d261 SB |
58 | git add file && |
59 | test_tick && | |
60 | git commit -m "patchid 3" && | |
61 | ||
94c42894 JK |
62 | git checkout -b empty main && |
63 | test_tick && | |
64 | git commit --allow-empty -m "empty commit" && | |
65 | ||
8f37854b | 66 | git checkout main |
ece3c67f JH |
67 | ' |
68 | ||
0ab74e97 | 69 | test_expect_success 'format-patch --ignore-if-in-upstream' ' |
8f37854b | 70 | git format-patch --stdout main..side >patch0 && |
6bd26f58 DL |
71 | grep "^From " patch0 >from0 && |
72 | test_line_count = 3 from0 | |
ece3c67f JH |
73 | ' |
74 | ||
0ab74e97 | 75 | test_expect_success 'format-patch --ignore-if-in-upstream' ' |
ece3c67f | 76 | git format-patch --stdout \ |
8f37854b | 77 | --ignore-if-in-upstream main..side >patch1 && |
6bd26f58 DL |
78 | grep "^From " patch1 >from1 && |
79 | test_line_count = 2 from1 | |
ece3c67f JH |
80 | ' |
81 | ||
0ab74e97 | 82 | test_expect_success 'format-patch --ignore-if-in-upstream handles tags' ' |
9b7a61d7 | 83 | git tag -a v1 -m tag side && |
8f37854b | 84 | git tag -a v2 -m tag main && |
9b7a61d7 | 85 | git format-patch --stdout --ignore-if-in-upstream v2..v1 >patch1 && |
6bd26f58 DL |
86 | grep "^From " patch1 >from1 && |
87 | test_line_count = 2 from1 | |
9b7a61d7 JH |
88 | ' |
89 | ||
2c642ed8 | 90 | test_expect_success "format-patch doesn't consider merge commits" ' |
8f37854b | 91 | git checkout -b feature main && |
2c642ed8 RR |
92 | echo "Another line" >>file && |
93 | test_tick && | |
08dc2606 | 94 | git commit -am "Feature branch change #1" && |
2c642ed8 RR |
95 | echo "Yet another line" >>file && |
96 | test_tick && | |
08dc2606 | 97 | git commit -am "Feature branch change #2" && |
8f37854b | 98 | git checkout -b merger main && |
2c642ed8 | 99 | test_tick && |
08dc2606 | 100 | git merge --no-ff feature && |
6bd26f58 DL |
101 | git format-patch -3 --stdout >patch && |
102 | grep "^From " patch >from && | |
103 | test_line_count = 3 from | |
2c642ed8 RR |
104 | ' |
105 | ||
0ab74e97 | 106 | test_expect_success 'format-patch result applies' ' |
8f37854b | 107 | git checkout -b rebuild-0 main && |
ece3c67f | 108 | git am -3 patch0 && |
8f37854b | 109 | git rev-list main.. >list && |
6bd26f58 | 110 | test_line_count = 2 list |
ece3c67f JH |
111 | ' |
112 | ||
0ab74e97 | 113 | test_expect_success 'format-patch --ignore-if-in-upstream result applies' ' |
8f37854b | 114 | git checkout -b rebuild-1 main && |
ece3c67f | 115 | git am -3 patch1 && |
8f37854b | 116 | git rev-list main.. >list && |
6bd26f58 | 117 | test_line_count = 2 list |
ece3c67f JH |
118 | ' |
119 | ||
816366e2 | 120 | test_expect_success 'commit did not screw up the log message' ' |
854b5cb4 DL |
121 | git cat-file commit side >actual && |
122 | grep "^Side .* with .* backslash-n" actual | |
816366e2 JH |
123 | ' |
124 | ||
125 | test_expect_success 'format-patch did not screw up the log message' ' | |
816366e2 JH |
126 | grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 && |
127 | grep "^Subject: .*Side changes #3 with .* backslash-n" patch1 | |
816366e2 JH |
128 | ' |
129 | ||
130 | test_expect_success 'replay did not screw up the log message' ' | |
854b5cb4 DL |
131 | git cat-file commit rebuild-1 >actual && |
132 | grep "^Side .* with .* backslash-n" actual | |
816366e2 JH |
133 | ' |
134 | ||
94c42894 JK |
135 | test_expect_success 'format-patch empty commit' ' |
136 | git format-patch --stdout main..empty >empty && | |
137 | grep "^From " empty >from && | |
138 | test_line_count = 1 from | |
139 | ' | |
140 | ||
a8d8173e | 141 | test_expect_success 'extra headers' ' |
25dc8dad | 142 | git config format.headers "To: R E Cipient <rcipient@example.com> |
a8d8173e | 143 | " && |
25dc8dad | 144 | git config --add format.headers "Cc: S E Cipient <scipient@example.com> |
a8d8173e | 145 | " && |
8f37854b | 146 | git format-patch --stdout main..side >patch2 && |
92014b69 | 147 | sed -e "/^\$/q" patch2 >hdrs2 && |
25dc8dad JS |
148 | grep "^To: R E Cipient <rcipient@example.com>\$" hdrs2 && |
149 | grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs2 | |
a8d8173e DB |
150 | ' |
151 | ||
7d22708b | 152 | test_expect_success 'extra headers without newlines' ' |
25dc8dad JS |
153 | git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && |
154 | git config --add format.headers "Cc: S E Cipient <scipient@example.com>" && | |
8f37854b | 155 | git format-patch --stdout main..side >patch3 && |
92014b69 | 156 | sed -e "/^\$/q" patch3 >hdrs3 && |
25dc8dad JS |
157 | grep "^To: R E Cipient <rcipient@example.com>\$" hdrs3 && |
158 | grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs3 | |
a8d8173e DB |
159 | ' |
160 | ||
3ee79d9f | 161 | test_expect_success 'extra headers with multiple To:s' ' |
25dc8dad JS |
162 | git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" && |
163 | git config --add format.headers "To: S E Cipient <scipient@example.com>" && | |
8f37854b | 164 | git format-patch --stdout main..side >patch4 && |
92014b69 | 165 | sed -e "/^\$/q" patch4 >hdrs4 && |
25dc8dad JS |
166 | grep "^To: R E Cipient <rcipient@example.com>,\$" hdrs4 && |
167 | grep "^ *S E Cipient <scipient@example.com>\$" hdrs4 | |
a8d8173e DB |
168 | ' |
169 | ||
25dc8dad | 170 | test_expect_success 'additional command line cc (ascii)' ' |
25dc8dad | 171 | git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && |
8f37854b | 172 | git format-patch --cc="S E Cipient <scipient@example.com>" --stdout main..side >patch5 && |
854b5cb4 DL |
173 | sed -e "/^\$/q" patch5 >hdrs5 && |
174 | grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 && | |
175 | grep "^ *S E Cipient <scipient@example.com>\$" hdrs5 | |
25dc8dad JS |
176 | ' |
177 | ||
178 | test_expect_failure 'additional command line cc (rfc822)' ' | |
25dc8dad | 179 | git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && |
8f37854b | 180 | git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout main..side >patch5 && |
854b5cb4 DL |
181 | sed -e "/^\$/q" patch5 >hdrs5 && |
182 | grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 && | |
183 | grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5 | |
736cc67d DB |
184 | ' |
185 | ||
d7d9c2d0 | 186 | test_expect_success 'command line headers' ' |
d7d9c2d0 | 187 | git config --unset-all format.headers && |
8f37854b | 188 | git format-patch --add-header="Cc: R E Cipient <rcipient@example.com>" --stdout main..side >patch6 && |
854b5cb4 DL |
189 | sed -e "/^\$/q" patch6 >hdrs6 && |
190 | grep "^Cc: R E Cipient <rcipient@example.com>\$" hdrs6 | |
d7d9c2d0 MH |
191 | ' |
192 | ||
193 | test_expect_success 'configuration headers and command line headers' ' | |
25dc8dad | 194 | git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" && |
8f37854b | 195 | git format-patch --add-header="Cc: S E Cipient <scipient@example.com>" --stdout main..side >patch7 && |
854b5cb4 DL |
196 | sed -e "/^\$/q" patch7 >hdrs7 && |
197 | grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs7 && | |
198 | grep "^ *S E Cipient <scipient@example.com>\$" hdrs7 | |
d7d9c2d0 MH |
199 | ' |
200 | ||
25dc8dad | 201 | test_expect_success 'command line To: header (ascii)' ' |
ae6c098f | 202 | git config --unset-all format.headers && |
8f37854b | 203 | git format-patch --to="R E Cipient <rcipient@example.com>" --stdout main..side >patch8 && |
854b5cb4 DL |
204 | sed -e "/^\$/q" patch8 >hdrs8 && |
205 | grep "^To: R E Cipient <rcipient@example.com>\$" hdrs8 | |
25dc8dad JS |
206 | ' |
207 | ||
208 | test_expect_failure 'command line To: header (rfc822)' ' | |
8f37854b | 209 | git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout main..side >patch8 && |
854b5cb4 DL |
210 | sed -e "/^\$/q" patch8 >hdrs8 && |
211 | grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs8 | |
25dc8dad JS |
212 | ' |
213 | ||
214 | test_expect_failure 'command line To: header (rfc2047)' ' | |
8f37854b | 215 | git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout main..side >patch8 && |
854b5cb4 DL |
216 | sed -e "/^\$/q" patch8 >hdrs8 && |
217 | grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs8 | |
ae6c098f SD |
218 | ' |
219 | ||
25dc8dad | 220 | test_expect_success 'configuration To: header (ascii)' ' |
25dc8dad | 221 | git config format.to "R E Cipient <rcipient@example.com>" && |
8f37854b | 222 | git format-patch --stdout main..side >patch9 && |
854b5cb4 DL |
223 | sed -e "/^\$/q" patch9 >hdrs9 && |
224 | grep "^To: R E Cipient <rcipient@example.com>\$" hdrs9 | |
25dc8dad JS |
225 | ' |
226 | ||
227 | test_expect_failure 'configuration To: header (rfc822)' ' | |
ae6c098f | 228 | git config format.to "R. E. Cipient <rcipient@example.com>" && |
8f37854b | 229 | git format-patch --stdout main..side >patch9 && |
854b5cb4 DL |
230 | sed -e "/^\$/q" patch9 >hdrs9 && |
231 | grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs9 | |
25dc8dad JS |
232 | ' |
233 | ||
234 | test_expect_failure 'configuration To: header (rfc2047)' ' | |
25dc8dad | 235 | git config format.to "R Ä Cipient <rcipient@example.com>" && |
8f37854b | 236 | git format-patch --stdout main..side >patch9 && |
854b5cb4 DL |
237 | sed -e "/^\$/q" patch9 >hdrs9 && |
238 | grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs9 | |
ae6c098f SD |
239 | ' |
240 | ||
cc663d14 TR |
241 | # check_patch <patch>: Verify that <patch> looks like a half-sane |
242 | # patch email to avoid a false positive with !grep | |
243 | check_patch () { | |
244 | grep -e "^From:" "$1" && | |
245 | grep -e "^Date:" "$1" && | |
246 | grep -e "^Subject:" "$1" | |
247 | } | |
248 | ||
6bc6b6c0 | 249 | test_expect_success 'format.from=false' ' |
8f37854b | 250 | git -c format.from=false format-patch --stdout main..side >patch && |
854b5cb4 | 251 | sed -e "/^\$/q" patch >hdrs && |
6bc6b6c0 | 252 | check_patch patch && |
854b5cb4 | 253 | ! grep "^From: C O Mitter <committer@example.com>\$" hdrs |
6bc6b6c0 JT |
254 | ' |
255 | ||
256 | test_expect_success 'format.from=true' ' | |
8f37854b | 257 | git -c format.from=true format-patch --stdout main..side >patch && |
854b5cb4 DL |
258 | sed -e "/^\$/q" patch >hdrs && |
259 | check_patch hdrs && | |
260 | grep "^From: C O Mitter <committer@example.com>\$" hdrs | |
6bc6b6c0 JT |
261 | ' |
262 | ||
263 | test_expect_success 'format.from with address' ' | |
8f37854b | 264 | git -c format.from="F R Om <from@example.com>" format-patch --stdout main..side >patch && |
854b5cb4 DL |
265 | sed -e "/^\$/q" patch >hdrs && |
266 | check_patch hdrs && | |
267 | grep "^From: F R Om <from@example.com>\$" hdrs | |
6bc6b6c0 JT |
268 | ' |
269 | ||
270 | test_expect_success '--no-from overrides format.from' ' | |
8f37854b | 271 | git -c format.from="F R Om <from@example.com>" format-patch --no-from --stdout main..side >patch && |
854b5cb4 DL |
272 | sed -e "/^\$/q" patch >hdrs && |
273 | check_patch hdrs && | |
274 | ! grep "^From: F R Om <from@example.com>\$" hdrs | |
6bc6b6c0 JT |
275 | ' |
276 | ||
277 | test_expect_success '--from overrides format.from' ' | |
8f37854b | 278 | git -c format.from="F R Om <from@example.com>" format-patch --from --stdout main..side >patch && |
854b5cb4 DL |
279 | sed -e "/^\$/q" patch >hdrs && |
280 | check_patch hdrs && | |
281 | ! grep "^From: F R Om <from@example.com>\$" hdrs | |
6bc6b6c0 JT |
282 | ' |
283 | ||
c4260034 | 284 | test_expect_success '--no-to overrides config.to' ' |
c4260034 | 285 | git config --replace-all format.to \ |
25dc8dad | 286 | "R E Cipient <rcipient@example.com>" && |
8f37854b | 287 | git format-patch --no-to --stdout main..side >patch10 && |
854b5cb4 DL |
288 | sed -e "/^\$/q" patch10 >hdrs10 && |
289 | check_patch hdrs10 && | |
290 | ! grep "^To: R E Cipient <rcipient@example.com>\$" hdrs10 | |
c4260034 SB |
291 | ' |
292 | ||
293 | test_expect_success '--no-to and --to replaces config.to' ' | |
c4260034 SB |
294 | git config --replace-all format.to \ |
295 | "Someone <someone@out.there>" && | |
296 | git format-patch --no-to --to="Someone Else <else@out.there>" \ | |
8f37854b | 297 | --stdout main..side >patch11 && |
854b5cb4 DL |
298 | sed -e "/^\$/q" patch11 >hdrs11 && |
299 | check_patch hdrs11 && | |
300 | ! grep "^To: Someone <someone@out.there>\$" hdrs11 && | |
301 | grep "^To: Someone Else <else@out.there>\$" hdrs11 | |
c4260034 SB |
302 | ' |
303 | ||
304 | test_expect_success '--no-cc overrides config.cc' ' | |
c4260034 | 305 | git config --replace-all format.cc \ |
25dc8dad | 306 | "C E Cipient <rcipient@example.com>" && |
8f37854b | 307 | git format-patch --no-cc --stdout main..side >patch12 && |
854b5cb4 DL |
308 | sed -e "/^\$/q" patch12 >hdrs12 && |
309 | check_patch hdrs12 && | |
310 | ! grep "^Cc: C E Cipient <rcipient@example.com>\$" hdrs12 | |
c4260034 SB |
311 | ' |
312 | ||
688f4f2f | 313 | test_expect_success '--no-add-header overrides config.headers' ' |
c4260034 | 314 | git config --replace-all format.headers \ |
25dc8dad | 315 | "Header1: B E Cipient <rcipient@example.com>" && |
8f37854b | 316 | git format-patch --no-add-header --stdout main..side >patch13 && |
854b5cb4 DL |
317 | sed -e "/^\$/q" patch13 >hdrs13 && |
318 | check_patch hdrs13 && | |
319 | ! grep "^Header1: B E Cipient <rcipient@example.com>\$" hdrs13 | |
c4260034 SB |
320 | ' |
321 | ||
7d812145 | 322 | test_expect_success 'multiple files' ' |
7d812145 DB |
323 | rm -rf patches/ && |
324 | git checkout side && | |
8f37854b | 325 | git format-patch -o patches/ main && |
7d812145 DB |
326 | ls patches/0001-Side-changes-1.patch patches/0002-Side-changes-2.patch patches/0003-Side-changes-3-with-n-backslash-n-in-it.patch |
327 | ' | |
328 | ||
3baf58bf JH |
329 | test_expect_success 'filename length limit' ' |
330 | test_when_finished "rm -f 000*" && | |
331 | rm -rf 000[1-9]-*.patch && | |
332 | for len in 15 25 35 | |
333 | do | |
334 | git format-patch --filename-max-length=$len -3 side && | |
335 | max=$( | |
336 | for patch in 000[1-9]-*.patch | |
337 | do | |
cbe1d9d6 | 338 | echo "$patch" | wc -c || exit 1 |
3baf58bf JH |
339 | done | |
340 | sort -nr | | |
341 | head -n 1 | |
342 | ) && | |
343 | test $max -le $len || return 1 | |
344 | done | |
345 | ' | |
346 | ||
347 | test_expect_success 'filename length limit from config' ' | |
348 | test_when_finished "rm -f 000*" && | |
349 | rm -rf 000[1-9]-*.patch && | |
350 | for len in 15 25 35 | |
351 | do | |
352 | git -c format.filenameMaxLength=$len format-patch -3 side && | |
353 | max=$( | |
354 | for patch in 000[1-9]-*.patch | |
355 | do | |
cbe1d9d6 | 356 | echo "$patch" | wc -c || exit 1 |
3baf58bf JH |
357 | done | |
358 | sort -nr | | |
359 | head -n 1 | |
360 | ) && | |
361 | test $max -le $len || return 1 | |
362 | done | |
363 | ' | |
364 | ||
365 | test_expect_success 'filename limit applies only to basename' ' | |
366 | test_when_finished "rm -rf patches/" && | |
367 | rm -rf patches/ && | |
368 | for len in 15 25 35 | |
369 | do | |
370 | git format-patch -o patches --filename-max-length=$len -3 side && | |
371 | max=$( | |
372 | for patch in patches/000[1-9]-*.patch | |
373 | do | |
cbe1d9d6 | 374 | echo "${patch#patches/}" | wc -c || exit 1 |
3baf58bf JH |
375 | done | |
376 | sort -nr | | |
377 | head -n 1 | |
378 | ) && | |
379 | test $max -le $len || return 1 | |
380 | done | |
381 | ' | |
382 | ||
4aad08e0 JH |
383 | test_expect_success 'reroll count' ' |
384 | rm -fr patches && | |
8f37854b | 385 | git format-patch -o patches --cover-letter --reroll-count 4 main..side >list && |
4aad08e0 JH |
386 | ! grep -v "^patches/v4-000[0-3]-" list && |
387 | sed -n -e "/^Subject: /p" $(cat list) >subjects && | |
388 | ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects | |
389 | ' | |
390 | ||
7952ea66 JH |
391 | test_expect_success 'reroll count (-v)' ' |
392 | rm -fr patches && | |
8f37854b | 393 | git format-patch -o patches --cover-letter -v4 main..side >list && |
7952ea66 JH |
394 | ! grep -v "^patches/v4-000[0-3]-" list && |
395 | sed -n -e "/^Subject: /p" $(cat list) >subjects && | |
396 | ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects | |
397 | ' | |
398 | ||
db91988a ZH |
399 | test_expect_success 'reroll count (-v) with a fractional number' ' |
400 | rm -fr patches && | |
401 | git format-patch -o patches --cover-letter -v4.4 main..side >list && | |
402 | ! grep -v "^patches/v4.4-000[0-3]-" list && | |
403 | sed -n -e "/^Subject: /p" $(cat list) >subjects && | |
404 | ! grep -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects | |
405 | ' | |
406 | ||
407 | test_expect_success 'reroll (-v) count with a non number' ' | |
408 | rm -fr patches && | |
409 | git format-patch -o patches --cover-letter -v4rev2 main..side >list && | |
410 | ! grep -v "^patches/v4rev2-000[0-3]-" list && | |
411 | sed -n -e "/^Subject: /p" $(cat list) >subjects && | |
412 | ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects | |
413 | ' | |
414 | ||
415 | test_expect_success 'reroll (-v) count with a non-pathname character' ' | |
416 | rm -fr patches && | |
417 | git format-patch -o patches --cover-letter -v4---..././../--1/.2// main..side >list && | |
418 | ! grep -v "patches/v4-\.-\.-\.-1-\.2-000[0-3]-" list && | |
419 | sed -n -e "/^Subject: /p" $(cat list) >subjects && | |
420 | ! grep -v "^Subject: \[PATCH v4---\.\.\./\./\.\./--1/\.2// [0-3]/3\] " subjects | |
421 | ' | |
422 | ||
484cf6c3 TR |
423 | check_threading () { |
424 | expect="$1" && | |
425 | shift && | |
dd2b6b68 | 426 | git format-patch --stdout "$@" >patch && |
484cf6c3 TR |
427 | # Prints everything between the Message-ID and In-Reply-To, |
428 | # and replaces all Message-ID-lookalikes by a sequence number | |
94221d22 | 429 | perl -ne ' |
484cf6c3 TR |
430 | if (/^(message-id|references|in-reply-to)/i) { |
431 | $printing = 1; | |
432 | } elsif (/^\S/) { | |
433 | $printing = 0; | |
434 | } | |
435 | if ($printing) { | |
436 | $h{$1}=$i++ if (/<([^>]+)>/ and !exists $h{$1}); | |
437 | for $k (keys %h) {s/$k/$h{$k}/}; | |
438 | print; | |
439 | } | |
440 | print "---\n" if /^From /i; | |
dd2b6b68 | 441 | ' <patch >actual && |
484cf6c3 TR |
442 | test_cmp "$expect" actual |
443 | } | |
444 | ||
92014b69 | 445 | cat >>expect.no-threading <<EOF |
484cf6c3 TR |
446 | --- |
447 | --- | |
448 | --- | |
449 | EOF | |
450 | ||
451 | test_expect_success 'no threading' ' | |
7d812145 | 452 | git checkout side && |
8f37854b | 453 | check_threading expect.no-threading main |
7d812145 DB |
454 | ' |
455 | ||
92014b69 | 456 | cat >expect.thread <<EOF |
484cf6c3 | 457 | --- |
ba4324c4 | 458 | Message-ID: <0> |
484cf6c3 | 459 | --- |
ba4324c4 | 460 | Message-ID: <1> |
484cf6c3 TR |
461 | In-Reply-To: <0> |
462 | References: <0> | |
463 | --- | |
ba4324c4 | 464 | Message-ID: <2> |
484cf6c3 TR |
465 | In-Reply-To: <0> |
466 | References: <0> | |
467 | EOF | |
7d812145 | 468 | |
484cf6c3 | 469 | test_expect_success 'thread' ' |
8f37854b | 470 | check_threading expect.thread --thread main |
7d812145 DB |
471 | ' |
472 | ||
f0249131 AH |
473 | test_expect_success '--thread overrides format.thread=deep' ' |
474 | test_config format.thread deep && | |
475 | check_threading expect.thread --thread main | |
476 | ' | |
477 | ||
92014b69 | 478 | cat >expect.in-reply-to <<EOF |
484cf6c3 | 479 | --- |
ba4324c4 | 480 | Message-ID: <0> |
484cf6c3 TR |
481 | In-Reply-To: <1> |
482 | References: <1> | |
483 | --- | |
ba4324c4 | 484 | Message-ID: <2> |
484cf6c3 TR |
485 | In-Reply-To: <1> |
486 | References: <1> | |
487 | --- | |
ba4324c4 | 488 | Message-ID: <3> |
484cf6c3 TR |
489 | In-Reply-To: <1> |
490 | References: <1> | |
491 | EOF | |
a5a27c79 | 492 | |
484cf6c3 TR |
493 | test_expect_success 'thread in-reply-to' ' |
494 | check_threading expect.in-reply-to --in-reply-to="<test.message>" \ | |
8f37854b | 495 | --thread main |
a5a27c79 DB |
496 | ' |
497 | ||
92014b69 | 498 | cat >expect.cover-letter <<EOF |
484cf6c3 | 499 | --- |
ba4324c4 | 500 | Message-ID: <0> |
484cf6c3 | 501 | --- |
ba4324c4 | 502 | Message-ID: <1> |
484cf6c3 TR |
503 | In-Reply-To: <0> |
504 | References: <0> | |
505 | --- | |
ba4324c4 | 506 | Message-ID: <2> |
484cf6c3 TR |
507 | In-Reply-To: <0> |
508 | References: <0> | |
509 | --- | |
ba4324c4 | 510 | Message-ID: <3> |
484cf6c3 TR |
511 | In-Reply-To: <0> |
512 | References: <0> | |
513 | EOF | |
a5a27c79 | 514 | |
484cf6c3 | 515 | test_expect_success 'thread cover-letter' ' |
8f37854b | 516 | check_threading expect.cover-letter --cover-letter --thread main |
484cf6c3 TR |
517 | ' |
518 | ||
92014b69 | 519 | cat >expect.cl-irt <<EOF |
484cf6c3 | 520 | --- |
ba4324c4 | 521 | Message-ID: <0> |
484cf6c3 TR |
522 | In-Reply-To: <1> |
523 | References: <1> | |
524 | --- | |
ba4324c4 | 525 | Message-ID: <2> |
2175c10d | 526 | In-Reply-To: <0> |
484cf6c3 | 527 | References: <1> |
2175c10d | 528 | <0> |
484cf6c3 | 529 | --- |
ba4324c4 | 530 | Message-ID: <3> |
2175c10d | 531 | In-Reply-To: <0> |
484cf6c3 | 532 | References: <1> |
2175c10d | 533 | <0> |
484cf6c3 | 534 | --- |
ba4324c4 | 535 | Message-ID: <4> |
2175c10d | 536 | In-Reply-To: <0> |
484cf6c3 | 537 | References: <1> |
2175c10d | 538 | <0> |
484cf6c3 TR |
539 | EOF |
540 | ||
541 | test_expect_success 'thread cover-letter in-reply-to' ' | |
542 | check_threading expect.cl-irt --cover-letter \ | |
8f37854b | 543 | --in-reply-to="<test.message>" --thread main |
a5a27c79 DB |
544 | ' |
545 | ||
30984ed2 TR |
546 | test_expect_success 'thread explicit shallow' ' |
547 | check_threading expect.cl-irt --cover-letter \ | |
8f37854b | 548 | --in-reply-to="<test.message>" --thread=shallow main |
30984ed2 TR |
549 | ' |
550 | ||
92014b69 | 551 | cat >expect.deep <<EOF |
30984ed2 | 552 | --- |
ba4324c4 | 553 | Message-ID: <0> |
30984ed2 | 554 | --- |
ba4324c4 | 555 | Message-ID: <1> |
30984ed2 TR |
556 | In-Reply-To: <0> |
557 | References: <0> | |
558 | --- | |
ba4324c4 | 559 | Message-ID: <2> |
30984ed2 TR |
560 | In-Reply-To: <1> |
561 | References: <0> | |
562 | <1> | |
563 | EOF | |
564 | ||
565 | test_expect_success 'thread deep' ' | |
8f37854b | 566 | check_threading expect.deep --thread=deep main |
30984ed2 TR |
567 | ' |
568 | ||
92014b69 | 569 | cat >expect.deep-irt <<EOF |
30984ed2 | 570 | --- |
ba4324c4 | 571 | Message-ID: <0> |
30984ed2 TR |
572 | In-Reply-To: <1> |
573 | References: <1> | |
574 | --- | |
ba4324c4 | 575 | Message-ID: <2> |
30984ed2 TR |
576 | In-Reply-To: <0> |
577 | References: <1> | |
578 | <0> | |
579 | --- | |
ba4324c4 | 580 | Message-ID: <3> |
30984ed2 TR |
581 | In-Reply-To: <2> |
582 | References: <1> | |
583 | <0> | |
584 | <2> | |
585 | EOF | |
586 | ||
587 | test_expect_success 'thread deep in-reply-to' ' | |
588 | check_threading expect.deep-irt --thread=deep \ | |
8f37854b | 589 | --in-reply-to="<test.message>" main |
30984ed2 TR |
590 | ' |
591 | ||
92014b69 | 592 | cat >expect.deep-cl <<EOF |
30984ed2 | 593 | --- |
ba4324c4 | 594 | Message-ID: <0> |
30984ed2 | 595 | --- |
ba4324c4 | 596 | Message-ID: <1> |
30984ed2 TR |
597 | In-Reply-To: <0> |
598 | References: <0> | |
599 | --- | |
ba4324c4 | 600 | Message-ID: <2> |
30984ed2 TR |
601 | In-Reply-To: <1> |
602 | References: <0> | |
603 | <1> | |
604 | --- | |
ba4324c4 | 605 | Message-ID: <3> |
30984ed2 TR |
606 | In-Reply-To: <2> |
607 | References: <0> | |
608 | <1> | |
609 | <2> | |
610 | EOF | |
611 | ||
612 | test_expect_success 'thread deep cover-letter' ' | |
8f37854b | 613 | check_threading expect.deep-cl --cover-letter --thread=deep main |
30984ed2 TR |
614 | ' |
615 | ||
92014b69 | 616 | cat >expect.deep-cl-irt <<EOF |
30984ed2 | 617 | --- |
ba4324c4 | 618 | Message-ID: <0> |
30984ed2 TR |
619 | In-Reply-To: <1> |
620 | References: <1> | |
621 | --- | |
ba4324c4 | 622 | Message-ID: <2> |
30984ed2 TR |
623 | In-Reply-To: <0> |
624 | References: <1> | |
625 | <0> | |
626 | --- | |
ba4324c4 | 627 | Message-ID: <3> |
30984ed2 TR |
628 | In-Reply-To: <2> |
629 | References: <1> | |
630 | <0> | |
631 | <2> | |
632 | --- | |
ba4324c4 | 633 | Message-ID: <4> |
30984ed2 TR |
634 | In-Reply-To: <3> |
635 | References: <1> | |
636 | <0> | |
637 | <2> | |
638 | <3> | |
639 | EOF | |
640 | ||
641 | test_expect_success 'thread deep cover-letter in-reply-to' ' | |
642 | check_threading expect.deep-cl-irt --cover-letter \ | |
8f37854b | 643 | --in-reply-to="<test.message>" --thread=deep main |
30984ed2 TR |
644 | ' |
645 | ||
646 | test_expect_success 'thread via config' ' | |
e8107155 | 647 | test_config format.thread true && |
8f37854b | 648 | check_threading expect.thread main |
30984ed2 TR |
649 | ' |
650 | ||
651 | test_expect_success 'thread deep via config' ' | |
e8107155 | 652 | test_config format.thread deep && |
8f37854b | 653 | check_threading expect.deep main |
30984ed2 TR |
654 | ' |
655 | ||
656 | test_expect_success 'thread config + override' ' | |
e8107155 | 657 | test_config format.thread deep && |
8f37854b | 658 | check_threading expect.thread --thread main |
30984ed2 TR |
659 | ' |
660 | ||
661 | test_expect_success 'thread config + --no-thread' ' | |
e8107155 | 662 | test_config format.thread deep && |
8f37854b | 663 | check_threading expect.no-threading --no-thread main |
30984ed2 TR |
664 | ' |
665 | ||
7d812145 | 666 | test_expect_success 'excessive subject' ' |
7d812145 DB |
667 | rm -rf patches/ && |
668 | git checkout side && | |
bdee9cd6 | 669 | before=$(git hash-object file) && |
670 | before=$(git rev-parse --short $before) && | |
08495412 | 671 | test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >>file && |
bdee9cd6 | 672 | after=$(git hash-object file) && |
673 | after=$(git rev-parse --short $after) && | |
7d812145 DB |
674 | git update-index file && |
675 | git commit -m "This is an excessively long subject line for a message due to the habit some projects have of not having a short, one-line subject at the start of the commit message, but rather sticking a whole paragraph right at the start as the only thing in the commit message. It had better not become the filename for the patch." && | |
8f37854b | 676 | git format-patch -o patches/ main..side && |
7d812145 DB |
677 | ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch |
678 | ' | |
679 | ||
2fe95f49 JH |
680 | test_expect_success 'failure to write cover-letter aborts gracefully' ' |
681 | test_when_finished "rmdir 0000-cover-letter.patch" && | |
682 | mkdir 0000-cover-letter.patch && | |
683 | test_must_fail git format-patch --no-renames --cover-letter -1 | |
684 | ' | |
685 | ||
5d02294c | 686 | test_expect_success 'cover-letter inherits diff options' ' |
5d02294c JS |
687 | git mv file foo && |
688 | git commit -m foo && | |
5404c116 | 689 | git format-patch --no-renames --cover-letter -1 && |
cc663d14 | 690 | check_patch 0000-cover-letter.patch && |
9524cf29 | 691 | ! grep "file => foo .* 0 *\$" 0000-cover-letter.patch && |
5d02294c | 692 | git format-patch --cover-letter -1 -M && |
9524cf29 | 693 | grep "file => foo .* 0 *\$" 0000-cover-letter.patch |
5d02294c | 694 | ' |
859c4fbe | 695 | |
92014b69 | 696 | cat >expect <<EOF |
859c4fbe JS |
697 | This is an excessively long subject line for a message due to the |
698 | habit some projects have of not having a short, one-line subject at | |
699 | the start of the commit message, but rather sticking a whole | |
700 | paragraph right at the start as the only thing in the commit | |
701 | message. It had better not become the filename for the patch. | |
702 | foo | |
703 | ||
704 | EOF | |
705 | ||
706 | test_expect_success 'shortlog of cover-letter wraps overly-long onelines' ' | |
859c4fbe | 707 | git format-patch --cover-letter -2 && |
c6ec6dad | 708 | sed -e "1,/A U Thor/d" -e "/^\$/q" 0000-cover-letter.patch >output && |
3af82863 | 709 | test_cmp expect output |
859c4fbe JS |
710 | ' |
711 | ||
92014b69 | 712 | cat >expect <<EOF |
bdee9cd6 | 713 | index $before..$after 100644 |
68daa64d JK |
714 | --- a/file |
715 | +++ b/file | |
716 | @@ -13,4 +13,20 @@ C | |
717 | 10 | |
718 | D | |
719 | E | |
720 | F | |
721 | +5 | |
722 | EOF | |
723 | ||
724 | test_expect_success 'format-patch respects -U' ' | |
68daa64d | 725 | git format-patch -U4 -2 && |
6dd88832 JN |
726 | sed -e "1,/^diff/d" -e "/^+5/q" \ |
727 | <0001-This-is-an-excessively-long-subject-line-for-a-messa.patch \ | |
728 | >output && | |
68daa64d | 729 | test_cmp expect output |
68daa64d JK |
730 | ' |
731 | ||
92014b69 | 732 | cat >expect <<EOF |
1d46f2ea JK |
733 | |
734 | diff --git a/file b/file | |
bdee9cd6 | 735 | index $before..$after 100644 |
1d46f2ea JK |
736 | --- a/file |
737 | +++ b/file | |
738 | @@ -14,3 +14,19 @@ C | |
739 | D | |
740 | E | |
741 | F | |
742 | +5 | |
743 | EOF | |
744 | ||
745 | test_expect_success 'format-patch -p suppresses stat' ' | |
1d46f2ea | 746 | git format-patch -p -2 && |
c6ec6dad | 747 | sed -e "1,/^\$/d" -e "/^+5/q" 0001-This-is-an-excessively-long-subject-line-for-a-messa.patch >output && |
1d46f2ea | 748 | test_cmp expect output |
1d46f2ea JK |
749 | ' |
750 | ||
9800a754 JH |
751 | test_expect_success 'format-patch from a subdirectory (1)' ' |
752 | filename=$( | |
753 | rm -rf sub && | |
754 | mkdir -p sub/dir && | |
755 | cd sub/dir && | |
756 | git format-patch -1 | |
757 | ) && | |
758 | case "$filename" in | |
759 | 0*) | |
760 | ;; # ok | |
761 | *) | |
762 | echo "Oops? $filename" | |
763 | false | |
764 | ;; | |
765 | esac && | |
766 | test -f "$filename" | |
767 | ' | |
768 | ||
769 | test_expect_success 'format-patch from a subdirectory (2)' ' | |
770 | filename=$( | |
771 | rm -rf sub && | |
772 | mkdir -p sub/dir && | |
773 | cd sub/dir && | |
774 | git format-patch -1 -o .. | |
775 | ) && | |
776 | case "$filename" in | |
777 | ../0*) | |
778 | ;; # ok | |
779 | *) | |
780 | echo "Oops? $filename" | |
781 | false | |
782 | ;; | |
783 | esac && | |
784 | basename=$(expr "$filename" : ".*/\(.*\)") && | |
785 | test -f "sub/$basename" | |
786 | ' | |
787 | ||
788 | test_expect_success 'format-patch from a subdirectory (3)' ' | |
9800a754 JH |
789 | rm -f 0* && |
790 | filename=$( | |
791 | rm -rf sub && | |
792 | mkdir -p sub/dir && | |
793 | cd sub/dir && | |
91c8b825 | 794 | git format-patch -1 -o "$TRASH_DIRECTORY" |
9800a754 JH |
795 | ) && |
796 | basename=$(expr "$filename" : ".*/\(.*\)") && | |
797 | test -f "$basename" | |
798 | ' | |
799 | ||
f044fe2d | 800 | test_expect_success 'format-patch --in-reply-to' ' |
92014b69 | 801 | git format-patch -1 --stdout --in-reply-to "baz@foo.bar" >patch8 && |
f044fe2d SB |
802 | grep "^In-Reply-To: <baz@foo.bar>" patch8 && |
803 | grep "^References: <baz@foo.bar>" patch8 | |
804 | ' | |
805 | ||
806 | test_expect_success 'format-patch --signoff' ' | |
212620fe JH |
807 | git format-patch -1 --signoff --stdout >out && |
808 | grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" out | |
809 | ' | |
810 | ||
811 | test_expect_success 'format-patch --notes --signoff' ' | |
812 | git notes --ref test add -m "test message" HEAD && | |
813 | git format-patch -1 --signoff --stdout --notes=test >out && | |
bd1470b8 | 814 | # Three dashes must come after S-o-b |
212620fe | 815 | ! sed "/^Signed-off-by: /q" out | grep "test message" && |
bd1470b8 JH |
816 | sed "1,/^Signed-off-by: /d" out | grep "test message" && |
817 | # Notes message must come after three dashes | |
818 | ! sed "/^---$/q" out | grep "test message" && | |
819 | sed "1,/^---$/d" out | grep "test message" | |
f044fe2d SB |
820 | ' |
821 | ||
13cdf780 DL |
822 | test_expect_success 'format-patch notes output control' ' |
823 | git notes add -m "notes config message" HEAD && | |
824 | test_when_finished git notes remove HEAD && | |
825 | ||
826 | git format-patch -1 --stdout >out && | |
827 | ! grep "notes config message" out && | |
828 | git format-patch -1 --stdout --notes >out && | |
829 | grep "notes config message" out && | |
830 | git format-patch -1 --stdout --no-notes >out && | |
831 | ! grep "notes config message" out && | |
832 | git format-patch -1 --stdout --notes --no-notes >out && | |
833 | ! grep "notes config message" out && | |
834 | git format-patch -1 --stdout --no-notes --notes >out && | |
835 | grep "notes config message" out && | |
836 | ||
837 | test_config format.notes true && | |
838 | git format-patch -1 --stdout >out && | |
839 | grep "notes config message" out && | |
840 | git format-patch -1 --stdout --notes >out && | |
841 | grep "notes config message" out && | |
842 | git format-patch -1 --stdout --no-notes >out && | |
843 | ! grep "notes config message" out && | |
844 | git format-patch -1 --stdout --notes --no-notes >out && | |
845 | ! grep "notes config message" out && | |
846 | git format-patch -1 --stdout --no-notes --notes >out && | |
847 | grep "notes config message" out | |
848 | ' | |
849 | ||
850 | test_expect_success 'format-patch with multiple notes refs' ' | |
851 | git notes --ref note1 add -m "this is note 1" HEAD && | |
852 | test_when_finished git notes --ref note1 remove HEAD && | |
853 | git notes --ref note2 add -m "this is note 2" HEAD && | |
854 | test_when_finished git notes --ref note2 remove HEAD && | |
855 | ||
856 | git format-patch -1 --stdout >out && | |
857 | ! grep "this is note 1" out && | |
858 | ! grep "this is note 2" out && | |
859 | git format-patch -1 --stdout --notes=note1 >out && | |
860 | grep "this is note 1" out && | |
861 | ! grep "this is note 2" out && | |
862 | git format-patch -1 --stdout --notes=note2 >out && | |
863 | ! grep "this is note 1" out && | |
864 | grep "this is note 2" out && | |
865 | git format-patch -1 --stdout --notes=note1 --notes=note2 >out && | |
866 | grep "this is note 1" out && | |
867 | grep "this is note 2" out && | |
868 | ||
869 | test_config format.notes note1 && | |
870 | git format-patch -1 --stdout >out && | |
871 | grep "this is note 1" out && | |
872 | ! grep "this is note 2" out && | |
873 | git format-patch -1 --stdout --no-notes >out && | |
874 | ! grep "this is note 1" out && | |
875 | ! grep "this is note 2" out && | |
876 | git format-patch -1 --stdout --notes=note2 >out && | |
877 | grep "this is note 1" out && | |
878 | grep "this is note 2" out && | |
879 | git format-patch -1 --stdout --no-notes --notes=note2 >out && | |
880 | ! grep "this is note 1" out && | |
881 | grep "this is note 2" out && | |
882 | ||
883 | git config --add format.notes note2 && | |
884 | git format-patch -1 --stdout >out && | |
885 | grep "this is note 1" out && | |
886 | grep "this is note 2" out && | |
887 | git format-patch -1 --stdout --no-notes >out && | |
888 | ! grep "this is note 1" out && | |
889 | ! grep "this is note 2" out | |
890 | ' | |
891 | ||
8164c961 DL |
892 | test_expect_success 'format-patch with multiple notes refs in config' ' |
893 | test_when_finished "test_unconfig format.notes" && | |
894 | ||
895 | git notes --ref note1 add -m "this is note 1" HEAD && | |
896 | test_when_finished git notes --ref note1 remove HEAD && | |
897 | git notes --ref note2 add -m "this is note 2" HEAD && | |
898 | test_when_finished git notes --ref note2 remove HEAD && | |
899 | ||
900 | git config format.notes note1 && | |
901 | git format-patch -1 --stdout >out && | |
902 | grep "this is note 1" out && | |
903 | ! grep "this is note 2" out && | |
904 | git config format.notes note2 && | |
905 | git format-patch -1 --stdout >out && | |
906 | ! grep "this is note 1" out && | |
907 | grep "this is note 2" out && | |
908 | git config --add format.notes note1 && | |
909 | git format-patch -1 --stdout >out && | |
910 | grep "this is note 1" out && | |
911 | grep "this is note 2" out && | |
912 | ||
913 | git config --replace-all format.notes note1 && | |
914 | git config --add format.notes false && | |
915 | git format-patch -1 --stdout >out && | |
916 | ! grep "this is note 1" out && | |
917 | ! grep "this is note 2" out && | |
918 | git config --add format.notes note2 && | |
919 | git format-patch -1 --stdout >out && | |
920 | ! grep "this is note 1" out && | |
921 | grep "this is note 2" out | |
922 | ' | |
923 | ||
92014b69 DL |
924 | echo "fatal: --name-only does not make sense" >expect.name-only |
925 | echo "fatal: --name-status does not make sense" >expect.name-status | |
926 | echo "fatal: --check does not make sense" >expect.check | |
02bc5b03 | 927 | |
68b2a005 | 928 | test_expect_success 'options no longer allowed for format-patch' ' |
92014b69 | 929 | test_must_fail git format-patch --name-only 2>output && |
1108cea7 | 930 | test_cmp expect.name-only output && |
92014b69 | 931 | test_must_fail git format-patch --name-status 2>output && |
1108cea7 | 932 | test_cmp expect.name-status output && |
92014b69 | 933 | test_must_fail git format-patch --check 2>output && |
1108cea7 | 934 | test_cmp expect.check output |
cb46c406 | 935 | ' |
02bc5b03 BG |
936 | |
937 | test_expect_success 'format-patch --numstat should produce a patch' ' | |
8f37854b | 938 | git format-patch --numstat --stdout main..side >output && |
6bd26f58 DL |
939 | grep "^diff --git a/" output >diff && |
940 | test_line_count = 5 diff | |
cb46c406 | 941 | ' |
02bc5b03 | 942 | |
7e93d3b9 | 943 | test_expect_success 'format-patch -- <path>' ' |
91f8f7e4 RS |
944 | rm -f *.patch && |
945 | git checkout -b pathspec main && | |
946 | ||
947 | echo file_a 1 >file_a && | |
948 | echo file_b 1 >file_b && | |
949 | git add file_a file_b && | |
950 | git commit -m pathspec_initial && | |
951 | ||
952 | echo file_a 2 >>file_a && | |
953 | git add file_a && | |
954 | git commit -m pathspec_a && | |
955 | ||
956 | echo file_b 2 >>file_b && | |
957 | git add file_b && | |
958 | git commit -m pathspec_b && | |
959 | ||
960 | echo file_a 3 >>file_a && | |
961 | echo file_b 3 >>file_b && | |
962 | git add file_a file_b && | |
963 | git commit -m pathspec_ab && | |
964 | ||
965 | cat >expect <<-\EOF && | |
966 | 0001-pathspec_initial.patch | |
967 | 0002-pathspec_a.patch | |
968 | 0003-pathspec_ab.patch | |
969 | EOF | |
970 | ||
971 | git format-patch main..pathspec -- file_a >output && | |
972 | test_cmp expect output && | |
973 | ! grep file_b *.patch | |
7e93d3b9 FC |
974 | ' |
975 | ||
657ab61e | 976 | test_expect_success 'format-patch --ignore-if-in-upstream HEAD' ' |
91f8f7e4 | 977 | git checkout side && |
657ab61e KB |
978 | git format-patch --ignore-if-in-upstream HEAD |
979 | ' | |
980 | ||
854b5cb4 DL |
981 | test_expect_success 'get git version' ' |
982 | git_version=$(git --version) && | |
983 | git_version=${git_version##* } | |
984 | ' | |
480871e0 JT |
985 | |
986 | signature() { | |
987 | printf "%s\n%s\n\n" "-- " "${1:-$git_version}" | |
988 | } | |
989 | ||
990 | test_expect_success 'format-patch default signature' ' | |
854b5cb4 DL |
991 | git format-patch --stdout -1 >patch && |
992 | tail -n 3 patch >output && | |
480871e0 JT |
993 | signature >expect && |
994 | test_cmp expect output | |
995 | ' | |
996 | ||
6622d9c7 | 997 | test_expect_success 'format-patch --signature' ' |
854b5cb4 DL |
998 | git format-patch --stdout --signature="my sig" -1 >patch && |
999 | tail -n 3 patch >output && | |
480871e0 JT |
1000 | signature "my sig" >expect && |
1001 | test_cmp expect output | |
6622d9c7 SB |
1002 | ' |
1003 | ||
1004 | test_expect_success 'format-patch with format.signature config' ' | |
1005 | git config format.signature "config sig" && | |
1006 | git format-patch --stdout -1 >output && | |
1007 | grep "config sig" output | |
1008 | ' | |
1009 | ||
1010 | test_expect_success 'format-patch --signature overrides format.signature' ' | |
1011 | git config format.signature "config sig" && | |
1012 | git format-patch --stdout --signature="overrides" -1 >output && | |
1013 | ! grep "config sig" output && | |
1014 | grep "overrides" output | |
1015 | ' | |
1016 | ||
1017 | test_expect_success 'format-patch --no-signature ignores format.signature' ' | |
1018 | git config format.signature "config sig" && | |
1019 | git format-patch --stdout --signature="my sig" --no-signature \ | |
1020 | -1 >output && | |
cc663d14 | 1021 | check_patch output && |
6622d9c7 SB |
1022 | ! grep "config sig" output && |
1023 | ! grep "my sig" output && | |
1024 | ! grep "^-- \$" output | |
1025 | ' | |
1026 | ||
1027 | test_expect_success 'format-patch --signature --cover-letter' ' | |
1028 | git config --unset-all format.signature && | |
1029 | git format-patch --stdout --signature="my sig" --cover-letter \ | |
1030 | -1 >output && | |
6bd26f58 DL |
1031 | grep "my sig" output >sig && |
1032 | test_line_count = 2 sig | |
6622d9c7 SB |
1033 | ' |
1034 | ||
41ccfdd9 | 1035 | test_expect_success 'format.signature="" suppresses signatures' ' |
6622d9c7 SB |
1036 | git config format.signature "" && |
1037 | git format-patch --stdout -1 >output && | |
cc663d14 | 1038 | check_patch output && |
6622d9c7 SB |
1039 | ! grep "^-- \$" output |
1040 | ' | |
1041 | ||
41ccfdd9 | 1042 | test_expect_success 'format-patch --no-signature suppresses signatures' ' |
6622d9c7 SB |
1043 | git config --unset-all format.signature && |
1044 | git format-patch --stdout --no-signature -1 >output && | |
cc663d14 | 1045 | check_patch output && |
6622d9c7 SB |
1046 | ! grep "^-- \$" output |
1047 | ' | |
1048 | ||
41ccfdd9 | 1049 | test_expect_success 'format-patch --signature="" suppresses signatures' ' |
2fdb5c62 | 1050 | git format-patch --stdout --signature="" -1 >output && |
cc663d14 | 1051 | check_patch output && |
6622d9c7 SB |
1052 | ! grep "^-- \$" output |
1053 | ' | |
1054 | ||
7022650f JM |
1055 | test_expect_success 'prepare mail-signature input' ' |
1056 | cat >mail-signature <<-\EOF | |
1057 | ||
1058 | Test User <test.email@kernel.org> | |
1059 | http://git.kernel.org/cgit/git/git.git | |
1060 | ||
1061 | git.kernel.org/?p=git/git.git;a=summary | |
1062 | ||
1063 | EOF | |
1064 | ' | |
1065 | ||
1066 | test_expect_success '--signature-file=file works' ' | |
1067 | git format-patch --stdout --signature-file=mail-signature -1 >output && | |
1068 | check_patch output && | |
c6ec6dad | 1069 | sed -e "1,/^-- \$/d" output >actual && |
7022650f JM |
1070 | { |
1071 | cat mail-signature && echo | |
1072 | } >expect && | |
1073 | test_cmp expect actual | |
1074 | ' | |
1075 | ||
1076 | test_expect_success 'format.signaturefile works' ' | |
1077 | test_config format.signaturefile mail-signature && | |
1078 | git format-patch --stdout -1 >output && | |
1079 | check_patch output && | |
c6ec6dad | 1080 | sed -e "1,/^-- \$/d" output >actual && |
7022650f JM |
1081 | { |
1082 | cat mail-signature && echo | |
1083 | } >expect && | |
1084 | test_cmp expect actual | |
1085 | ' | |
1086 | ||
1087 | test_expect_success '--no-signature suppresses format.signaturefile ' ' | |
1088 | test_config format.signaturefile mail-signature && | |
1089 | git format-patch --stdout --no-signature -1 >output && | |
1090 | check_patch output && | |
1091 | ! grep "^-- \$" output | |
1092 | ' | |
1093 | ||
1094 | test_expect_success '--signature-file overrides format.signaturefile' ' | |
99094a7a | 1095 | cat >other-mail-signature <<-\EOF && |
7022650f JM |
1096 | Use this other signature instead of mail-signature. |
1097 | EOF | |
1098 | test_config format.signaturefile mail-signature && | |
1099 | git format-patch --stdout \ | |
1100 | --signature-file=other-mail-signature -1 >output && | |
1101 | check_patch output && | |
c6ec6dad | 1102 | sed -e "1,/^-- \$/d" output >actual && |
7022650f JM |
1103 | { |
1104 | cat other-mail-signature && echo | |
1105 | } >expect && | |
1106 | test_cmp expect actual | |
1107 | ' | |
1108 | ||
1109 | test_expect_success '--signature overrides format.signaturefile' ' | |
1110 | test_config format.signaturefile mail-signature && | |
1111 | git format-patch --stdout --signature="my sig" -1 >output && | |
1112 | check_patch output && | |
1113 | grep "my sig" output | |
1114 | ' | |
1115 | ||
38a94bb6 TRC |
1116 | test_expect_success TTY 'format-patch --stdout paginates' ' |
1117 | rm -f pager_used && | |
512477b1 | 1118 | test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all && |
38a94bb6 TRC |
1119 | test_path_is_file pager_used |
1120 | ' | |
1121 | ||
1122 | test_expect_success TTY 'format-patch --stdout pagination can be disabled' ' | |
1123 | rm -f pager_used && | |
512477b1 DT |
1124 | test_terminal env GIT_PAGER="wc >pager_used" git --no-pager format-patch --stdout --all && |
1125 | test_terminal env GIT_PAGER="wc >pager_used" git -c "pager.format-patch=false" format-patch --stdout --all && | |
38a94bb6 TRC |
1126 | test_path_is_missing pager_used && |
1127 | test_path_is_missing .git/pager_used | |
1128 | ' | |
1129 | ||
a1f6baa5 JK |
1130 | test_expect_success 'format-patch handles multi-line subjects' ' |
1131 | rm -rf patches/ && | |
1132 | echo content >>file && | |
08495412 | 1133 | test_write_lines one two three >msg && |
a1f6baa5 JK |
1134 | git add file && |
1135 | git commit -F msg && | |
1136 | git format-patch -o patches -1 && | |
1137 | grep ^Subject: patches/0001-one.patch >actual && | |
1138 | echo "Subject: [PATCH] one two three" >expect && | |
1139 | test_cmp expect actual | |
1140 | ' | |
1141 | ||
1142 | test_expect_success 'format-patch handles multi-line encoded subjects' ' | |
1143 | rm -rf patches/ && | |
1144 | echo content >>file && | |
08495412 | 1145 | test_write_lines en två tre >msg && |
a1f6baa5 JK |
1146 | git add file && |
1147 | git commit -F msg && | |
1148 | git format-patch -o patches -1 && | |
1149 | grep ^Subject: patches/0001-en.patch >actual && | |
1150 | echo "Subject: [PATCH] =?UTF-8?q?en=20tv=C3=A5=20tre?=" >expect && | |
1151 | test_cmp expect actual | |
1152 | ' | |
1153 | ||
1154 | M8="foo bar " | |
1155 | M64=$M8$M8$M8$M8$M8$M8$M8$M8 | |
1156 | M512=$M64$M64$M64$M64$M64$M64$M64$M64 | |
1157 | cat >expect <<'EOF' | |
1158 | Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo | |
7a76e68a JS |
1159 | bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar |
1160 | foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo | |
1161 | bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar | |
1162 | foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo | |
1163 | bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar | |
1164 | foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar | |
a1f6baa5 | 1165 | EOF |
7a76e68a | 1166 | test_expect_success 'format-patch wraps extremely long subject (ascii)' ' |
a1f6baa5 JK |
1167 | echo content >>file && |
1168 | git add file && | |
1169 | git commit -m "$M512" && | |
1170 | git format-patch --stdout -1 >patch && | |
c6ec6dad | 1171 | sed -n "/^Subject/p; /^ /p; /^$/q" patch >subject && |
a1f6baa5 JK |
1172 | test_cmp expect subject |
1173 | ' | |
1174 | ||
1175 | M8="föö bar " | |
1176 | M64=$M8$M8$M8$M8$M8$M8$M8$M8 | |
1177 | M512=$M64$M64$M64$M64$M64$M64$M64$M64 | |
1178 | cat >expect <<'EOF' | |
94f6cdf6 JS |
1179 | Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= |
1180 | =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= | |
1181 | =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= | |
1182 | =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= | |
6cd3c053 KS |
1183 | =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= |
1184 | =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= | |
94f6cdf6 JS |
1185 | =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= |
1186 | =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= | |
1187 | =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= | |
6cd3c053 KS |
1188 | =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= |
1189 | =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= | |
94f6cdf6 JS |
1190 | =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= |
1191 | =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= | |
1192 | =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= | |
6cd3c053 KS |
1193 | =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= |
1194 | =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= | |
1195 | =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= | |
1196 | =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= | |
1197 | =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= | |
1198 | =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= | |
1199 | =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= | |
1200 | =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= | |
1201 | =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= | |
1202 | =?UTF-8?q?bar?= | |
a1f6baa5 | 1203 | EOF |
94f6cdf6 | 1204 | test_expect_success 'format-patch wraps extremely long subject (rfc2047)' ' |
a1f6baa5 JK |
1205 | rm -rf patches/ && |
1206 | echo content >>file && | |
1207 | git add file && | |
1208 | git commit -m "$M512" && | |
1209 | git format-patch --stdout -1 >patch && | |
c6ec6dad | 1210 | sed -n "/^Subject/p; /^ /p; /^$/q" patch >subject && |
a1f6baa5 JK |
1211 | test_cmp expect subject |
1212 | ' | |
1213 | ||
4d03c18a JK |
1214 | check_author() { |
1215 | echo content >>file && | |
1216 | git add file && | |
1217 | GIT_AUTHOR_NAME=$1 git commit -m author-check && | |
1218 | git format-patch --stdout -1 >patch && | |
c6ec6dad | 1219 | sed -n "/^From: /p; /^ /p; /^$/q" patch >actual && |
4d03c18a JK |
1220 | test_cmp expect actual |
1221 | } | |
1222 | ||
1223 | cat >expect <<'EOF' | |
1224 | From: "Foo B. Bar" <author@example.com> | |
1225 | EOF | |
0fcec2ce | 1226 | test_expect_success 'format-patch quotes dot in from-headers' ' |
4d03c18a JK |
1227 | check_author "Foo B. Bar" |
1228 | ' | |
1229 | ||
1230 | cat >expect <<'EOF' | |
1231 | From: "Foo \"The Baz\" Bar" <author@example.com> | |
1232 | EOF | |
0fcec2ce | 1233 | test_expect_success 'format-patch quotes double-quote in from-headers' ' |
4d03c18a JK |
1234 | check_author "Foo \"The Baz\" Bar" |
1235 | ' | |
1236 | ||
1237 | cat >expect <<'EOF' | |
0fcec2ce | 1238 | From: =?UTF-8?q?F=C3=B6o=20Bar?= <author@example.com> |
4d03c18a | 1239 | EOF |
0fcec2ce JS |
1240 | test_expect_success 'format-patch uses rfc2047-encoded from-headers when necessary' ' |
1241 | check_author "Föo Bar" | |
1242 | ' | |
1243 | ||
1244 | cat >expect <<'EOF' | |
1245 | From: =?UTF-8?q?F=C3=B6o=20B=2E=20Bar?= <author@example.com> | |
1246 | EOF | |
41dd00ba | 1247 | test_expect_success 'rfc2047-encoded from-headers leave no rfc822 specials' ' |
4d03c18a JK |
1248 | check_author "Föo B. Bar" |
1249 | ' | |
1250 | ||
7a76e68a JS |
1251 | cat >expect <<EOF |
1252 | From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_ | |
1253 | <author@example.com> | |
1254 | EOF | |
1255 | test_expect_success 'format-patch wraps moderately long from-header (ascii)' ' | |
1256 | check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_" | |
1257 | ' | |
1258 | ||
1259 | cat >expect <<'EOF' | |
1260 | From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar | |
1261 | Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo | |
1262 | Bar Foo Bar Foo Bar Foo Bar <author@example.com> | |
1263 | EOF | |
1264 | test_expect_success 'format-patch wraps extremely long from-header (ascii)' ' | |
1265 | check_author "Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" | |
1266 | ' | |
1267 | ||
1268 | cat >expect <<'EOF' | |
1269 | From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar | |
1270 | Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo | |
1271 | Bar Foo Bar Foo Bar Foo Bar" <author@example.com> | |
1272 | EOF | |
1273 | test_expect_success 'format-patch wraps extremely long from-header (rfc822)' ' | |
1274 | check_author "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" | |
1275 | ' | |
1276 | ||
4d03c18a | 1277 | cat >expect <<'EOF' |
94f6cdf6 JS |
1278 | From: =?UTF-8?q?Fo=C3=B6=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo?= |
1279 | =?UTF-8?q?=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20?= | |
1280 | =?UTF-8?q?Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar?= | |
1281 | =?UTF-8?q?=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20?= | |
1282 | =?UTF-8?q?Foo=20Bar=20Foo=20Bar?= <author@example.com> | |
1283 | EOF | |
1284 | test_expect_success 'format-patch wraps extremely long from-header (rfc2047)' ' | |
1285 | check_author "Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" | |
1286 | ' | |
1287 | ||
19d097e3 EB |
1288 | cat >expect <<'EOF' |
1289 | From: Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar | |
1290 | Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo | |
1291 | Bar Foo Bar Foo Bar Foo Bar <author@example.com> | |
1292 | EOF | |
1293 | test_expect_success 'format-patch wraps extremely long from-header (non-ASCII without Q-encoding)' ' | |
1294 | echo content >>file && | |
1295 | git add file && | |
1296 | GIT_AUTHOR_NAME="Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" \ | |
1297 | git commit -m author-check && | |
1298 | git format-patch --no-encode-email-headers --stdout -1 >patch && | |
1299 | sed -n "/^From: /p; /^ /p; /^$/q" patch >actual && | |
1300 | test_cmp expect actual | |
1301 | ' | |
1302 | ||
1303 | cat >expect <<'EOF' | |
1304 | Subject: [PATCH] Foö | |
1305 | EOF | |
1306 | test_expect_success 'subject lines are unencoded with --no-encode-email-headers' ' | |
1307 | echo content >>file && | |
1308 | git add file && | |
1309 | git commit -m "Foö" && | |
1310 | git format-patch --no-encode-email-headers -1 --stdout >patch && | |
1311 | grep ^Subject: patch >actual && | |
1312 | test_cmp expect actual | |
1313 | ' | |
1314 | ||
1315 | cat >expect <<'EOF' | |
1316 | Subject: [PATCH] Foö | |
1317 | EOF | |
1318 | test_expect_success 'subject lines are unencoded with format.encodeEmailHeaders=false' ' | |
1319 | echo content >>file && | |
1320 | git add file && | |
1321 | git commit -m "Foö" && | |
1322 | git config format.encodeEmailHeaders false && | |
1323 | git format-patch -1 --stdout >patch && | |
1324 | grep ^Subject: patch >actual && | |
1325 | test_cmp expect actual | |
1326 | ' | |
1327 | ||
1328 | cat >expect <<'EOF' | |
1329 | Subject: [PATCH] =?UTF-8?q?Fo=C3=B6?= | |
1330 | EOF | |
1331 | test_expect_success '--encode-email-headers overrides format.encodeEmailHeaders' ' | |
1332 | echo content >>file && | |
1333 | git add file && | |
1334 | git commit -m "Foö" && | |
1335 | git config format.encodeEmailHeaders false && | |
1336 | git format-patch --encode-email-headers -1 --stdout >patch && | |
1337 | grep ^Subject: patch >actual && | |
1338 | test_cmp expect actual | |
1339 | ' | |
1340 | ||
94f6cdf6 | 1341 | cat >expect <<'EOF' |
4d03c18a JK |
1342 | Subject: header with . in it |
1343 | EOF | |
1344 | test_expect_success 'subject lines do not have 822 atom-quoting' ' | |
1345 | echo content >>file && | |
1346 | git add file && | |
1347 | git commit -m "header with . in it" && | |
1348 | git format-patch -k -1 --stdout >patch && | |
1349 | grep ^Subject: patch >actual && | |
1350 | test_cmp expect actual | |
1351 | ' | |
1352 | ||
e7af8e49 JK |
1353 | cat >expect <<'EOF' |
1354 | Subject: [PREFIX 1/1] header with . in it | |
1355 | EOF | |
1356 | test_expect_success 'subject prefixes have space prepended' ' | |
1357 | git format-patch -n -1 --stdout --subject-prefix=PREFIX >patch && | |
1358 | grep ^Subject: patch >actual && | |
1359 | test_cmp expect actual | |
1360 | ' | |
1361 | ||
1362 | cat >expect <<'EOF' | |
1363 | Subject: [1/1] header with . in it | |
1364 | EOF | |
1365 | test_expect_success 'empty subject prefix does not have extra space' ' | |
1366 | git format-patch -n -1 --stdout --subject-prefix= >patch && | |
1367 | grep ^Subject: patch >actual && | |
1368 | test_cmp expect actual | |
1369 | ' | |
1370 | ||
68e83a5b JT |
1371 | test_expect_success '--rfc' ' |
1372 | cat >expect <<-\EOF && | |
1373 | Subject: [RFC PATCH 1/1] header with . in it | |
1374 | EOF | |
1375 | git format-patch -n -1 --stdout --rfc >patch && | |
e0d7db74 DD |
1376 | grep "^Subject:" patch >actual && |
1377 | test_cmp expect actual | |
1378 | ' | |
1379 | ||
1380 | test_expect_success '--rfc does not overwrite prefix' ' | |
1381 | cat >expect <<-\EOF && | |
1382 | Subject: [RFC PATCH foobar 1/1] header with . in it | |
1383 | EOF | |
1384 | git -c format.subjectPrefix="PATCH foobar" \ | |
1385 | format-patch -n -1 --stdout --rfc >patch && | |
1386 | grep "^Subject:" patch >actual && | |
1387 | test_cmp expect actual | |
1388 | ' | |
1389 | ||
1390 | test_expect_success '--rfc is argument order independent' ' | |
1391 | cat >expect <<-\EOF && | |
1392 | Subject: [RFC PATCH foobar 1/1] header with . in it | |
1393 | EOF | |
1394 | git format-patch -n -1 --stdout --rfc \ | |
1395 | --subject-prefix="PATCH foobar" >patch && | |
1396 | grep "^Subject:" patch >actual && | |
68e83a5b JT |
1397 | test_cmp expect actual |
1398 | ' | |
1399 | ||
a9080475 JK |
1400 | test_expect_success '--from=ident notices bogus ident' ' |
1401 | test_must_fail git format-patch -1 --stdout --from=foo >patch | |
1402 | ' | |
1403 | ||
1404 | test_expect_success '--from=ident replaces author' ' | |
1405 | git format-patch -1 --stdout --from="Me <me@example.com>" >patch && | |
1406 | cat >expect <<-\EOF && | |
1407 | From: Me <me@example.com> | |
1408 | ||
1409 | From: A U Thor <author@example.com> | |
1410 | ||
1411 | EOF | |
c6ec6dad | 1412 | sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && |
a9080475 JK |
1413 | test_cmp expect patch.head |
1414 | ' | |
1415 | ||
1416 | test_expect_success '--from uses committer ident' ' | |
1417 | git format-patch -1 --stdout --from >patch && | |
1418 | cat >expect <<-\EOF && | |
1419 | From: C O Mitter <committer@example.com> | |
1420 | ||
1421 | From: A U Thor <author@example.com> | |
1422 | ||
1423 | EOF | |
c6ec6dad | 1424 | sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && |
a9080475 JK |
1425 | test_cmp expect patch.head |
1426 | ' | |
1427 | ||
662cc30c JK |
1428 | test_expect_success '--from omits redundant in-body header' ' |
1429 | git format-patch -1 --stdout --from="A U Thor <author@example.com>" >patch && | |
1430 | cat >expect <<-\EOF && | |
1431 | From: A U Thor <author@example.com> | |
1432 | ||
1433 | EOF | |
c6ec6dad | 1434 | sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && |
662cc30c JK |
1435 | test_cmp expect patch.head |
1436 | ' | |
1437 | ||
34bc1b10 JH |
1438 | test_expect_success 'with --force-in-body-from, redundant in-body from is kept' ' |
1439 | git format-patch --force-in-body-from \ | |
1440 | -1 --stdout --from="A U Thor <author@example.com>" >patch && | |
1441 | cat >expect <<-\EOF && | |
1442 | From: A U Thor <author@example.com> | |
1443 | ||
1444 | From: A U Thor <author@example.com> | |
1445 | ||
1446 | EOF | |
1447 | sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && | |
1448 | test_cmp expect patch.head | |
1449 | ' | |
1450 | ||
d5fc07df JH |
1451 | test_expect_success 'format.forceInBodyFrom, equivalent to --force-in-body-from' ' |
1452 | git -c format.forceInBodyFrom=yes format-patch \ | |
1453 | -1 --stdout --from="A U Thor <author@example.com>" >patch && | |
1454 | cat >expect <<-\EOF && | |
1455 | From: A U Thor <author@example.com> | |
1456 | ||
1457 | From: A U Thor <author@example.com> | |
1458 | ||
1459 | EOF | |
1460 | sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && | |
1461 | test_cmp expect patch.head | |
1462 | ' | |
1463 | ||
1464 | test_expect_success 'format.forceInBodyFrom, equivalent to --force-in-body-from' ' | |
1465 | git -c format.forceInBodyFrom=yes format-patch --no-force-in-body-from \ | |
1466 | -1 --stdout --from="A U Thor <author@example.com>" >patch && | |
1467 | cat >expect <<-\EOF && | |
1468 | From: A U Thor <author@example.com> | |
1469 | ||
1470 | EOF | |
1471 | sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head && | |
1472 | test_cmp expect patch.head | |
1473 | ' | |
1474 | ||
a9080475 | 1475 | test_expect_success 'in-body headers trigger content encoding' ' |
d2554c72 | 1476 | test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic && |
a9080475 JK |
1477 | test_when_finished "git reset --hard HEAD^" && |
1478 | git format-patch -1 --stdout --from >patch && | |
1479 | cat >expect <<-\EOF && | |
1480 | From: C O Mitter <committer@example.com> | |
1481 | Content-Type: text/plain; charset=UTF-8 | |
1482 | ||
1483 | From: éxötìc <author@example.com> | |
1484 | ||
1485 | EOF | |
c6ec6dad | 1486 | sed -ne "/^From:/p; /^$/p; /^Content-Type/p; /^---$/q" patch >patch.head && |
a9080475 JK |
1487 | test_cmp expect patch.head |
1488 | ' | |
1489 | ||
79133a66 NTND |
1490 | append_signoff() |
1491 | { | |
1492 | C=$(git commit-tree HEAD^^{tree} -p HEAD) && | |
1493 | git format-patch --stdout --signoff $C^..$C >append_signoff.patch && | |
1494 | sed -n -e "1,/^---$/p" append_signoff.patch | | |
81580fa0 | 1495 | grep -E -n "^Subject|Sign|^$" |
79133a66 NTND |
1496 | } |
1497 | ||
1498 | test_expect_success 'signoff: commit with no body' ' | |
1499 | append_signoff </dev/null >actual && | |
460609cb DL |
1500 | cat <<-\EOF | sed "s/EOL$//" >expect && |
1501 | 4:Subject: [PATCH] EOL | |
1502 | 8: | |
1503 | 9:Signed-off-by: C O Mitter <committer@example.com> | |
1504 | EOF | |
b562a54c | 1505 | test_cmp expect actual |
79133a66 NTND |
1506 | ' |
1507 | ||
1508 | test_expect_success 'signoff: commit with only subject' ' | |
1509 | echo subject | append_signoff >actual && | |
460609cb DL |
1510 | cat >expect <<-\EOF && |
1511 | 4:Subject: [PATCH] subject | |
1512 | 8: | |
1513 | 9:Signed-off-by: C O Mitter <committer@example.com> | |
1514 | EOF | |
b562a54c | 1515 | test_cmp expect actual |
79133a66 NTND |
1516 | ' |
1517 | ||
1518 | test_expect_success 'signoff: commit with only subject that does not end with NL' ' | |
1519 | printf subject | append_signoff >actual && | |
460609cb DL |
1520 | cat >expect <<-\EOF && |
1521 | 4:Subject: [PATCH] subject | |
1522 | 8: | |
1523 | 9:Signed-off-by: C O Mitter <committer@example.com> | |
1524 | EOF | |
b562a54c | 1525 | test_cmp expect actual |
79133a66 NTND |
1526 | ' |
1527 | ||
1528 | test_expect_success 'signoff: no existing signoffs' ' | |
460609cb DL |
1529 | append_signoff <<-\EOF >actual && |
1530 | subject | |
79133a66 | 1531 | |
460609cb DL |
1532 | body |
1533 | EOF | |
1534 | cat >expect <<-\EOF && | |
1535 | 4:Subject: [PATCH] subject | |
1536 | 8: | |
1537 | 10: | |
1538 | 11:Signed-off-by: C O Mitter <committer@example.com> | |
1539 | EOF | |
b562a54c | 1540 | test_cmp expect actual |
79133a66 NTND |
1541 | ' |
1542 | ||
1543 | test_expect_success 'signoff: no existing signoffs and no trailing NL' ' | |
1544 | printf "subject\n\nbody" | append_signoff >actual && | |
460609cb DL |
1545 | cat >expect <<-\EOF && |
1546 | 4:Subject: [PATCH] subject | |
1547 | 8: | |
1548 | 10: | |
1549 | 11:Signed-off-by: C O Mitter <committer@example.com> | |
1550 | EOF | |
b562a54c | 1551 | test_cmp expect actual |
79133a66 NTND |
1552 | ' |
1553 | ||
1554 | test_expect_success 'signoff: some random signoff' ' | |
460609cb DL |
1555 | append_signoff <<-\EOF >actual && |
1556 | subject | |
79133a66 | 1557 | |
460609cb | 1558 | body |
79133a66 | 1559 | |
460609cb DL |
1560 | Signed-off-by: my@house |
1561 | EOF | |
1562 | cat >expect <<-\EOF && | |
1563 | 4:Subject: [PATCH] subject | |
1564 | 8: | |
1565 | 10: | |
1566 | 11:Signed-off-by: my@house | |
1567 | 12:Signed-off-by: C O Mitter <committer@example.com> | |
1568 | EOF | |
b562a54c | 1569 | test_cmp expect actual |
79133a66 NTND |
1570 | ' |
1571 | ||
959a2623 | 1572 | test_expect_success 'signoff: misc conforming footer elements' ' |
460609cb DL |
1573 | append_signoff <<-\EOF >actual && |
1574 | subject | |
959a2623 | 1575 | |
460609cb | 1576 | body |
959a2623 | 1577 | |
460609cb DL |
1578 | Signed-off-by: my@house |
1579 | (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709) | |
1580 | Tested-by: Some One <someone@example.com> | |
1581 | Bug: 1234 | |
1582 | EOF | |
1583 | cat >expect <<-\EOF && | |
1584 | 4:Subject: [PATCH] subject | |
1585 | 8: | |
1586 | 10: | |
1587 | 11:Signed-off-by: my@house | |
1588 | 15:Signed-off-by: C O Mitter <committer@example.com> | |
1589 | EOF | |
b562a54c | 1590 | test_cmp expect actual |
959a2623 BC |
1591 | ' |
1592 | ||
1593 | test_expect_success 'signoff: some random signoff-alike' ' | |
460609cb DL |
1594 | append_signoff <<-\EOF >actual && |
1595 | subject | |
79133a66 | 1596 | |
460609cb DL |
1597 | body |
1598 | Fooled-by-me: my@house | |
1599 | EOF | |
1600 | cat >expect <<-\EOF && | |
1601 | 4:Subject: [PATCH] subject | |
1602 | 8: | |
1603 | 11: | |
1604 | 12:Signed-off-by: C O Mitter <committer@example.com> | |
1605 | EOF | |
b562a54c | 1606 | test_cmp expect actual |
79133a66 NTND |
1607 | ' |
1608 | ||
959a2623 | 1609 | test_expect_success 'signoff: not really a signoff' ' |
460609cb DL |
1610 | append_signoff <<-\EOF >actual && |
1611 | subject | |
79133a66 | 1612 | |
460609cb DL |
1613 | I want to mention about Signed-off-by: here. |
1614 | EOF | |
1615 | cat >expect <<-\EOF && | |
1616 | 4:Subject: [PATCH] subject | |
1617 | 8: | |
1618 | 9:I want to mention about Signed-off-by: here. | |
1619 | 10: | |
1620 | 11:Signed-off-by: C O Mitter <committer@example.com> | |
1621 | EOF | |
b562a54c | 1622 | test_cmp expect actual |
79133a66 NTND |
1623 | ' |
1624 | ||
959a2623 | 1625 | test_expect_success 'signoff: not really a signoff (2)' ' |
460609cb DL |
1626 | append_signoff <<-\EOF >actual && |
1627 | subject | |
79133a66 | 1628 | |
460609cb DL |
1629 | My unfortunate |
1630 | Signed-off-by: example happens to be wrapped here. | |
1631 | EOF | |
1632 | cat >expect <<-\EOF && | |
1633 | 4:Subject: [PATCH] subject | |
1634 | 8: | |
1635 | 10:Signed-off-by: example happens to be wrapped here. | |
1636 | 11:Signed-off-by: C O Mitter <committer@example.com> | |
1637 | EOF | |
b562a54c | 1638 | test_cmp expect actual |
79133a66 NTND |
1639 | ' |
1640 | ||
959a2623 | 1641 | test_expect_success 'signoff: valid S-o-b paragraph in the middle' ' |
460609cb DL |
1642 | append_signoff <<-\EOF >actual && |
1643 | subject | |
79133a66 | 1644 | |
460609cb DL |
1645 | Signed-off-by: my@house |
1646 | Signed-off-by: your@house | |
79133a66 | 1647 | |
460609cb DL |
1648 | A lot of houses. |
1649 | EOF | |
1650 | cat >expect <<-\EOF && | |
1651 | 4:Subject: [PATCH] subject | |
1652 | 8: | |
1653 | 9:Signed-off-by: my@house | |
1654 | 10:Signed-off-by: your@house | |
1655 | 11: | |
1656 | 13: | |
1657 | 14:Signed-off-by: C O Mitter <committer@example.com> | |
1658 | EOF | |
b562a54c | 1659 | test_cmp expect actual |
79133a66 NTND |
1660 | ' |
1661 | ||
1662 | test_expect_success 'signoff: the same signoff at the end' ' | |
460609cb DL |
1663 | append_signoff <<-\EOF >actual && |
1664 | subject | |
79133a66 | 1665 | |
460609cb | 1666 | body |
79133a66 | 1667 | |
460609cb DL |
1668 | Signed-off-by: C O Mitter <committer@example.com> |
1669 | EOF | |
1670 | cat >expect <<-\EOF && | |
1671 | 4:Subject: [PATCH] subject | |
1672 | 8: | |
1673 | 10: | |
1674 | 11:Signed-off-by: C O Mitter <committer@example.com> | |
1675 | EOF | |
b562a54c | 1676 | test_cmp expect actual |
79133a66 NTND |
1677 | ' |
1678 | ||
1679 | test_expect_success 'signoff: the same signoff at the end, no trailing NL' ' | |
1680 | printf "subject\n\nSigned-off-by: C O Mitter <committer@example.com>" | | |
1681 | append_signoff >actual && | |
460609cb DL |
1682 | cat >expect <<-\EOF && |
1683 | 4:Subject: [PATCH] subject | |
1684 | 8: | |
1685 | 9:Signed-off-by: C O Mitter <committer@example.com> | |
1686 | EOF | |
b562a54c | 1687 | test_cmp expect actual |
79133a66 NTND |
1688 | ' |
1689 | ||
1690 | test_expect_success 'signoff: the same signoff NOT at the end' ' | |
460609cb DL |
1691 | append_signoff <<-\EOF >actual && |
1692 | subject | |
79133a66 | 1693 | |
460609cb | 1694 | body |
79133a66 | 1695 | |
460609cb DL |
1696 | Signed-off-by: C O Mitter <committer@example.com> |
1697 | Signed-off-by: my@house | |
1698 | EOF | |
1699 | cat >expect <<-\EOF && | |
1700 | 4:Subject: [PATCH] subject | |
1701 | 8: | |
1702 | 10: | |
1703 | 11:Signed-off-by: C O Mitter <committer@example.com> | |
1704 | 12:Signed-off-by: my@house | |
1705 | EOF | |
b562a54c | 1706 | test_cmp expect actual |
79133a66 NTND |
1707 | ' |
1708 | ||
967dfd4d | 1709 | test_expect_success 'signoff: tolerate garbage in conforming footer' ' |
460609cb DL |
1710 | append_signoff <<-\EOF >actual && |
1711 | subject | |
79133a66 | 1712 | |
460609cb | 1713 | body |
79133a66 | 1714 | |
460609cb DL |
1715 | Tested-by: my@house |
1716 | Some Trash | |
1717 | Signed-off-by: C O Mitter <committer@example.com> | |
1718 | EOF | |
1719 | cat >expect <<-\EOF && | |
1720 | 4:Subject: [PATCH] subject | |
1721 | 8: | |
1722 | 10: | |
1723 | 13:Signed-off-by: C O Mitter <committer@example.com> | |
1724 | EOF | |
b562a54c | 1725 | test_cmp expect actual |
967dfd4d JT |
1726 | ' |
1727 | ||
1728 | test_expect_success 'signoff: respect trailer config' ' | |
460609cb DL |
1729 | append_signoff <<-\EOF >actual && |
1730 | subject | |
967dfd4d | 1731 | |
460609cb DL |
1732 | Myfooter: x |
1733 | Some Trash | |
1734 | EOF | |
1735 | cat >expect <<-\EOF && | |
1736 | 4:Subject: [PATCH] subject | |
1737 | 8: | |
1738 | 11: | |
1739 | 12:Signed-off-by: C O Mitter <committer@example.com> | |
1740 | EOF | |
b562a54c | 1741 | test_cmp expect actual && |
967dfd4d JT |
1742 | |
1743 | test_config trailer.Myfooter.ifexists add && | |
460609cb DL |
1744 | append_signoff <<-\EOF >actual && |
1745 | subject | |
967dfd4d | 1746 | |
460609cb DL |
1747 | Myfooter: x |
1748 | Some Trash | |
1749 | EOF | |
1750 | cat >expect <<-\EOF && | |
1751 | 4:Subject: [PATCH] subject | |
1752 | 8: | |
1753 | 11:Signed-off-by: C O Mitter <committer@example.com> | |
1754 | EOF | |
b562a54c | 1755 | test_cmp expect actual |
79133a66 NTND |
1756 | ' |
1757 | ||
1758 | test_expect_success 'signoff: footer begins with non-signoff without @ sign' ' | |
460609cb DL |
1759 | append_signoff <<-\EOF >actual && |
1760 | subject | |
79133a66 | 1761 | |
460609cb | 1762 | body |
79133a66 | 1763 | |
460609cb DL |
1764 | Reviewed-id: Noone |
1765 | Tested-by: my@house | |
1766 | Change-id: Ideadbeef | |
1767 | Signed-off-by: C O Mitter <committer@example.com> | |
1768 | Bug: 1234 | |
1769 | EOF | |
1770 | cat >expect <<-\EOF && | |
1771 | 4:Subject: [PATCH] subject | |
1772 | 8: | |
1773 | 10: | |
1774 | 14:Signed-off-by: C O Mitter <committer@example.com> | |
1775 | EOF | |
b562a54c | 1776 | test_cmp expect actual |
79133a66 NTND |
1777 | ' |
1778 | ||
787570c7 PYH |
1779 | test_expect_success 'format patch ignores color.ui' ' |
1780 | test_unconfig color.ui && | |
1781 | git format-patch --stdout -1 >expect && | |
1782 | test_config color.ui always && | |
1783 | git format-patch --stdout -1 >actual && | |
1784 | test_cmp expect actual | |
1785 | ' | |
1786 | ||
c28ded83 LA |
1787 | test_expect_success 'format patch respects diff.relative' ' |
1788 | rm -rf subdir && | |
1789 | mkdir subdir && | |
1790 | echo other content >subdir/file2 && | |
1791 | git add subdir/file2 && | |
1792 | git commit -F msg && | |
1793 | test_unconfig diff.relative && | |
1794 | git format-patch --relative=subdir --stdout -1 >expect && | |
1795 | test_config diff.relative true && | |
1796 | git -C subdir format-patch --stdout -1 >actual && | |
1797 | test_cmp expect actual | |
1798 | ' | |
1799 | ||
bf8e65b3 DL |
1800 | test_expect_success 'cover letter with invalid --cover-from-description and config' ' |
1801 | test_config branch.rebuild-1.description "config subject | |
1802 | ||
1803 | body" && | |
8f37854b | 1804 | test_must_fail git format-patch --cover-letter --cover-from-description garbage main && |
bf8e65b3 | 1805 | test_config format.coverFromDescription garbage && |
8f37854b | 1806 | test_must_fail git format-patch --cover-letter main |
bf8e65b3 DL |
1807 | ' |
1808 | ||
1809 | test_expect_success 'cover letter with format.coverFromDescription = default' ' | |
1810 | test_config branch.rebuild-1.description "config subject | |
1811 | ||
1812 | body" && | |
1813 | test_config format.coverFromDescription default && | |
1814 | git checkout rebuild-1 && | |
8f37854b | 1815 | git format-patch --stdout --cover-letter main >actual && |
bf8e65b3 DL |
1816 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1817 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1818 | grep "^config subject$" actual && | |
1819 | grep "^body$" actual | |
1820 | ' | |
1821 | ||
1822 | test_expect_success 'cover letter with --cover-from-description default' ' | |
1823 | test_config branch.rebuild-1.description "config subject | |
1824 | ||
1825 | body" && | |
1826 | git checkout rebuild-1 && | |
8f37854b | 1827 | git format-patch --stdout --cover-letter --cover-from-description default main >actual && |
bf8e65b3 DL |
1828 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1829 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1830 | grep "^config subject$" actual && | |
1831 | grep "^body$" actual | |
1832 | ' | |
1833 | ||
1834 | test_expect_success 'cover letter with format.coverFromDescription = none' ' | |
1835 | test_config branch.rebuild-1.description "config subject | |
1836 | ||
1837 | body" && | |
1838 | test_config format.coverFromDescription none && | |
1839 | git checkout rebuild-1 && | |
8f37854b | 1840 | git format-patch --stdout --cover-letter main >actual && |
bf8e65b3 DL |
1841 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1842 | grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1843 | ! grep "^config subject$" actual && | |
1844 | ! grep "^body$" actual | |
1845 | ' | |
1846 | ||
1847 | test_expect_success 'cover letter with --cover-from-description none' ' | |
1848 | test_config branch.rebuild-1.description "config subject | |
1849 | ||
1850 | body" && | |
1851 | git checkout rebuild-1 && | |
8f37854b | 1852 | git format-patch --stdout --cover-letter --cover-from-description none main >actual && |
bf8e65b3 DL |
1853 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1854 | grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1855 | ! grep "^config subject$" actual && | |
1856 | ! grep "^body$" actual | |
1857 | ' | |
1858 | ||
1859 | test_expect_success 'cover letter with format.coverFromDescription = message' ' | |
1860 | test_config branch.rebuild-1.description "config subject | |
1861 | ||
1862 | body" && | |
1863 | test_config format.coverFromDescription message && | |
1864 | git checkout rebuild-1 && | |
8f37854b | 1865 | git format-patch --stdout --cover-letter main >actual && |
bf8e65b3 DL |
1866 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1867 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1868 | grep "^config subject$" actual && | |
1869 | grep "^body$" actual | |
1870 | ' | |
1871 | ||
1872 | test_expect_success 'cover letter with --cover-from-description message' ' | |
1873 | test_config branch.rebuild-1.description "config subject | |
1874 | ||
1875 | body" && | |
1876 | git checkout rebuild-1 && | |
8f37854b | 1877 | git format-patch --stdout --cover-letter --cover-from-description message main >actual && |
bf8e65b3 DL |
1878 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1879 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1880 | grep "^config subject$" actual && | |
1881 | grep "^body$" actual | |
1882 | ' | |
1883 | ||
1884 | test_expect_success 'cover letter with format.coverFromDescription = subject' ' | |
1885 | test_config branch.rebuild-1.description "config subject | |
1886 | ||
1887 | body" && | |
1888 | test_config format.coverFromDescription subject && | |
1889 | git checkout rebuild-1 && | |
8f37854b | 1890 | git format-patch --stdout --cover-letter main >actual && |
bf8e65b3 DL |
1891 | grep "^Subject: \[PATCH 0/2\] config subject$" actual && |
1892 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1893 | ! grep "^config subject$" actual && | |
1894 | grep "^body$" actual | |
1895 | ' | |
1896 | ||
1897 | test_expect_success 'cover letter with --cover-from-description subject' ' | |
1898 | test_config branch.rebuild-1.description "config subject | |
1899 | ||
1900 | body" && | |
1901 | git checkout rebuild-1 && | |
8f37854b | 1902 | git format-patch --stdout --cover-letter --cover-from-description subject main >actual && |
bf8e65b3 DL |
1903 | grep "^Subject: \[PATCH 0/2\] config subject$" actual && |
1904 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1905 | ! grep "^config subject$" actual && | |
1906 | grep "^body$" actual | |
1907 | ' | |
1908 | ||
1909 | test_expect_success 'cover letter with format.coverFromDescription = auto (short subject line)' ' | |
1910 | test_config branch.rebuild-1.description "config subject | |
1911 | ||
1912 | body" && | |
1913 | test_config format.coverFromDescription auto && | |
1914 | git checkout rebuild-1 && | |
8f37854b | 1915 | git format-patch --stdout --cover-letter main >actual && |
bf8e65b3 DL |
1916 | grep "^Subject: \[PATCH 0/2\] config subject$" actual && |
1917 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1918 | ! grep "^config subject$" actual && | |
1919 | grep "^body$" actual | |
1920 | ' | |
1921 | ||
1922 | test_expect_success 'cover letter with --cover-from-description auto (short subject line)' ' | |
1923 | test_config branch.rebuild-1.description "config subject | |
1924 | ||
1925 | body" && | |
1926 | git checkout rebuild-1 && | |
8f37854b | 1927 | git format-patch --stdout --cover-letter --cover-from-description auto main >actual && |
bf8e65b3 DL |
1928 | grep "^Subject: \[PATCH 0/2\] config subject$" actual && |
1929 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1930 | ! grep "^config subject$" actual && | |
1931 | grep "^body$" actual | |
1932 | ' | |
1933 | ||
1934 | test_expect_success 'cover letter with format.coverFromDescription = auto (long subject line)' ' | |
1935 | test_config branch.rebuild-1.description "this is a really long first line and it is over 100 characters long which is the threshold for long subjects | |
1936 | ||
1937 | body" && | |
1938 | test_config format.coverFromDescription auto && | |
1939 | git checkout rebuild-1 && | |
8f37854b | 1940 | git format-patch --stdout --cover-letter main >actual && |
bf8e65b3 DL |
1941 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1942 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1943 | grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && | |
1944 | grep "^body$" actual | |
1945 | ' | |
1946 | ||
1947 | test_expect_success 'cover letter with --cover-from-description auto (long subject line)' ' | |
1948 | test_config branch.rebuild-1.description "this is a really long first line and it is over 100 characters long which is the threshold for long subjects | |
1949 | ||
1950 | body" && | |
1951 | git checkout rebuild-1 && | |
8f37854b | 1952 | git format-patch --stdout --cover-letter --cover-from-description auto main >actual && |
bf8e65b3 DL |
1953 | grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual && |
1954 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1955 | grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual && | |
1956 | grep "^body$" actual | |
1957 | ' | |
1958 | ||
1959 | test_expect_success 'cover letter with command-line --cover-from-description overrides config' ' | |
1960 | test_config branch.rebuild-1.description "config subject | |
1961 | ||
1962 | body" && | |
1963 | test_config format.coverFromDescription none && | |
1964 | git checkout rebuild-1 && | |
8f37854b | 1965 | git format-patch --stdout --cover-letter --cover-from-description subject main >actual && |
bf8e65b3 DL |
1966 | grep "^Subject: \[PATCH 0/2\] config subject$" actual && |
1967 | ! grep "^\*\*\* BLURB HERE \*\*\*$" actual && | |
1968 | ! grep "^config subject$" actual && | |
1969 | grep "^body$" actual | |
1970 | ' | |
1971 | ||
e216cc48 NTND |
1972 | test_expect_success 'cover letter using branch description (1)' ' |
1973 | git checkout rebuild-1 && | |
1974 | test_config branch.rebuild-1.description hello && | |
8f37854b | 1975 | git format-patch --stdout --cover-letter main >actual && |
f2e2fa8f | 1976 | grep hello actual |
e216cc48 NTND |
1977 | ' |
1978 | ||
1979 | test_expect_success 'cover letter using branch description (2)' ' | |
1980 | git checkout rebuild-1 && | |
1981 | test_config branch.rebuild-1.description hello && | |
1982 | git format-patch --stdout --cover-letter rebuild-1~2..rebuild-1 >actual && | |
f2e2fa8f | 1983 | grep hello actual |
e216cc48 NTND |
1984 | ' |
1985 | ||
1986 | test_expect_success 'cover letter using branch description (3)' ' | |
1987 | git checkout rebuild-1 && | |
1988 | test_config branch.rebuild-1.description hello && | |
8f37854b | 1989 | git format-patch --stdout --cover-letter ^main rebuild-1 >actual && |
f2e2fa8f | 1990 | grep hello actual |
e216cc48 NTND |
1991 | ' |
1992 | ||
20b630aa NTND |
1993 | test_expect_success 'cover letter using branch description (4)' ' |
1994 | git checkout rebuild-1 && | |
1995 | test_config branch.rebuild-1.description hello && | |
8f37854b | 1996 | git format-patch --stdout --cover-letter main.. >actual && |
f2e2fa8f | 1997 | grep hello actual |
20b630aa NTND |
1998 | ' |
1999 | ||
2000 | test_expect_success 'cover letter using branch description (5)' ' | |
2001 | git checkout rebuild-1 && | |
2002 | test_config branch.rebuild-1.description hello && | |
2003 | git format-patch --stdout --cover-letter -2 HEAD >actual && | |
f2e2fa8f | 2004 | grep hello actual |
20b630aa NTND |
2005 | ' |
2006 | ||
5ee29aef NTND |
2007 | test_expect_success 'cover letter using branch description (6)' ' |
2008 | git checkout rebuild-1 && | |
2009 | test_config branch.rebuild-1.description hello && | |
2010 | git format-patch --stdout --cover-letter -2 >actual && | |
f2e2fa8f | 2011 | grep hello actual |
5ee29aef NTND |
2012 | ' |
2013 | ||
67f4b36e OB |
2014 | test_expect_success 'cover letter with --description-file' ' |
2015 | test_when_finished "rm -f description.txt" && | |
2016 | cat >description.txt <<-\EOF && | |
2017 | subject from file | |
2018 | ||
2019 | body from file | |
2020 | EOF | |
2021 | git checkout rebuild-1 && | |
2022 | git format-patch --stdout --cover-letter --cover-from-description auto \ | |
2023 | --description-file description.txt main >actual && | |
2024 | grep "^Subject: \[PATCH 0/2\] subject from file$" actual && | |
2025 | grep "^body from file$" actual | |
2026 | ' | |
2027 | ||
80d35ca0 FC |
2028 | test_expect_success 'cover letter with nothing' ' |
2029 | git format-patch --stdout --cover-letter >actual && | |
2030 | test_line_count = 0 actual | |
2031 | ' | |
2032 | ||
2a4c2607 FC |
2033 | test_expect_success 'cover letter auto' ' |
2034 | mkdir -p tmp && | |
2035 | test_when_finished "rm -rf tmp; | |
2036 | git config --unset format.coverletter" && | |
2037 | ||
2038 | git config format.coverletter auto && | |
2039 | git format-patch -o tmp -1 >list && | |
2040 | test_line_count = 1 list && | |
2041 | git format-patch -o tmp -2 >list && | |
2042 | test_line_count = 3 list | |
2043 | ' | |
2044 | ||
2045 | test_expect_success 'cover letter auto user override' ' | |
2046 | mkdir -p tmp && | |
2047 | test_when_finished "rm -rf tmp; | |
2048 | git config --unset format.coverletter" && | |
2049 | ||
2050 | git config format.coverletter auto && | |
2051 | git format-patch -o tmp --cover-letter -1 >list && | |
2052 | test_line_count = 2 list && | |
2053 | git format-patch -o tmp --cover-letter -2 >list && | |
2054 | test_line_count = 3 list && | |
2055 | git format-patch -o tmp --no-cover-letter -1 >list && | |
2056 | test_line_count = 1 list && | |
2057 | git format-patch -o tmp --no-cover-letter -2 >list && | |
2058 | test_line_count = 2 list | |
2059 | ' | |
2060 | ||
3a30aa17 | 2061 | test_expect_success 'format-patch --zero-commit' ' |
2062 | git format-patch --zero-commit --stdout v2..v1 >patch2 && | |
2063 | grep "^From " patch2 | sort | uniq >actual && | |
8125a58b | 2064 | echo "From $ZERO_OID Mon Sep 17 00:00:00 2001" >expect && |
3a30aa17 | 2065 | test_cmp expect actual |
2066 | ' | |
2067 | ||
06dfc9eb | 2068 | test_expect_success 'From line has expected format' ' |
2069 | git format-patch --stdout v2..v1 >patch2 && | |
2070 | grep "^From " patch2 >from && | |
2ece6ad2 | 2071 | grep "^From $OID_REGEX Mon Sep 17 00:00:00 2001$" patch2 >filtered && |
06dfc9eb | 2072 | test_cmp from filtered |
2073 | ' | |
2074 | ||
edefc318 BW |
2075 | test_expect_success 'format-patch -o with no leading directories' ' |
2076 | rm -fr patches && | |
8f37854b JS |
2077 | git format-patch -o patches main..side && |
2078 | count=$(git rev-list --count main..side) && | |
edefc318 BW |
2079 | ls patches >list && |
2080 | test_line_count = $count list | |
2081 | ' | |
2082 | ||
2083 | test_expect_success 'format-patch -o with leading existing directories' ' | |
19c29e53 BW |
2084 | rm -rf existing-dir && |
2085 | mkdir existing-dir && | |
8f37854b JS |
2086 | git format-patch -o existing-dir/patches main..side && |
2087 | count=$(git rev-list --count main..side) && | |
19c29e53 | 2088 | ls existing-dir/patches >list && |
edefc318 BW |
2089 | test_line_count = $count list |
2090 | ' | |
2091 | ||
2092 | test_expect_success 'format-patch -o with leading non-existing directories' ' | |
19c29e53 | 2093 | rm -rf non-existing-dir && |
8f37854b JS |
2094 | git format-patch -o non-existing-dir/patches main..side && |
2095 | count=$(git rev-list --count main..side) && | |
19c29e53 BW |
2096 | test_path_is_dir non-existing-dir && |
2097 | ls non-existing-dir/patches >list && | |
edefc318 BW |
2098 | test_line_count = $count list |
2099 | ' | |
2100 | ||
bc6bf2d7 AK |
2101 | test_expect_success 'format-patch format.outputDirectory option' ' |
2102 | test_config format.outputDirectory patches && | |
2103 | rm -fr patches && | |
8f37854b JS |
2104 | git format-patch main..side && |
2105 | count=$(git rev-list --count main..side) && | |
756fb0de DL |
2106 | ls patches >list && |
2107 | test_line_count = $count list | |
bc6bf2d7 AK |
2108 | ' |
2109 | ||
2110 | test_expect_success 'format-patch -o overrides format.outputDirectory' ' | |
2111 | test_config format.outputDirectory patches && | |
2112 | rm -fr patches patchset && | |
8f37854b | 2113 | git format-patch main..side -o patchset && |
bc6bf2d7 AK |
2114 | test_path_is_missing patches && |
2115 | test_path_is_dir patchset | |
2116 | ' | |
2117 | ||
4c6f781f | 2118 | test_expect_success 'format-patch forbids multiple outputs' ' |
dc1672dd | 2119 | rm -fr outfile outdir && |
4c6f781f | 2120 | test_must_fail \ |
dc1672dd JK |
2121 | git format-patch --stdout --output-directory=outdir && |
2122 | test_must_fail \ | |
2123 | git format-patch --stdout --output=outfile && | |
2124 | test_must_fail \ | |
2125 | git format-patch --output=outfile --output-directory=outdir | |
4c6f781f JK |
2126 | ' |
2127 | ||
2128 | test_expect_success 'configured outdir does not conflict with output options' ' | |
dc1672dd | 2129 | rm -fr outfile outdir && |
4c6f781f JK |
2130 | test_config format.outputDirectory outdir && |
2131 | git format-patch --stdout && | |
dc1672dd JK |
2132 | test_path_is_missing outdir && |
2133 | git format-patch --output=outfile && | |
4c6f781f JK |
2134 | test_path_is_missing outdir |
2135 | ' | |
2136 | ||
dc1672dd JK |
2137 | test_expect_success 'format-patch --output' ' |
2138 | rm -fr outfile && | |
2139 | git format-patch -3 --stdout HEAD >expect && | |
2140 | git format-patch -3 --output=outfile HEAD && | |
2141 | test_cmp expect outfile | |
2142 | ' | |
2143 | ||
2144 | test_expect_success 'format-patch --cover-letter --output' ' | |
2145 | rm -fr outfile && | |
2146 | git format-patch --cover-letter -3 --stdout HEAD >expect && | |
2147 | git format-patch --cover-letter -3 --output=outfile HEAD && | |
2148 | test_cmp expect outfile | |
2149 | ' | |
2150 | ||
fa2ab86d | 2151 | test_expect_success 'format-patch --base' ' |
6f93d261 | 2152 | git checkout patchid && |
854b5cb4 DL |
2153 | |
2154 | git format-patch --stdout --base=HEAD~3 -1 >patch && | |
2155 | tail -n 7 patch >actual1 && | |
2156 | ||
2157 | git format-patch --stdout --base=HEAD~3 HEAD~.. >patch && | |
2158 | tail -n 7 patch >actual2 && | |
2159 | ||
b562a54c | 2160 | echo >expect && |
854b5cb4 DL |
2161 | git rev-parse HEAD~3 >commit-id-base && |
2162 | echo "base-commit: $(cat commit-id-base)" >>expect && | |
2163 | ||
2164 | git show --patch HEAD~2 >patch && | |
2165 | git patch-id --stable <patch >patch.id.raw && | |
2166 | awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>expect && | |
2167 | ||
2168 | git show --patch HEAD~1 >patch && | |
2169 | git patch-id --stable <patch >patch.id.raw && | |
2170 | awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>expect && | |
2171 | ||
92014b69 | 2172 | signature >>expect && |
b562a54c DL |
2173 | test_cmp expect actual1 && |
2174 | test_cmp expect actual2 && | |
854b5cb4 | 2175 | |
6f93d261 | 2176 | echo >fail && |
854b5cb4 DL |
2177 | echo "base-commit: $(cat commit-id-base)" >>fail && |
2178 | ||
2179 | git show --patch HEAD~2 >patch && | |
2180 | git patch-id --unstable <patch >patch.id.raw && | |
2181 | awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>fail && | |
2182 | ||
2183 | git show --patch HEAD~1 >patch && | |
2184 | git patch-id --unstable <patch >patch.id.raw && | |
2185 | awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>fail && | |
2186 | ||
92014b69 | 2187 | signature >>fail && |
6f93d261 SB |
2188 | ! test_cmp fail actual1 && |
2189 | ! test_cmp fail actual2 | |
fa2ab86d XY |
2190 | ' |
2191 | ||
2192 | test_expect_success 'format-patch --base errors out when base commit is in revision list' ' | |
2193 | test_must_fail git format-patch --base=HEAD -2 && | |
2194 | test_must_fail git format-patch --base=HEAD~1 -2 && | |
2195 | git format-patch --stdout --base=HEAD~2 -2 >patch && | |
2196 | grep "^base-commit:" patch >actual && | |
854b5cb4 DL |
2197 | git rev-parse HEAD~2 >commit-id-base && |
2198 | echo "base-commit: $(cat commit-id-base)" >expect && | |
b562a54c | 2199 | test_cmp expect actual |
fa2ab86d XY |
2200 | ' |
2201 | ||
2202 | test_expect_success 'format-patch --base errors out when base commit is not ancestor of revision list' ' | |
2203 | # For history as below: | |
2204 | # | |
2205 | # ---Q---P---Z---Y---*---X | |
2206 | # \ / | |
2207 | # ------------W | |
2208 | # | |
2209 | # If "format-patch Z..X" is given, P and Z can not be specified as the base commit | |
8f37854b | 2210 | git checkout -b topic1 main && |
fa2ab86d XY |
2211 | git rev-parse HEAD >commit-id-base && |
2212 | test_commit P && | |
2213 | git rev-parse HEAD >commit-id-P && | |
2214 | test_commit Z && | |
2215 | git rev-parse HEAD >commit-id-Z && | |
2216 | test_commit Y && | |
8f37854b | 2217 | git checkout -b topic2 main && |
fa2ab86d XY |
2218 | test_commit W && |
2219 | git merge topic1 && | |
2220 | test_commit X && | |
2221 | test_must_fail git format-patch --base=$(cat commit-id-P) -3 && | |
2222 | test_must_fail git format-patch --base=$(cat commit-id-Z) -3 && | |
2223 | git format-patch --stdout --base=$(cat commit-id-base) -3 >patch && | |
2224 | grep "^base-commit:" patch >actual && | |
b562a54c DL |
2225 | echo "base-commit: $(cat commit-id-base)" >expect && |
2226 | test_cmp expect actual | |
fa2ab86d XY |
2227 | ' |
2228 | ||
3de66517 | 2229 | test_expect_success 'format-patch --base=auto' ' |
8f37854b | 2230 | git checkout -b upstream main && |
3de66517 XY |
2231 | git checkout -b local upstream && |
2232 | git branch --set-upstream-to=upstream && | |
2233 | test_commit N1 && | |
2234 | test_commit N2 && | |
2235 | git format-patch --stdout --base=auto -2 >patch && | |
2236 | grep "^base-commit:" patch >actual && | |
854b5cb4 DL |
2237 | git rev-parse upstream >commit-id-base && |
2238 | echo "base-commit: $(cat commit-id-base)" >expect && | |
b562a54c | 2239 | test_cmp expect actual |
3de66517 XY |
2240 | ' |
2241 | ||
2242 | test_expect_success 'format-patch errors out when history involves criss-cross' ' | |
2243 | # setup criss-cross history | |
2244 | # | |
2245 | # B---M1---D | |
2246 | # / \ / | |
2247 | # A X | |
2248 | # \ / \ | |
2249 | # C---M2---E | |
2250 | # | |
8f37854b | 2251 | git checkout main && |
3de66517 | 2252 | test_commit A && |
8f37854b | 2253 | git checkout -b xb main && |
3de66517 | 2254 | test_commit B && |
8f37854b | 2255 | git checkout -b xc main && |
3de66517 XY |
2256 | test_commit C && |
2257 | git checkout -b xbc xb -- && | |
2258 | git merge xc && | |
2259 | git checkout -b xcb xc -- && | |
2260 | git branch --set-upstream-to=xbc && | |
2261 | git merge xb && | |
2262 | git checkout xbc && | |
2263 | test_commit D && | |
2264 | git checkout xcb && | |
2265 | test_commit E && | |
2266 | test_must_fail git format-patch --base=auto -1 | |
2267 | ' | |
2268 | ||
7efba5fa JK |
2269 | test_expect_success 'format-patch format.useAutoBase whenAble history involves criss-cross' ' |
2270 | test_config format.useAutoBase whenAble && | |
2271 | git format-patch -1 >patch && | |
2272 | ! grep "^base-commit:" patch | |
2273 | ' | |
2274 | ||
700e006c | 2275 | test_expect_success 'format-patch format.useAutoBase option' ' |
bb52995f | 2276 | git checkout local && |
700e006c | 2277 | test_config format.useAutoBase true && |
bb52995f XY |
2278 | git format-patch --stdout -1 >patch && |
2279 | grep "^base-commit:" patch >actual && | |
854b5cb4 DL |
2280 | git rev-parse upstream >commit-id-base && |
2281 | echo "base-commit: $(cat commit-id-base)" >expect && | |
b562a54c | 2282 | test_cmp expect actual |
bb52995f XY |
2283 | ' |
2284 | ||
7efba5fa JK |
2285 | test_expect_success 'format-patch format.useAutoBase option with whenAble' ' |
2286 | git checkout local && | |
2287 | test_config format.useAutoBase whenAble && | |
2288 | git format-patch --stdout -1 >patch && | |
2289 | grep "^base-commit:" patch >actual && | |
2290 | git rev-parse upstream >commit-id-base && | |
2291 | echo "base-commit: $(cat commit-id-base)" >expect && | |
2292 | test_cmp expect actual | |
2293 | ' | |
2294 | ||
bb52995f | 2295 | test_expect_success 'format-patch --base overrides format.useAutoBase' ' |
700e006c | 2296 | test_config format.useAutoBase true && |
bb52995f XY |
2297 | git format-patch --stdout --base=HEAD~1 -1 >patch && |
2298 | grep "^base-commit:" patch >actual && | |
854b5cb4 DL |
2299 | git rev-parse HEAD~1 >commit-id-base && |
2300 | echo "base-commit: $(cat commit-id-base)" >expect && | |
b562a54c | 2301 | test_cmp expect actual |
bb52995f XY |
2302 | ' |
2303 | ||
945dc55d DL |
2304 | test_expect_success 'format-patch --no-base overrides format.useAutoBase' ' |
2305 | test_config format.useAutoBase true && | |
2306 | git format-patch --stdout --no-base -1 >patch && | |
2307 | ! grep "^base-commit:" patch | |
2308 | ' | |
2309 | ||
7efba5fa JK |
2310 | test_expect_success 'format-patch --no-base overrides format.useAutoBase whenAble' ' |
2311 | test_config format.useAutoBase whenAble && | |
2312 | git format-patch --stdout --no-base -1 >patch && | |
2313 | ! grep "^base-commit:" patch | |
2314 | ' | |
2315 | ||
480871e0 JT |
2316 | test_expect_success 'format-patch --base with --attach' ' |
2317 | git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch && | |
2318 | sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \ | |
2319 | patch >actual && | |
2320 | test_write_lines 1 2 >expect && | |
2321 | test_cmp expect actual | |
2322 | ' | |
50cd54ef | 2323 | test_expect_success 'format-patch --attach cover-letter only is non-multipart' ' |
2324 | test_when_finished "rm -fr patches" && | |
2325 | git format-patch -o patches --cover-letter --attach=mimemime --base=HEAD~ -1 && | |
81580fa0 ĐTCD |
2326 | ! grep -E "^--+mimemime" patches/0000*.patch && |
2327 | grep -E "^--+mimemime$" patches/0001*.patch >output && | |
50cd54ef | 2328 | test_line_count = 2 output && |
81580fa0 | 2329 | grep -E "^--+mimemime--$" patches/0001*.patch >output && |
50cd54ef | 2330 | test_line_count = 1 output |
2331 | ' | |
480871e0 | 2332 | |
50bebf98 JH |
2333 | test_expect_success 'format-patch with format.attach' ' |
2334 | test_when_finished "rm -fr patches" && | |
2335 | separator=attachment-separator && | |
2336 | test_config format.attach "$separator" && | |
2337 | filename=$(git format-patch -o patches -1) && | |
2338 | grep "^Content-Type: multipart/.*$separator" "$filename" | |
2339 | ' | |
2340 | ||
2341 | test_expect_success 'format-patch with format.attach=disabled' ' | |
2342 | test_when_finished "rm -fr patches" && | |
2343 | separator=attachment-separator && | |
2344 | test_config_global format.attach "$separator" && | |
2345 | test_config format.attach "" && | |
2346 | filename=$(git format-patch -o patches -1) && | |
2347 | # The output should not even declare content type for text/plain. | |
2348 | ! grep "^Content-Type: multipart/" "$filename" | |
2349 | ' | |
2350 | ||
4810946f | 2351 | test_expect_success '-c format.mboxrd format-patch' ' |
9f23e040 EW |
2352 | sp=" " && |
2353 | cat >msg <<-INPUT_END && | |
2354 | mboxrd should escape the body | |
2355 | ||
2356 | From could trip up a loose mbox parser | |
2357 | >From extra escape for reversibility | |
2358 | >>From extra escape for reversibility 2 | |
2359 | from lower case not escaped | |
2360 | Fromm bad speling not escaped | |
2361 | From with leading space not escaped | |
2362 | ||
2363 | F | |
2364 | From | |
2365 | From$sp | |
2366 | From $sp | |
2367 | From $sp | |
2368 | INPUT_END | |
2369 | ||
2370 | cat >expect <<-INPUT_END && | |
2371 | >From could trip up a loose mbox parser | |
2372 | >>From extra escape for reversibility | |
2373 | >>>From extra escape for reversibility 2 | |
2374 | from lower case not escaped | |
2375 | Fromm bad speling not escaped | |
2376 | From with leading space not escaped | |
2377 | ||
2378 | F | |
2379 | From | |
2380 | From | |
2381 | From | |
2382 | From | |
2383 | INPUT_END | |
2384 | ||
2385 | C=$(git commit-tree HEAD^^{tree} -p HEAD <msg) && | |
4810946f EW |
2386 | git -c format.mboxrd format-patch --stdout -1 $C~1..$C >patch && |
2387 | git format-patch --pretty=mboxrd --stdout -1 $C~1..$C >compat && | |
2388 | test_cmp patch compat && | |
9f23e040 EW |
2389 | git grep -h --no-index -A11 \ |
2390 | "^>From could trip up a loose mbox parser" patch >actual && | |
2391 | test_cmp expect actual | |
2392 | ' | |
2393 | ||
126facf8 | 2394 | test_expect_success 'interdiff: setup' ' |
8f37854b | 2395 | git checkout -b boop main && |
126facf8 ES |
2396 | test_commit fnorp blorp && |
2397 | test_commit fleep blorp | |
2398 | ' | |
2399 | ||
2400 | test_expect_success 'interdiff: cover-letter' ' | |
2401 | sed "y/q/ /" >expect <<-\EOF && | |
2402 | +fleep | |
2403 | --q | |
2404 | EOF | |
2405 | git format-patch --cover-letter --interdiff=boop~2 -1 boop && | |
6789275d JH |
2406 | test_grep "^Interdiff:$" 0000-cover-letter.patch && |
2407 | test_grep ! "^Interdiff:$" 0001-fleep.patch && | |
c6ec6dad | 2408 | sed "1,/^@@ /d; /^-- $/q" 0000-cover-letter.patch >actual && |
126facf8 ES |
2409 | test_cmp expect actual |
2410 | ' | |
2411 | ||
5ac290f9 ES |
2412 | test_expect_success 'interdiff: reroll-count' ' |
2413 | git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop && | |
6789275d | 2414 | test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch |
5ac290f9 ES |
2415 | ' |
2416 | ||
db91988a ZH |
2417 | test_expect_success 'interdiff: reroll-count with a non-integer' ' |
2418 | git format-patch --cover-letter --interdiff=boop~2 -v2.2 -1 boop && | |
6789275d | 2419 | test_grep "^Interdiff:$" v2.2-0000-cover-letter.patch |
db91988a ZH |
2420 | ' |
2421 | ||
2422 | test_expect_success 'interdiff: reroll-count with a integer' ' | |
2423 | git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop && | |
6789275d | 2424 | test_grep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch |
db91988a ZH |
2425 | ' |
2426 | ||
ee6cbf71 ES |
2427 | test_expect_success 'interdiff: solo-patch' ' |
2428 | cat >expect <<-\EOF && | |
2429 | +fleep | |
2430 | ||
2431 | EOF | |
2432 | git format-patch --interdiff=boop~2 -1 boop && | |
6789275d | 2433 | test_grep "^Interdiff:$" 0001-fleep.patch && |
c6ec6dad | 2434 | sed "1,/^ @@ /d; /^$/q" 0001-fleep.patch >actual && |
ee6cbf71 ES |
2435 | test_cmp expect actual |
2436 | ' | |
2437 | ||
c169af8f JK |
2438 | test_expect_success 'format-patch does not respect diff.noprefix' ' |
2439 | git -c diff.noprefix format-patch -1 --stdout >actual && | |
2440 | grep "^--- a/blorp" actual | |
2441 | ' | |
2442 | ||
8d5213de JK |
2443 | test_expect_success 'format-patch respects format.noprefix' ' |
2444 | git -c format.noprefix format-patch -1 --stdout >actual && | |
2445 | grep "^--- blorp" actual | |
2446 | ' | |
2447 | ||
2448 | test_expect_success 'format-patch --default-prefix overrides format.noprefix' ' | |
2449 | git -c format.noprefix \ | |
2450 | format-patch -1 --default-prefix --stdout >actual && | |
2451 | grep "^--- a/blorp" actual | |
2452 | ' | |
2453 | ||
ece3c67f | 2454 | test_done |