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