1#!/bin/sh
2
3test_description='git send-email'
4. ./test-lib.sh
5
6# May be altered later in the test
7PREREQ="PERL"
8
9test_expect_success $PREREQ 'prepare reference tree' '
10 echo "1A quick brown fox jumps over the" >file &&
11 echo "lazy dog" >>file &&
12 git add file &&
13 GIT_AUTHOR_NAME="A" git commit -a -m "Initial."
14'
15
16test_expect_success $PREREQ 'Setup helper tool' '
17 write_script fake.sendmail <<-\EOF &&
18 shift
19 output=1
20 while test -f commandline$output
21 do
22 output=$(($output+1))
23 done
24 for a
25 do
26 echo "!$a!"
27 done >commandline$output
28 cat >"msgtxt$output"
29 EOF
30 git add fake.sendmail &&
31 GIT_AUTHOR_NAME="A" git commit -a -m "Second."
32'
33
34clean_fake_sendmail () {
35 rm -f commandline* msgtxt*
36}
37
38test_expect_success $PREREQ 'Extract patches' '
39 patches=`git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1`
40'
41
42# Test no confirm early to ensure remaining tests will not hang
43test_no_confirm () {
44 rm -f no_confirm_okay
45 echo n | \
46 GIT_SEND_EMAIL_NOTTY=1 \
47 git send-email \
48 --from="Example <from@example.com>" \
49 --to=nobody@example.com \
50 --smtp-server="$(pwd)/fake.sendmail" \
51 $@ \
52 $patches >stdout &&
53 test_must_fail grep "Send this email" stdout &&
54 >no_confirm_okay
55}
56
57# Exit immediately to prevent hang if a no-confirm test fails
58check_no_confirm () {
59 if ! test -f no_confirm_okay
60 then
61 say 'confirm test failed; skipping remaining tests to prevent hanging'
62 PREREQ="$PREREQ,CHECK_NO_CONFIRM"
63 fi
64 return 0
65}
66
67test_expect_success $PREREQ 'No confirm with --suppress-cc' '
68 test_no_confirm --suppress-cc=sob &&
69 check_no_confirm
70'
71
72
73test_expect_success $PREREQ 'No confirm with --confirm=never' '
74 test_no_confirm --confirm=never &&
75 check_no_confirm
76'
77
78# leave sendemail.confirm set to never after this so that none of the
79# remaining tests prompt unintentionally.
80test_expect_success $PREREQ 'No confirm with sendemail.confirm=never' '
81 git config sendemail.confirm never &&
82 test_no_confirm --compose --subject=foo &&
83 check_no_confirm
84'
85
86test_expect_success $PREREQ 'Send patches' '
87 git send-email --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
88'
89
90test_expect_success $PREREQ 'setup expect' '
91 cat >expected <<-\EOF
92 !nobody@example.com!
93 !author@example.com!
94 !one@example.com!
95 !two@example.com!
96 EOF
97'
98
99test_expect_success $PREREQ 'Verify commandline' '
100 test_cmp expected commandline1
101'
102
103test_expect_success $PREREQ 'Send patches with --envelope-sender' '
104 clean_fake_sendmail &&
105 git send-email --envelope-sender="Patch Contributor <patch@example.com>" --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
106'
107
108test_expect_success $PREREQ 'setup expect' '
109 cat >expected <<-\EOF
110 !patch@example.com!
111 !-i!
112 !nobody@example.com!
113 !author@example.com!
114 !one@example.com!
115 !two@example.com!
116 EOF
117'
118
119test_expect_success $PREREQ 'Verify commandline' '
120 test_cmp expected commandline1
121'
122
123test_expect_success $PREREQ 'Send patches with --envelope-sender=auto' '
124 clean_fake_sendmail &&
125 git send-email --envelope-sender=auto --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
126'
127
128test_expect_success $PREREQ 'setup expect' '
129 cat >expected <<-\EOF
130 !nobody@example.com!
131 !-i!
132 !nobody@example.com!
133 !author@example.com!
134 !one@example.com!
135 !two@example.com!
136 EOF
137'
138
139test_expect_success $PREREQ 'Verify commandline' '
140 test_cmp expected commandline1
141'
142
143test_expect_success $PREREQ 'setup expect' "
144cat >expected-show-all-headers <<\EOF
1450001-Second.patch
146(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
147(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
148(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
149Dry-OK. Log says:
150Server: relay.example.com
151MAIL FROM:<from@example.com>
152RCPT TO:<to@example.com>
153RCPT TO:<cc@example.com>
154RCPT TO:<author@example.com>
155RCPT TO:<one@example.com>
156RCPT TO:<two@example.com>
157RCPT TO:<bcc@example.com>
158From: Example <from@example.com>
159To: to@example.com
160Cc: cc@example.com,
161 A <author@example.com>,
162 One <one@example.com>,
163 two@example.com
164Subject: [PATCH 1/1] Second.
165Date: DATE-STRING
166Message-Id: MESSAGE-ID-STRING
167X-Mailer: X-MAILER-STRING
168In-Reply-To: <unique-message-id@example.com>
169References: <unique-message-id@example.com>
170
171Result: OK
172EOF
173"
174
175test_suppress_self () {
176 test_commit $3 &&
177 test_when_finished "git reset --hard HEAD^" &&
178
179 write_script cccmd-sed <<-EOF &&
180 sed -n -e s/^cccmd--//p "\$1"
181 EOF
182
183 git commit --amend --author="$1 <$2>" -F - &&
184 clean_fake_sendmail &&
185 git format-patch --stdout -1 >"suppress-self-$3.patch" &&
186
187 git send-email --from="$1 <$2>" \
188 --to=nobody@example.com \
189 --cc-cmd=./cccmd-sed \
190 --suppress-cc=self \
191 --smtp-server="$(pwd)/fake.sendmail" \
192 suppress-self-$3.patch &&
193
194 mv msgtxt1 msgtxt1-$3 &&
195 sed -e '/^$/q' msgtxt1-$3 >"msghdr1-$3" &&
196 >"expected-no-cc-$3" &&
197
198 (grep '^Cc:' msghdr1-$3 >"actual-no-cc-$3";
199 test_cmp expected-no-cc-$3 actual-no-cc-$3)
200}
201
202test_suppress_self_unquoted () {
203 test_suppress_self "$1" "$2" "unquoted-$3" <<-EOF
204 test suppress-cc.self unquoted-$3 with name $1 email $2
205
206 unquoted-$3
207
208 cccmd--$1 <$2>
209
210 Cc: $1 <$2>
211 Signed-off-by: $1 <$2>
212 EOF
213}
214
215test_suppress_self_quoted () {
216 test_suppress_self "$1" "$2" "quoted-$3" <<-EOF
217 test suppress-cc.self quoted-$3 with name $1 email $2
218
219 quoted-$3
220
221 cccmd--"$1" <$2>
222
223 Cc: $1 <$2>
224 Cc: "$1" <$2>
225 Signed-off-by: $1 <$2>
226 Signed-off-by: "$1" <$2>
227 EOF
228}
229
230test_expect_success $PREREQ 'self name is suppressed' "
231 test_suppress_self_unquoted 'A U Thor' 'author@example.com' \
232 'self_name_suppressed'
233"
234
235test_expect_success $PREREQ 'self name with dot is suppressed' "
236 test_suppress_self_quoted 'A U. Thor' 'author@example.com' \
237 'self_name_dot_suppressed'
238"
239
240test_expect_success $PREREQ 'non-ascii self name is suppressed' "
241 test_suppress_self_quoted 'Füñný Nâmé' 'odd_?=mail@example.com' \
242 'non_ascii_self_suppressed'
243"
244
245# This name is long enough to force format-patch to split it into multiple
246# encoded-words, assuming it uses UTF-8 with the "Q" encoding.
247test_expect_success $PREREQ 'long non-ascii self name is suppressed' "
248 test_suppress_self_quoted 'Ƒüñníęř €. Nâṁé' 'odd_?=mail@example.com' \
249 'long_non_ascii_self_suppressed'
250"
251
252test_expect_success $PREREQ 'sanitized self name is suppressed' "
253 test_suppress_self_unquoted '\"A U. Thor\"' 'author@example.com' \
254 'self_name_sanitized_suppressed'
255"
256
257test_expect_success $PREREQ 'Show all headers' '
258 git send-email \
259 --dry-run \
260 --suppress-cc=sob \
261 --from="Example <from@example.com>" \
262 --to=to@example.com \
263 --cc=cc@example.com \
264 --bcc=bcc@example.com \
265 --in-reply-to="<unique-message-id@example.com>" \
266 --smtp-server relay.example.com \
267 $patches |
268 sed -e "s/^\(Date:\).*/\1 DATE-STRING/" \
269 -e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
270 -e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
271 >actual-show-all-headers &&
272 test_cmp expected-show-all-headers actual-show-all-headers
273'
274
275test_expect_success $PREREQ 'Prompting works' '
276 clean_fake_sendmail &&
277 (echo "to@example.com"
278 echo ""
279 ) | GIT_SEND_EMAIL_NOTTY=1 git send-email \
280 --smtp-server="$(pwd)/fake.sendmail" \
281 $patches \
282 2>errors &&
283 grep "^From: A U Thor <author@example.com>\$" msgtxt1 &&
284 grep "^To: to@example.com\$" msgtxt1
285'
286
287test_expect_success $PREREQ,AUTOIDENT 'implicit ident is allowed' '
288 clean_fake_sendmail &&
289 (sane_unset GIT_AUTHOR_NAME &&
290 sane_unset GIT_AUTHOR_EMAIL &&
291 sane_unset GIT_COMMITTER_NAME &&
292 sane_unset GIT_COMMITTER_EMAIL &&
293 GIT_SEND_EMAIL_NOTTY=1 git send-email \
294 --smtp-server="$(pwd)/fake.sendmail" \
295 --to=to@example.com \
296 $patches </dev/null 2>errors
297 )
298'
299
300test_expect_success $PREREQ,!AUTOIDENT 'broken implicit ident aborts send-email' '
301 clean_fake_sendmail &&
302 (sane_unset GIT_AUTHOR_NAME &&
303 sane_unset GIT_AUTHOR_EMAIL &&
304 sane_unset GIT_COMMITTER_NAME &&
305 sane_unset GIT_COMMITTER_EMAIL &&
306 GIT_SEND_EMAIL_NOTTY=1 && export GIT_SEND_EMAIL_NOTTY &&
307 test_must_fail git send-email \
308 --smtp-server="$(pwd)/fake.sendmail" \
309 --to=to@example.com \
310 $patches </dev/null 2>errors &&
311 test_i18ngrep "tell me who you are" errors
312 )
313'
314
315test_expect_success $PREREQ 'setup tocmd and cccmd scripts' '
316 write_script tocmd-sed <<-\EOF &&
317 sed -n -e "s/^tocmd--//p" "$1"
318 EOF
319 write_script cccmd-sed <<-\EOF
320 sed -n -e "s/^cccmd--//p" "$1"
321 EOF
322'
323
324test_expect_success $PREREQ 'tocmd works' '
325 clean_fake_sendmail &&
326 cp $patches tocmd.patch &&
327 echo tocmd--tocmd@example.com >>tocmd.patch &&
328 git send-email \
329 --from="Example <nobody@example.com>" \
330 --to-cmd=./tocmd-sed \
331 --smtp-server="$(pwd)/fake.sendmail" \
332 tocmd.patch \
333 &&
334 grep "^To: tocmd@example.com" msgtxt1
335'
336
337test_expect_success $PREREQ 'cccmd works' '
338 clean_fake_sendmail &&
339 cp $patches cccmd.patch &&
340 echo "cccmd-- cccmd@example.com" >>cccmd.patch &&
341 git send-email \
342 --from="Example <nobody@example.com>" \
343 --to=nobody@example.com \
344 --cc-cmd=./cccmd-sed \
345 --smtp-server="$(pwd)/fake.sendmail" \
346 cccmd.patch \
347 &&
348 grep "^ cccmd@example.com" msgtxt1
349'
350
351test_expect_success $PREREQ 'reject long lines' '
352 z8=zzzzzzzz &&
353 z64=$z8$z8$z8$z8$z8$z8$z8$z8 &&
354 z512=$z64$z64$z64$z64$z64$z64$z64$z64 &&
355 clean_fake_sendmail &&
356 cp $patches longline.patch &&
357 echo $z512$z512 >>longline.patch &&
358 test_must_fail git send-email \
359 --from="Example <nobody@example.com>" \
360 --to=nobody@example.com \
361 --smtp-server="$(pwd)/fake.sendmail" \
362 $patches longline.patch \
363 2>errors &&
364 grep longline.patch errors
365'
366
367test_expect_success $PREREQ 'no patch was sent' '
368 ! test -e commandline1
369'
370
371test_expect_success $PREREQ 'Author From: in message body' '
372 clean_fake_sendmail &&
373 git send-email \
374 --from="Example <nobody@example.com>" \
375 --to=nobody@example.com \
376 --smtp-server="$(pwd)/fake.sendmail" \
377 $patches &&
378 sed "1,/^\$/d" <msgtxt1 >msgbody1 &&
379 grep "From: A <author@example.com>" msgbody1
380'
381
382test_expect_success $PREREQ 'Author From: not in message body' '
383 clean_fake_sendmail &&
384 git send-email \
385 --from="A <author@example.com>" \
386 --to=nobody@example.com \
387 --smtp-server="$(pwd)/fake.sendmail" \
388 $patches &&
389 sed "1,/^\$/d" <msgtxt1 >msgbody1 &&
390 ! grep "From: A <author@example.com>" msgbody1
391'
392
393test_expect_success $PREREQ 'allow long lines with --no-validate' '
394 git send-email \
395 --from="Example <nobody@example.com>" \
396 --to=nobody@example.com \
397 --smtp-server="$(pwd)/fake.sendmail" \
398 --no-validate \
399 $patches longline.patch \
400 2>errors
401'
402
403test_expect_success $PREREQ 'Invalid In-Reply-To' '
404 clean_fake_sendmail &&
405 git send-email \
406 --from="Example <nobody@example.com>" \
407 --to=nobody@example.com \
408 --in-reply-to=" " \
409 --smtp-server="$(pwd)/fake.sendmail" \
410 $patches \
411 2>errors &&
412 ! grep "^In-Reply-To: < *>" msgtxt1
413'
414
415test_expect_success $PREREQ 'Valid In-Reply-To when prompting' '
416 clean_fake_sendmail &&
417 (echo "From Example <from@example.com>"
418 echo "To Example <to@example.com>"
419 echo ""
420 ) | GIT_SEND_EMAIL_NOTTY=1 git send-email \
421 --smtp-server="$(pwd)/fake.sendmail" \
422 $patches 2>errors &&
423 ! grep "^In-Reply-To: < *>" msgtxt1
424'
425
426test_expect_success $PREREQ 'In-Reply-To without --chain-reply-to' '
427 clean_fake_sendmail &&
428 echo "<unique-message-id@example.com>" >expect &&
429 git send-email \
430 --from="Example <nobody@example.com>" \
431 --to=nobody@example.com \
432 --no-chain-reply-to \
433 --in-reply-to="$(cat expect)" \
434 --smtp-server="$(pwd)/fake.sendmail" \
435 $patches $patches $patches \
436 2>errors &&
437 # The first message is a reply to --in-reply-to
438 sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt1 >actual &&
439 test_cmp expect actual &&
440 # Second and subsequent messages are replies to the first one
441 sed -n -e "s/^Message-Id: *\(.*\)/\1/p" msgtxt1 >expect &&
442 sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt2 >actual &&
443 test_cmp expect actual &&
444 sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt3 >actual &&
445 test_cmp expect actual
446'
447
448test_expect_success $PREREQ 'In-Reply-To with --chain-reply-to' '
449 clean_fake_sendmail &&
450 echo "<unique-message-id@example.com>" >expect &&
451 git send-email \
452 --from="Example <nobody@example.com>" \
453 --to=nobody@example.com \
454 --chain-reply-to \
455 --in-reply-to="$(cat expect)" \
456 --smtp-server="$(pwd)/fake.sendmail" \
457 $patches $patches $patches \
458 2>errors &&
459 sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt1 >actual &&
460 test_cmp expect actual &&
461 sed -n -e "s/^Message-Id: *\(.*\)/\1/p" msgtxt1 >expect &&
462 sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt2 >actual &&
463 test_cmp expect actual &&
464 sed -n -e "s/^Message-Id: *\(.*\)/\1/p" msgtxt2 >expect &&
465 sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt3 >actual &&
466 test_cmp expect actual
467'
468
469test_expect_success $PREREQ 'setup fake editor' '
470 write_script fake-editor <<-\EOF
471 echo fake edit >>"$1"
472 EOF
473'
474
475test_set_editor "$(pwd)/fake-editor"
476
477test_expect_success $PREREQ '--compose works' '
478 clean_fake_sendmail &&
479 git send-email \
480 --compose --subject foo \
481 --from="Example <nobody@example.com>" \
482 --to=nobody@example.com \
483 --smtp-server="$(pwd)/fake.sendmail" \
484 $patches \
485 2>errors
486'
487
488test_expect_success $PREREQ 'first message is compose text' '
489 grep "^fake edit" msgtxt1
490'
491
492test_expect_success $PREREQ 'second message is patch' '
493 grep "Subject:.*Second" msgtxt2
494'
495
496test_expect_success $PREREQ 'setup expect' "
497cat >expected-suppress-sob <<\EOF
4980001-Second.patch
499(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
500(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
501(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
502Dry-OK. Log says:
503Server: relay.example.com
504MAIL FROM:<from@example.com>
505RCPT TO:<to@example.com>
506RCPT TO:<cc@example.com>
507RCPT TO:<author@example.com>
508RCPT TO:<one@example.com>
509RCPT TO:<two@example.com>
510From: Example <from@example.com>
511To: to@example.com
512Cc: cc@example.com,
513 A <author@example.com>,
514 One <one@example.com>,
515 two@example.com
516Subject: [PATCH 1/1] Second.
517Date: DATE-STRING
518Message-Id: MESSAGE-ID-STRING
519X-Mailer: X-MAILER-STRING
520
521Result: OK
522EOF
523"
524
525replace_variable_fields () {
526 sed -e "s/^\(Date:\).*/\1 DATE-STRING/" \
527 -e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
528 -e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/"
529}
530
531test_suppression () {
532 git send-email \
533 --dry-run \
534 --suppress-cc=$1 ${2+"--suppress-cc=$2"} \
535 --from="Example <from@example.com>" \
536 --to=to@example.com \
537 --smtp-server relay.example.com \
538 $patches | replace_variable_fields \
539 >actual-suppress-$1${2+"-$2"} &&
540 test_cmp expected-suppress-$1${2+"-$2"} actual-suppress-$1${2+"-$2"}
541}
542
543test_expect_success $PREREQ 'sendemail.cc set' '
544 git config sendemail.cc cc@example.com &&
545 test_suppression sob
546'
547
548test_expect_success $PREREQ 'setup expect' "
549cat >expected-suppress-sob <<\EOF
5500001-Second.patch
551(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
552(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
553(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
554Dry-OK. Log says:
555Server: relay.example.com
556MAIL FROM:<from@example.com>
557RCPT TO:<to@example.com>
558RCPT TO:<author@example.com>
559RCPT TO:<one@example.com>
560RCPT TO:<two@example.com>
561From: Example <from@example.com>
562To: to@example.com
563Cc: A <author@example.com>,
564 One <one@example.com>,
565 two@example.com
566Subject: [PATCH 1/1] Second.
567Date: DATE-STRING
568Message-Id: MESSAGE-ID-STRING
569X-Mailer: X-MAILER-STRING
570
571Result: OK
572EOF
573"
574
575test_expect_success $PREREQ 'sendemail.cc unset' '
576 git config --unset sendemail.cc &&
577 test_suppression sob
578'
579
580test_expect_success $PREREQ 'setup expect' "
581cat >expected-suppress-cccmd <<\EOF
5820001-Second.patch
583(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
584(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
585(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
586(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
587Dry-OK. Log says:
588Server: relay.example.com
589MAIL FROM:<from@example.com>
590RCPT TO:<to@example.com>
591RCPT TO:<author@example.com>
592RCPT TO:<one@example.com>
593RCPT TO:<two@example.com>
594RCPT TO:<committer@example.com>
595From: Example <from@example.com>
596To: to@example.com
597Cc: A <author@example.com>,
598 One <one@example.com>,
599 two@example.com,
600 C O Mitter <committer@example.com>
601Subject: [PATCH 1/1] Second.
602Date: DATE-STRING
603Message-Id: MESSAGE-ID-STRING
604X-Mailer: X-MAILER-STRING
605
606Result: OK
607EOF
608"
609
610test_expect_success $PREREQ 'sendemail.cccmd' '
611 write_script cccmd <<-\EOF &&
612 echo cc-cmd@example.com
613 EOF
614 git config sendemail.cccmd ./cccmd &&
615 test_suppression cccmd
616'
617
618test_expect_success $PREREQ 'setup expect' '
619cat >expected-suppress-all <<\EOF
6200001-Second.patch
621Dry-OK. Log says:
622Server: relay.example.com
623MAIL FROM:<from@example.com>
624RCPT TO:<to@example.com>
625From: Example <from@example.com>
626To: to@example.com
627Subject: [PATCH 1/1] Second.
628Date: DATE-STRING
629Message-Id: MESSAGE-ID-STRING
630X-Mailer: X-MAILER-STRING
631
632Result: OK
633EOF
634'
635
636test_expect_success $PREREQ '--suppress-cc=all' '
637 test_suppression all
638'
639
640test_expect_success $PREREQ 'setup expect' "
641cat >expected-suppress-body <<\EOF
6420001-Second.patch
643(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
644(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
645(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
646(cc-cmd) Adding cc: cc-cmd@example.com from: './cccmd'
647Dry-OK. Log says:
648Server: relay.example.com
649MAIL FROM:<from@example.com>
650RCPT TO:<to@example.com>
651RCPT TO:<author@example.com>
652RCPT TO:<one@example.com>
653RCPT TO:<two@example.com>
654RCPT TO:<cc-cmd@example.com>
655From: Example <from@example.com>
656To: to@example.com
657Cc: A <author@example.com>,
658 One <one@example.com>,
659 two@example.com,
660 cc-cmd@example.com
661Subject: [PATCH 1/1] Second.
662Date: DATE-STRING
663Message-Id: MESSAGE-ID-STRING
664X-Mailer: X-MAILER-STRING
665
666Result: OK
667EOF
668"
669
670test_expect_success $PREREQ '--suppress-cc=body' '
671 test_suppression body
672'
673
674test_expect_success $PREREQ 'setup expect' "
675cat >expected-suppress-body-cccmd <<\EOF
6760001-Second.patch
677(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
678(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
679(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
680Dry-OK. Log says:
681Server: relay.example.com
682MAIL FROM:<from@example.com>
683RCPT TO:<to@example.com>
684RCPT TO:<author@example.com>
685RCPT TO:<one@example.com>
686RCPT TO:<two@example.com>
687From: Example <from@example.com>
688To: to@example.com
689Cc: A <author@example.com>,
690 One <one@example.com>,
691 two@example.com
692Subject: [PATCH 1/1] Second.
693Date: DATE-STRING
694Message-Id: MESSAGE-ID-STRING
695X-Mailer: X-MAILER-STRING
696
697Result: OK
698EOF
699"
700
701test_expect_success $PREREQ '--suppress-cc=body --suppress-cc=cccmd' '
702 test_suppression body cccmd
703'
704
705test_expect_success $PREREQ 'setup expect' "
706cat >expected-suppress-sob <<\EOF
7070001-Second.patch
708(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
709(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
710(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
711Dry-OK. Log says:
712Server: relay.example.com
713MAIL FROM:<from@example.com>
714RCPT TO:<to@example.com>
715RCPT TO:<author@example.com>
716RCPT TO:<one@example.com>
717RCPT TO:<two@example.com>
718From: Example <from@example.com>
719To: to@example.com
720Cc: A <author@example.com>,
721 One <one@example.com>,
722 two@example.com
723Subject: [PATCH 1/1] Second.
724Date: DATE-STRING
725Message-Id: MESSAGE-ID-STRING
726X-Mailer: X-MAILER-STRING
727
728Result: OK
729EOF
730"
731
732test_expect_success $PREREQ '--suppress-cc=sob' '
733 test_might_fail git config --unset sendemail.cccmd &&
734 test_suppression sob
735'
736
737test_expect_success $PREREQ 'setup expect' "
738cat >expected-suppress-bodycc <<\EOF
7390001-Second.patch
740(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
741(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
742(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
743(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
744Dry-OK. Log says:
745Server: relay.example.com
746MAIL FROM:<from@example.com>
747RCPT TO:<to@example.com>
748RCPT TO:<author@example.com>
749RCPT TO:<one@example.com>
750RCPT TO:<two@example.com>
751RCPT TO:<committer@example.com>
752From: Example <from@example.com>
753To: to@example.com
754Cc: A <author@example.com>,
755 One <one@example.com>,
756 two@example.com,
757 C O Mitter <committer@example.com>
758Subject: [PATCH 1/1] Second.
759Date: DATE-STRING
760Message-Id: MESSAGE-ID-STRING
761X-Mailer: X-MAILER-STRING
762
763Result: OK
764EOF
765"
766
767test_expect_success $PREREQ '--suppress-cc=bodycc' '
768 test_suppression bodycc
769'
770
771test_expect_success $PREREQ 'setup expect' "
772cat >expected-suppress-cc <<\EOF
7730001-Second.patch
774(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
775(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
776Dry-OK. Log says:
777Server: relay.example.com
778MAIL FROM:<from@example.com>
779RCPT TO:<to@example.com>
780RCPT TO:<author@example.com>
781RCPT TO:<committer@example.com>
782From: Example <from@example.com>
783To: to@example.com
784Cc: A <author@example.com>,
785 C O Mitter <committer@example.com>
786Subject: [PATCH 1/1] Second.
787Date: DATE-STRING
788Message-Id: MESSAGE-ID-STRING
789X-Mailer: X-MAILER-STRING
790
791Result: OK
792EOF
793"
794
795test_expect_success $PREREQ '--suppress-cc=cc' '
796 test_suppression cc
797'
798
799test_confirm () {
800 echo y | \
801 GIT_SEND_EMAIL_NOTTY=1 \
802 git send-email \
803 --from="Example <nobody@example.com>" \
804 --to=nobody@example.com \
805 --smtp-server="$(pwd)/fake.sendmail" \
806 $@ $patches >stdout &&
807 grep "Send this email" stdout
808}
809
810test_expect_success $PREREQ '--confirm=always' '
811 test_confirm --confirm=always --suppress-cc=all
812'
813
814test_expect_success $PREREQ '--confirm=auto' '
815 test_confirm --confirm=auto
816'
817
818test_expect_success $PREREQ '--confirm=cc' '
819 test_confirm --confirm=cc
820'
821
822test_expect_success $PREREQ '--confirm=compose' '
823 test_confirm --confirm=compose --compose
824'
825
826test_expect_success $PREREQ 'confirm by default (due to cc)' '
827 test_when_finished git config sendemail.confirm never &&
828 git config --unset sendemail.confirm &&
829 test_confirm
830'
831
832test_expect_success $PREREQ 'confirm by default (due to --compose)' '
833 test_when_finished git config sendemail.confirm never &&
834 git config --unset sendemail.confirm &&
835 test_confirm --suppress-cc=all --compose
836'
837
838test_expect_success $PREREQ 'confirm detects EOF (inform assumes y)' '
839 test_when_finished git config sendemail.confirm never &&
840 git config --unset sendemail.confirm &&
841 rm -fr outdir &&
842 git format-patch -2 -o outdir &&
843 GIT_SEND_EMAIL_NOTTY=1 \
844 git send-email \
845 --from="Example <nobody@example.com>" \
846 --to=nobody@example.com \
847 --smtp-server="$(pwd)/fake.sendmail" \
848 outdir/*.patch </dev/null
849'
850
851test_expect_success $PREREQ 'confirm detects EOF (auto causes failure)' '
852 test_when_finished git config sendemail.confirm never &&
853 git config sendemail.confirm auto &&
854 GIT_SEND_EMAIL_NOTTY=1 &&
855 export GIT_SEND_EMAIL_NOTTY &&
856 test_must_fail git send-email \
857 --from="Example <nobody@example.com>" \
858 --to=nobody@example.com \
859 --smtp-server="$(pwd)/fake.sendmail" \
860 $patches </dev/null
861'
862
863test_expect_success $PREREQ 'confirm does not loop forever' '
864 test_when_finished git config sendemail.confirm never &&
865 git config sendemail.confirm auto &&
866 GIT_SEND_EMAIL_NOTTY=1 &&
867 export GIT_SEND_EMAIL_NOTTY &&
868 yes "bogus" | test_must_fail git send-email \
869 --from="Example <nobody@example.com>" \
870 --to=nobody@example.com \
871 --smtp-server="$(pwd)/fake.sendmail" \
872 $patches
873'
874
875test_expect_success $PREREQ 'utf8 Cc is rfc2047 encoded' '
876 clean_fake_sendmail &&
877 rm -fr outdir &&
878 git format-patch -1 -o outdir --cc="àéìöú <utf8@example.com>" &&
879 git send-email \
880 --from="Example <nobody@example.com>" \
881 --to=nobody@example.com \
882 --smtp-server="$(pwd)/fake.sendmail" \
883 outdir/*.patch &&
884 grep "^ " msgtxt1 |
885 grep "=?UTF-8?q?=C3=A0=C3=A9=C3=AC=C3=B6=C3=BA?= <utf8@example.com>"
886'
887
888test_expect_success $PREREQ '--compose adds MIME for utf8 body' '
889 clean_fake_sendmail &&
890 write_script fake-editor-utf8 <<-\EOF &&
891 echo "utf8 body: àéìöú" >>"$1"
892 EOF
893 GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
894 git send-email \
895 --compose --subject foo \
896 --from="Example <nobody@example.com>" \
897 --to=nobody@example.com \
898 --smtp-server="$(pwd)/fake.sendmail" \
899 $patches &&
900 grep "^utf8 body" msgtxt1 &&
901 grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1
902'
903
904test_expect_success $PREREQ '--compose respects user mime type' '
905 clean_fake_sendmail &&
906 write_script fake-editor-utf8-mime <<-\EOF &&
907 cat >"$1" <<-\EOM
908 MIME-Version: 1.0
909 Content-Type: text/plain; charset=iso-8859-1
910 Content-Transfer-Encoding: 8bit
911 Subject: foo
912
913 utf8 body: àéìöú
914 EOM
915 EOF
916 GIT_EDITOR="\"$(pwd)/fake-editor-utf8-mime\"" \
917 git send-email \
918 --compose --subject foo \
919 --from="Example <nobody@example.com>" \
920 --to=nobody@example.com \
921 --smtp-server="$(pwd)/fake.sendmail" \
922 $patches &&
923 grep "^utf8 body" msgtxt1 &&
924 grep "^Content-Type: text/plain; charset=iso-8859-1" msgtxt1 &&
925 ! grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1
926'
927
928test_expect_success $PREREQ '--compose adds MIME for utf8 subject' '
929 clean_fake_sendmail &&
930 GIT_EDITOR="\"$(pwd)/fake-editor\"" \
931 git send-email \
932 --compose --subject utf8-sübjëct \
933 --from="Example <nobody@example.com>" \
934 --to=nobody@example.com \
935 --smtp-server="$(pwd)/fake.sendmail" \
936 $patches &&
937 grep "^fake edit" msgtxt1 &&
938 grep "^Subject: =?UTF-8?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1
939'
940
941test_expect_success $PREREQ 'utf8 author is correctly passed on' '
942 clean_fake_sendmail &&
943 test_commit weird_author &&
944 test_when_finished "git reset --hard HEAD^" &&
945 git commit --amend --author "Füñný Nâmé <odd_?=mail@example.com>" &&
946 git format-patch --stdout -1 >funny_name.patch &&
947 git send-email --from="Example <nobody@example.com>" \
948 --to=nobody@example.com \
949 --smtp-server="$(pwd)/fake.sendmail" \
950 funny_name.patch &&
951 grep "^From: Füñný Nâmé <odd_?=mail@example.com>" msgtxt1
952'
953
954test_expect_success $PREREQ 'utf8 sender is not duplicated' '
955 clean_fake_sendmail &&
956 test_commit weird_sender &&
957 test_when_finished "git reset --hard HEAD^" &&
958 git commit --amend --author "Füñný Nâmé <odd_?=mail@example.com>" &&
959 git format-patch --stdout -1 >funny_name.patch &&
960 git send-email --from="Füñný Nâmé <odd_?=mail@example.com>" \
961 --to=nobody@example.com \
962 --smtp-server="$(pwd)/fake.sendmail" \
963 funny_name.patch &&
964 grep "^From: " msgtxt1 >msgfrom &&
965 test_line_count = 1 msgfrom
966'
967
968test_expect_success $PREREQ 'sendemail.composeencoding works' '
969 clean_fake_sendmail &&
970 git config sendemail.composeencoding iso-8859-1 &&
971 write_script fake-editor-utf8 <<-\EOF &&
972 echo "utf8 body: àéìöú" >>"$1"
973 EOF
974 GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
975 git send-email \
976 --compose --subject foo \
977 --from="Example <nobody@example.com>" \
978 --to=nobody@example.com \
979 --smtp-server="$(pwd)/fake.sendmail" \
980 $patches &&
981 grep "^utf8 body" msgtxt1 &&
982 grep "^Content-Type: text/plain; charset=iso-8859-1" msgtxt1
983'
984
985test_expect_success $PREREQ '--compose-encoding works' '
986 clean_fake_sendmail &&
987 write_script fake-editor-utf8 <<-\EOF &&
988 echo "utf8 body: àéìöú" >>"$1"
989 EOF
990 GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
991 git send-email \
992 --compose-encoding iso-8859-1 \
993 --compose --subject foo \
994 --from="Example <nobody@example.com>" \
995 --to=nobody@example.com \
996 --smtp-server="$(pwd)/fake.sendmail" \
997 $patches &&
998 grep "^utf8 body" msgtxt1 &&
999 grep "^Content-Type: text/plain; charset=iso-8859-1" msgtxt1
1000'
1001
1002test_expect_success $PREREQ '--compose-encoding overrides sendemail.composeencoding' '
1003 clean_fake_sendmail &&
1004 git config sendemail.composeencoding iso-8859-1 &&
1005 write_script fake-editor-utf8 <<-\EOF &&
1006 echo "utf8 body: àéìöú" >>"$1"
1007 EOF
1008 GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
1009 git send-email \
1010 --compose-encoding iso-8859-2 \
1011 --compose --subject foo \
1012 --from="Example <nobody@example.com>" \
1013 --to=nobody@example.com \
1014 --smtp-server="$(pwd)/fake.sendmail" \
1015 $patches &&
1016 grep "^utf8 body" msgtxt1 &&
1017 grep "^Content-Type: text/plain; charset=iso-8859-2" msgtxt1
1018'
1019
1020test_expect_success $PREREQ '--compose-encoding adds correct MIME for subject' '
1021 clean_fake_sendmail &&
1022 GIT_EDITOR="\"$(pwd)/fake-editor\"" \
1023 git send-email \
1024 --compose-encoding iso-8859-2 \
1025 --compose --subject utf8-sübjëct \
1026 --from="Example <nobody@example.com>" \
1027 --to=nobody@example.com \
1028 --smtp-server="$(pwd)/fake.sendmail" \
1029 $patches &&
1030 grep "^fake edit" msgtxt1 &&
1031 grep "^Subject: =?iso-8859-2?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1
1032'
1033
1034test_expect_success $PREREQ 'detects ambiguous reference/file conflict' '
1035 echo master >master &&
1036 git add master &&
1037 git commit -m"add master" &&
1038 test_must_fail git send-email --dry-run master 2>errors &&
1039 grep disambiguate errors
1040'
1041
1042test_expect_success $PREREQ 'feed two files' '
1043 rm -fr outdir &&
1044 git format-patch -2 -o outdir &&
1045 git send-email \
1046 --dry-run \
1047 --from="Example <nobody@example.com>" \
1048 --to=nobody@example.com \
1049 outdir/000?-*.patch 2>errors >out &&
1050 grep "^Subject: " out >subjects &&
1051 test "z$(sed -n -e 1p subjects)" = "zSubject: [PATCH 1/2] Second." &&
1052 test "z$(sed -n -e 2p subjects)" = "zSubject: [PATCH 2/2] add master"
1053'
1054
1055test_expect_success $PREREQ 'in-reply-to but no threading' '
1056 git send-email \
1057 --dry-run \
1058 --from="Example <nobody@example.com>" \
1059 --to=nobody@example.com \
1060 --in-reply-to="<in-reply-id@example.com>" \
1061 --no-thread \
1062 $patches |
1063 grep "In-Reply-To: <in-reply-id@example.com>"
1064'
1065
1066test_expect_success $PREREQ 'no in-reply-to and no threading' '
1067 git send-email \
1068 --dry-run \
1069 --from="Example <nobody@example.com>" \
1070 --to=nobody@example.com \
1071 --no-thread \
1072 $patches $patches >stdout &&
1073 ! grep "In-Reply-To: " stdout
1074'
1075
1076test_expect_success $PREREQ 'threading but no chain-reply-to' '
1077 git send-email \
1078 --dry-run \
1079 --from="Example <nobody@example.com>" \
1080 --to=nobody@example.com \
1081 --thread \
1082 --no-chain-reply-to \
1083 $patches $patches >stdout &&
1084 grep "In-Reply-To: " stdout
1085'
1086
1087test_expect_success $PREREQ 'sendemail.to works' '
1088 git config --replace-all sendemail.to "Somebody <somebody@ex.com>" &&
1089 git send-email \
1090 --dry-run \
1091 --from="Example <nobody@example.com>" \
1092 $patches $patches >stdout &&
1093 grep "To: Somebody <somebody@ex.com>" stdout
1094'
1095
1096test_expect_success $PREREQ '--no-to overrides sendemail.to' '
1097 git send-email \
1098 --dry-run \
1099 --from="Example <nobody@example.com>" \
1100 --no-to \
1101 --to=nobody@example.com \
1102 $patches $patches >stdout &&
1103 grep "To: nobody@example.com" stdout &&
1104 ! grep "To: Somebody <somebody@ex.com>" stdout
1105'
1106
1107test_expect_success $PREREQ 'sendemail.cc works' '
1108 git config --replace-all sendemail.cc "Somebody <somebody@ex.com>" &&
1109 git send-email \
1110 --dry-run \
1111 --from="Example <nobody@example.com>" \
1112 --to=nobody@example.com \
1113 $patches $patches >stdout &&
1114 grep "Cc: Somebody <somebody@ex.com>" stdout
1115'
1116
1117test_expect_success $PREREQ '--no-cc overrides sendemail.cc' '
1118 git send-email \
1119 --dry-run \
1120 --from="Example <nobody@example.com>" \
1121 --no-cc \
1122 --cc=bodies@example.com \
1123 --to=nobody@example.com \
1124 $patches $patches >stdout &&
1125 grep "Cc: bodies@example.com" stdout &&
1126 ! grep "Cc: Somebody <somebody@ex.com>" stdout
1127'
1128
1129test_expect_success $PREREQ 'sendemail.bcc works' '
1130 git config --replace-all sendemail.bcc "Other <other@ex.com>" &&
1131 git send-email \
1132 --dry-run \
1133 --from="Example <nobody@example.com>" \
1134 --to=nobody@example.com \
1135 --smtp-server relay.example.com \
1136 $patches $patches >stdout &&
1137 grep "RCPT TO:<other@ex.com>" stdout
1138'
1139
1140test_expect_success $PREREQ '--no-bcc overrides sendemail.bcc' '
1141 git send-email \
1142 --dry-run \
1143 --from="Example <nobody@example.com>" \
1144 --no-bcc \
1145 --bcc=bodies@example.com \
1146 --to=nobody@example.com \
1147 --smtp-server relay.example.com \
1148 $patches $patches >stdout &&
1149 grep "RCPT TO:<bodies@example.com>" stdout &&
1150 ! grep "RCPT TO:<other@ex.com>" stdout
1151'
1152
1153test_expect_success $PREREQ 'patches To headers are used by default' '
1154 patch=`git format-patch -1 --to="bodies@example.com"` &&
1155 test_when_finished "rm $patch" &&
1156 git send-email \
1157 --dry-run \
1158 --from="Example <nobody@example.com>" \
1159 --smtp-server relay.example.com \
1160 $patch >stdout &&
1161 grep "RCPT TO:<bodies@example.com>" stdout
1162'
1163
1164test_expect_success $PREREQ 'patches To headers are appended to' '
1165 patch=`git format-patch -1 --to="bodies@example.com"` &&
1166 test_when_finished "rm $patch" &&
1167 git send-email \
1168 --dry-run \
1169 --from="Example <nobody@example.com>" \
1170 --to=nobody@example.com \
1171 --smtp-server relay.example.com \
1172 $patch >stdout &&
1173 grep "RCPT TO:<bodies@example.com>" stdout &&
1174 grep "RCPT TO:<nobody@example.com>" stdout
1175'
1176
1177test_expect_success $PREREQ 'To headers from files reset each patch' '
1178 patch1=`git format-patch -1 --to="bodies@example.com"` &&
1179 patch2=`git format-patch -1 --to="other@example.com" HEAD~` &&
1180 test_when_finished "rm $patch1 && rm $patch2" &&
1181 git send-email \
1182 --dry-run \
1183 --from="Example <nobody@example.com>" \
1184 --to="nobody@example.com" \
1185 --smtp-server relay.example.com \
1186 $patch1 $patch2 >stdout &&
1187 test $(grep -c "RCPT TO:<bodies@example.com>" stdout) = 1 &&
1188 test $(grep -c "RCPT TO:<nobody@example.com>" stdout) = 2 &&
1189 test $(grep -c "RCPT TO:<other@example.com>" stdout) = 1
1190'
1191
1192test_expect_success $PREREQ 'setup expect' '
1193cat >email-using-8bit <<\EOF
1194From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
1195Message-Id: <bogus-message-id@example.com>
1196From: author@example.com
1197Date: Sat, 12 Jun 2010 15:53:58 +0200
1198Subject: subject goes here
1199
1200Dieser deutsche Text enthält einen Umlaut!
1201EOF
1202'
1203
1204test_expect_success $PREREQ 'setup expect' '
1205 echo "Subject: subject goes here" >expected
1206'
1207
1208test_expect_success $PREREQ 'ASCII subject is not RFC2047 quoted' '
1209 clean_fake_sendmail &&
1210 echo bogus |
1211 git send-email --from=author@example.com --to=nobody@example.com \
1212 --smtp-server="$(pwd)/fake.sendmail" \
1213 --8bit-encoding=UTF-8 \
1214 email-using-8bit >stdout &&
1215 grep "Subject" msgtxt1 >actual &&
1216 test_cmp expected actual
1217'
1218
1219test_expect_success $PREREQ 'setup expect' '
1220 cat >content-type-decl <<-\EOF
1221 MIME-Version: 1.0
1222 Content-Type: text/plain; charset=UTF-8
1223 Content-Transfer-Encoding: 8bit
1224 EOF
1225'
1226
1227test_expect_success $PREREQ 'asks about and fixes 8bit encodings' '
1228 clean_fake_sendmail &&
1229 echo |
1230 git send-email --from=author@example.com --to=nobody@example.com \
1231 --smtp-server="$(pwd)/fake.sendmail" \
1232 email-using-8bit >stdout &&
1233 grep "do not declare a Content-Transfer-Encoding" stdout &&
1234 grep email-using-8bit stdout &&
1235 grep "Which 8bit encoding" stdout &&
1236 egrep "Content|MIME" msgtxt1 >actual &&
1237 test_cmp actual content-type-decl
1238'
1239
1240test_expect_success $PREREQ 'sendemail.8bitEncoding works' '
1241 clean_fake_sendmail &&
1242 git config sendemail.assume8bitEncoding UTF-8 &&
1243 echo bogus |
1244 git send-email --from=author@example.com --to=nobody@example.com \
1245 --smtp-server="$(pwd)/fake.sendmail" \
1246 email-using-8bit >stdout &&
1247 egrep "Content|MIME" msgtxt1 >actual &&
1248 test_cmp actual content-type-decl
1249'
1250
1251test_expect_success $PREREQ '--8bit-encoding overrides sendemail.8bitEncoding' '
1252 clean_fake_sendmail &&
1253 git config sendemail.assume8bitEncoding "bogus too" &&
1254 echo bogus |
1255 git send-email --from=author@example.com --to=nobody@example.com \
1256 --smtp-server="$(pwd)/fake.sendmail" \
1257 --8bit-encoding=UTF-8 \
1258 email-using-8bit >stdout &&
1259 egrep "Content|MIME" msgtxt1 >actual &&
1260 test_cmp actual content-type-decl
1261'
1262
1263test_expect_success $PREREQ 'setup expect' '
1264 cat >email-using-8bit <<-\EOF
1265 From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
1266 Message-Id: <bogus-message-id@example.com>
1267 From: author@example.com
1268 Date: Sat, 12 Jun 2010 15:53:58 +0200
1269 Subject: Dieser Betreff enthält auch einen Umlaut!
1270
1271 Nothing to see here.
1272 EOF
1273'
1274
1275test_expect_success $PREREQ 'setup expect' '
1276 cat >expected <<-\EOF
1277 Subject: =?UTF-8?q?Dieser=20Betreff=20enth=C3=A4lt=20auch=20einen=20Umlaut!?=
1278 EOF
1279'
1280
1281test_expect_success $PREREQ '--8bit-encoding also treats subject' '
1282 clean_fake_sendmail &&
1283 echo bogus |
1284 git send-email --from=author@example.com --to=nobody@example.com \
1285 --smtp-server="$(pwd)/fake.sendmail" \
1286 --8bit-encoding=UTF-8 \
1287 email-using-8bit >stdout &&
1288 grep "Subject" msgtxt1 >actual &&
1289 test_cmp expected actual
1290'
1291
1292test_expect_success $PREREQ 'setup expect' '
1293 cat >email-using-8bit <<-\EOF
1294 From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
1295 Message-Id: <bogus-message-id@example.com>
1296 From: A U Thor <author@example.com>
1297 Date: Sat, 12 Jun 2010 15:53:58 +0200
1298 Content-Type: text/plain; charset=UTF-8
1299 Subject: Nothing to see here.
1300
1301 Dieser Betreff enthält auch einen Umlaut!
1302 EOF
1303'
1304
1305test_expect_success $PREREQ 'sendemail.transferencoding=7bit fails on 8bit data' '
1306 clean_fake_sendmail &&
1307 git config sendemail.transferEncoding 7bit &&
1308 test_must_fail git send-email \
1309 --transfer-encoding=7bit \
1310 --smtp-server="$(pwd)/fake.sendmail" \
1311 email-using-8bit \
1312 2>errors >out &&
1313 grep "cannot send message as 7bit" errors &&
1314 test -z "$(ls msgtxt*)"
1315'
1316
1317test_expect_success $PREREQ '--transfer-encoding overrides sendemail.transferEncoding' '
1318 clean_fake_sendmail &&
1319 git config sendemail.transferEncoding 8bit &&
1320 test_must_fail git send-email \
1321 --transfer-encoding=7bit \
1322 --smtp-server="$(pwd)/fake.sendmail" \
1323 email-using-8bit \
1324 2>errors >out &&
1325 grep "cannot send message as 7bit" errors &&
1326 test -z "$(ls msgtxt*)"
1327'
1328
1329test_expect_success $PREREQ 'sendemail.transferencoding=8bit' '
1330 clean_fake_sendmail &&
1331 git send-email \
1332 --transfer-encoding=8bit \
1333 --smtp-server="$(pwd)/fake.sendmail" \
1334 email-using-8bit \
1335 2>errors >out &&
1336 sed '1,/^$/d' msgtxt1 >actual &&
1337 sed '1,/^$/d' email-using-8bit >expected &&
1338 test_cmp expected actual
1339'
1340
1341test_expect_success $PREREQ 'setup expect' '
1342 cat >expected <<-\EOF
1343 Dieser Betreff enth=C3=A4lt auch einen Umlaut!
1344 EOF
1345'
1346
1347test_expect_success $PREREQ '8-bit and sendemail.transferencoding=quoted-printable' '
1348 clean_fake_sendmail &&
1349 git send-email \
1350 --transfer-encoding=quoted-printable \
1351 --smtp-server="$(pwd)/fake.sendmail" \
1352 email-using-8bit \
1353 2>errors >out &&
1354 sed '1,/^$/d' msgtxt1 >actual &&
1355 test_cmp expected actual
1356'
1357
1358test_expect_success $PREREQ 'setup expect' '
1359 cat >expected <<-\EOF
1360 RGllc2VyIEJldHJlZmYgZW50aMOkbHQgYXVjaCBlaW5lbiBVbWxhdXQhCg==
1361 EOF
1362'
1363
1364test_expect_success $PREREQ '8-bit and sendemail.transferencoding=base64' '
1365 clean_fake_sendmail &&
1366 git send-email \
1367 --transfer-encoding=base64 \
1368 --smtp-server="$(pwd)/fake.sendmail" \
1369 email-using-8bit \
1370 2>errors >out &&
1371 sed '1,/^$/d' msgtxt1 >actual &&
1372 test_cmp expected actual
1373'
1374
1375test_expect_success $PREREQ 'setup expect' '
1376 cat >email-using-qp <<-\EOF
1377 From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
1378 Message-Id: <bogus-message-id@example.com>
1379 From: A U Thor <author@example.com>
1380 Date: Sat, 12 Jun 2010 15:53:58 +0200
1381 MIME-Version: 1.0
1382 Content-Transfer-Encoding: quoted-printable
1383 Content-Type: text/plain; charset=UTF-8
1384 Subject: Nothing to see here.
1385
1386 Dieser Betreff enth=C3=A4lt auch einen Umlaut!
1387 EOF
1388'
1389
1390test_expect_success $PREREQ 'convert from quoted-printable to base64' '
1391 clean_fake_sendmail &&
1392 git send-email \
1393 --transfer-encoding=base64 \
1394 --smtp-server="$(pwd)/fake.sendmail" \
1395 email-using-qp \
1396 2>errors >out &&
1397 sed '1,/^$/d' msgtxt1 >actual &&
1398 test_cmp expected actual
1399'
1400
1401test_expect_success $PREREQ 'setup expect' "
1402tr -d '\\015' | tr '%' '\\015' >email-using-crlf <<EOF
1403From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
1404Message-Id: <bogus-message-id@example.com>
1405From: A U Thor <author@example.com>
1406Date: Sat, 12 Jun 2010 15:53:58 +0200
1407Content-Type: text/plain; charset=UTF-8
1408Subject: Nothing to see here.
1409
1410Look, I have a CRLF and an = sign!%
1411EOF
1412"
1413
1414test_expect_success $PREREQ 'setup expect' '
1415 cat >expected <<-\EOF
1416 Look, I have a CRLF and an =3D sign!=0D
1417 EOF
1418'
1419
1420test_expect_success $PREREQ 'CRLF and sendemail.transferencoding=quoted-printable' '
1421 clean_fake_sendmail &&
1422 git send-email \
1423 --transfer-encoding=quoted-printable \
1424 --smtp-server="$(pwd)/fake.sendmail" \
1425 email-using-crlf \
1426 2>errors >out &&
1427 sed '1,/^$/d' msgtxt1 >actual &&
1428 test_cmp expected actual
1429'
1430
1431test_expect_success $PREREQ 'setup expect' '
1432 cat >expected <<-\EOF
1433 TG9vaywgSSBoYXZlIGEgQ1JMRiBhbmQgYW4gPSBzaWduIQ0K
1434 EOF
1435'
1436
1437test_expect_success $PREREQ 'CRLF and sendemail.transferencoding=base64' '
1438 clean_fake_sendmail &&
1439 git send-email \
1440 --transfer-encoding=base64 \
1441 --smtp-server="$(pwd)/fake.sendmail" \
1442 email-using-crlf \
1443 2>errors >out &&
1444 sed '1,/^$/d' msgtxt1 >actual &&
1445 test_cmp expected actual
1446'
1447
1448
1449# Note that the patches in this test are deliberately out of order; we
1450# want to make sure it works even if the cover-letter is not in the
1451# first mail.
1452test_expect_success $PREREQ 'refusing to send cover letter template' '
1453 clean_fake_sendmail &&
1454 rm -fr outdir &&
1455 git format-patch --cover-letter -2 -o outdir &&
1456 test_must_fail git send-email \
1457 --from="Example <nobody@example.com>" \
1458 --to=nobody@example.com \
1459 --smtp-server="$(pwd)/fake.sendmail" \
1460 outdir/0002-*.patch \
1461 outdir/0000-*.patch \
1462 outdir/0001-*.patch \
1463 2>errors >out &&
1464 grep "SUBJECT HERE" errors &&
1465 test -z "$(ls msgtxt*)"
1466'
1467
1468test_expect_success $PREREQ '--force sends cover letter template anyway' '
1469 clean_fake_sendmail &&
1470 rm -fr outdir &&
1471 git format-patch --cover-letter -2 -o outdir &&
1472 git send-email \
1473 --force \
1474 --from="Example <nobody@example.com>" \
1475 --to=nobody@example.com \
1476 --smtp-server="$(pwd)/fake.sendmail" \
1477 outdir/0002-*.patch \
1478 outdir/0000-*.patch \
1479 outdir/0001-*.patch \
1480 2>errors >out &&
1481 ! grep "SUBJECT HERE" errors &&
1482 test -n "$(ls msgtxt*)"
1483'
1484
1485test_cover_addresses () {
1486 header="$1"
1487 shift
1488 clean_fake_sendmail &&
1489 rm -fr outdir &&
1490 git format-patch --cover-letter -2 -o outdir &&
1491 cover=`echo outdir/0000-*.patch` &&
1492 mv $cover cover-to-edit.patch &&
1493 perl -pe "s/^From:/$header: extra\@address.com\nFrom:/" cover-to-edit.patch >"$cover" &&
1494 git send-email \
1495 --force \
1496 --from="Example <nobody@example.com>" \
1497 --no-to --no-cc \
1498 "$@" \
1499 --smtp-server="$(pwd)/fake.sendmail" \
1500 outdir/0000-*.patch \
1501 outdir/0001-*.patch \
1502 outdir/0002-*.patch \
1503 2>errors >out &&
1504 grep "^$header: extra@address.com" msgtxt1 >to1 &&
1505 grep "^$header: extra@address.com" msgtxt2 >to2 &&
1506 grep "^$header: extra@address.com" msgtxt3 >to3 &&
1507 test_line_count = 1 to1 &&
1508 test_line_count = 1 to2 &&
1509 test_line_count = 1 to3
1510}
1511
1512test_expect_success $PREREQ 'to-cover adds To to all mail' '
1513 test_cover_addresses "To" --to-cover
1514'
1515
1516test_expect_success $PREREQ 'cc-cover adds Cc to all mail' '
1517 test_cover_addresses "Cc" --cc-cover
1518'
1519
1520test_expect_success $PREREQ 'tocover adds To to all mail' '
1521 test_config sendemail.tocover true &&
1522 test_cover_addresses "To"
1523'
1524
1525test_expect_success $PREREQ 'cccover adds Cc to all mail' '
1526 test_config sendemail.cccover true &&
1527 test_cover_addresses "Cc"
1528'
1529
1530test_expect_success $PREREQ 'sendemail.aliasfiletype=mailrc' '
1531 clean_fake_sendmail &&
1532 echo "alias sbd somebody@example.org" >.mailrc &&
1533 git config --replace-all sendemail.aliasesfile "$(pwd)/.mailrc" &&
1534 git config sendemail.aliasfiletype mailrc &&
1535 git send-email \
1536 --from="Example <nobody@example.com>" \
1537 --to=sbd \
1538 --smtp-server="$(pwd)/fake.sendmail" \
1539 outdir/0001-*.patch \
1540 2>errors >out &&
1541 grep "^!somebody@example\.org!$" commandline1
1542'
1543
1544test_expect_success $PREREQ 'sendemail.aliasfile=~/.mailrc' '
1545 clean_fake_sendmail &&
1546 echo "alias sbd someone@example.org" >"$HOME/.mailrc" &&
1547 git config --replace-all sendemail.aliasesfile "~/.mailrc" &&
1548 git config sendemail.aliasfiletype mailrc &&
1549 git send-email \
1550 --from="Example <nobody@example.com>" \
1551 --to=sbd \
1552 --smtp-server="$(pwd)/fake.sendmail" \
1553 outdir/0001-*.patch \
1554 2>errors >out &&
1555 grep "^!someone@example\.org!$" commandline1
1556'
1557
1558test_dump_aliases () {
1559 msg="$1" && shift &&
1560 filetype="$1" && shift &&
1561 printf '%s\n' "$@" >expect &&
1562 cat >.tmp-email-aliases &&
1563
1564 test_expect_success $PREREQ "$msg" '
1565 clean_fake_sendmail && rm -fr outdir &&
1566 git config --replace-all sendemail.aliasesfile \
1567 "$(pwd)/.tmp-email-aliases" &&
1568 git config sendemail.aliasfiletype "$filetype" &&
1569 git send-email --dump-aliases 2>errors >actual &&
1570 test_cmp expect actual
1571 '
1572}
1573
1574test_dump_aliases '--dump-aliases sendmail format' \
1575 'sendmail' \
1576 'abgroup' \
1577 'alice' \
1578 'bcgrp' \
1579 'bob' \
1580 'chloe' <<-\EOF
1581 alice: Alice W Land <awol@example.com>
1582 bob: Robert Bobbyton <bob@example.com>
1583 chloe: chloe@example.com
1584 abgroup: alice, bob
1585 bcgrp: bob, chloe, Other <o@example.com>
1586 EOF
1587
1588test_dump_aliases '--dump-aliases mutt format' \
1589 'mutt' \
1590 'alice' \
1591 'bob' \
1592 'chloe' \
1593 'donald' <<-\EOF
1594 alias alice Alice W Land <awol@example.com>
1595 alias donald Donald C Carlton <donc@example.com>
1596 alias bob Robert Bobbyton <bob@example.com>
1597 alias chloe chloe@example.com
1598 EOF
1599
1600test_dump_aliases '--dump-aliases mailrc format' \
1601 'mailrc' \
1602 'alice' \
1603 'bob' \
1604 'chloe' \
1605 'eve' <<-\EOF
1606 alias alice Alice W Land <awol@example.com>
1607 alias eve Eve <eve@example.com>
1608 alias bob Robert Bobbyton <bob@example.com>
1609 alias chloe chloe@example.com
1610 EOF
1611
1612test_dump_aliases '--dump-aliases pine format' \
1613 'pine' \
1614 'alice' \
1615 'bob' \
1616 'chloe' \
1617 'eve' <<-\EOF
1618 alice Alice W Land <awol@example.com>
1619 eve Eve <eve@example.com>
1620 bob Robert Bobbyton <bob@example.com>
1621 chloe chloe@example.com
1622 EOF
1623
1624test_dump_aliases '--dump-aliases gnus format' \
1625 'gnus' \
1626 'alice' \
1627 'bob' \
1628 'chloe' \
1629 'eve' <<-\EOF
1630 (define-mail-alias "alice" "awol@example.com")
1631 (define-mail-alias "eve" "eve@example.com")
1632 (define-mail-alias "bob" "bob@example.com")
1633 (define-mail-alias "chloe" "chloe@example.com")
1634 EOF
1635
1636test_expect_success '--dump-aliases must be used alone' '
1637 test_must_fail git send-email --dump-aliases --to=janice@example.com -1 refs/heads/accounting
1638'
1639
1640test_sendmail_aliases () {
1641 msg="$1" && shift &&
1642 expect="$@" &&
1643 cat >.tmp-email-aliases &&
1644
1645 test_expect_success $PREREQ "$msg" '
1646 clean_fake_sendmail && rm -fr outdir &&
1647 git format-patch -1 -o outdir &&
1648 git config --replace-all sendemail.aliasesfile \
1649 "$(pwd)/.tmp-email-aliases" &&
1650 git config sendemail.aliasfiletype sendmail &&
1651 git send-email \
1652 --from="Example <nobody@example.com>" \
1653 --to=alice --to=bcgrp \
1654 --smtp-server="$(pwd)/fake.sendmail" \
1655 outdir/0001-*.patch \
1656 2>errors >out &&
1657 for i in $expect
1658 do
1659 grep "^!$i!$" commandline1 || return 1
1660 done
1661 '
1662}
1663
1664test_sendmail_aliases 'sendemail.aliasfiletype=sendmail' \
1665 'awol@example\.com' \
1666 'bob@example\.com' \
1667 'chloe@example\.com' \
1668 'o@example\.com' <<-\EOF
1669 alice: Alice W Land <awol@example.com>
1670 bob: Robert Bobbyton <bob@example.com>
1671 # this is a comment
1672 # this is also a comment
1673 chloe: chloe@example.com
1674 abgroup: alice, bob
1675 bcgrp: bob, chloe, Other <o@example.com>
1676 EOF
1677
1678test_sendmail_aliases 'sendmail aliases line folding' \
1679 alice1 \
1680 bob1 bob2 \
1681 chuck1 chuck2 \
1682 darla1 darla2 darla3 \
1683 elton1 elton2 elton3 \
1684 fred1 fred2 \
1685 greg1 <<-\EOF
1686 alice: alice1
1687 bob: bob1,\
1688 bob2
1689 chuck: chuck1,
1690 chuck2
1691 darla: darla1,\
1692 darla2,
1693 darla3
1694 elton: elton1,
1695 elton2,\
1696 elton3
1697 fred: fred1,\
1698 fred2
1699 greg: greg1
1700 bcgrp: bob, chuck, darla, elton, fred, greg
1701 EOF
1702
1703test_sendmail_aliases 'sendmail aliases tolerate bogus line folding' \
1704 alice1 bob1 <<-\EOF
1705 alice: alice1
1706 bcgrp: bob1\
1707 EOF
1708
1709test_sendmail_aliases 'sendmail aliases empty' alice bcgrp <<-\EOF
1710 EOF
1711
1712test_expect_success $PREREQ 'alias support in To header' '
1713 clean_fake_sendmail &&
1714 echo "alias sbd someone@example.org" >.mailrc &&
1715 test_config sendemail.aliasesfile ".mailrc" &&
1716 test_config sendemail.aliasfiletype mailrc &&
1717 git format-patch --stdout -1 --to=sbd >aliased.patch &&
1718 git send-email \
1719 --from="Example <nobody@example.com>" \
1720 --smtp-server="$(pwd)/fake.sendmail" \
1721 aliased.patch \
1722 2>errors >out &&
1723 grep "^!someone@example\.org!$" commandline1
1724'
1725
1726test_expect_success $PREREQ 'alias support in Cc header' '
1727 clean_fake_sendmail &&
1728 echo "alias sbd someone@example.org" >.mailrc &&
1729 test_config sendemail.aliasesfile ".mailrc" &&
1730 test_config sendemail.aliasfiletype mailrc &&
1731 git format-patch --stdout -1 --cc=sbd >aliased.patch &&
1732 git send-email \
1733 --from="Example <nobody@example.com>" \
1734 --smtp-server="$(pwd)/fake.sendmail" \
1735 aliased.patch \
1736 2>errors >out &&
1737 grep "^!someone@example\.org!$" commandline1
1738'
1739
1740test_expect_success $PREREQ 'tocmd works with aliases' '
1741 clean_fake_sendmail &&
1742 echo "alias sbd someone@example.org" >.mailrc &&
1743 test_config sendemail.aliasesfile ".mailrc" &&
1744 test_config sendemail.aliasfiletype mailrc &&
1745 git format-patch --stdout -1 >tocmd.patch &&
1746 echo tocmd--sbd >>tocmd.patch &&
1747 git send-email \
1748 --from="Example <nobody@example.com>" \
1749 --to-cmd=./tocmd-sed \
1750 --smtp-server="$(pwd)/fake.sendmail" \
1751 tocmd.patch \
1752 2>errors >out &&
1753 grep "^!someone@example\.org!$" commandline1
1754'
1755
1756test_expect_success $PREREQ 'cccmd works with aliases' '
1757 clean_fake_sendmail &&
1758 echo "alias sbd someone@example.org" >.mailrc &&
1759 test_config sendemail.aliasesfile ".mailrc" &&
1760 test_config sendemail.aliasfiletype mailrc &&
1761 git format-patch --stdout -1 >cccmd.patch &&
1762 echo cccmd--sbd >>cccmd.patch &&
1763 git send-email \
1764 --from="Example <nobody@example.com>" \
1765 --cc-cmd=./cccmd-sed \
1766 --smtp-server="$(pwd)/fake.sendmail" \
1767 cccmd.patch \
1768 2>errors >out &&
1769 grep "^!someone@example\.org!$" commandline1
1770'
1771
1772do_xmailer_test () {
1773 expected=$1 params=$2 &&
1774 git format-patch -1 &&
1775 git send-email \
1776 --from="Example <nobody@example.com>" \
1777 --to=someone@example.com \
1778 --smtp-server="$(pwd)/fake.sendmail" \
1779 $params \
1780 0001-*.patch \
1781 2>errors >out &&
1782 { grep '^X-Mailer:' out || :; } >mailer &&
1783 test_line_count = $expected mailer
1784}
1785
1786test_expect_success $PREREQ '--[no-]xmailer without any configuration' '
1787 do_xmailer_test 1 "--xmailer" &&
1788 do_xmailer_test 0 "--no-xmailer"
1789'
1790
1791test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer=true' '
1792 test_config sendemail.xmailer true &&
1793 do_xmailer_test 1 "" &&
1794 do_xmailer_test 0 "--no-xmailer" &&
1795 do_xmailer_test 1 "--xmailer"
1796'
1797
1798test_expect_success $PREREQ '--[no-]xmailer with sendemail.xmailer=false' '
1799 test_config sendemail.xmailer false &&
1800 do_xmailer_test 0 "" &&
1801 do_xmailer_test 0 "--no-xmailer" &&
1802 do_xmailer_test 1 "--xmailer"
1803'
1804
1805test_expect_success $PREREQ 'setup expected-list' '
1806 git send-email \
1807 --dry-run \
1808 --from="Example <from@example.com>" \
1809 --to="To 1 <to1@example.com>" \
1810 --to="to2@example.com" \
1811 --to="to3@example.com" \
1812 --cc="Cc 1 <cc1@example.com>" \
1813 --cc="Cc2 <cc2@example.com>" \
1814 --bcc="bcc1@example.com" \
1815 --bcc="bcc2@example.com" \
1816 0001-add-master.patch | replace_variable_fields \
1817 >expected-list
1818'
1819
1820test_expect_success $PREREQ 'use email list in --cc --to and --bcc' '
1821 git send-email \
1822 --dry-run \
1823 --from="Example <from@example.com>" \
1824 --to="To 1 <to1@example.com>, to2@example.com" \
1825 --to="to3@example.com" \
1826 --cc="Cc 1 <cc1@example.com>, Cc2 <cc2@example.com>" \
1827 --bcc="bcc1@example.com, bcc2@example.com" \
1828 0001-add-master.patch | replace_variable_fields \
1829 >actual-list &&
1830 test_cmp expected-list actual-list
1831'
1832
1833test_expect_success $PREREQ 'aliases work with email list' '
1834 echo "alias to2 to2@example.com" >.mutt &&
1835 echo "alias cc1 Cc 1 <cc1@example.com>" >>.mutt &&
1836 test_config sendemail.aliasesfile ".mutt" &&
1837 test_config sendemail.aliasfiletype mutt &&
1838 git send-email \
1839 --dry-run \
1840 --from="Example <from@example.com>" \
1841 --to="To 1 <to1@example.com>, to2, to3@example.com" \
1842 --cc="cc1, Cc2 <cc2@example.com>" \
1843 --bcc="bcc1@example.com, bcc2@example.com" \
1844 0001-add-master.patch | replace_variable_fields \
1845 >actual-list &&
1846 test_cmp expected-list actual-list
1847'
1848
1849test_expect_success $PREREQ 'leading and trailing whitespaces are removed' '
1850 echo "alias to2 to2@example.com" >.mutt &&
1851 echo "alias cc1 Cc 1 <cc1@example.com>" >>.mutt &&
1852 test_config sendemail.aliasesfile ".mutt" &&
1853 test_config sendemail.aliasfiletype mutt &&
1854 TO1=$(echo "QTo 1 <to1@example.com>" | q_to_tab) &&
1855 TO2=$(echo "QZto2" | qz_to_tab_space) &&
1856 CC1=$(echo "cc1" | append_cr) &&
1857 BCC1=$(echo "Q bcc1@example.com Q" | q_to_nul) &&
1858 git send-email \
1859 --dry-run \
1860 --from=" Example <from@example.com>" \
1861 --to="$TO1" \
1862 --to="$TO2" \
1863 --to=" to3@example.com " \
1864 --cc="$CC1" \
1865 --cc="Cc2 <cc2@example.com>" \
1866 --bcc="$BCC1" \
1867 --bcc="bcc2@example.com" \
1868 0001-add-master.patch | replace_variable_fields \
1869 >actual-list &&
1870 test_cmp expected-list actual-list
1871'
1872
1873test_done