Merge branch 'js/send-email'
* js/send-email: send-email: add --confirm option and configuration setting send-email: don't create temporary compose file until it is needed send-email: --suppress-cc improvements send-email: handle multiple Cc addresses when reading mbox message send-email: allow send-email to run outside a repo
This commit is contained in:
@ -32,16 +32,59 @@ clean_fake_sendmail() {
|
||||
}
|
||||
|
||||
test_expect_success 'Extract patches' '
|
||||
patches=`git format-patch -n HEAD^1`
|
||||
patches=`git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1`
|
||||
'
|
||||
|
||||
# Test no confirm early to ensure remaining tests will not hang
|
||||
test_no_confirm () {
|
||||
rm -f no_confirm_okay
|
||||
echo n | \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$@ \
|
||||
$patches > stdout &&
|
||||
test_must_fail grep "Send this email" stdout &&
|
||||
> no_confirm_okay
|
||||
}
|
||||
|
||||
# Exit immediately to prevent hang if a no-confirm test fails
|
||||
check_no_confirm () {
|
||||
test -f no_confirm_okay || {
|
||||
say 'No confirm test failed; skipping remaining tests to prevent hanging'
|
||||
test_done
|
||||
}
|
||||
}
|
||||
|
||||
test_expect_success 'No confirm with --suppress-cc' '
|
||||
test_no_confirm --suppress-cc=sob
|
||||
'
|
||||
check_no_confirm
|
||||
|
||||
test_expect_success 'No confirm with --confirm=never' '
|
||||
test_no_confirm --confirm=never
|
||||
'
|
||||
check_no_confirm
|
||||
|
||||
# leave sendemail.confirm set to never after this so that none of the
|
||||
# remaining tests prompt unintentionally.
|
||||
test_expect_success 'No confirm with sendemail.confirm=never' '
|
||||
git config sendemail.confirm never &&
|
||||
test_no_confirm --compose --subject=foo
|
||||
'
|
||||
check_no_confirm
|
||||
|
||||
test_expect_success 'Send patches' '
|
||||
git send-email --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
|
||||
git send-email --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
|
||||
'
|
||||
|
||||
cat >expected <<\EOF
|
||||
!nobody@example.com!
|
||||
!author@example.com!
|
||||
!one@example.com!
|
||||
!two@example.com!
|
||||
EOF
|
||||
test_expect_success \
|
||||
'Verify commandline' \
|
||||
@ -50,13 +93,15 @@ test_expect_success \
|
||||
cat >expected-show-all-headers <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>,<bcc@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>,<one@example.com>,<two@example.com>,<bcc@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: cc@example.com, A <author@example.com>
|
||||
Cc: cc@example.com, A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
@ -70,6 +115,7 @@ EOF
|
||||
test_expect_success 'Show all headers' '
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--suppress-cc=sob \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=to@example.com \
|
||||
--cc=cc@example.com \
|
||||
@ -104,6 +150,28 @@ test_expect_success 'no patch was sent' '
|
||||
! test -e commandline1
|
||||
'
|
||||
|
||||
test_expect_success 'Author From: in message body' '
|
||||
clean_fake_sendmail &&
|
||||
git send-email \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches &&
|
||||
sed "1,/^$/d" < msgtxt1 > msgbody1
|
||||
grep "From: A <author@example.com>" msgbody1
|
||||
'
|
||||
|
||||
test_expect_success 'Author From: not in message body' '
|
||||
clean_fake_sendmail &&
|
||||
git send-email \
|
||||
--from="A <author@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches &&
|
||||
sed "1,/^$/d" < msgtxt1 > msgbody1
|
||||
! grep "From: A <author@example.com>" msgbody1
|
||||
'
|
||||
|
||||
test_expect_success 'allow long lines with --no-validate' '
|
||||
git send-email \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@ -148,15 +216,13 @@ test_set_editor "$(pwd)/fake-editor"
|
||||
|
||||
test_expect_success '--compose works' '
|
||||
clean_fake_sendmail &&
|
||||
echo y | \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches \
|
||||
2>errors
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$patches \
|
||||
2>errors
|
||||
'
|
||||
|
||||
test_expect_success 'first message is compose text' '
|
||||
@ -167,16 +233,18 @@ test_expect_success 'second message is patch' '
|
||||
grep "Subject:.*Second" msgtxt2
|
||||
'
|
||||
|
||||
cat >expected-show-all-headers <<\EOF
|
||||
cat >expected-suppress-sob <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>
|
||||
RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: cc@example.com, A <author@example.com>
|
||||
Cc: cc@example.com, A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
@ -185,10 +253,10 @@ X-Mailer: X-MAILER-STRING
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success 'sendemail.cc set' '
|
||||
git config sendemail.cc cc@example.com &&
|
||||
test_suppression () {
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--suppress-cc=$1 \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=to@example.com \
|
||||
--smtp-server relay.example.com \
|
||||
@ -196,20 +264,27 @@ test_expect_success 'sendemail.cc set' '
|
||||
sed -e "s/^\(Date:\).*/\1 DATE-STRING/" \
|
||||
-e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
|
||||
-e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
|
||||
>actual-show-all-headers &&
|
||||
test_cmp expected-show-all-headers actual-show-all-headers
|
||||
>actual-suppress-$1 &&
|
||||
test_cmp expected-suppress-$1 actual-suppress-$1
|
||||
}
|
||||
|
||||
test_expect_success 'sendemail.cc set' '
|
||||
git config sendemail.cc cc@example.com &&
|
||||
test_suppression sob
|
||||
'
|
||||
|
||||
cat >expected-show-all-headers <<\EOF
|
||||
cat >expected-suppress-sob <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
@ -220,17 +295,166 @@ EOF
|
||||
|
||||
test_expect_success 'sendemail.cc unset' '
|
||||
git config --unset sendemail.cc &&
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--from="Example <from@example.com>" \
|
||||
--to=to@example.com \
|
||||
--smtp-server relay.example.com \
|
||||
$patches |
|
||||
sed -e "s/^\(Date:\).*/\1 DATE-STRING/" \
|
||||
-e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
|
||||
-e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
|
||||
>actual-show-all-headers &&
|
||||
test_cmp expected-show-all-headers actual-show-all-headers
|
||||
test_suppression sob
|
||||
'
|
||||
|
||||
cat >expected-suppress-all <<\EOF
|
||||
0001-Second.patch
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=all' '
|
||||
test_suppression all
|
||||
'
|
||||
|
||||
cat >expected-suppress-body <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=body' '
|
||||
test_suppression body
|
||||
'
|
||||
|
||||
cat >expected-suppress-sob <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=sob' '
|
||||
test_suppression sob
|
||||
'
|
||||
|
||||
cat >expected-suppress-bodycc <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
|
||||
(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<one@example.com>,<two@example.com>,<committer@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, One <one@example.com>, two@example.com, C O Mitter <committer@example.com>
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=bodycc' '
|
||||
test_suppression bodycc
|
||||
'
|
||||
|
||||
cat >expected-suppress-cc <<\EOF
|
||||
0001-Second.patch
|
||||
(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
|
||||
(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
|
||||
Dry-OK. Log says:
|
||||
Server: relay.example.com
|
||||
MAIL FROM:<from@example.com>
|
||||
RCPT TO:<to@example.com>,<author@example.com>,<committer@example.com>
|
||||
From: Example <from@example.com>
|
||||
To: to@example.com
|
||||
Cc: A <author@example.com>, C O Mitter <committer@example.com>
|
||||
Subject: [PATCH 1/1] Second.
|
||||
Date: DATE-STRING
|
||||
Message-Id: MESSAGE-ID-STRING
|
||||
X-Mailer: X-MAILER-STRING
|
||||
|
||||
Result: OK
|
||||
EOF
|
||||
|
||||
test_expect_success '--suppress-cc=cc' '
|
||||
test_suppression cc
|
||||
'
|
||||
|
||||
test_confirm () {
|
||||
echo y | \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
--smtp-server="$(pwd)/fake.sendmail" \
|
||||
$@ \
|
||||
$patches | grep "Send this email"
|
||||
}
|
||||
|
||||
test_expect_success '--confirm=always' '
|
||||
test_confirm --confirm=always --suppress-cc=all
|
||||
'
|
||||
|
||||
test_expect_success '--confirm=auto' '
|
||||
test_confirm --confirm=auto
|
||||
'
|
||||
|
||||
test_expect_success '--confirm=cc' '
|
||||
test_confirm --confirm=cc
|
||||
'
|
||||
|
||||
test_expect_success '--confirm=compose' '
|
||||
test_confirm --confirm=compose --compose
|
||||
'
|
||||
|
||||
test_expect_success 'confirm by default (due to cc)' '
|
||||
CONFIRM=$(git config --get sendemail.confirm) &&
|
||||
git config --unset sendemail.confirm &&
|
||||
test_confirm &&
|
||||
git config sendemail.confirm $CONFIRM
|
||||
'
|
||||
|
||||
test_expect_success 'confirm by default (due to --compose)' '
|
||||
CONFIRM=$(git config --get sendemail.confirm) &&
|
||||
git config --unset sendemail.confirm &&
|
||||
test_confirm --suppress-cc=all --compose
|
||||
ret="$?"
|
||||
git config sendemail.confirm ${CONFIRM:-never}
|
||||
test $ret = "0"
|
||||
'
|
||||
|
||||
test_expect_success '--compose adds MIME for utf8 body' '
|
||||
@ -239,9 +463,7 @@ test_expect_success '--compose adds MIME for utf8 body' '
|
||||
echo "echo utf8 body: àéìöú >>\"\$1\""
|
||||
) >fake-editor-utf8 &&
|
||||
chmod +x fake-editor-utf8 &&
|
||||
echo y | \
|
||||
GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@ -263,9 +485,7 @@ test_expect_success '--compose respects user mime type' '
|
||||
echo " echo utf8 body: àéìöú) >\"\$1\""
|
||||
) >fake-editor-utf8-mime &&
|
||||
chmod +x fake-editor-utf8-mime &&
|
||||
echo y | \
|
||||
GIT_EDITOR="\"$(pwd)/fake-editor-utf8-mime\"" \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject foo \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@ -279,9 +499,7 @@ test_expect_success '--compose respects user mime type' '
|
||||
|
||||
test_expect_success '--compose adds MIME for utf8 subject' '
|
||||
clean_fake_sendmail &&
|
||||
echo y | \
|
||||
GIT_EDITOR="\"$(pwd)/fake-editor\"" \
|
||||
GIT_SEND_EMAIL_NOTTY=1 \
|
||||
git send-email \
|
||||
--compose --subject utf8-sübjëct \
|
||||
--from="Example <nobody@example.com>" \
|
||||
@ -303,7 +521,7 @@ test_expect_success 'detects ambiguous reference/file conflict' '
|
||||
test_expect_success 'feed two files' '
|
||||
rm -fr outdir &&
|
||||
git format-patch -2 -o outdir &&
|
||||
GIT_SEND_EMAIL_NOTTY=1 git send-email \
|
||||
git send-email \
|
||||
--dry-run \
|
||||
--from="Example <nobody@example.com>" \
|
||||
--to=nobody@example.com \
|
||||
|
Reference in New Issue
Block a user