blob: 7dc5a5c736e3f2db0c4bc29c20321b6a386661df [file] [log] [blame]
Junio C Hamanoece3c672006-06-26 15:40:09 -07001#!/bin/sh
2#
3# Copyright (c) 2006 Junio C Hamano
4#
5
Junio C Hamano9800a752009-01-12 15:18:02 -08006test_description='various format-patch tests'
Junio C Hamanoece3c672006-06-26 15:40:09 -07007
Johannes Schindelin8f378542020-11-18 23:44:27 +00008GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
Johannes Schindelin334afbc2020-11-18 23:44:19 +00009export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
10
Junio C Hamanoece3c672006-06-26 15:40:09 -070011. ./test-lib.sh
Tay Ray Chuan38a94bb2010-11-23 11:16:30 +080012. "$TEST_DIRECTORY"/lib-terminal.sh
Junio C Hamanoece3c672006-06-26 15:40:09 -070013
14test_expect_success setup '
Eric Sunshine08495412021-12-09 00:11:05 -050015 test_write_lines 1 2 3 4 5 6 7 8 9 10 >file &&
Junio C Hamanocd894ee2007-09-18 15:19:47 -070016 cat file >elif &&
17 git add file elif &&
Ramkumar Ramachandra6426f2d2010-08-28 01:58:15 +053018 test_tick &&
Junio C Hamanoece3c672006-06-26 15:40:09 -070019 git commit -m Initial &&
20 git checkout -b side &&
21
Eric Sunshine08495412021-12-09 00:11:05 -050022 test_write_lines 1 2 5 6 A B C 7 8 9 10 >file &&
Johannes Sixt1f553912009-02-28 21:12:57 +010023 test_chmod +x elif &&
Ramkumar Ramachandra6426f2d2010-08-28 01:58:15 +053024 test_tick &&
Junio C Hamano816366e2007-05-26 00:26:20 -070025 git commit -m "Side changes #1" &&
Junio C Hamanoece3c672006-06-26 15:40:09 -070026
Eric Sunshine08495412021-12-09 00:11:05 -050027 test_write_lines D E F >>file &&
Junio C Hamanoece3c672006-06-26 15:40:09 -070028 git update-index file &&
Ramkumar Ramachandra6426f2d2010-08-28 01:58:15 +053029 test_tick &&
Junio C Hamano816366e2007-05-26 00:26:20 -070030 git commit -m "Side changes #2" &&
Junio C Hamano982b64e2006-06-28 22:48:34 -070031 git tag C2 &&
Junio C Hamanoece3c672006-06-26 15:40:09 -070032
Eric Sunshine08495412021-12-09 00:11:05 -050033 test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >file &&
Junio C Hamanoece3c672006-06-26 15:40:09 -070034 git update-index file &&
Ramkumar Ramachandra6426f2d2010-08-28 01:58:15 +053035 test_tick &&
Junio C Hamano816366e2007-05-26 00:26:20 -070036 git commit -m "Side changes #3 with \\n backslash-n in it." &&
Junio C Hamanoece3c672006-06-26 15:40:09 -070037
Johannes Schindelin8f378542020-11-18 23:44:27 +000038 git checkout main &&
Denton Liu854b5cb2019-08-27 00:05:15 -040039 git diff-tree -p C2 >patch &&
40 git apply --index <patch &&
Ramkumar Ramachandra6426f2d2010-08-28 01:58:15 +053041 test_tick &&
Johannes Schindelin8f378542020-11-18 23:44:27 +000042 git commit -m "Main accepts moral equivalent of #2" &&
Junio C Hamanoece3c672006-06-26 15:40:09 -070043
Stephen Boyd6f93d262019-04-26 16:51:56 -070044 git checkout side &&
45 git checkout -b patchid &&
Eric Sunshine08495412021-12-09 00:11:05 -050046 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 &&
Stephen Boyd6f93d262019-04-26 16:51:56 -070049 git add file file2 file3 &&
50 test_tick &&
51 git commit -m "patchid 1" &&
Eric Sunshine08495412021-12-09 00:11:05 -050052 test_write_lines 4 A B 7 8 9 10 >file2 &&
53 test_write_lines 8 9 10 5 6 >file3 &&
Stephen Boyd6f93d262019-04-26 16:51:56 -070054 git add file2 file3 &&
55 test_tick &&
56 git commit -m "patchid 2" &&
Eric Sunshine08495412021-12-09 00:11:05 -050057 test_write_lines 10 5 6 >file &&
Stephen Boyd6f93d262019-04-26 16:51:56 -070058 git add file &&
59 test_tick &&
60 git commit -m "patchid 3" &&
61
Johannes Schindelin8f378542020-11-18 23:44:27 +000062 git checkout main
Junio C Hamanoece3c672006-06-26 15:40:09 -070063'
64
Denton Liu0ab74e92019-08-27 00:04:58 -040065test_expect_success 'format-patch --ignore-if-in-upstream' '
Johannes Schindelin8f378542020-11-18 23:44:27 +000066 git format-patch --stdout main..side >patch0 &&
Denton Liu6bd26f52019-08-27 00:05:10 -040067 grep "^From " patch0 >from0 &&
68 test_line_count = 3 from0
Junio C Hamanoece3c672006-06-26 15:40:09 -070069'
70
Denton Liu0ab74e92019-08-27 00:04:58 -040071test_expect_success 'format-patch --ignore-if-in-upstream' '
Junio C Hamanoece3c672006-06-26 15:40:09 -070072 git format-patch --stdout \
Johannes Schindelin8f378542020-11-18 23:44:27 +000073 --ignore-if-in-upstream main..side >patch1 &&
Denton Liu6bd26f52019-08-27 00:05:10 -040074 grep "^From " patch1 >from1 &&
75 test_line_count = 2 from1
Junio C Hamanoece3c672006-06-26 15:40:09 -070076'
77
Denton Liu0ab74e92019-08-27 00:04:58 -040078test_expect_success 'format-patch --ignore-if-in-upstream handles tags' '
Junio C Hamano9b7a61d2015-06-01 10:44:21 -070079 git tag -a v1 -m tag side &&
Johannes Schindelin8f378542020-11-18 23:44:27 +000080 git tag -a v2 -m tag main &&
Junio C Hamano9b7a61d2015-06-01 10:44:21 -070081 git format-patch --stdout --ignore-if-in-upstream v2..v1 >patch1 &&
Denton Liu6bd26f52019-08-27 00:05:10 -040082 grep "^From " patch1 >from1 &&
83 test_line_count = 2 from1
Junio C Hamano9b7a61d2015-06-01 10:44:21 -070084'
85
Ramkumar Ramachandra2c642ed2010-08-28 01:58:16 +053086test_expect_success "format-patch doesn't consider merge commits" '
Johannes Schindelin8f378542020-11-18 23:44:27 +000087 git checkout -b feature main &&
Ramkumar Ramachandra2c642ed2010-08-28 01:58:16 +053088 echo "Another line" >>file &&
89 test_tick &&
Paolo Bonzini08dc2602020-06-19 11:32:10 +020090 git commit -am "Feature branch change #1" &&
Ramkumar Ramachandra2c642ed2010-08-28 01:58:16 +053091 echo "Yet another line" >>file &&
92 test_tick &&
Paolo Bonzini08dc2602020-06-19 11:32:10 +020093 git commit -am "Feature branch change #2" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +000094 git checkout -b merger main &&
Ramkumar Ramachandra2c642ed2010-08-28 01:58:16 +053095 test_tick &&
Paolo Bonzini08dc2602020-06-19 11:32:10 +020096 git merge --no-ff feature &&
Denton Liu6bd26f52019-08-27 00:05:10 -040097 git format-patch -3 --stdout >patch &&
98 grep "^From " patch >from &&
99 test_line_count = 3 from
Ramkumar Ramachandra2c642ed2010-08-28 01:58:16 +0530100'
101
Denton Liu0ab74e92019-08-27 00:04:58 -0400102test_expect_success 'format-patch result applies' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000103 git checkout -b rebuild-0 main &&
Junio C Hamanoece3c672006-06-26 15:40:09 -0700104 git am -3 patch0 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000105 git rev-list main.. >list &&
Denton Liu6bd26f52019-08-27 00:05:10 -0400106 test_line_count = 2 list
Junio C Hamanoece3c672006-06-26 15:40:09 -0700107'
108
Denton Liu0ab74e92019-08-27 00:04:58 -0400109test_expect_success 'format-patch --ignore-if-in-upstream result applies' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000110 git checkout -b rebuild-1 main &&
Junio C Hamanoece3c672006-06-26 15:40:09 -0700111 git am -3 patch1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000112 git rev-list main.. >list &&
Denton Liu6bd26f52019-08-27 00:05:10 -0400113 test_line_count = 2 list
Junio C Hamanoece3c672006-06-26 15:40:09 -0700114'
115
Junio C Hamano816366e2007-05-26 00:26:20 -0700116test_expect_success 'commit did not screw up the log message' '
Denton Liu854b5cb2019-08-27 00:05:15 -0400117 git cat-file commit side >actual &&
118 grep "^Side .* with .* backslash-n" actual
Junio C Hamano816366e2007-05-26 00:26:20 -0700119'
120
121test_expect_success 'format-patch did not screw up the log message' '
Junio C Hamano816366e2007-05-26 00:26:20 -0700122 grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 &&
123 grep "^Subject: .*Side changes #3 with .* backslash-n" patch1
Junio C Hamano816366e2007-05-26 00:26:20 -0700124'
125
126test_expect_success 'replay did not screw up the log message' '
Denton Liu854b5cb2019-08-27 00:05:15 -0400127 git cat-file commit rebuild-1 >actual &&
128 grep "^Side .* with .* backslash-n" actual
Junio C Hamano816366e2007-05-26 00:26:20 -0700129'
130
Daniel Barkalowa8d81732008-02-19 02:40:28 -0500131test_expect_success 'extra headers' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200132 git config format.headers "To: R E Cipient <rcipient@example.com>
Daniel Barkalowa8d81732008-02-19 02:40:28 -0500133" &&
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200134 git config --add format.headers "Cc: S E Cipient <scipient@example.com>
Daniel Barkalowa8d81732008-02-19 02:40:28 -0500135" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000136 git format-patch --stdout main..side >patch2 &&
Denton Liu92014b62019-08-27 00:05:00 -0400137 sed -e "/^\$/q" patch2 >hdrs2 &&
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200138 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs2 &&
139 grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs2
Daniel Barkalowa8d81732008-02-19 02:40:28 -0500140'
141
Daniel Barkalow7d227082008-02-19 02:40:31 -0500142test_expect_success 'extra headers without newlines' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200143 git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" &&
144 git config --add format.headers "Cc: S E Cipient <scipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000145 git format-patch --stdout main..side >patch3 &&
Denton Liu92014b62019-08-27 00:05:00 -0400146 sed -e "/^\$/q" patch3 >hdrs3 &&
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200147 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs3 &&
148 grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs3
Daniel Barkalowa8d81732008-02-19 02:40:28 -0500149'
150
Daniel Barkalow3ee79d92008-02-19 02:40:33 -0500151test_expect_success 'extra headers with multiple To:s' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200152 git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" &&
153 git config --add format.headers "To: S E Cipient <scipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000154 git format-patch --stdout main..side >patch4 &&
Denton Liu92014b62019-08-27 00:05:00 -0400155 sed -e "/^\$/q" patch4 >hdrs4 &&
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200156 grep "^To: R E Cipient <rcipient@example.com>,\$" hdrs4 &&
157 grep "^ *S E Cipient <scipient@example.com>\$" hdrs4
Daniel Barkalowa8d81732008-02-19 02:40:28 -0500158'
159
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200160test_expect_success 'additional command line cc (ascii)' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200161 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000162 git format-patch --cc="S E Cipient <scipient@example.com>" --stdout main..side >patch5 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400163 sed -e "/^\$/q" patch5 >hdrs5 &&
164 grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 &&
165 grep "^ *S E Cipient <scipient@example.com>\$" hdrs5
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200166'
167
168test_expect_failure 'additional command line cc (rfc822)' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200169 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000170 git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout main..side >patch5 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400171 sed -e "/^\$/q" patch5 >hdrs5 &&
172 grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 &&
173 grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5
Daniel Barkalow736cc672008-02-19 02:40:35 -0500174'
175
Michael Hendricksd7d9c2d2009-03-26 10:51:05 -0600176test_expect_success 'command line headers' '
Michael Hendricksd7d9c2d2009-03-26 10:51:05 -0600177 git config --unset-all format.headers &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000178 git format-patch --add-header="Cc: R E Cipient <rcipient@example.com>" --stdout main..side >patch6 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400179 sed -e "/^\$/q" patch6 >hdrs6 &&
180 grep "^Cc: R E Cipient <rcipient@example.com>\$" hdrs6
Michael Hendricksd7d9c2d2009-03-26 10:51:05 -0600181'
182
183test_expect_success 'configuration headers and command line headers' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200184 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000185 git format-patch --add-header="Cc: S E Cipient <scipient@example.com>" --stdout main..side >patch7 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400186 sed -e "/^\$/q" patch7 >hdrs7 &&
187 grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs7 &&
188 grep "^ *S E Cipient <scipient@example.com>\$" hdrs7
Michael Hendricksd7d9c2d2009-03-26 10:51:05 -0600189'
190
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200191test_expect_success 'command line To: header (ascii)' '
Steven Drakeae6c0982010-02-17 12:39:34 +1300192 git config --unset-all format.headers &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000193 git format-patch --to="R E Cipient <rcipient@example.com>" --stdout main..side >patch8 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400194 sed -e "/^\$/q" patch8 >hdrs8 &&
195 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs8
Steven Drakeae6c0982010-02-17 12:39:34 +1300196'
197
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200198test_expect_failure 'command line To: header (rfc822)' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000199 git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout main..side >patch8 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400200 sed -e "/^\$/q" patch8 >hdrs8 &&
201 grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs8
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200202'
203
204test_expect_failure 'command line To: header (rfc2047)' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000205 git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout main..side >patch8 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400206 sed -e "/^\$/q" patch8 >hdrs8 &&
207 grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs8
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200208'
209
210test_expect_success 'configuration To: header (ascii)' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200211 git config format.to "R E Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000212 git format-patch --stdout main..side >patch9 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400213 sed -e "/^\$/q" patch9 >hdrs9 &&
214 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs9
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200215'
216
217test_expect_failure 'configuration To: header (rfc822)' '
Steven Drakeae6c0982010-02-17 12:39:34 +1300218 git config format.to "R. E. Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000219 git format-patch --stdout main..side >patch9 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400220 sed -e "/^\$/q" patch9 >hdrs9 &&
221 grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs9
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200222'
223
224test_expect_failure 'configuration To: header (rfc2047)' '
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200225 git config format.to "R Ä Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000226 git format-patch --stdout main..side >patch9 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400227 sed -e "/^\$/q" patch9 >hdrs9 &&
228 grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs9
Steven Drakeae6c0982010-02-17 12:39:34 +1300229'
230
Thomas Rastcc663d12011-08-29 22:10:46 +0200231# check_patch <patch>: Verify that <patch> looks like a half-sane
232# patch email to avoid a false positive with !grep
233check_patch () {
234 grep -e "^From:" "$1" &&
235 grep -e "^Date:" "$1" &&
236 grep -e "^Subject:" "$1"
237}
238
Josh Triplett6bc6b6c2016-07-30 02:41:56 -0700239test_expect_success 'format.from=false' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000240 git -c format.from=false format-patch --stdout main..side >patch &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400241 sed -e "/^\$/q" patch >hdrs &&
Josh Triplett6bc6b6c2016-07-30 02:41:56 -0700242 check_patch patch &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400243 ! grep "^From: C O Mitter <committer@example.com>\$" hdrs
Josh Triplett6bc6b6c2016-07-30 02:41:56 -0700244'
245
246test_expect_success 'format.from=true' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000247 git -c format.from=true format-patch --stdout main..side >patch &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400248 sed -e "/^\$/q" patch >hdrs &&
249 check_patch hdrs &&
250 grep "^From: C O Mitter <committer@example.com>\$" hdrs
Josh Triplett6bc6b6c2016-07-30 02:41:56 -0700251'
252
253test_expect_success 'format.from with address' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000254 git -c format.from="F R Om <from@example.com>" format-patch --stdout main..side >patch &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400255 sed -e "/^\$/q" patch >hdrs &&
256 check_patch hdrs &&
257 grep "^From: F R Om <from@example.com>\$" hdrs
Josh Triplett6bc6b6c2016-07-30 02:41:56 -0700258'
259
260test_expect_success '--no-from overrides format.from' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000261 git -c format.from="F R Om <from@example.com>" format-patch --no-from --stdout main..side >patch &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400262 sed -e "/^\$/q" patch >hdrs &&
263 check_patch hdrs &&
264 ! grep "^From: F R Om <from@example.com>\$" hdrs
Josh Triplett6bc6b6c2016-07-30 02:41:56 -0700265'
266
267test_expect_success '--from overrides format.from' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000268 git -c format.from="F R Om <from@example.com>" format-patch --from --stdout main..side >patch &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400269 sed -e "/^\$/q" patch >hdrs &&
270 check_patch hdrs &&
271 ! grep "^From: F R Om <from@example.com>\$" hdrs
Josh Triplett6bc6b6c2016-07-30 02:41:56 -0700272'
273
Stephen Boydc4260032010-03-07 14:46:47 -0800274test_expect_success '--no-to overrides config.to' '
Stephen Boydc4260032010-03-07 14:46:47 -0800275 git config --replace-all format.to \
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200276 "R E Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000277 git format-patch --no-to --stdout main..side >patch10 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400278 sed -e "/^\$/q" patch10 >hdrs10 &&
279 check_patch hdrs10 &&
280 ! grep "^To: R E Cipient <rcipient@example.com>\$" hdrs10
Stephen Boydc4260032010-03-07 14:46:47 -0800281'
282
283test_expect_success '--no-to and --to replaces config.to' '
Stephen Boydc4260032010-03-07 14:46:47 -0800284 git config --replace-all format.to \
285 "Someone <someone@out.there>" &&
286 git format-patch --no-to --to="Someone Else <else@out.there>" \
Johannes Schindelin8f378542020-11-18 23:44:27 +0000287 --stdout main..side >patch11 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400288 sed -e "/^\$/q" patch11 >hdrs11 &&
289 check_patch hdrs11 &&
290 ! grep "^To: Someone <someone@out.there>\$" hdrs11 &&
291 grep "^To: Someone Else <else@out.there>\$" hdrs11
Stephen Boydc4260032010-03-07 14:46:47 -0800292'
293
294test_expect_success '--no-cc overrides config.cc' '
Stephen Boydc4260032010-03-07 14:46:47 -0800295 git config --replace-all format.cc \
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200296 "C E Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000297 git format-patch --no-cc --stdout main..side >patch12 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400298 sed -e "/^\$/q" patch12 >hdrs12 &&
299 check_patch hdrs12 &&
300 ! grep "^Cc: C E Cipient <rcipient@example.com>\$" hdrs12
Stephen Boydc4260032010-03-07 14:46:47 -0800301'
302
Thomas Rast688f4f22011-08-29 22:10:48 +0200303test_expect_success '--no-add-header overrides config.headers' '
Stephen Boydc4260032010-03-07 14:46:47 -0800304 git config --replace-all format.headers \
Jan H. Schönherr25dc8da2012-10-18 16:43:34 +0200305 "Header1: B E Cipient <rcipient@example.com>" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000306 git format-patch --no-add-header --stdout main..side >patch13 &&
Denton Liu854b5cb2019-08-27 00:05:15 -0400307 sed -e "/^\$/q" patch13 >hdrs13 &&
308 check_patch hdrs13 &&
309 ! grep "^Header1: B E Cipient <rcipient@example.com>\$" hdrs13
Stephen Boydc4260032010-03-07 14:46:47 -0800310'
311
Daniel Barkalow7d812142008-02-18 22:56:02 -0500312test_expect_success 'multiple files' '
Daniel Barkalow7d812142008-02-18 22:56:02 -0500313 rm -rf patches/ &&
314 git checkout side &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000315 git format-patch -o patches/ main &&
Daniel Barkalow7d812142008-02-18 22:56:02 -0500316 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
317'
318
Junio C Hamano3baf58b2020-11-06 13:56:24 -0800319test_expect_success 'filename length limit' '
320 test_when_finished "rm -f 000*" &&
321 rm -rf 000[1-9]-*.patch &&
322 for len in 15 25 35
323 do
324 git format-patch --filename-max-length=$len -3 side &&
325 max=$(
326 for patch in 000[1-9]-*.patch
327 do
Eric Sunshinecbe1d9d2021-12-09 00:11:13 -0500328 echo "$patch" | wc -c || exit 1
Junio C Hamano3baf58b2020-11-06 13:56:24 -0800329 done |
330 sort -nr |
331 head -n 1
332 ) &&
333 test $max -le $len || return 1
334 done
335'
336
337test_expect_success 'filename length limit from config' '
338 test_when_finished "rm -f 000*" &&
339 rm -rf 000[1-9]-*.patch &&
340 for len in 15 25 35
341 do
342 git -c format.filenameMaxLength=$len format-patch -3 side &&
343 max=$(
344 for patch in 000[1-9]-*.patch
345 do
Eric Sunshinecbe1d9d2021-12-09 00:11:13 -0500346 echo "$patch" | wc -c || exit 1
Junio C Hamano3baf58b2020-11-06 13:56:24 -0800347 done |
348 sort -nr |
349 head -n 1
350 ) &&
351 test $max -le $len || return 1
352 done
353'
354
355test_expect_success 'filename limit applies only to basename' '
356 test_when_finished "rm -rf patches/" &&
357 rm -rf patches/ &&
358 for len in 15 25 35
359 do
360 git format-patch -o patches --filename-max-length=$len -3 side &&
361 max=$(
362 for patch in patches/000[1-9]-*.patch
363 do
Eric Sunshinecbe1d9d2021-12-09 00:11:13 -0500364 echo "${patch#patches/}" | wc -c || exit 1
Junio C Hamano3baf58b2020-11-06 13:56:24 -0800365 done |
366 sort -nr |
367 head -n 1
368 ) &&
369 test $max -le $len || return 1
370 done
371'
372
Junio C Hamano4aad08e2013-01-02 14:16:07 -0800373test_expect_success 'reroll count' '
374 rm -fr patches &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000375 git format-patch -o patches --cover-letter --reroll-count 4 main..side >list &&
Junio C Hamano4aad08e2013-01-02 14:16:07 -0800376 ! grep -v "^patches/v4-000[0-3]-" list &&
377 sed -n -e "/^Subject: /p" $(cat list) >subjects &&
378 ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects
379'
380
Junio C Hamano7952ea62013-01-02 14:19:05 -0800381test_expect_success 'reroll count (-v)' '
382 rm -fr patches &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000383 git format-patch -o patches --cover-letter -v4 main..side >list &&
Junio C Hamano7952ea62013-01-02 14:19:05 -0800384 ! grep -v "^patches/v4-000[0-3]-" list &&
385 sed -n -e "/^Subject: /p" $(cat list) >subjects &&
386 ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects
387'
388
ZheNing Hudb919882021-03-23 11:12:25 +0000389test_expect_success 'reroll count (-v) with a fractional number' '
390 rm -fr patches &&
391 git format-patch -o patches --cover-letter -v4.4 main..side >list &&
392 ! grep -v "^patches/v4.4-000[0-3]-" list &&
393 sed -n -e "/^Subject: /p" $(cat list) >subjects &&
394 ! grep -v "^Subject: \[PATCH v4.4 [0-3]/3\] " subjects
395'
396
397test_expect_success 'reroll (-v) count with a non number' '
398 rm -fr patches &&
399 git format-patch -o patches --cover-letter -v4rev2 main..side >list &&
400 ! grep -v "^patches/v4rev2-000[0-3]-" list &&
401 sed -n -e "/^Subject: /p" $(cat list) >subjects &&
402 ! grep -v "^Subject: \[PATCH v4rev2 [0-3]/3\] " subjects
403'
404
405test_expect_success 'reroll (-v) count with a non-pathname character' '
406 rm -fr patches &&
407 git format-patch -o patches --cover-letter -v4---..././../--1/.2// main..side >list &&
408 ! grep -v "patches/v4-\.-\.-\.-1-\.2-000[0-3]-" list &&
409 sed -n -e "/^Subject: /p" $(cat list) >subjects &&
410 ! grep -v "^Subject: \[PATCH v4---\.\.\./\./\.\./--1/\.2// [0-3]/3\] " subjects
411'
412
Thomas Rast484cf6c2009-02-19 22:26:30 +0100413check_threading () {
414 expect="$1" &&
415 shift &&
Denton Liudd2b6b62019-08-27 00:05:12 -0400416 git format-patch --stdout "$@" >patch &&
Thomas Rast484cf6c2009-02-19 22:26:30 +0100417 # Prints everything between the Message-ID and In-Reply-To,
418 # and replaces all Message-ID-lookalikes by a sequence number
Jeff King94221d22013-10-28 21:23:03 -0400419 perl -ne '
Thomas Rast484cf6c2009-02-19 22:26:30 +0100420 if (/^(message-id|references|in-reply-to)/i) {
421 $printing = 1;
422 } elsif (/^\S/) {
423 $printing = 0;
424 }
425 if ($printing) {
426 $h{$1}=$i++ if (/<([^>]+)>/ and !exists $h{$1});
427 for $k (keys %h) {s/$k/$h{$k}/};
428 print;
429 }
430 print "---\n" if /^From /i;
Denton Liudd2b6b62019-08-27 00:05:12 -0400431 ' <patch >actual &&
Thomas Rast484cf6c2009-02-19 22:26:30 +0100432 test_cmp "$expect" actual
433}
Daniel Barkalow7d812142008-02-18 22:56:02 -0500434
Denton Liu92014b62019-08-27 00:05:00 -0400435cat >>expect.no-threading <<EOF
Thomas Rast484cf6c2009-02-19 22:26:30 +0100436---
437---
438---
439EOF
440
441test_expect_success 'no threading' '
Daniel Barkalow7d812142008-02-18 22:56:02 -0500442 git checkout side &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000443 check_threading expect.no-threading main
Daniel Barkalow7d812142008-02-18 22:56:02 -0500444'
445
Denton Liu92014b62019-08-27 00:05:00 -0400446cat >expect.thread <<EOF
Thomas Rast484cf6c2009-02-19 22:26:30 +0100447---
448Message-Id: <0>
449---
450Message-Id: <1>
451In-Reply-To: <0>
452References: <0>
453---
454Message-Id: <2>
455In-Reply-To: <0>
456References: <0>
457EOF
458
459test_expect_success 'thread' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000460 check_threading expect.thread --thread main
Thomas Rast484cf6c2009-02-19 22:26:30 +0100461'
462
Denton Liu92014b62019-08-27 00:05:00 -0400463cat >expect.in-reply-to <<EOF
Thomas Rast484cf6c2009-02-19 22:26:30 +0100464---
465Message-Id: <0>
466In-Reply-To: <1>
467References: <1>
468---
469Message-Id: <2>
470In-Reply-To: <1>
471References: <1>
472---
473Message-Id: <3>
474In-Reply-To: <1>
475References: <1>
476EOF
477
Daniel Barkalow7d812142008-02-18 22:56:02 -0500478test_expect_success 'thread in-reply-to' '
Thomas Rast484cf6c2009-02-19 22:26:30 +0100479 check_threading expect.in-reply-to --in-reply-to="<test.message>" \
Johannes Schindelin8f378542020-11-18 23:44:27 +0000480 --thread main
Daniel Barkalow7d812142008-02-18 22:56:02 -0500481'
482
Denton Liu92014b62019-08-27 00:05:00 -0400483cat >expect.cover-letter <<EOF
Thomas Rast484cf6c2009-02-19 22:26:30 +0100484---
485Message-Id: <0>
486---
487Message-Id: <1>
488In-Reply-To: <0>
489References: <0>
490---
491Message-Id: <2>
492In-Reply-To: <0>
493References: <0>
494---
495Message-Id: <3>
496In-Reply-To: <0>
497References: <0>
498EOF
499
Daniel Barkalowa5a27c72008-02-18 22:56:13 -0500500test_expect_success 'thread cover-letter' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000501 check_threading expect.cover-letter --cover-letter --thread main
Daniel Barkalowa5a27c72008-02-18 22:56:13 -0500502'
503
Denton Liu92014b62019-08-27 00:05:00 -0400504cat >expect.cl-irt <<EOF
Thomas Rast484cf6c2009-02-19 22:26:30 +0100505---
506Message-Id: <0>
507In-Reply-To: <1>
508References: <1>
509---
510Message-Id: <2>
Thomas Rast2175c102009-02-19 22:26:32 +0100511In-Reply-To: <0>
Thomas Rast484cf6c2009-02-19 22:26:30 +0100512References: <1>
Thomas Rast2175c102009-02-19 22:26:32 +0100513 <0>
Thomas Rast484cf6c2009-02-19 22:26:30 +0100514---
515Message-Id: <3>
Thomas Rast2175c102009-02-19 22:26:32 +0100516In-Reply-To: <0>
Thomas Rast484cf6c2009-02-19 22:26:30 +0100517References: <1>
Thomas Rast2175c102009-02-19 22:26:32 +0100518 <0>
Thomas Rast484cf6c2009-02-19 22:26:30 +0100519---
520Message-Id: <4>
Thomas Rast2175c102009-02-19 22:26:32 +0100521In-Reply-To: <0>
Thomas Rast484cf6c2009-02-19 22:26:30 +0100522References: <1>
Thomas Rast2175c102009-02-19 22:26:32 +0100523 <0>
Thomas Rast484cf6c2009-02-19 22:26:30 +0100524EOF
Daniel Barkalowa5a27c72008-02-18 22:56:13 -0500525
Thomas Rast484cf6c2009-02-19 22:26:30 +0100526test_expect_success 'thread cover-letter in-reply-to' '
527 check_threading expect.cl-irt --cover-letter \
Johannes Schindelin8f378542020-11-18 23:44:27 +0000528 --in-reply-to="<test.message>" --thread main
Daniel Barkalowa5a27c72008-02-18 22:56:13 -0500529'
530
Thomas Rast30984ed2009-02-19 22:26:33 +0100531test_expect_success 'thread explicit shallow' '
532 check_threading expect.cl-irt --cover-letter \
Johannes Schindelin8f378542020-11-18 23:44:27 +0000533 --in-reply-to="<test.message>" --thread=shallow main
Thomas Rast30984ed2009-02-19 22:26:33 +0100534'
535
Denton Liu92014b62019-08-27 00:05:00 -0400536cat >expect.deep <<EOF
Thomas Rast30984ed2009-02-19 22:26:33 +0100537---
538Message-Id: <0>
539---
540Message-Id: <1>
541In-Reply-To: <0>
542References: <0>
543---
544Message-Id: <2>
545In-Reply-To: <1>
546References: <0>
547 <1>
548EOF
549
550test_expect_success 'thread deep' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000551 check_threading expect.deep --thread=deep main
Thomas Rast30984ed2009-02-19 22:26:33 +0100552'
553
Denton Liu92014b62019-08-27 00:05:00 -0400554cat >expect.deep-irt <<EOF
Thomas Rast30984ed2009-02-19 22:26:33 +0100555---
556Message-Id: <0>
557In-Reply-To: <1>
558References: <1>
559---
560Message-Id: <2>
561In-Reply-To: <0>
562References: <1>
563 <0>
564---
565Message-Id: <3>
566In-Reply-To: <2>
567References: <1>
568 <0>
569 <2>
570EOF
571
572test_expect_success 'thread deep in-reply-to' '
573 check_threading expect.deep-irt --thread=deep \
Johannes Schindelin8f378542020-11-18 23:44:27 +0000574 --in-reply-to="<test.message>" main
Thomas Rast30984ed2009-02-19 22:26:33 +0100575'
576
Denton Liu92014b62019-08-27 00:05:00 -0400577cat >expect.deep-cl <<EOF
Thomas Rast30984ed2009-02-19 22:26:33 +0100578---
579Message-Id: <0>
580---
581Message-Id: <1>
582In-Reply-To: <0>
583References: <0>
584---
585Message-Id: <2>
586In-Reply-To: <1>
587References: <0>
588 <1>
589---
590Message-Id: <3>
591In-Reply-To: <2>
592References: <0>
593 <1>
594 <2>
595EOF
596
597test_expect_success 'thread deep cover-letter' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000598 check_threading expect.deep-cl --cover-letter --thread=deep main
Thomas Rast30984ed2009-02-19 22:26:33 +0100599'
600
Denton Liu92014b62019-08-27 00:05:00 -0400601cat >expect.deep-cl-irt <<EOF
Thomas Rast30984ed2009-02-19 22:26:33 +0100602---
603Message-Id: <0>
604In-Reply-To: <1>
605References: <1>
606---
607Message-Id: <2>
608In-Reply-To: <0>
609References: <1>
610 <0>
611---
612Message-Id: <3>
613In-Reply-To: <2>
614References: <1>
615 <0>
616 <2>
617---
618Message-Id: <4>
619In-Reply-To: <3>
620References: <1>
621 <0>
622 <2>
623 <3>
624EOF
625
626test_expect_success 'thread deep cover-letter in-reply-to' '
627 check_threading expect.deep-cl-irt --cover-letter \
Johannes Schindelin8f378542020-11-18 23:44:27 +0000628 --in-reply-to="<test.message>" --thread=deep main
Thomas Rast30984ed2009-02-19 22:26:33 +0100629'
630
631test_expect_success 'thread via config' '
Jeff Kinge8107152011-09-19 15:15:45 -0400632 test_config format.thread true &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000633 check_threading expect.thread main
Thomas Rast30984ed2009-02-19 22:26:33 +0100634'
635
636test_expect_success 'thread deep via config' '
Jeff Kinge8107152011-09-19 15:15:45 -0400637 test_config format.thread deep &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000638 check_threading expect.deep main
Thomas Rast30984ed2009-02-19 22:26:33 +0100639'
640
641test_expect_success 'thread config + override' '
Jeff Kinge8107152011-09-19 15:15:45 -0400642 test_config format.thread deep &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000643 check_threading expect.thread --thread main
Thomas Rast30984ed2009-02-19 22:26:33 +0100644'
645
646test_expect_success 'thread config + --no-thread' '
Jeff Kinge8107152011-09-19 15:15:45 -0400647 test_config format.thread deep &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000648 check_threading expect.no-threading --no-thread main
Thomas Rast30984ed2009-02-19 22:26:33 +0100649'
650
Daniel Barkalow7d812142008-02-18 22:56:02 -0500651test_expect_success 'excessive subject' '
Daniel Barkalow7d812142008-02-18 22:56:02 -0500652 rm -rf patches/ &&
653 git checkout side &&
brian m. carlsonbdee9cd2018-05-21 02:01:36 +0000654 before=$(git hash-object file) &&
655 before=$(git rev-parse --short $before) &&
Eric Sunshine08495412021-12-09 00:11:05 -0500656 test_write_lines 5 6 1 2 3 A 4 B C 7 8 9 10 D E F >>file &&
brian m. carlsonbdee9cd2018-05-21 02:01:36 +0000657 after=$(git hash-object file) &&
658 after=$(git rev-parse --short $after) &&
Daniel Barkalow7d812142008-02-18 22:56:02 -0500659 git update-index file &&
660 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." &&
Johannes Schindelin8f378542020-11-18 23:44:27 +0000661 git format-patch -o patches/ main..side &&
Daniel Barkalow7d812142008-02-18 22:56:02 -0500662 ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch
663'
664
Junio C Hamano2fe95f42019-02-22 11:26:43 -0800665test_expect_success 'failure to write cover-letter aborts gracefully' '
666 test_when_finished "rmdir 0000-cover-letter.patch" &&
667 mkdir 0000-cover-letter.patch &&
668 test_must_fail git format-patch --no-renames --cover-letter -1
669'
670
Johannes Schindelin5d022942008-03-02 15:53:04 +0000671test_expect_success 'cover-letter inherits diff options' '
Johannes Schindelin5d022942008-03-02 15:53:04 +0000672 git mv file foo &&
673 git commit -m foo &&
Matthieu Moy5404c112016-02-25 09:59:21 +0100674 git format-patch --no-renames --cover-letter -1 &&
Thomas Rastcc663d12011-08-29 22:10:46 +0200675 check_patch 0000-cover-letter.patch &&
Stephen Boyd9524cf22010-01-26 15:08:31 -0800676 ! grep "file => foo .* 0 *\$" 0000-cover-letter.patch &&
Johannes Schindelin5d022942008-03-02 15:53:04 +0000677 git format-patch --cover-letter -1 -M &&
Stephen Boyd9524cf22010-01-26 15:08:31 -0800678 grep "file => foo .* 0 *\$" 0000-cover-letter.patch
Johannes Schindelin5d022942008-03-02 15:53:04 +0000679'
Johannes Schindelin859c4fb2008-03-02 15:53:39 +0000680
Denton Liu92014b62019-08-27 00:05:00 -0400681cat >expect <<EOF
Johannes Schindelin859c4fb2008-03-02 15:53:39 +0000682 This is an excessively long subject line for a message due to the
683 habit some projects have of not having a short, one-line subject at
684 the start of the commit message, but rather sticking a whole
685 paragraph right at the start as the only thing in the commit
686 message. It had better not become the filename for the patch.
687 foo
688
689EOF
690
691test_expect_success 'shortlog of cover-letter wraps overly-long onelines' '
Johannes Schindelin859c4fb2008-03-02 15:53:39 +0000692 git format-patch --cover-letter -2 &&
Denton Liuc6ec6da2019-08-27 00:05:07 -0400693 sed -e "1,/A U Thor/d" -e "/^\$/q" 0000-cover-letter.patch >output &&
Junio C Hamano3af82862008-05-23 22:28:56 -0700694 test_cmp expect output
Johannes Schindelin859c4fb2008-03-02 15:53:39 +0000695'
696
Denton Liu92014b62019-08-27 00:05:00 -0400697cat >expect <<EOF
brian m. carlsonbdee9cd2018-05-21 02:01:36 +0000698index $before..$after 100644
Jeff King68daa642008-08-24 22:10:29 -0400699--- a/file
700+++ b/file
701@@ -13,4 +13,20 @@ C
702 10
703 D
704 E
705 F
706+5
707EOF
708
709test_expect_success 'format-patch respects -U' '
Jeff King68daa642008-08-24 22:10:29 -0400710 git format-patch -U4 -2 &&
Jonathan Nieder6dd88832012-03-13 00:05:54 -0500711 sed -e "1,/^diff/d" -e "/^+5/q" \
712 <0001-This-is-an-excessively-long-subject-line-for-a-messa.patch \
713 >output &&
Jeff King68daa642008-08-24 22:10:29 -0400714 test_cmp expect output
Jeff King68daa642008-08-24 22:10:29 -0400715'
716
Denton Liu92014b62019-08-27 00:05:00 -0400717cat >expect <<EOF
Jeff King1d46f2e2009-11-04 02:19:40 -0500718
719diff --git a/file b/file
brian m. carlsonbdee9cd2018-05-21 02:01:36 +0000720index $before..$after 100644
Jeff King1d46f2e2009-11-04 02:19:40 -0500721--- a/file
722+++ b/file
723@@ -14,3 +14,19 @@ C
724 D
725 E
726 F
727+5
728EOF
729
730test_expect_success 'format-patch -p suppresses stat' '
Jeff King1d46f2e2009-11-04 02:19:40 -0500731 git format-patch -p -2 &&
Denton Liuc6ec6da2019-08-27 00:05:07 -0400732 sed -e "1,/^\$/d" -e "/^+5/q" 0001-This-is-an-excessively-long-subject-line-for-a-messa.patch >output &&
Jeff King1d46f2e2009-11-04 02:19:40 -0500733 test_cmp expect output
Jeff King1d46f2e2009-11-04 02:19:40 -0500734'
735
Junio C Hamano9800a752009-01-12 15:18:02 -0800736test_expect_success 'format-patch from a subdirectory (1)' '
737 filename=$(
738 rm -rf sub &&
739 mkdir -p sub/dir &&
740 cd sub/dir &&
741 git format-patch -1
742 ) &&
743 case "$filename" in
744 0*)
745 ;; # ok
746 *)
747 echo "Oops? $filename"
748 false
749 ;;
750 esac &&
751 test -f "$filename"
752'
753
754test_expect_success 'format-patch from a subdirectory (2)' '
755 filename=$(
756 rm -rf sub &&
757 mkdir -p sub/dir &&
758 cd sub/dir &&
759 git format-patch -1 -o ..
760 ) &&
761 case "$filename" in
762 ../0*)
763 ;; # ok
764 *)
765 echo "Oops? $filename"
766 false
767 ;;
768 esac &&
769 basename=$(expr "$filename" : ".*/\(.*\)") &&
770 test -f "sub/$basename"
771'
772
773test_expect_success 'format-patch from a subdirectory (3)' '
Junio C Hamano9800a752009-01-12 15:18:02 -0800774 rm -f 0* &&
775 filename=$(
776 rm -rf sub &&
777 mkdir -p sub/dir &&
778 cd sub/dir &&
Jeff King91c8b822009-08-09 04:38:11 -0400779 git format-patch -1 -o "$TRASH_DIRECTORY"
Junio C Hamano9800a752009-01-12 15:18:02 -0800780 ) &&
781 basename=$(expr "$filename" : ".*/\(.*\)") &&
782 test -f "$basename"
783'
784
Stephen Boydf044fe22009-05-16 02:24:45 -0700785test_expect_success 'format-patch --in-reply-to' '
Denton Liu92014b62019-08-27 00:05:00 -0400786 git format-patch -1 --stdout --in-reply-to "baz@foo.bar" >patch8 &&
Stephen Boydf044fe22009-05-16 02:24:45 -0700787 grep "^In-Reply-To: <baz@foo.bar>" patch8 &&
788 grep "^References: <baz@foo.bar>" patch8
789'
790
791test_expect_success 'format-patch --signoff' '
Junio C Hamano212620f2012-10-17 20:48:25 -0700792 git format-patch -1 --signoff --stdout >out &&
793 grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" out
794'
795
796test_expect_success 'format-patch --notes --signoff' '
797 git notes --ref test add -m "test message" HEAD &&
798 git format-patch -1 --signoff --stdout --notes=test >out &&
Junio C Hamanobd1470b2012-10-17 21:27:22 -0700799 # Three dashes must come after S-o-b
Junio C Hamano212620f2012-10-17 20:48:25 -0700800 ! sed "/^Signed-off-by: /q" out | grep "test message" &&
Junio C Hamanobd1470b2012-10-17 21:27:22 -0700801 sed "1,/^Signed-off-by: /d" out | grep "test message" &&
802 # Notes message must come after three dashes
803 ! sed "/^---$/q" out | grep "test message" &&
804 sed "1,/^---$/d" out | grep "test message"
Stephen Boydf044fe22009-05-16 02:24:45 -0700805'
806
Denton Liu13cdf782019-05-16 19:14:14 -0400807test_expect_success 'format-patch notes output control' '
808 git notes add -m "notes config message" HEAD &&
809 test_when_finished git notes remove HEAD &&
810
811 git format-patch -1 --stdout >out &&
812 ! grep "notes config message" out &&
813 git format-patch -1 --stdout --notes >out &&
814 grep "notes config message" out &&
815 git format-patch -1 --stdout --no-notes >out &&
816 ! grep "notes config message" out &&
817 git format-patch -1 --stdout --notes --no-notes >out &&
818 ! grep "notes config message" out &&
819 git format-patch -1 --stdout --no-notes --notes >out &&
820 grep "notes config message" out &&
821
822 test_config format.notes true &&
823 git format-patch -1 --stdout >out &&
824 grep "notes config message" out &&
825 git format-patch -1 --stdout --notes >out &&
826 grep "notes config message" out &&
827 git format-patch -1 --stdout --no-notes >out &&
828 ! grep "notes config message" out &&
829 git format-patch -1 --stdout --notes --no-notes >out &&
830 ! grep "notes config message" out &&
831 git format-patch -1 --stdout --no-notes --notes >out &&
832 grep "notes config message" out
833'
834
835test_expect_success 'format-patch with multiple notes refs' '
836 git notes --ref note1 add -m "this is note 1" HEAD &&
837 test_when_finished git notes --ref note1 remove HEAD &&
838 git notes --ref note2 add -m "this is note 2" HEAD &&
839 test_when_finished git notes --ref note2 remove HEAD &&
840
841 git format-patch -1 --stdout >out &&
842 ! grep "this is note 1" out &&
843 ! grep "this is note 2" out &&
844 git format-patch -1 --stdout --notes=note1 >out &&
845 grep "this is note 1" out &&
846 ! grep "this is note 2" out &&
847 git format-patch -1 --stdout --notes=note2 >out &&
848 ! grep "this is note 1" out &&
849 grep "this is note 2" out &&
850 git format-patch -1 --stdout --notes=note1 --notes=note2 >out &&
851 grep "this is note 1" out &&
852 grep "this is note 2" out &&
853
854 test_config format.notes note1 &&
855 git format-patch -1 --stdout >out &&
856 grep "this is note 1" out &&
857 ! grep "this is note 2" out &&
858 git format-patch -1 --stdout --no-notes >out &&
859 ! grep "this is note 1" out &&
860 ! grep "this is note 2" out &&
861 git format-patch -1 --stdout --notes=note2 >out &&
862 grep "this is note 1" out &&
863 grep "this is note 2" out &&
864 git format-patch -1 --stdout --no-notes --notes=note2 >out &&
865 ! grep "this is note 1" out &&
866 grep "this is note 2" out &&
867
868 git config --add format.notes note2 &&
869 git format-patch -1 --stdout >out &&
870 grep "this is note 1" out &&
871 grep "this is note 2" out &&
872 git format-patch -1 --stdout --no-notes >out &&
873 ! grep "this is note 1" out &&
874 ! grep "this is note 2" out
875'
876
Denton Liu8164c962019-12-09 05:10:46 -0800877test_expect_success 'format-patch with multiple notes refs in config' '
878 test_when_finished "test_unconfig format.notes" &&
879
880 git notes --ref note1 add -m "this is note 1" HEAD &&
881 test_when_finished git notes --ref note1 remove HEAD &&
882 git notes --ref note2 add -m "this is note 2" HEAD &&
883 test_when_finished git notes --ref note2 remove HEAD &&
884
885 git config format.notes note1 &&
886 git format-patch -1 --stdout >out &&
887 grep "this is note 1" out &&
888 ! grep "this is note 2" out &&
889 git config format.notes note2 &&
890 git format-patch -1 --stdout >out &&
891 ! grep "this is note 1" out &&
892 grep "this is note 2" out &&
893 git config --add format.notes note1 &&
894 git format-patch -1 --stdout >out &&
895 grep "this is note 1" out &&
896 grep "this is note 2" out &&
897
898 git config --replace-all format.notes note1 &&
899 git config --add format.notes false &&
900 git format-patch -1 --stdout >out &&
901 ! grep "this is note 1" out &&
902 ! grep "this is note 2" out &&
903 git config --add format.notes note2 &&
904 git format-patch -1 --stdout >out &&
905 ! grep "this is note 1" out &&
906 grep "this is note 2" out
907'
908
Denton Liu92014b62019-08-27 00:05:00 -0400909echo "fatal: --name-only does not make sense" >expect.name-only
910echo "fatal: --name-status does not make sense" >expect.name-status
911echo "fatal: --check does not make sense" >expect.check
Björn Gustavsson02bc5b02009-11-07 10:51:56 +0100912
Junio C Hamano68b2a002011-04-12 16:27:11 -0700913test_expect_success 'options no longer allowed for format-patch' '
Denton Liu92014b62019-08-27 00:05:00 -0400914 test_must_fail git format-patch --name-only 2>output &&
Ævar Arnfjörð Bjarmason1108cea2021-02-11 02:53:53 +0100915 test_cmp expect.name-only output &&
Denton Liu92014b62019-08-27 00:05:00 -0400916 test_must_fail git format-patch --name-status 2>output &&
Ævar Arnfjörð Bjarmason1108cea2021-02-11 02:53:53 +0100917 test_cmp expect.name-status output &&
Denton Liu92014b62019-08-27 00:05:00 -0400918 test_must_fail git format-patch --check 2>output &&
Ævar Arnfjörð Bjarmason1108cea2021-02-11 02:53:53 +0100919 test_cmp expect.check output
Denton Liucb46c402019-08-27 00:04:55 -0400920'
Björn Gustavsson02bc5b02009-11-07 10:51:56 +0100921
922test_expect_success 'format-patch --numstat should produce a patch' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000923 git format-patch --numstat --stdout main..side >output &&
Denton Liu6bd26f52019-08-27 00:05:10 -0400924 grep "^diff --git a/" output >diff &&
925 test_line_count = 5 diff
Denton Liucb46c402019-08-27 00:04:55 -0400926'
Björn Gustavsson02bc5b02009-11-07 10:51:56 +0100927
Felipe Contreras7e93d3b2009-11-26 21:12:00 +0200928test_expect_success 'format-patch -- <path>' '
Johannes Schindelin8f378542020-11-18 23:44:27 +0000929 git format-patch main..side -- file 2>error &&
Felipe Contreras7e93d3b2009-11-26 21:12:00 +0200930 ! grep "Use .--" error
931'
932
Kevin Ballard657ab612010-03-29 19:46:38 -0700933test_expect_success 'format-patch --ignore-if-in-upstream HEAD' '
934 git format-patch --ignore-if-in-upstream HEAD
935'
936
Denton Liu854b5cb2019-08-27 00:05:15 -0400937test_expect_success 'get git version' '
938 git_version=$(git --version) &&
939 git_version=${git_version##* }
940'
Josh Triplett480871e2016-09-07 18:12:01 -0700941
942signature() {
943 printf "%s\n%s\n\n" "-- " "${1:-$git_version}"
944}
945
946test_expect_success 'format-patch default signature' '
Denton Liu854b5cb2019-08-27 00:05:15 -0400947 git format-patch --stdout -1 >patch &&
948 tail -n 3 patch >output &&
Josh Triplett480871e2016-09-07 18:12:01 -0700949 signature >expect &&
950 test_cmp expect output
951'
952
Stephen Boyd6622d9c2010-06-15 22:59:25 -0700953test_expect_success 'format-patch --signature' '
Denton Liu854b5cb2019-08-27 00:05:15 -0400954 git format-patch --stdout --signature="my sig" -1 >patch &&
955 tail -n 3 patch >output &&
Josh Triplett480871e2016-09-07 18:12:01 -0700956 signature "my sig" >expect &&
957 test_cmp expect output
Stephen Boyd6622d9c2010-06-15 22:59:25 -0700958'
959
960test_expect_success 'format-patch with format.signature config' '
961 git config format.signature "config sig" &&
962 git format-patch --stdout -1 >output &&
963 grep "config sig" output
964'
965
966test_expect_success 'format-patch --signature overrides format.signature' '
967 git config format.signature "config sig" &&
968 git format-patch --stdout --signature="overrides" -1 >output &&
969 ! grep "config sig" output &&
970 grep "overrides" output
971'
972
973test_expect_success 'format-patch --no-signature ignores format.signature' '
974 git config format.signature "config sig" &&
975 git format-patch --stdout --signature="my sig" --no-signature \
976 -1 >output &&
Thomas Rastcc663d12011-08-29 22:10:46 +0200977 check_patch output &&
Stephen Boyd6622d9c2010-06-15 22:59:25 -0700978 ! grep "config sig" output &&
979 ! grep "my sig" output &&
980 ! grep "^-- \$" output
981'
982
983test_expect_success 'format-patch --signature --cover-letter' '
984 git config --unset-all format.signature &&
985 git format-patch --stdout --signature="my sig" --cover-letter \
986 -1 >output &&
Denton Liu6bd26f52019-08-27 00:05:10 -0400987 grep "my sig" output >sig &&
988 test_line_count = 2 sig
Stephen Boyd6622d9c2010-06-15 22:59:25 -0700989'
990
Stefano Lattarini41ccfdd2013-04-12 00:36:10 +0200991test_expect_success 'format.signature="" suppresses signatures' '
Stephen Boyd6622d9c2010-06-15 22:59:25 -0700992 git config format.signature "" &&
993 git format-patch --stdout -1 >output &&
Thomas Rastcc663d12011-08-29 22:10:46 +0200994 check_patch output &&
Stephen Boyd6622d9c2010-06-15 22:59:25 -0700995 ! grep "^-- \$" output
996'
997
Stefano Lattarini41ccfdd2013-04-12 00:36:10 +0200998test_expect_success 'format-patch --no-signature suppresses signatures' '
Stephen Boyd6622d9c2010-06-15 22:59:25 -0700999 git config --unset-all format.signature &&
1000 git format-patch --stdout --no-signature -1 >output &&
Thomas Rastcc663d12011-08-29 22:10:46 +02001001 check_patch output &&
Stephen Boyd6622d9c2010-06-15 22:59:25 -07001002 ! grep "^-- \$" output
1003'
1004
Stefano Lattarini41ccfdd2013-04-12 00:36:10 +02001005test_expect_success 'format-patch --signature="" suppresses signatures' '
Thomas Rast2fdb5c62011-08-29 22:10:47 +02001006 git format-patch --stdout --signature="" -1 >output &&
Thomas Rastcc663d12011-08-29 22:10:46 +02001007 check_patch output &&
Stephen Boyd6622d9c2010-06-15 22:59:25 -07001008 ! grep "^-- \$" output
1009'
1010
Jeremiah Mahler70226502014-05-23 21:08:14 -07001011test_expect_success 'prepare mail-signature input' '
1012 cat >mail-signature <<-\EOF
1013
1014 Test User <test.email@kernel.org>
1015 http://git.kernel.org/cgit/git/git.git
1016
1017 git.kernel.org/?p=git/git.git;a=summary
1018
1019 EOF
1020'
1021
1022test_expect_success '--signature-file=file works' '
1023 git format-patch --stdout --signature-file=mail-signature -1 >output &&
1024 check_patch output &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04001025 sed -e "1,/^-- \$/d" output >actual &&
Jeremiah Mahler70226502014-05-23 21:08:14 -07001026 {
1027 cat mail-signature && echo
1028 } >expect &&
1029 test_cmp expect actual
1030'
1031
1032test_expect_success 'format.signaturefile works' '
1033 test_config format.signaturefile mail-signature &&
1034 git format-patch --stdout -1 >output &&
1035 check_patch output &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04001036 sed -e "1,/^-- \$/d" output >actual &&
Jeremiah Mahler70226502014-05-23 21:08:14 -07001037 {
1038 cat mail-signature && echo
1039 } >expect &&
1040 test_cmp expect actual
1041'
1042
1043test_expect_success '--no-signature suppresses format.signaturefile ' '
1044 test_config format.signaturefile mail-signature &&
1045 git format-patch --stdout --no-signature -1 >output &&
1046 check_patch output &&
1047 ! grep "^-- \$" output
1048'
1049
1050test_expect_success '--signature-file overrides format.signaturefile' '
Jeff King99094a72015-03-20 06:07:15 -04001051 cat >other-mail-signature <<-\EOF &&
Jeremiah Mahler70226502014-05-23 21:08:14 -07001052 Use this other signature instead of mail-signature.
1053 EOF
1054 test_config format.signaturefile mail-signature &&
1055 git format-patch --stdout \
1056 --signature-file=other-mail-signature -1 >output &&
1057 check_patch output &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04001058 sed -e "1,/^-- \$/d" output >actual &&
Jeremiah Mahler70226502014-05-23 21:08:14 -07001059 {
1060 cat other-mail-signature && echo
1061 } >expect &&
1062 test_cmp expect actual
1063'
1064
1065test_expect_success '--signature overrides format.signaturefile' '
1066 test_config format.signaturefile mail-signature &&
1067 git format-patch --stdout --signature="my sig" -1 >output &&
1068 check_patch output &&
1069 grep "my sig" output
1070'
1071
Tay Ray Chuan38a94bb2010-11-23 11:16:30 +08001072test_expect_success TTY 'format-patch --stdout paginates' '
1073 rm -f pager_used &&
David Tran512477b2014-03-18 18:54:05 +00001074 test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all &&
Tay Ray Chuan38a94bb2010-11-23 11:16:30 +08001075 test_path_is_file pager_used
1076'
1077
1078 test_expect_success TTY 'format-patch --stdout pagination can be disabled' '
1079 rm -f pager_used &&
David Tran512477b2014-03-18 18:54:05 +00001080 test_terminal env GIT_PAGER="wc >pager_used" git --no-pager format-patch --stdout --all &&
1081 test_terminal env GIT_PAGER="wc >pager_used" git -c "pager.format-patch=false" format-patch --stdout --all &&
Tay Ray Chuan38a94bb2010-11-23 11:16:30 +08001082 test_path_is_missing pager_used &&
1083 test_path_is_missing .git/pager_used
1084'
1085
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001086test_expect_success 'format-patch handles multi-line subjects' '
1087 rm -rf patches/ &&
1088 echo content >>file &&
Eric Sunshine08495412021-12-09 00:11:05 -05001089 test_write_lines one two three >msg &&
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001090 git add file &&
1091 git commit -F msg &&
1092 git format-patch -o patches -1 &&
1093 grep ^Subject: patches/0001-one.patch >actual &&
1094 echo "Subject: [PATCH] one two three" >expect &&
1095 test_cmp expect actual
1096'
1097
1098test_expect_success 'format-patch handles multi-line encoded subjects' '
1099 rm -rf patches/ &&
1100 echo content >>file &&
Eric Sunshine08495412021-12-09 00:11:05 -05001101 test_write_lines en två tre >msg &&
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001102 git add file &&
1103 git commit -F msg &&
1104 git format-patch -o patches -1 &&
1105 grep ^Subject: patches/0001-en.patch >actual &&
1106 echo "Subject: [PATCH] =?UTF-8?q?en=20tv=C3=A5=20tre?=" >expect &&
1107 test_cmp expect actual
1108'
1109
1110M8="foo bar "
1111M64=$M8$M8$M8$M8$M8$M8$M8$M8
1112M512=$M64$M64$M64$M64$M64$M64$M64$M64
1113cat >expect <<'EOF'
1114Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
Jan H. Schönherr7a76e682012-10-18 16:43:29 +02001115 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
1116 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
1117 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
1118 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
1119 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
1120 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001121EOF
Jan H. Schönherr7a76e682012-10-18 16:43:29 +02001122test_expect_success 'format-patch wraps extremely long subject (ascii)' '
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001123 echo content >>file &&
1124 git add file &&
1125 git commit -m "$M512" &&
1126 git format-patch --stdout -1 >patch &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04001127 sed -n "/^Subject/p; /^ /p; /^$/q" patch >subject &&
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001128 test_cmp expect subject
1129'
1130
1131M8="föö bar "
1132M64=$M8$M8$M8$M8$M8$M8$M8$M8
1133M512=$M64$M64$M64$M64$M64$M64$M64$M64
1134cat >expect <<'EOF'
Jan H. Schönherr94f6cdf2012-10-18 16:43:30 +02001135Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1136 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1137 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1138 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
Kirill Smelkov6cd3c052013-03-07 14:55:07 +04001139 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1140 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
Jan H. Schönherr94f6cdf2012-10-18 16:43:30 +02001141 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1142 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1143 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
Kirill Smelkov6cd3c052013-03-07 14:55:07 +04001144 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1145 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
Jan H. Schönherr94f6cdf2012-10-18 16:43:30 +02001146 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1147 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1148 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
Kirill Smelkov6cd3c052013-03-07 14:55:07 +04001149 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1150 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1151 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1152 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1153 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
1154 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
1155 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
1156 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
1157 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
1158 =?UTF-8?q?bar?=
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001159EOF
Jan H. Schönherr94f6cdf2012-10-18 16:43:30 +02001160test_expect_success 'format-patch wraps extremely long subject (rfc2047)' '
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001161 rm -rf patches/ &&
1162 echo content >>file &&
1163 git add file &&
1164 git commit -m "$M512" &&
1165 git format-patch --stdout -1 >patch &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04001166 sed -n "/^Subject/p; /^ /p; /^$/q" patch >subject &&
Jeff Kinga1f6baa2011-02-23 04:58:41 -05001167 test_cmp expect subject
1168'
1169
Jeff King4d03c182011-04-08 18:40:36 -04001170check_author() {
1171 echo content >>file &&
1172 git add file &&
1173 GIT_AUTHOR_NAME=$1 git commit -m author-check &&
1174 git format-patch --stdout -1 >patch &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04001175 sed -n "/^From: /p; /^ /p; /^$/q" patch >actual &&
Jeff King4d03c182011-04-08 18:40:36 -04001176 test_cmp expect actual
1177}
1178
1179cat >expect <<'EOF'
1180From: "Foo B. Bar" <author@example.com>
1181EOF
Jan H. Schönherr0fcec2c2012-10-18 16:43:32 +02001182test_expect_success 'format-patch quotes dot in from-headers' '
Jeff King4d03c182011-04-08 18:40:36 -04001183 check_author "Foo B. Bar"
1184'
1185
1186cat >expect <<'EOF'
1187From: "Foo \"The Baz\" Bar" <author@example.com>
1188EOF
Jan H. Schönherr0fcec2c2012-10-18 16:43:32 +02001189test_expect_success 'format-patch quotes double-quote in from-headers' '
Jeff King4d03c182011-04-08 18:40:36 -04001190 check_author "Foo \"The Baz\" Bar"
1191'
1192
1193cat >expect <<'EOF'
Jan H. Schönherr0fcec2c2012-10-18 16:43:32 +02001194From: =?UTF-8?q?F=C3=B6o=20Bar?= <author@example.com>
Jeff King4d03c182011-04-08 18:40:36 -04001195EOF
Jan H. Schönherr0fcec2c2012-10-18 16:43:32 +02001196test_expect_success 'format-patch uses rfc2047-encoded from-headers when necessary' '
1197 check_author "Föo Bar"
1198'
1199
1200cat >expect <<'EOF'
1201From: =?UTF-8?q?F=C3=B6o=20B=2E=20Bar?= <author@example.com>
1202EOF
Jan H. Schönherr41dd00b2012-10-18 16:43:33 +02001203test_expect_success 'rfc2047-encoded from-headers leave no rfc822 specials' '
Jeff King4d03c182011-04-08 18:40:36 -04001204 check_author "Föo B. Bar"
1205'
1206
Jan H. Schönherr7a76e682012-10-18 16:43:29 +02001207cat >expect <<EOF
1208From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_
1209 <author@example.com>
1210EOF
1211test_expect_success 'format-patch wraps moderately long from-header (ascii)' '
1212 check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_"
1213'
1214
1215cat >expect <<'EOF'
1216From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
1217 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
1218 Bar Foo Bar Foo Bar Foo Bar <author@example.com>
1219EOF
1220test_expect_success 'format-patch wraps extremely long from-header (ascii)' '
1221 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"
1222'
1223
1224cat >expect <<'EOF'
1225From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
1226 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
1227 Bar Foo Bar Foo Bar Foo Bar" <author@example.com>
1228EOF
1229test_expect_success 'format-patch wraps extremely long from-header (rfc822)' '
1230 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"
1231'
1232
Jeff King4d03c182011-04-08 18:40:36 -04001233cat >expect <<'EOF'
Jan H. Schönherr94f6cdf2012-10-18 16:43:30 +02001234From: =?UTF-8?q?Fo=C3=B6=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo?=
1235 =?UTF-8?q?=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20?=
1236 =?UTF-8?q?Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar?=
1237 =?UTF-8?q?=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20?=
1238 =?UTF-8?q?Foo=20Bar=20Foo=20Bar?= <author@example.com>
1239EOF
1240test_expect_success 'format-patch wraps extremely long from-header (rfc2047)' '
1241 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"
1242'
1243
1244cat >expect <<'EOF'
Emma Brooks19d097e2020-04-08 04:31:38 +00001245From: Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
1246 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
1247 Bar Foo Bar Foo Bar Foo Bar <author@example.com>
1248EOF
1249test_expect_success 'format-patch wraps extremely long from-header (non-ASCII without Q-encoding)' '
1250 echo content >>file &&
1251 git add file &&
1252 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" \
1253 git commit -m author-check &&
1254 git format-patch --no-encode-email-headers --stdout -1 >patch &&
1255 sed -n "/^From: /p; /^ /p; /^$/q" patch >actual &&
1256 test_cmp expect actual
1257'
1258
1259cat >expect <<'EOF'
1260Subject: [PATCH] Foö
1261EOF
1262test_expect_success 'subject lines are unencoded with --no-encode-email-headers' '
1263 echo content >>file &&
1264 git add file &&
1265 git commit -m "Foö" &&
1266 git format-patch --no-encode-email-headers -1 --stdout >patch &&
1267 grep ^Subject: patch >actual &&
1268 test_cmp expect actual
1269'
1270
1271cat >expect <<'EOF'
1272Subject: [PATCH] Foö
1273EOF
1274test_expect_success 'subject lines are unencoded with format.encodeEmailHeaders=false' '
1275 echo content >>file &&
1276 git add file &&
1277 git commit -m "Foö" &&
1278 git config format.encodeEmailHeaders false &&
1279 git format-patch -1 --stdout >patch &&
1280 grep ^Subject: patch >actual &&
1281 test_cmp expect actual
1282'
1283
1284cat >expect <<'EOF'
1285Subject: [PATCH] =?UTF-8?q?Fo=C3=B6?=
1286EOF
1287test_expect_success '--encode-email-headers overrides format.encodeEmailHeaders' '
1288 echo content >>file &&
1289 git add file &&
1290 git commit -m "Foö" &&
1291 git config format.encodeEmailHeaders false &&
1292 git format-patch --encode-email-headers -1 --stdout >patch &&
1293 grep ^Subject: patch >actual &&
1294 test_cmp expect actual
1295'
1296
1297cat >expect <<'EOF'
Jeff King4d03c182011-04-08 18:40:36 -04001298Subject: header with . in it
1299EOF
1300test_expect_success 'subject lines do not have 822 atom-quoting' '
1301 echo content >>file &&
1302 git add file &&
1303 git commit -m "header with . in it" &&
1304 git format-patch -k -1 --stdout >patch &&
1305 grep ^Subject: patch >actual &&
1306 test_cmp expect actual
1307'
1308
Jeff Kinge7af8e42011-05-30 10:19:05 -04001309cat >expect <<'EOF'
1310Subject: [PREFIX 1/1] header with . in it
1311EOF
1312test_expect_success 'subject prefixes have space prepended' '
1313 git format-patch -n -1 --stdout --subject-prefix=PREFIX >patch &&
1314 grep ^Subject: patch >actual &&
1315 test_cmp expect actual
1316'
1317
1318cat >expect <<'EOF'
1319Subject: [1/1] header with . in it
1320EOF
1321test_expect_success 'empty subject prefix does not have extra space' '
1322 git format-patch -n -1 --stdout --subject-prefix= >patch &&
1323 grep ^Subject: patch >actual &&
1324 test_cmp expect actual
1325'
1326
Josh Triplett68e83a52016-09-19 21:23:25 -07001327test_expect_success '--rfc' '
1328 cat >expect <<-\EOF &&
1329 Subject: [RFC PATCH 1/1] header with . in it
1330 EOF
1331 git format-patch -n -1 --stdout --rfc >patch &&
1332 grep ^Subject: patch >actual &&
1333 test_cmp expect actual
1334'
1335
Jeff Kinga9080472013-07-03 03:08:22 -04001336test_expect_success '--from=ident notices bogus ident' '
1337 test_must_fail git format-patch -1 --stdout --from=foo >patch
1338'
1339
1340test_expect_success '--from=ident replaces author' '
1341 git format-patch -1 --stdout --from="Me <me@example.com>" >patch &&
1342 cat >expect <<-\EOF &&
1343 From: Me <me@example.com>
1344
1345 From: A U Thor <author@example.com>
1346
1347 EOF
Denton Liuc6ec6da2019-08-27 00:05:07 -04001348 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head &&
Jeff Kinga9080472013-07-03 03:08:22 -04001349 test_cmp expect patch.head
1350'
1351
1352test_expect_success '--from uses committer ident' '
1353 git format-patch -1 --stdout --from >patch &&
1354 cat >expect <<-\EOF &&
1355 From: C O Mitter <committer@example.com>
1356
1357 From: A U Thor <author@example.com>
1358
1359 EOF
Denton Liuc6ec6da2019-08-27 00:05:07 -04001360 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head &&
Jeff Kinga9080472013-07-03 03:08:22 -04001361 test_cmp expect patch.head
1362'
1363
Jeff King662cc302013-09-20 06:16:28 -04001364test_expect_success '--from omits redundant in-body header' '
1365 git format-patch -1 --stdout --from="A U Thor <author@example.com>" >patch &&
1366 cat >expect <<-\EOF &&
1367 From: A U Thor <author@example.com>
1368
1369 EOF
Denton Liuc6ec6da2019-08-27 00:05:07 -04001370 sed -ne "/^From:/p; /^$/p; /^---$/q" patch >patch.head &&
Jeff King662cc302013-09-20 06:16:28 -04001371 test_cmp expect patch.head
1372'
1373
Jeff Kinga9080472013-07-03 03:08:22 -04001374test_expect_success 'in-body headers trigger content encoding' '
Jeff Kingd2554c72016-06-01 03:04:26 -04001375 test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
Jeff Kinga9080472013-07-03 03:08:22 -04001376 test_when_finished "git reset --hard HEAD^" &&
1377 git format-patch -1 --stdout --from >patch &&
1378 cat >expect <<-\EOF &&
1379 From: C O Mitter <committer@example.com>
1380 Content-Type: text/plain; charset=UTF-8
1381
1382 From: éxötìc <author@example.com>
1383
1384 EOF
Denton Liuc6ec6da2019-08-27 00:05:07 -04001385 sed -ne "/^From:/p; /^$/p; /^Content-Type/p; /^---$/q" patch >patch.head &&
Jeff Kinga9080472013-07-03 03:08:22 -04001386 test_cmp expect patch.head
1387'
1388
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001389append_signoff()
1390{
1391 C=$(git commit-tree HEAD^^{tree} -p HEAD) &&
1392 git format-patch --stdout --signoff $C^..$C >append_signoff.patch &&
1393 sed -n -e "1,/^---$/p" append_signoff.patch |
1394 egrep -n "^Subject|Sign|^$"
1395}
1396
1397test_expect_success 'signoff: commit with no body' '
1398 append_signoff </dev/null >actual &&
Denton Liu460609c2019-08-27 00:05:03 -04001399 cat <<-\EOF | sed "s/EOL$//" >expect &&
1400 4:Subject: [PATCH] EOL
1401 8:
1402 9:Signed-off-by: C O Mitter <committer@example.com>
1403 EOF
Denton Liub562a542019-08-27 00:04:52 -04001404 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001405'
1406
1407test_expect_success 'signoff: commit with only subject' '
1408 echo subject | append_signoff >actual &&
Denton Liu460609c2019-08-27 00:05:03 -04001409 cat >expect <<-\EOF &&
1410 4:Subject: [PATCH] subject
1411 8:
1412 9:Signed-off-by: C O Mitter <committer@example.com>
1413 EOF
Denton Liub562a542019-08-27 00:04:52 -04001414 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001415'
1416
1417test_expect_success 'signoff: commit with only subject that does not end with NL' '
1418 printf subject | append_signoff >actual &&
Denton Liu460609c2019-08-27 00:05:03 -04001419 cat >expect <<-\EOF &&
1420 4:Subject: [PATCH] subject
1421 8:
1422 9:Signed-off-by: C O Mitter <committer@example.com>
1423 EOF
Denton Liub562a542019-08-27 00:04:52 -04001424 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001425'
1426
1427test_expect_success 'signoff: no existing signoffs' '
Denton Liu460609c2019-08-27 00:05:03 -04001428 append_signoff <<-\EOF >actual &&
1429 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001430
Denton Liu460609c2019-08-27 00:05:03 -04001431 body
1432 EOF
1433 cat >expect <<-\EOF &&
1434 4:Subject: [PATCH] subject
1435 8:
1436 10:
1437 11:Signed-off-by: C O Mitter <committer@example.com>
1438 EOF
Denton Liub562a542019-08-27 00:04:52 -04001439 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001440'
1441
1442test_expect_success 'signoff: no existing signoffs and no trailing NL' '
1443 printf "subject\n\nbody" | append_signoff >actual &&
Denton Liu460609c2019-08-27 00:05:03 -04001444 cat >expect <<-\EOF &&
1445 4:Subject: [PATCH] subject
1446 8:
1447 10:
1448 11:Signed-off-by: C O Mitter <committer@example.com>
1449 EOF
Denton Liub562a542019-08-27 00:04:52 -04001450 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001451'
1452
1453test_expect_success 'signoff: some random signoff' '
Denton Liu460609c2019-08-27 00:05:03 -04001454 append_signoff <<-\EOF >actual &&
1455 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001456
Denton Liu460609c2019-08-27 00:05:03 -04001457 body
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001458
Denton Liu460609c2019-08-27 00:05:03 -04001459 Signed-off-by: my@house
1460 EOF
1461 cat >expect <<-\EOF &&
1462 4:Subject: [PATCH] subject
1463 8:
1464 10:
1465 11:Signed-off-by: my@house
1466 12:Signed-off-by: C O Mitter <committer@example.com>
1467 EOF
Denton Liub562a542019-08-27 00:04:52 -04001468 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001469'
1470
Brandon Casey959a2622013-02-12 02:17:39 -08001471test_expect_success 'signoff: misc conforming footer elements' '
Denton Liu460609c2019-08-27 00:05:03 -04001472 append_signoff <<-\EOF >actual &&
1473 subject
Brandon Casey959a2622013-02-12 02:17:39 -08001474
Denton Liu460609c2019-08-27 00:05:03 -04001475 body
Brandon Casey959a2622013-02-12 02:17:39 -08001476
Denton Liu460609c2019-08-27 00:05:03 -04001477 Signed-off-by: my@house
1478 (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709)
1479 Tested-by: Some One <someone@example.com>
1480 Bug: 1234
1481 EOF
1482 cat >expect <<-\EOF &&
1483 4:Subject: [PATCH] subject
1484 8:
1485 10:
1486 11:Signed-off-by: my@house
1487 15:Signed-off-by: C O Mitter <committer@example.com>
1488 EOF
Denton Liub562a542019-08-27 00:04:52 -04001489 test_cmp expect actual
Brandon Casey959a2622013-02-12 02:17:39 -08001490'
1491
1492test_expect_success 'signoff: some random signoff-alike' '
Denton Liu460609c2019-08-27 00:05:03 -04001493 append_signoff <<-\EOF >actual &&
1494 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001495
Denton Liu460609c2019-08-27 00:05:03 -04001496 body
1497 Fooled-by-me: my@house
1498 EOF
1499 cat >expect <<-\EOF &&
1500 4:Subject: [PATCH] subject
1501 8:
1502 11:
1503 12:Signed-off-by: C O Mitter <committer@example.com>
1504 EOF
Denton Liub562a542019-08-27 00:04:52 -04001505 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001506'
1507
Brandon Casey959a2622013-02-12 02:17:39 -08001508test_expect_success 'signoff: not really a signoff' '
Denton Liu460609c2019-08-27 00:05:03 -04001509 append_signoff <<-\EOF >actual &&
1510 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001511
Denton Liu460609c2019-08-27 00:05:03 -04001512 I want to mention about Signed-off-by: here.
1513 EOF
1514 cat >expect <<-\EOF &&
1515 4:Subject: [PATCH] subject
1516 8:
1517 9:I want to mention about Signed-off-by: here.
1518 10:
1519 11:Signed-off-by: C O Mitter <committer@example.com>
1520 EOF
Denton Liub562a542019-08-27 00:04:52 -04001521 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001522'
1523
Brandon Casey959a2622013-02-12 02:17:39 -08001524test_expect_success 'signoff: not really a signoff (2)' '
Denton Liu460609c2019-08-27 00:05:03 -04001525 append_signoff <<-\EOF >actual &&
1526 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001527
Denton Liu460609c2019-08-27 00:05:03 -04001528 My unfortunate
1529 Signed-off-by: example happens to be wrapped here.
1530 EOF
1531 cat >expect <<-\EOF &&
1532 4:Subject: [PATCH] subject
1533 8:
1534 10:Signed-off-by: example happens to be wrapped here.
1535 11:Signed-off-by: C O Mitter <committer@example.com>
1536 EOF
Denton Liub562a542019-08-27 00:04:52 -04001537 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001538'
1539
Brandon Casey959a2622013-02-12 02:17:39 -08001540test_expect_success 'signoff: valid S-o-b paragraph in the middle' '
Denton Liu460609c2019-08-27 00:05:03 -04001541 append_signoff <<-\EOF >actual &&
1542 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001543
Denton Liu460609c2019-08-27 00:05:03 -04001544 Signed-off-by: my@house
1545 Signed-off-by: your@house
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001546
Denton Liu460609c2019-08-27 00:05:03 -04001547 A lot of houses.
1548 EOF
1549 cat >expect <<-\EOF &&
1550 4:Subject: [PATCH] subject
1551 8:
1552 9:Signed-off-by: my@house
1553 10:Signed-off-by: your@house
1554 11:
1555 13:
1556 14:Signed-off-by: C O Mitter <committer@example.com>
1557 EOF
Denton Liub562a542019-08-27 00:04:52 -04001558 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001559'
1560
1561test_expect_success 'signoff: the same signoff at the end' '
Denton Liu460609c2019-08-27 00:05:03 -04001562 append_signoff <<-\EOF >actual &&
1563 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001564
Denton Liu460609c2019-08-27 00:05:03 -04001565 body
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001566
Denton Liu460609c2019-08-27 00:05:03 -04001567 Signed-off-by: C O Mitter <committer@example.com>
1568 EOF
1569 cat >expect <<-\EOF &&
1570 4:Subject: [PATCH] subject
1571 8:
1572 10:
1573 11:Signed-off-by: C O Mitter <committer@example.com>
1574 EOF
Denton Liub562a542019-08-27 00:04:52 -04001575 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001576'
1577
1578test_expect_success 'signoff: the same signoff at the end, no trailing NL' '
1579 printf "subject\n\nSigned-off-by: C O Mitter <committer@example.com>" |
1580 append_signoff >actual &&
Denton Liu460609c2019-08-27 00:05:03 -04001581 cat >expect <<-\EOF &&
1582 4:Subject: [PATCH] subject
1583 8:
1584 9:Signed-off-by: C O Mitter <committer@example.com>
1585 EOF
Denton Liub562a542019-08-27 00:04:52 -04001586 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001587'
1588
1589test_expect_success 'signoff: the same signoff NOT at the end' '
Denton Liu460609c2019-08-27 00:05:03 -04001590 append_signoff <<-\EOF >actual &&
1591 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001592
Denton Liu460609c2019-08-27 00:05:03 -04001593 body
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001594
Denton Liu460609c2019-08-27 00:05:03 -04001595 Signed-off-by: C O Mitter <committer@example.com>
1596 Signed-off-by: my@house
1597 EOF
1598 cat >expect <<-\EOF &&
1599 4:Subject: [PATCH] subject
1600 8:
1601 10:
1602 11:Signed-off-by: C O Mitter <committer@example.com>
1603 12:Signed-off-by: my@house
1604 EOF
Denton Liub562a542019-08-27 00:04:52 -04001605 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001606'
1607
Jonathan Tan967dfd42016-11-02 10:29:20 -07001608test_expect_success 'signoff: tolerate garbage in conforming footer' '
Denton Liu460609c2019-08-27 00:05:03 -04001609 append_signoff <<-\EOF >actual &&
1610 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001611
Denton Liu460609c2019-08-27 00:05:03 -04001612 body
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001613
Denton Liu460609c2019-08-27 00:05:03 -04001614 Tested-by: my@house
1615 Some Trash
1616 Signed-off-by: C O Mitter <committer@example.com>
1617 EOF
1618 cat >expect <<-\EOF &&
1619 4:Subject: [PATCH] subject
1620 8:
1621 10:
1622 13:Signed-off-by: C O Mitter <committer@example.com>
1623 EOF
Denton Liub562a542019-08-27 00:04:52 -04001624 test_cmp expect actual
Jonathan Tan967dfd42016-11-02 10:29:20 -07001625'
1626
1627test_expect_success 'signoff: respect trailer config' '
Denton Liu460609c2019-08-27 00:05:03 -04001628 append_signoff <<-\EOF >actual &&
1629 subject
Jonathan Tan967dfd42016-11-02 10:29:20 -07001630
Denton Liu460609c2019-08-27 00:05:03 -04001631 Myfooter: x
1632 Some Trash
1633 EOF
1634 cat >expect <<-\EOF &&
1635 4:Subject: [PATCH] subject
1636 8:
1637 11:
1638 12:Signed-off-by: C O Mitter <committer@example.com>
1639 EOF
Denton Liub562a542019-08-27 00:04:52 -04001640 test_cmp expect actual &&
Jonathan Tan967dfd42016-11-02 10:29:20 -07001641
1642 test_config trailer.Myfooter.ifexists add &&
Denton Liu460609c2019-08-27 00:05:03 -04001643 append_signoff <<-\EOF >actual &&
1644 subject
Jonathan Tan967dfd42016-11-02 10:29:20 -07001645
Denton Liu460609c2019-08-27 00:05:03 -04001646 Myfooter: x
1647 Some Trash
1648 EOF
1649 cat >expect <<-\EOF &&
1650 4:Subject: [PATCH] subject
1651 8:
1652 11:Signed-off-by: C O Mitter <committer@example.com>
1653 EOF
Denton Liub562a542019-08-27 00:04:52 -04001654 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001655'
1656
1657test_expect_success 'signoff: footer begins with non-signoff without @ sign' '
Denton Liu460609c2019-08-27 00:05:03 -04001658 append_signoff <<-\EOF >actual &&
1659 subject
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001660
Denton Liu460609c2019-08-27 00:05:03 -04001661 body
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001662
Denton Liu460609c2019-08-27 00:05:03 -04001663 Reviewed-id: Noone
1664 Tested-by: my@house
1665 Change-id: Ideadbeef
1666 Signed-off-by: C O Mitter <committer@example.com>
1667 Bug: 1234
1668 EOF
1669 cat >expect <<-\EOF &&
1670 4:Subject: [PATCH] subject
1671 8:
1672 10:
1673 14:Signed-off-by: C O Mitter <committer@example.com>
1674 EOF
Denton Liub562a542019-08-27 00:04:52 -04001675 test_cmp expect actual
Nguyễn Thái Ngọc Duy79133a62013-02-12 02:17:37 -08001676'
1677
Pang Yan Han787570c2011-09-13 01:46:41 +08001678test_expect_success 'format patch ignores color.ui' '
1679 test_unconfig color.ui &&
1680 git format-patch --stdout -1 >expect &&
1681 test_config color.ui always &&
1682 git format-patch --stdout -1 >actual &&
1683 test_cmp expect actual
1684'
1685
Laurent Arnoudc28ded82020-05-22 12:46:18 +02001686test_expect_success 'format patch respects diff.relative' '
1687 rm -rf subdir &&
1688 mkdir subdir &&
1689 echo other content >subdir/file2 &&
1690 git add subdir/file2 &&
1691 git commit -F msg &&
1692 test_unconfig diff.relative &&
1693 git format-patch --relative=subdir --stdout -1 >expect &&
1694 test_config diff.relative true &&
1695 git -C subdir format-patch --stdout -1 >actual &&
1696 test_cmp expect actual
1697'
1698
Denton Liubf8e65b2019-10-15 02:06:40 -07001699test_expect_success 'cover letter with invalid --cover-from-description and config' '
1700 test_config branch.rebuild-1.description "config subject
1701
1702body" &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001703 test_must_fail git format-patch --cover-letter --cover-from-description garbage main &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001704 test_config format.coverFromDescription garbage &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001705 test_must_fail git format-patch --cover-letter main
Denton Liubf8e65b2019-10-15 02:06:40 -07001706'
1707
1708test_expect_success 'cover letter with format.coverFromDescription = default' '
1709 test_config branch.rebuild-1.description "config subject
1710
1711body" &&
1712 test_config format.coverFromDescription default &&
1713 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001714 git format-patch --stdout --cover-letter main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001715 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1716 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1717 grep "^config subject$" actual &&
1718 grep "^body$" actual
1719'
1720
1721test_expect_success 'cover letter with --cover-from-description default' '
1722 test_config branch.rebuild-1.description "config subject
1723
1724body" &&
1725 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001726 git format-patch --stdout --cover-letter --cover-from-description default main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001727 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1728 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1729 grep "^config subject$" actual &&
1730 grep "^body$" actual
1731'
1732
1733test_expect_success 'cover letter with format.coverFromDescription = none' '
1734 test_config branch.rebuild-1.description "config subject
1735
1736body" &&
1737 test_config format.coverFromDescription none &&
1738 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001739 git format-patch --stdout --cover-letter main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001740 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1741 grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1742 ! grep "^config subject$" actual &&
1743 ! grep "^body$" actual
1744'
1745
1746test_expect_success 'cover letter with --cover-from-description none' '
1747 test_config branch.rebuild-1.description "config subject
1748
1749body" &&
1750 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001751 git format-patch --stdout --cover-letter --cover-from-description none main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001752 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1753 grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1754 ! grep "^config subject$" actual &&
1755 ! grep "^body$" actual
1756'
1757
1758test_expect_success 'cover letter with format.coverFromDescription = message' '
1759 test_config branch.rebuild-1.description "config subject
1760
1761body" &&
1762 test_config format.coverFromDescription message &&
1763 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001764 git format-patch --stdout --cover-letter main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001765 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1766 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1767 grep "^config subject$" actual &&
1768 grep "^body$" actual
1769'
1770
1771test_expect_success 'cover letter with --cover-from-description message' '
1772 test_config branch.rebuild-1.description "config subject
1773
1774body" &&
1775 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001776 git format-patch --stdout --cover-letter --cover-from-description message main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001777 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1778 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1779 grep "^config subject$" actual &&
1780 grep "^body$" actual
1781'
1782
1783test_expect_success 'cover letter with format.coverFromDescription = subject' '
1784 test_config branch.rebuild-1.description "config subject
1785
1786body" &&
1787 test_config format.coverFromDescription subject &&
1788 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001789 git format-patch --stdout --cover-letter main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001790 grep "^Subject: \[PATCH 0/2\] config subject$" actual &&
1791 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1792 ! grep "^config subject$" actual &&
1793 grep "^body$" actual
1794'
1795
1796test_expect_success 'cover letter with --cover-from-description subject' '
1797 test_config branch.rebuild-1.description "config subject
1798
1799body" &&
1800 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001801 git format-patch --stdout --cover-letter --cover-from-description subject main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001802 grep "^Subject: \[PATCH 0/2\] config subject$" actual &&
1803 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1804 ! grep "^config subject$" actual &&
1805 grep "^body$" actual
1806'
1807
1808test_expect_success 'cover letter with format.coverFromDescription = auto (short subject line)' '
1809 test_config branch.rebuild-1.description "config subject
1810
1811body" &&
1812 test_config format.coverFromDescription auto &&
1813 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001814 git format-patch --stdout --cover-letter main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001815 grep "^Subject: \[PATCH 0/2\] config subject$" actual &&
1816 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1817 ! grep "^config subject$" actual &&
1818 grep "^body$" actual
1819'
1820
1821test_expect_success 'cover letter with --cover-from-description auto (short subject line)' '
1822 test_config branch.rebuild-1.description "config subject
1823
1824body" &&
1825 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001826 git format-patch --stdout --cover-letter --cover-from-description auto main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001827 grep "^Subject: \[PATCH 0/2\] config subject$" actual &&
1828 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1829 ! grep "^config subject$" actual &&
1830 grep "^body$" actual
1831'
1832
1833test_expect_success 'cover letter with format.coverFromDescription = auto (long subject line)' '
1834 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
1835
1836body" &&
1837 test_config format.coverFromDescription auto &&
1838 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001839 git format-patch --stdout --cover-letter main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001840 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1841 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1842 grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual &&
1843 grep "^body$" actual
1844'
1845
1846test_expect_success 'cover letter with --cover-from-description auto (long subject line)' '
1847 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
1848
1849body" &&
1850 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001851 git format-patch --stdout --cover-letter --cover-from-description auto main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001852 grep "^Subject: \[PATCH 0/2\] \*\*\* SUBJECT HERE \*\*\*$" actual &&
1853 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1854 grep "^this is a really long first line and it is over 100 characters long which is the threshold for long subjects$" actual &&
1855 grep "^body$" actual
1856'
1857
1858test_expect_success 'cover letter with command-line --cover-from-description overrides config' '
1859 test_config branch.rebuild-1.description "config subject
1860
1861body" &&
1862 test_config format.coverFromDescription none &&
1863 git checkout rebuild-1 &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001864 git format-patch --stdout --cover-letter --cover-from-description subject main >actual &&
Denton Liubf8e65b2019-10-15 02:06:40 -07001865 grep "^Subject: \[PATCH 0/2\] config subject$" actual &&
1866 ! grep "^\*\*\* BLURB HERE \*\*\*$" actual &&
1867 ! grep "^config subject$" actual &&
1868 grep "^body$" actual
1869'
1870
Nguyễn Thái Ngọc Duye216cc42013-01-03 21:03:09 +07001871test_expect_success 'cover letter using branch description (1)' '
1872 git checkout rebuild-1 &&
1873 test_config branch.rebuild-1.description hello &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001874 git format-patch --stdout --cover-letter main >actual &&
Denton Liuf2e2fa82019-08-27 00:05:05 -04001875 grep hello actual
Nguyễn Thái Ngọc Duye216cc42013-01-03 21:03:09 +07001876'
1877
1878test_expect_success 'cover letter using branch description (2)' '
1879 git checkout rebuild-1 &&
1880 test_config branch.rebuild-1.description hello &&
1881 git format-patch --stdout --cover-letter rebuild-1~2..rebuild-1 >actual &&
Denton Liuf2e2fa82019-08-27 00:05:05 -04001882 grep hello actual
Nguyễn Thái Ngọc Duye216cc42013-01-03 21:03:09 +07001883'
1884
1885test_expect_success 'cover letter using branch description (3)' '
1886 git checkout rebuild-1 &&
1887 test_config branch.rebuild-1.description hello &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001888 git format-patch --stdout --cover-letter ^main rebuild-1 >actual &&
Denton Liuf2e2fa82019-08-27 00:05:05 -04001889 grep hello actual
Nguyễn Thái Ngọc Duye216cc42013-01-03 21:03:09 +07001890'
1891
Nguyễn Thái Ngọc Duy20b630a2013-01-03 21:03:10 +07001892test_expect_success 'cover letter using branch description (4)' '
1893 git checkout rebuild-1 &&
1894 test_config branch.rebuild-1.description hello &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001895 git format-patch --stdout --cover-letter main.. >actual &&
Denton Liuf2e2fa82019-08-27 00:05:05 -04001896 grep hello actual
Nguyễn Thái Ngọc Duy20b630a2013-01-03 21:03:10 +07001897'
1898
1899test_expect_success 'cover letter using branch description (5)' '
1900 git checkout rebuild-1 &&
1901 test_config branch.rebuild-1.description hello &&
1902 git format-patch --stdout --cover-letter -2 HEAD >actual &&
Denton Liuf2e2fa82019-08-27 00:05:05 -04001903 grep hello actual
Nguyễn Thái Ngọc Duy20b630a2013-01-03 21:03:10 +07001904'
1905
Nguyễn Thái Ngọc Duy5ee29ae2013-01-03 23:16:37 +07001906test_expect_success 'cover letter using branch description (6)' '
1907 git checkout rebuild-1 &&
1908 test_config branch.rebuild-1.description hello &&
1909 git format-patch --stdout --cover-letter -2 >actual &&
Denton Liuf2e2fa82019-08-27 00:05:05 -04001910 grep hello actual
Nguyễn Thái Ngọc Duy5ee29ae2013-01-03 23:16:37 +07001911'
1912
Felipe Contreras80d35ca2013-04-07 12:46:20 -05001913test_expect_success 'cover letter with nothing' '
1914 git format-patch --stdout --cover-letter >actual &&
1915 test_line_count = 0 actual
1916'
1917
Felipe Contreras2a4c2602013-04-07 12:46:23 -05001918test_expect_success 'cover letter auto' '
1919 mkdir -p tmp &&
1920 test_when_finished "rm -rf tmp;
1921 git config --unset format.coverletter" &&
1922
1923 git config format.coverletter auto &&
1924 git format-patch -o tmp -1 >list &&
1925 test_line_count = 1 list &&
1926 git format-patch -o tmp -2 >list &&
1927 test_line_count = 3 list
1928'
1929
1930test_expect_success 'cover letter auto user override' '
1931 mkdir -p tmp &&
1932 test_when_finished "rm -rf tmp;
1933 git config --unset format.coverletter" &&
1934
1935 git config format.coverletter auto &&
1936 git format-patch -o tmp --cover-letter -1 >list &&
1937 test_line_count = 2 list &&
1938 git format-patch -o tmp --cover-letter -2 >list &&
1939 test_line_count = 3 list &&
1940 git format-patch -o tmp --no-cover-letter -1 >list &&
1941 test_line_count = 1 list &&
1942 git format-patch -o tmp --no-cover-letter -2 >list &&
1943 test_line_count = 2 list
1944'
1945
brian m. carlson3a30aa12015-12-15 01:52:04 +00001946test_expect_success 'format-patch --zero-commit' '
1947 git format-patch --zero-commit --stdout v2..v1 >patch2 &&
1948 grep "^From " patch2 | sort | uniq >actual &&
brian m. carlson8125a582018-05-13 02:24:13 +00001949 echo "From $ZERO_OID Mon Sep 17 00:00:00 2001" >expect &&
brian m. carlson3a30aa12015-12-15 01:52:04 +00001950 test_cmp expect actual
1951'
1952
brian m. carlson06dfc9e2015-12-15 01:52:05 +00001953test_expect_success 'From line has expected format' '
1954 git format-patch --stdout v2..v1 >patch2 &&
1955 grep "^From " patch2 >from &&
brian m. carlson2ece6ad2018-05-13 02:24:15 +00001956 grep "^From $OID_REGEX Mon Sep 17 00:00:00 2001$" patch2 >filtered &&
brian m. carlson06dfc9e2015-12-15 01:52:05 +00001957 test_cmp from filtered
1958'
1959
Bert Wesargedefc312019-10-11 10:36:41 +02001960test_expect_success 'format-patch -o with no leading directories' '
1961 rm -fr patches &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001962 git format-patch -o patches main..side &&
1963 count=$(git rev-list --count main..side) &&
Bert Wesargedefc312019-10-11 10:36:41 +02001964 ls patches >list &&
1965 test_line_count = $count list
1966'
1967
1968test_expect_success 'format-patch -o with leading existing directories' '
Bert Wesarg19c29e52019-10-21 15:23:42 +02001969 rm -rf existing-dir &&
1970 mkdir existing-dir &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001971 git format-patch -o existing-dir/patches main..side &&
1972 count=$(git rev-list --count main..side) &&
Bert Wesarg19c29e52019-10-21 15:23:42 +02001973 ls existing-dir/patches >list &&
Bert Wesargedefc312019-10-11 10:36:41 +02001974 test_line_count = $count list
1975'
1976
1977test_expect_success 'format-patch -o with leading non-existing directories' '
Bert Wesarg19c29e52019-10-21 15:23:42 +02001978 rm -rf non-existing-dir &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001979 git format-patch -o non-existing-dir/patches main..side &&
1980 count=$(git rev-list --count main..side) &&
Bert Wesarg19c29e52019-10-21 15:23:42 +02001981 test_path_is_dir non-existing-dir &&
1982 ls non-existing-dir/patches >list &&
Bert Wesargedefc312019-10-11 10:36:41 +02001983 test_line_count = $count list
1984'
1985
Alexander Kuleshovbc6bf2d2016-01-13 06:20:11 -07001986test_expect_success 'format-patch format.outputDirectory option' '
1987 test_config format.outputDirectory patches &&
1988 rm -fr patches &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001989 git format-patch main..side &&
1990 count=$(git rev-list --count main..side) &&
Denton Liu756fb0d2019-10-08 02:14:11 -07001991 ls patches >list &&
1992 test_line_count = $count list
Alexander Kuleshovbc6bf2d2016-01-13 06:20:11 -07001993'
1994
1995test_expect_success 'format-patch -o overrides format.outputDirectory' '
1996 test_config format.outputDirectory patches &&
1997 rm -fr patches patchset &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00001998 git format-patch main..side -o patchset &&
Alexander Kuleshovbc6bf2d2016-01-13 06:20:11 -07001999 test_path_is_missing patches &&
2000 test_path_is_dir patchset
2001'
2002
Jeff King4c6f7812020-11-04 14:28:31 -05002003test_expect_success 'format-patch forbids multiple outputs' '
Jeff Kingdc1672d2020-11-04 14:28:36 -05002004 rm -fr outfile outdir &&
Jeff King4c6f7812020-11-04 14:28:31 -05002005 test_must_fail \
Jeff Kingdc1672d2020-11-04 14:28:36 -05002006 git format-patch --stdout --output-directory=outdir &&
2007 test_must_fail \
2008 git format-patch --stdout --output=outfile &&
2009 test_must_fail \
2010 git format-patch --output=outfile --output-directory=outdir
Jeff King4c6f7812020-11-04 14:28:31 -05002011'
2012
2013test_expect_success 'configured outdir does not conflict with output options' '
Jeff Kingdc1672d2020-11-04 14:28:36 -05002014 rm -fr outfile outdir &&
Jeff King4c6f7812020-11-04 14:28:31 -05002015 test_config format.outputDirectory outdir &&
2016 git format-patch --stdout &&
Jeff Kingdc1672d2020-11-04 14:28:36 -05002017 test_path_is_missing outdir &&
2018 git format-patch --output=outfile &&
Jeff King4c6f7812020-11-04 14:28:31 -05002019 test_path_is_missing outdir
2020'
2021
Jeff Kingdc1672d2020-11-04 14:28:36 -05002022test_expect_success 'format-patch --output' '
2023 rm -fr outfile &&
2024 git format-patch -3 --stdout HEAD >expect &&
2025 git format-patch -3 --output=outfile HEAD &&
2026 test_cmp expect outfile
2027'
2028
2029test_expect_success 'format-patch --cover-letter --output' '
2030 rm -fr outfile &&
2031 git format-patch --cover-letter -3 --stdout HEAD >expect &&
2032 git format-patch --cover-letter -3 --output=outfile HEAD &&
2033 test_cmp expect outfile
2034'
2035
Xiaolong Yefa2ab862016-04-26 15:51:22 +08002036test_expect_success 'format-patch --base' '
Stephen Boyd6f93d262019-04-26 16:51:56 -07002037 git checkout patchid &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002038
2039 git format-patch --stdout --base=HEAD~3 -1 >patch &&
2040 tail -n 7 patch >actual1 &&
2041
2042 git format-patch --stdout --base=HEAD~3 HEAD~.. >patch &&
2043 tail -n 7 patch >actual2 &&
2044
Denton Liub562a542019-08-27 00:04:52 -04002045 echo >expect &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002046 git rev-parse HEAD~3 >commit-id-base &&
2047 echo "base-commit: $(cat commit-id-base)" >>expect &&
2048
2049 git show --patch HEAD~2 >patch &&
2050 git patch-id --stable <patch >patch.id.raw &&
2051 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>expect &&
2052
2053 git show --patch HEAD~1 >patch &&
2054 git patch-id --stable <patch >patch.id.raw &&
2055 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>expect &&
2056
Denton Liu92014b62019-08-27 00:05:00 -04002057 signature >>expect &&
Denton Liub562a542019-08-27 00:04:52 -04002058 test_cmp expect actual1 &&
2059 test_cmp expect actual2 &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002060
Stephen Boyd6f93d262019-04-26 16:51:56 -07002061 echo >fail &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002062 echo "base-commit: $(cat commit-id-base)" >>fail &&
2063
2064 git show --patch HEAD~2 >patch &&
2065 git patch-id --unstable <patch >patch.id.raw &&
2066 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>fail &&
2067
2068 git show --patch HEAD~1 >patch &&
2069 git patch-id --unstable <patch >patch.id.raw &&
2070 awk "{print \"prerequisite-patch-id:\", \$1}" <patch.id.raw >>fail &&
2071
Denton Liu92014b62019-08-27 00:05:00 -04002072 signature >>fail &&
Stephen Boyd6f93d262019-04-26 16:51:56 -07002073 ! test_cmp fail actual1 &&
2074 ! test_cmp fail actual2
Xiaolong Yefa2ab862016-04-26 15:51:22 +08002075'
2076
2077test_expect_success 'format-patch --base errors out when base commit is in revision list' '
2078 test_must_fail git format-patch --base=HEAD -2 &&
2079 test_must_fail git format-patch --base=HEAD~1 -2 &&
2080 git format-patch --stdout --base=HEAD~2 -2 >patch &&
2081 grep "^base-commit:" patch >actual &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002082 git rev-parse HEAD~2 >commit-id-base &&
2083 echo "base-commit: $(cat commit-id-base)" >expect &&
Denton Liub562a542019-08-27 00:04:52 -04002084 test_cmp expect actual
Xiaolong Yefa2ab862016-04-26 15:51:22 +08002085'
2086
2087test_expect_success 'format-patch --base errors out when base commit is not ancestor of revision list' '
2088 # For history as below:
2089 #
2090 # ---Q---P---Z---Y---*---X
2091 # \ /
2092 # ------------W
2093 #
2094 # If "format-patch Z..X" is given, P and Z can not be specified as the base commit
Johannes Schindelin8f378542020-11-18 23:44:27 +00002095 git checkout -b topic1 main &&
Xiaolong Yefa2ab862016-04-26 15:51:22 +08002096 git rev-parse HEAD >commit-id-base &&
2097 test_commit P &&
2098 git rev-parse HEAD >commit-id-P &&
2099 test_commit Z &&
2100 git rev-parse HEAD >commit-id-Z &&
2101 test_commit Y &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00002102 git checkout -b topic2 main &&
Xiaolong Yefa2ab862016-04-26 15:51:22 +08002103 test_commit W &&
2104 git merge topic1 &&
2105 test_commit X &&
2106 test_must_fail git format-patch --base=$(cat commit-id-P) -3 &&
2107 test_must_fail git format-patch --base=$(cat commit-id-Z) -3 &&
2108 git format-patch --stdout --base=$(cat commit-id-base) -3 >patch &&
2109 grep "^base-commit:" patch >actual &&
Denton Liub562a542019-08-27 00:04:52 -04002110 echo "base-commit: $(cat commit-id-base)" >expect &&
2111 test_cmp expect actual
Xiaolong Yefa2ab862016-04-26 15:51:22 +08002112'
2113
Xiaolong Ye3de66512016-04-26 15:51:23 +08002114test_expect_success 'format-patch --base=auto' '
Johannes Schindelin8f378542020-11-18 23:44:27 +00002115 git checkout -b upstream main &&
Xiaolong Ye3de66512016-04-26 15:51:23 +08002116 git checkout -b local upstream &&
2117 git branch --set-upstream-to=upstream &&
2118 test_commit N1 &&
2119 test_commit N2 &&
2120 git format-patch --stdout --base=auto -2 >patch &&
2121 grep "^base-commit:" patch >actual &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002122 git rev-parse upstream >commit-id-base &&
2123 echo "base-commit: $(cat commit-id-base)" >expect &&
Denton Liub562a542019-08-27 00:04:52 -04002124 test_cmp expect actual
Xiaolong Ye3de66512016-04-26 15:51:23 +08002125'
2126
2127test_expect_success 'format-patch errors out when history involves criss-cross' '
2128 # setup criss-cross history
2129 #
2130 # B---M1---D
2131 # / \ /
2132 # A X
2133 # \ / \
2134 # C---M2---E
2135 #
Johannes Schindelin8f378542020-11-18 23:44:27 +00002136 git checkout main &&
Xiaolong Ye3de66512016-04-26 15:51:23 +08002137 test_commit A &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00002138 git checkout -b xb main &&
Xiaolong Ye3de66512016-04-26 15:51:23 +08002139 test_commit B &&
Johannes Schindelin8f378542020-11-18 23:44:27 +00002140 git checkout -b xc main &&
Xiaolong Ye3de66512016-04-26 15:51:23 +08002141 test_commit C &&
2142 git checkout -b xbc xb -- &&
2143 git merge xc &&
2144 git checkout -b xcb xc -- &&
2145 git branch --set-upstream-to=xbc &&
2146 git merge xb &&
2147 git checkout xbc &&
2148 test_commit D &&
2149 git checkout xcb &&
2150 test_commit E &&
2151 test_must_fail git format-patch --base=auto -1
2152'
2153
Jacob Keller7efba5f2020-10-01 14:46:53 -07002154test_expect_success 'format-patch format.useAutoBase whenAble history involves criss-cross' '
2155 test_config format.useAutoBase whenAble &&
2156 git format-patch -1 >patch &&
2157 ! grep "^base-commit:" patch
2158'
2159
Denton Liu700e0062019-12-04 13:25:00 -08002160test_expect_success 'format-patch format.useAutoBase option' '
Xiaolong Yebb529952016-04-26 15:51:24 +08002161 git checkout local &&
Denton Liu700e0062019-12-04 13:25:00 -08002162 test_config format.useAutoBase true &&
Xiaolong Yebb529952016-04-26 15:51:24 +08002163 git format-patch --stdout -1 >patch &&
2164 grep "^base-commit:" patch >actual &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002165 git rev-parse upstream >commit-id-base &&
2166 echo "base-commit: $(cat commit-id-base)" >expect &&
Denton Liub562a542019-08-27 00:04:52 -04002167 test_cmp expect actual
Xiaolong Yebb529952016-04-26 15:51:24 +08002168'
2169
Jacob Keller7efba5f2020-10-01 14:46:53 -07002170test_expect_success 'format-patch format.useAutoBase option with whenAble' '
2171 git checkout local &&
2172 test_config format.useAutoBase whenAble &&
2173 git format-patch --stdout -1 >patch &&
2174 grep "^base-commit:" patch >actual &&
2175 git rev-parse upstream >commit-id-base &&
2176 echo "base-commit: $(cat commit-id-base)" >expect &&
2177 test_cmp expect actual
2178'
2179
Xiaolong Yebb529952016-04-26 15:51:24 +08002180test_expect_success 'format-patch --base overrides format.useAutoBase' '
Denton Liu700e0062019-12-04 13:25:00 -08002181 test_config format.useAutoBase true &&
Xiaolong Yebb529952016-04-26 15:51:24 +08002182 git format-patch --stdout --base=HEAD~1 -1 >patch &&
2183 grep "^base-commit:" patch >actual &&
Denton Liu854b5cb2019-08-27 00:05:15 -04002184 git rev-parse HEAD~1 >commit-id-base &&
2185 echo "base-commit: $(cat commit-id-base)" >expect &&
Denton Liub562a542019-08-27 00:04:52 -04002186 test_cmp expect actual
Xiaolong Yebb529952016-04-26 15:51:24 +08002187'
2188
Denton Liu945dc552019-12-04 13:25:06 -08002189test_expect_success 'format-patch --no-base overrides format.useAutoBase' '
2190 test_config format.useAutoBase true &&
2191 git format-patch --stdout --no-base -1 >patch &&
2192 ! grep "^base-commit:" patch
2193'
2194
Jacob Keller7efba5f2020-10-01 14:46:53 -07002195test_expect_success 'format-patch --no-base overrides format.useAutoBase whenAble' '
2196 test_config format.useAutoBase whenAble &&
2197 git format-patch --stdout --no-base -1 >patch &&
2198 ! grep "^base-commit:" patch
2199'
2200
Josh Triplett480871e2016-09-07 18:12:01 -07002201test_expect_success 'format-patch --base with --attach' '
2202 git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch &&
2203 sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \
2204 patch >actual &&
2205 test_write_lines 1 2 >expect &&
2206 test_cmp expect actual
2207'
brian m. carlson50cd54e2018-05-02 02:20:52 +00002208test_expect_success 'format-patch --attach cover-letter only is non-multipart' '
2209 test_when_finished "rm -fr patches" &&
2210 git format-patch -o patches --cover-letter --attach=mimemime --base=HEAD~ -1 &&
2211 ! egrep "^--+mimemime" patches/0000*.patch &&
2212 egrep "^--+mimemime$" patches/0001*.patch >output &&
2213 test_line_count = 2 output &&
2214 egrep "^--+mimemime--$" patches/0001*.patch >output &&
2215 test_line_count = 1 output
2216'
Josh Triplett480871e2016-09-07 18:12:01 -07002217
Eric Wong9f23e042016-06-05 04:46:39 +00002218test_expect_success 'format-patch --pretty=mboxrd' '
2219 sp=" " &&
2220 cat >msg <<-INPUT_END &&
2221 mboxrd should escape the body
2222
2223 From could trip up a loose mbox parser
2224 >From extra escape for reversibility
2225 >>From extra escape for reversibility 2
2226 from lower case not escaped
2227 Fromm bad speling not escaped
2228 From with leading space not escaped
2229
2230 F
2231 From
2232 From$sp
2233 From $sp
2234 From $sp
2235 INPUT_END
2236
2237 cat >expect <<-INPUT_END &&
2238 >From could trip up a loose mbox parser
2239 >>From extra escape for reversibility
2240 >>>From extra escape for reversibility 2
2241 from lower case not escaped
2242 Fromm bad speling not escaped
2243 From with leading space not escaped
2244
2245 F
2246 From
2247 From
2248 From
2249 From
2250 INPUT_END
2251
2252 C=$(git commit-tree HEAD^^{tree} -p HEAD <msg) &&
2253 git format-patch --pretty=mboxrd --stdout -1 $C~1..$C >patch &&
2254 git grep -h --no-index -A11 \
2255 "^>From could trip up a loose mbox parser" patch >actual &&
2256 test_cmp expect actual
2257'
2258
Eric Sunshine126facf2018-07-22 05:57:05 -04002259test_expect_success 'interdiff: setup' '
Johannes Schindelin8f378542020-11-18 23:44:27 +00002260 git checkout -b boop main &&
Eric Sunshine126facf2018-07-22 05:57:05 -04002261 test_commit fnorp blorp &&
2262 test_commit fleep blorp
2263'
2264
2265test_expect_success 'interdiff: cover-letter' '
2266 sed "y/q/ /" >expect <<-\EOF &&
2267 +fleep
2268 --q
2269 EOF
2270 git format-patch --cover-letter --interdiff=boop~2 -1 boop &&
2271 test_i18ngrep "^Interdiff:$" 0000-cover-letter.patch &&
Eric Sunshineee6cbf72018-07-22 05:57:09 -04002272 test_i18ngrep ! "^Interdiff:$" 0001-fleep.patch &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04002273 sed "1,/^@@ /d; /^-- $/q" 0000-cover-letter.patch >actual &&
Eric Sunshine126facf2018-07-22 05:57:05 -04002274 test_cmp expect actual
2275'
2276
Eric Sunshine5ac290f2018-07-22 05:57:06 -04002277test_expect_success 'interdiff: reroll-count' '
2278 git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop &&
2279 test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
2280'
2281
ZheNing Hudb919882021-03-23 11:12:25 +00002282test_expect_success 'interdiff: reroll-count with a non-integer' '
2283 git format-patch --cover-letter --interdiff=boop~2 -v2.2 -1 boop &&
2284 test_i18ngrep "^Interdiff:$" v2.2-0000-cover-letter.patch
2285'
2286
2287test_expect_success 'interdiff: reroll-count with a integer' '
2288 git format-patch --cover-letter --interdiff=boop~2 -v2 -1 boop &&
2289 test_i18ngrep "^Interdiff ..* v1:$" v2-0000-cover-letter.patch
2290'
2291
Eric Sunshineee6cbf72018-07-22 05:57:09 -04002292test_expect_success 'interdiff: solo-patch' '
2293 cat >expect <<-\EOF &&
2294 +fleep
2295
2296 EOF
2297 git format-patch --interdiff=boop~2 -1 boop &&
2298 test_i18ngrep "^Interdiff:$" 0001-fleep.patch &&
Denton Liuc6ec6da2019-08-27 00:05:07 -04002299 sed "1,/^ @@ /d; /^$/q" 0001-fleep.patch >actual &&
Eric Sunshineee6cbf72018-07-22 05:57:09 -04002300 test_cmp expect actual
2301'
2302
Junio C Hamanoece3c672006-06-26 15:40:09 -07002303test_done