Code

format-patch: thread as reply to cover letter even with in-reply-to
[git.git] / t / t4014-format-patch.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2006 Junio C Hamano
4 #
6 test_description='various format-patch tests'
8 . ./test-lib.sh
10 test_expect_success setup '
12         for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i"; done >file &&
13         cat file >elif &&
14         git add file elif &&
15         git commit -m Initial &&
16         git checkout -b side &&
18         for i in 1 2 5 6 A B C 7 8 9 10; do echo "$i"; done >file &&
19         chmod +x elif &&
20         git update-index file elif &&
21         git update-index --chmod=+x elif &&
22         git commit -m "Side changes #1" &&
24         for i in D E F; do echo "$i"; done >>file &&
25         git update-index file &&
26         git commit -m "Side changes #2" &&
27         git tag C2 &&
29         for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >file &&
30         git update-index file &&
31         git commit -m "Side changes #3 with \\n backslash-n in it." &&
33         git checkout master &&
34         git diff-tree -p C2 | git apply --index &&
35         git commit -m "Master accepts moral equivalent of #2"
37 '
39 test_expect_success "format-patch --ignore-if-in-upstream" '
41         git format-patch --stdout master..side >patch0 &&
42         cnt=`grep "^From " patch0 | wc -l` &&
43         test $cnt = 3
45 '
47 test_expect_success "format-patch --ignore-if-in-upstream" '
49         git format-patch --stdout \
50                 --ignore-if-in-upstream master..side >patch1 &&
51         cnt=`grep "^From " patch1 | wc -l` &&
52         test $cnt = 2
54 '
56 test_expect_success "format-patch result applies" '
58         git checkout -b rebuild-0 master &&
59         git am -3 patch0 &&
60         cnt=`git rev-list master.. | wc -l` &&
61         test $cnt = 2
62 '
64 test_expect_success "format-patch --ignore-if-in-upstream result applies" '
66         git checkout -b rebuild-1 master &&
67         git am -3 patch1 &&
68         cnt=`git rev-list master.. | wc -l` &&
69         test $cnt = 2
70 '
72 test_expect_success 'commit did not screw up the log message' '
74         git cat-file commit side | grep "^Side .* with .* backslash-n"
76 '
78 test_expect_success 'format-patch did not screw up the log message' '
80         grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 &&
81         grep "^Subject: .*Side changes #3 with .* backslash-n" patch1
83 '
85 test_expect_success 'replay did not screw up the log message' '
87         git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"
89 '
91 test_expect_success 'extra headers' '
93         git config format.headers "To: R. E. Cipient <rcipient@example.com>
94 " &&
95         git config --add format.headers "Cc: S. E. Cipient <scipient@example.com>
96 " &&
97         git format-patch --stdout master..side > patch2 &&
98         sed -e "/^$/q" patch2 > hdrs2 &&
99         grep "^To: R. E. Cipient <rcipient@example.com>$" hdrs2 &&
100         grep "^Cc: S. E. Cipient <scipient@example.com>$" hdrs2
104 test_expect_success 'extra headers without newlines' '
106         git config --replace-all format.headers "To: R. E. Cipient <rcipient@example.com>" &&
107         git config --add format.headers "Cc: S. E. Cipient <scipient@example.com>" &&
108         git format-patch --stdout master..side >patch3 &&
109         sed -e "/^$/q" patch3 > hdrs3 &&
110         grep "^To: R. E. Cipient <rcipient@example.com>$" hdrs3 &&
111         grep "^Cc: S. E. Cipient <scipient@example.com>$" hdrs3
115 test_expect_success 'extra headers with multiple To:s' '
117         git config --replace-all format.headers "To: R. E. Cipient <rcipient@example.com>" &&
118         git config --add format.headers "To: S. E. Cipient <scipient@example.com>" &&
119         git format-patch --stdout master..side > patch4 &&
120         sed -e "/^$/q" patch4 > hdrs4 &&
121         grep "^To: R. E. Cipient <rcipient@example.com>,$" hdrs4 &&
122         grep "^ *S. E. Cipient <scipient@example.com>$" hdrs4
125 test_expect_success 'additional command line cc' '
127         git config --replace-all format.headers "Cc: R. E. Cipient <rcipient@example.com>" &&
128         git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout master..side | sed -e "/^$/q" >patch5 &&
129         grep "^Cc: R. E. Cipient <rcipient@example.com>,$" patch5 &&
130         grep "^ *S. E. Cipient <scipient@example.com>$" patch5
133 test_expect_success 'multiple files' '
135         rm -rf patches/ &&
136         git checkout side &&
137         git format-patch -o patches/ master &&
138         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
141 check_threading () {
142         expect="$1" &&
143         shift &&
144         (git format-patch --stdout "$@"; echo $? > status.out) |
145         # Prints everything between the Message-ID and In-Reply-To,
146         # and replaces all Message-ID-lookalikes by a sequence number
147         perl -ne '
148                 if (/^(message-id|references|in-reply-to)/i) {
149                         $printing = 1;
150                 } elsif (/^\S/) {
151                         $printing = 0;
152                 }
153                 if ($printing) {
154                         $h{$1}=$i++ if (/<([^>]+)>/ and !exists $h{$1});
155                         for $k (keys %h) {s/$k/$h{$k}/};
156                         print;
157                 }
158                 print "---\n" if /^From /i;
159         ' > actual &&
160         test 0 = "$(cat status.out)" &&
161         test_cmp "$expect" actual
164 cat >> expect.no-threading <<EOF
165 ---
166 ---
167 ---
168 EOF
170 test_expect_success 'no threading' '
171         git checkout side &&
172         check_threading expect.no-threading master
175 cat > expect.thread <<EOF
176 ---
177 Message-Id: <0>
178 ---
179 Message-Id: <1>
180 In-Reply-To: <0>
181 References: <0>
182 ---
183 Message-Id: <2>
184 In-Reply-To: <0>
185 References: <0>
186 EOF
188 test_expect_success 'thread' '
189         check_threading expect.thread --thread master
192 cat > expect.in-reply-to <<EOF
193 ---
194 Message-Id: <0>
195 In-Reply-To: <1>
196 References: <1>
197 ---
198 Message-Id: <2>
199 In-Reply-To: <1>
200 References: <1>
201 ---
202 Message-Id: <3>
203 In-Reply-To: <1>
204 References: <1>
205 EOF
207 test_expect_success 'thread in-reply-to' '
208         check_threading expect.in-reply-to --in-reply-to="<test.message>" \
209                 --thread master
212 cat > expect.cover-letter <<EOF
213 ---
214 Message-Id: <0>
215 ---
216 Message-Id: <1>
217 In-Reply-To: <0>
218 References: <0>
219 ---
220 Message-Id: <2>
221 In-Reply-To: <0>
222 References: <0>
223 ---
224 Message-Id: <3>
225 In-Reply-To: <0>
226 References: <0>
227 EOF
229 test_expect_success 'thread cover-letter' '
230         check_threading expect.cover-letter --cover-letter --thread master
233 cat > expect.cl-irt <<EOF
234 ---
235 Message-Id: <0>
236 In-Reply-To: <1>
237 References: <1>
238 ---
239 Message-Id: <2>
240 In-Reply-To: <0>
241 References: <1>
242         <0>
243 ---
244 Message-Id: <3>
245 In-Reply-To: <0>
246 References: <1>
247         <0>
248 ---
249 Message-Id: <4>
250 In-Reply-To: <0>
251 References: <1>
252         <0>
253 EOF
255 test_expect_success 'thread cover-letter in-reply-to' '
256         check_threading expect.cl-irt --cover-letter \
257                 --in-reply-to="<test.message>" --thread master
260 test_expect_success 'excessive subject' '
262         rm -rf patches/ &&
263         git checkout side &&
264         for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >>file &&
265         git update-index file &&
266         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." &&
267         git format-patch -o patches/ master..side &&
268         ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch
271 test_expect_success 'cover-letter inherits diff options' '
273         git mv file foo &&
274         git commit -m foo &&
275         git format-patch --cover-letter -1 &&
276         ! grep "file => foo .* 0 *$" 0000-cover-letter.patch &&
277         git format-patch --cover-letter -1 -M &&
278         grep "file => foo .* 0 *$" 0000-cover-letter.patch
282 cat > expect << EOF
283   This is an excessively long subject line for a message due to the
284     habit some projects have of not having a short, one-line subject at
285     the start of the commit message, but rather sticking a whole
286     paragraph right at the start as the only thing in the commit
287     message. It had better not become the filename for the patch.
288   foo
290 EOF
292 test_expect_success 'shortlog of cover-letter wraps overly-long onelines' '
294         git format-patch --cover-letter -2 &&
295         sed -e "1,/A U Thor/d" -e "/^$/q" < 0000-cover-letter.patch > output &&
296         test_cmp expect output
300 cat > expect << EOF
301 ---
302  file |   16 ++++++++++++++++
303  1 files changed, 16 insertions(+), 0 deletions(-)
305 diff --git a/file b/file
306 index 40f36c6..2dc5c23 100644
307 --- a/file
308 +++ b/file
309 @@ -13,4 +13,20 @@ C
310  10
311  D
312  E
313  F
314 +5
315 EOF
317 test_expect_success 'format-patch respects -U' '
319         git format-patch -U4 -2 &&
320         sed -e "1,/^$/d" -e "/^+5/q" < 0001-This-is-an-excessively-long-subject-line-for-a-messa.patch > output &&
321         test_cmp expect output
325 test_expect_success 'format-patch from a subdirectory (1)' '
326         filename=$(
327                 rm -rf sub &&
328                 mkdir -p sub/dir &&
329                 cd sub/dir &&
330                 git format-patch -1
331         ) &&
332         case "$filename" in
333         0*)
334                 ;; # ok
335         *)
336                 echo "Oops? $filename"
337                 false
338                 ;;
339         esac &&
340         test -f "$filename"
343 test_expect_success 'format-patch from a subdirectory (2)' '
344         filename=$(
345                 rm -rf sub &&
346                 mkdir -p sub/dir &&
347                 cd sub/dir &&
348                 git format-patch -1 -o ..
349         ) &&
350         case "$filename" in
351         ../0*)
352                 ;; # ok
353         *)
354                 echo "Oops? $filename"
355                 false
356                 ;;
357         esac &&
358         basename=$(expr "$filename" : ".*/\(.*\)") &&
359         test -f "sub/$basename"
362 test_expect_success 'format-patch from a subdirectory (3)' '
363         here="$TEST_DIRECTORY/$test" &&
364         rm -f 0* &&
365         filename=$(
366                 rm -rf sub &&
367                 mkdir -p sub/dir &&
368                 cd sub/dir &&
369                 git format-patch -1 -o "$here"
370         ) &&
371         basename=$(expr "$filename" : ".*/\(.*\)") &&
372         test -f "$basename"
375 test_done