]> asedeno.scripts.mit.edu Git - git.git/commitdiff
Merge branch 'tr/send-email-refuse-sending-unedited-cover-letter'
authorJunio C Hamano <gitster@pobox.com>
Wed, 29 Sep 2010 22:26:12 +0000 (15:26 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 29 Sep 2010 22:26:12 +0000 (15:26 -0700)
* tr/send-email-refuse-sending-unedited-cover-letter:
  send-email: Refuse to send cover-letter template subject

1  2 
git-send-email.perl
t/t9001-send-email.sh

diff --combined git-send-email.perl
index 08c8c3c25f8ed3aecf19f56a16db22ffa86f8d0b,bfb6a3634402ddc1411478b22e047a10d433d667..8cc416115569e38317e63d1638d361d579518b73
@@@ -24,7 -24,6 +24,7 @@@ use Text::ParseWords
  use Data::Dumper;
  use Term::ANSIColor;
  use File::Temp qw/ tempdir tempfile /;
 +use File::Spec::Functions qw(catfile);
  use Error qw(:try);
  use Git;
  
@@@ -86,6 -85,7 +86,7 @@@ git send-email [options] <file | direct
      --[no-]validate                * Perform patch sanity checks. Default on.
      --[no-]format-patch            * understand any non optional arguments as
                                       `git format-patch` ones.
+     --force                        * Send even if safety checks would prevent it.
  
  EOT
        exit(1);
@@@ -163,6 -163,7 +164,7 @@@ if ($@) 
  my ($quiet, $dry_run) = (0, 0);
  my $format_patch;
  my $compose_filename;
+ my $force = 0;
  
  # Handle interactive edition of files.
  my $multiedit;
@@@ -302,6 -303,7 +304,7 @@@ my $rc = GetOptions("sender|from=s" => 
                    "validate!" => \$validate,
                    "format-patch!" => \$format_patch,
                    "8bit-encoding=s" => \$auto_8bit_encoding,
+                   "force" => \$force,
         );
  
  unless ($rc) {
@@@ -512,7 -514,7 +515,7 @@@ while (defined(my $f = shift @ARGV)) 
                opendir(DH,$f)
                        or die "Failed to opendir $f: $!";
  
 -              push @files, grep { -f $_ } map { +$f . "/" . $_ }
 +              push @files, grep { -f $_ } map { catfile($f, $_) }
                                sort readdir(DH);
                closedir(DH);
        } elsif ((-f $f or -p $f) and !check_file_rev_conflict($f)) {
@@@ -703,6 -705,16 +706,16 @@@ if (!defined $auto_8bit_encoding && sca
                                  default => "UTF-8");
  }
  
+ if (!$force) {
+       for my $f (@files) {
+               if (get_patch_subject($f) =~ /\*\*\* SUBJECT HERE \*\*\*/) {
+                       die "Refusing to send because the patch\n\t$f\n"
+                               . "has the template subject '*** SUBJECT HERE ***'. "
+                               . "Pass --force if you really want to send.\n";
+               }
+       }
+ }
  my $prompting = 0;
  if (!defined $sender) {
        $sender = $repoauthor || $repocommitter || '';
@@@ -896,7 -908,7 +909,7 @@@ sub sanitize_address 
  
  sub valid_fqdn {
        my $domain = shift;
 -      return !($^O eq 'darwin' && $domain =~ /\.local$/) && $domain =~ /\./;
 +      return defined $domain && !($^O eq 'darwin' && $domain =~ /\.local$/) && $domain =~ /\./;
  }
  
  sub maildomain_net {
diff --combined t/t9001-send-email.sh
index 71b3df9b55d7009def5ea11ff519cae4f28dea6d,f3aedb917688384bb900b36b6cc443d939c3b0ce..6f67da4e71459e8ae44cce2a23c6f62c34947d12
@@@ -3,17 -3,20 +3,17 @@@
  test_description='git send-email'
  . ./test-lib.sh
  
 -if ! test_have_prereq PERL; then
 -      skip_all='skipping git send-email tests, perl not available'
 -      test_done
 -fi
 +# May be altered later in the test
 +PREREQ="PERL"
  
 -PROG='git send-email'
 -test_expect_success \
 +test_expect_success $PREREQ \
      'prepare reference tree' \
      'echo "1A quick brown fox jumps over the" >file &&
       echo "lazy dog" >>file &&
       git add file &&
       GIT_AUTHOR_NAME="A" git commit -a -m "Initial."'
  
 -test_expect_success \
 +test_expect_success $PREREQ \
      'Setup helper tool' \
      '(echo "#!$SHELL_PATH"
        echo shift
@@@ -33,7 -36,7 +33,7 @@@ clean_fake_sendmail() 
        rm -f commandline* msgtxt*
  }
  
 -test_expect_success 'Extract patches' '
 +test_expect_success $PREREQ 'Extract patches' '
      patches=`git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1`
  '
  
@@@ -54,56 -57,49 +54,56 @@@ test_no_confirm () 
  
  # Exit immediately to prevent hang if a no-confirm test fails
  check_no_confirm () {
 -      test -f no_confirm_okay || {
 -              skip_all='confirm test failed; skipping remaining tests to prevent hanging'
 -              test_done
 -      }
 +      if ! test -f no_confirm_okay
 +      then
 +              say 'confirm test failed; skipping remaining tests to prevent hanging'
 +              PREREQ="$PREREQ,CHECK_NO_CONFIRM"
 +      fi
 +      return 0
  }
  
 -test_expect_success 'No confirm with --suppress-cc' '
 -      test_no_confirm --suppress-cc=sob
 +test_expect_success $PREREQ 'No confirm with --suppress-cc' '
 +      test_no_confirm --suppress-cc=sob &&
 +      check_no_confirm
  '
 -check_no_confirm
  
 -test_expect_success 'No confirm with --confirm=never' '
 -      test_no_confirm --confirm=never
 +
 +test_expect_success $PREREQ 'No confirm with --confirm=never' '
 +      test_no_confirm --confirm=never &&
 +      check_no_confirm
  '
 -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' '
 +test_expect_success $PREREQ 'No confirm with sendemail.confirm=never' '
        git config sendemail.confirm never &&
 -      test_no_confirm --compose --subject=foo
 +      test_no_confirm --compose --subject=foo &&
 +      check_no_confirm
  '
 -check_no_confirm
  
 -test_expect_success 'Send patches' '
 +test_expect_success $PREREQ 'Send patches' '
       git send-email --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
  '
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >expected <<\EOF
  !nobody@example.com!
  !author@example.com!
  !one@example.com!
  !two@example.com!
  EOF
 -test_expect_success \
 +'
 +
 +test_expect_success $PREREQ \
      'Verify commandline' \
      'test_cmp expected commandline1'
  
 -test_expect_success 'Send patches with --envelope-sender' '
 +test_expect_success $PREREQ 'Send patches with --envelope-sender' '
      clean_fake_sendmail &&
       git send-email --envelope-sender="Patch Contributer <patch@example.com>" --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
  '
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >expected <<\EOF
  !patch@example.com!
  !-i!
  !one@example.com!
  !two@example.com!
  EOF
 -test_expect_success \
 +'
 +
 +test_expect_success $PREREQ \
      'Verify commandline' \
      'test_cmp expected commandline1'
  
 -test_expect_success 'Send patches with --envelope-sender=auto' '
 +test_expect_success $PREREQ 'Send patches with --envelope-sender=auto' '
      clean_fake_sendmail &&
       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
  '
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >expected <<\EOF
  !nobody@example.com!
  !-i!
  !one@example.com!
  !two@example.com!
  EOF
 -test_expect_success \
 +'
 +
 +test_expect_success $PREREQ \
      'Verify commandline' \
      'test_cmp expected commandline1'
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-show-all-headers <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -168,9 -158,8 +168,9 @@@ References: <unique-message-id@example.
  
  Result: OK
  EOF
 +"
  
 -test_expect_success 'Show all headers' '
 +test_expect_success $PREREQ 'Show all headers' '
        git send-email \
                --dry-run \
                --suppress-cc=sob \
        test_cmp expected-show-all-headers actual-show-all-headers
  '
  
 -test_expect_success 'Prompting works' '
 +test_expect_success $PREREQ 'Prompting works' '
        clean_fake_sendmail &&
        (echo "Example <from@example.com>"
         echo "to@example.com"
                grep "^To: to@example.com\$" msgtxt1
  '
  
 -test_expect_success 'cccmd works' '
 +test_expect_success $PREREQ 'cccmd works' '
        clean_fake_sendmail &&
        cp $patches cccmd.patch &&
        echo cccmd--cccmd@example.com >>cccmd.patch &&
        grep "^ cccmd@example.com" msgtxt1
  '
  
 -z8=zzzzzzzz
 -z64=$z8$z8$z8$z8$z8$z8$z8$z8
 -z512=$z64$z64$z64$z64$z64$z64$z64$z64
 -test_expect_success 'reject long lines' '
 +test_expect_success $PREREQ 'reject long lines' '
 +      z8=zzzzzzzz &&
 +      z64=$z8$z8$z8$z8$z8$z8$z8$z8 &&
 +      z512=$z64$z64$z64$z64$z64$z64$z64$z64 &&
        clean_fake_sendmail &&
        cp $patches longline.patch &&
        echo $z512$z512 >>longline.patch &&
        grep longline.patch errors
  '
  
 -test_expect_success 'no patch was sent' '
 +test_expect_success $PREREQ 'no patch was sent' '
        ! test -e commandline1
  '
  
 -test_expect_success 'Author From: in message body' '
 +test_expect_success $PREREQ 'Author From: in message body' '
        clean_fake_sendmail &&
        git send-email \
                --from="Example <nobody@example.com>" \
        grep "From: A <author@example.com>" msgbody1
  '
  
 -test_expect_success 'Author From: not in message body' '
 +test_expect_success $PREREQ 'Author From: not in message body' '
        clean_fake_sendmail &&
        git send-email \
                --from="A <author@example.com>" \
        ! grep "From: A <author@example.com>" msgbody1
  '
  
 -test_expect_success 'allow long lines with --no-validate' '
 +test_expect_success $PREREQ 'allow long lines with --no-validate' '
        git send-email \
                --from="Example <nobody@example.com>" \
                --to=nobody@example.com \
                2>errors
  '
  
 -test_expect_success 'Invalid In-Reply-To' '
 +test_expect_success $PREREQ 'Invalid In-Reply-To' '
        clean_fake_sendmail &&
        git send-email \
                --from="Example <nobody@example.com>" \
        ! grep "^In-Reply-To: < *>" msgtxt1
  '
  
 -test_expect_success 'Valid In-Reply-To when prompting' '
 +test_expect_success $PREREQ 'Valid In-Reply-To when prompting' '
        clean_fake_sendmail &&
        (echo "From Example <from@example.com>"
         echo "To Example <to@example.com>"
        ! grep "^In-Reply-To: < *>" msgtxt1
  '
  
 -test_expect_success 'setup fake editor' '
 +test_expect_success $PREREQ 'setup fake editor' '
        (echo "#!$SHELL_PATH" &&
         echo "echo fake edit >>\"\$1\""
        ) >fake-editor &&
  
  test_set_editor "$(pwd)/fake-editor"
  
 -test_expect_success '--compose works' '
 +test_expect_success $PREREQ '--compose works' '
        clean_fake_sendmail &&
        git send-email \
        --compose --subject foo \
        2>errors
  '
  
 -test_expect_success 'first message is compose text' '
 +test_expect_success $PREREQ 'first message is compose text' '
        grep "^fake edit" msgtxt1
  '
  
 -test_expect_success 'second message is patch' '
 +test_expect_success $PREREQ 'second message is patch' '
        grep "Subject:.*Second" msgtxt2
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-sob <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -350,7 -338,6 +350,7 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
  test_suppression () {
        git send-email \
        test_cmp expected-suppress-$1${2+"-$2"} actual-suppress-$1${2+"-$2"}
  }
  
 -test_expect_success 'sendemail.cc set' '
 +test_expect_success $PREREQ 'sendemail.cc set' '
        git config sendemail.cc cc@example.com &&
        test_suppression sob
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-sob <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -397,14 -383,12 +397,14 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
 -test_expect_success 'sendemail.cc unset' '
 +test_expect_success $PREREQ 'sendemail.cc unset' '
        git config --unset sendemail.cc &&
        test_suppression sob
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-cccmd <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -432,16 -416,14 +432,16 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
 -test_expect_success 'sendemail.cccmd' '
 +test_expect_success $PREREQ 'sendemail.cccmd' '
        echo echo cc-cmd@example.com > cccmd &&
        chmod +x cccmd &&
        git config sendemail.cccmd ./cccmd &&
        test_suppression cccmd
  '
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >expected-suppress-all <<\EOF
  0001-Second.patch
  Dry-OK. Log says:
@@@ -457,13 -439,11 +457,13 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +'
  
 -test_expect_success '--suppress-cc=all' '
 +test_expect_success $PREREQ '--suppress-cc=all' '
        test_suppression all
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-body <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -491,13 -471,11 +491,13 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
 -test_expect_success '--suppress-cc=body' '
 +test_expect_success $PREREQ '--suppress-cc=body' '
        test_suppression body
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-body-cccmd <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -522,13 -500,11 +522,13 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
 -test_expect_success '--suppress-cc=body --suppress-cc=cccmd' '
 +test_expect_success $PREREQ '--suppress-cc=body --suppress-cc=cccmd' '
        test_suppression body cccmd
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-sob <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -553,14 -529,12 +553,14 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
 -test_expect_success '--suppress-cc=sob' '
 +test_expect_success $PREREQ '--suppress-cc=sob' '
        git config --unset sendemail.cccmd
        test_suppression sob
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-bodycc <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -588,13 -562,11 +588,13 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
 -test_expect_success '--suppress-cc=bodycc' '
 +test_expect_success $PREREQ '--suppress-cc=bodycc' '
        test_suppression bodycc
  '
  
 +test_expect_success $PREREQ 'setup expect' "
  cat >expected-suppress-cc <<\EOF
  0001-Second.patch
  (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
@@@ -616,9 -588,8 +616,9 @@@ X-Mailer: X-MAILER-STRIN
  
  Result: OK
  EOF
 +"
  
 -test_expect_success '--suppress-cc=cc' '
 +test_expect_success $PREREQ '--suppress-cc=cc' '
        test_suppression cc
  '
  
@@@ -633,23 -604,23 +633,23 @@@ test_confirm () 
        grep "Send this email" stdout
  }
  
 -test_expect_success '--confirm=always' '
 +test_expect_success $PREREQ '--confirm=always' '
        test_confirm --confirm=always --suppress-cc=all
  '
  
 -test_expect_success '--confirm=auto' '
 +test_expect_success $PREREQ '--confirm=auto' '
        test_confirm --confirm=auto
  '
  
 -test_expect_success '--confirm=cc' '
 +test_expect_success $PREREQ '--confirm=cc' '
        test_confirm --confirm=cc
  '
  
 -test_expect_success '--confirm=compose' '
 +test_expect_success $PREREQ '--confirm=compose' '
        test_confirm --confirm=compose --compose
  '
  
 -test_expect_success 'confirm by default (due to cc)' '
 +test_expect_success $PREREQ 'confirm by default (due to cc)' '
        CONFIRM=$(git config --get sendemail.confirm) &&
        git config --unset sendemail.confirm &&
        test_confirm
        test $ret = "0"
  '
  
 -test_expect_success 'confirm by default (due to --compose)' '
 +test_expect_success $PREREQ 'confirm by default (due to --compose)' '
        CONFIRM=$(git config --get sendemail.confirm) &&
        git config --unset sendemail.confirm &&
        test_confirm --suppress-cc=all --compose
        test $ret = "0"
  '
  
 -test_expect_success 'confirm detects EOF (inform assumes y)' '
 +test_expect_success $PREREQ 'confirm detects EOF (inform assumes y)' '
        CONFIRM=$(git config --get sendemail.confirm) &&
        git config --unset sendemail.confirm &&
        rm -fr outdir &&
        test $ret = "0"
  '
  
 -test_expect_success 'confirm detects EOF (auto causes failure)' '
 +test_expect_success $PREREQ 'confirm detects EOF (auto causes failure)' '
        CONFIRM=$(git config --get sendemail.confirm) &&
        git config sendemail.confirm auto &&
        GIT_SEND_EMAIL_NOTTY=1 &&
        test $ret = "0"
  '
  
 -test_expect_success 'confirm doesnt loop forever' '
 +test_expect_success $PREREQ 'confirm doesnt loop forever' '
        CONFIRM=$(git config --get sendemail.confirm) &&
        git config sendemail.confirm auto &&
        GIT_SEND_EMAIL_NOTTY=1 &&
        test $ret = "0"
  '
  
 -test_expect_success 'utf8 Cc is rfc2047 encoded' '
 +test_expect_success $PREREQ 'utf8 Cc is rfc2047 encoded' '
        clean_fake_sendmail &&
        rm -fr outdir &&
        git format-patch -1 -o outdir --cc="àéìöú <utf8@example.com>" &&
        grep "=?UTF-8?q?=C3=A0=C3=A9=C3=AC=C3=B6=C3=BA?= <utf8@example.com>"
  '
  
 -test_expect_success '--compose adds MIME for utf8 body' '
 +test_expect_success $PREREQ '--compose adds MIME for utf8 body' '
        clean_fake_sendmail &&
        (echo "#!$SHELL_PATH" &&
         echo "echo utf8 body: àéìöú >>\"\$1\""
        grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1
  '
  
 -test_expect_success '--compose respects user mime type' '
 +test_expect_success $PREREQ '--compose respects user mime type' '
        clean_fake_sendmail &&
        (echo "#!$SHELL_PATH" &&
         echo "(echo MIME-Version: 1.0"
        ! grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1
  '
  
 -test_expect_success '--compose adds MIME for utf8 subject' '
 +test_expect_success $PREREQ '--compose adds MIME for utf8 subject' '
        clean_fake_sendmail &&
          GIT_EDITOR="\"$(pwd)/fake-editor\"" \
          git send-email \
        grep "^Subject: =?UTF-8?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1
  '
  
 -test_expect_success 'detects ambiguous reference/file conflict' '
 +test_expect_success $PREREQ 'detects ambiguous reference/file conflict' '
        echo master > master &&
        git add master &&
        git commit -m"add master" &&
        grep disambiguate errors
  '
  
 -test_expect_success 'feed two files' '
 +test_expect_success $PREREQ 'feed two files' '
        rm -fr outdir &&
        git format-patch -2 -o outdir &&
        git send-email \
        test "z$(sed -n -e 2p subjects)" = "zSubject: [PATCH 2/2] add master"
  '
  
 -test_expect_success 'in-reply-to but no threading' '
 +test_expect_success $PREREQ 'in-reply-to but no threading' '
        git send-email \
                --dry-run \
                --from="Example <nobody@example.com>" \
        grep "In-Reply-To: <in-reply-id@example.com>"
  '
  
 -test_expect_success 'no in-reply-to and no threading' '
 +test_expect_success $PREREQ 'no in-reply-to and no threading' '
        git send-email \
                --dry-run \
                --from="Example <nobody@example.com>" \
        ! grep "In-Reply-To: " stdout
  '
  
 -test_expect_success 'threading but no chain-reply-to' '
 +test_expect_success $PREREQ 'threading but no chain-reply-to' '
        git send-email \
                --dry-run \
                --from="Example <nobody@example.com>" \
        grep "In-Reply-To: " stdout
  '
  
 -test_expect_success 'warning with an implicit --chain-reply-to' '
 +test_expect_success $PREREQ 'warning with an implicit --chain-reply-to' '
        git send-email \
        --dry-run \
        --from="Example <nobody@example.com>" \
        grep "no-chain-reply-to" errors
  '
  
 -test_expect_success 'no warning with an explicit --chain-reply-to' '
 +test_expect_success $PREREQ 'no warning with an explicit --chain-reply-to' '
        git send-email \
        --dry-run \
        --from="Example <nobody@example.com>" \
        ! grep "no-chain-reply-to" errors
  '
  
 -test_expect_success 'no warning with an explicit --no-chain-reply-to' '
 +test_expect_success $PREREQ 'no warning with an explicit --no-chain-reply-to' '
        git send-email \
        --dry-run \
        --from="Example <nobody@example.com>" \
        ! grep "no-chain-reply-to" errors
  '
  
 -test_expect_success 'no warning with sendemail.chainreplyto = false' '
 +test_expect_success $PREREQ 'no warning with sendemail.chainreplyto = false' '
        git config sendemail.chainreplyto false &&
        git send-email \
        --dry-run \
        ! grep "no-chain-reply-to" errors
  '
  
 -test_expect_success 'no warning with sendemail.chainreplyto = true' '
 +test_expect_success $PREREQ 'no warning with sendemail.chainreplyto = true' '
        git config sendemail.chainreplyto true &&
        git send-email \
        --dry-run \
        ! grep "no-chain-reply-to" errors
  '
  
 -test_expect_success 'sendemail.to works' '
 +test_expect_success $PREREQ 'sendemail.to works' '
        git config --replace-all sendemail.to "Somebody <somebody@ex.com>" &&
        git send-email \
                --dry-run \
        grep "To: Somebody <somebody@ex.com>" stdout
  '
  
 -test_expect_success '--no-to overrides sendemail.to' '
 +test_expect_success $PREREQ '--no-to overrides sendemail.to' '
        git send-email \
                --dry-run \
                --from="Example <nobody@example.com>" \
        ! grep "To: Somebody <somebody@ex.com>" stdout
  '
  
 -test_expect_success 'sendemail.cc works' '
 +test_expect_success $PREREQ 'sendemail.cc works' '
        git config --replace-all sendemail.cc "Somebody <somebody@ex.com>" &&
        git send-email \
                --dry-run \
        grep "Cc: Somebody <somebody@ex.com>" stdout
  '
  
 -test_expect_success '--no-cc overrides sendemail.cc' '
 +test_expect_success $PREREQ '--no-cc overrides sendemail.cc' '
        git send-email \
                --dry-run \
                --from="Example <nobody@example.com>" \
        ! grep "Cc: Somebody <somebody@ex.com>" stdout
  '
  
 -test_expect_success 'sendemail.bcc works' '
 +test_expect_success $PREREQ 'sendemail.bcc works' '
        git config --replace-all sendemail.bcc "Other <other@ex.com>" &&
        git send-email \
                --dry-run \
        grep "RCPT TO:<other@ex.com>" stdout
  '
  
 -test_expect_success '--no-bcc overrides sendemail.bcc' '
 +test_expect_success $PREREQ '--no-bcc overrides sendemail.bcc' '
        git send-email \
                --dry-run \
                --from="Example <nobody@example.com>" \
        ! grep "RCPT TO:<other@ex.com>" stdout
  '
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >email-using-8bit <<EOF
  From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
  Message-Id: <bogus-message-id@example.com>
@@@ -957,17 -927,14 +957,17 @@@ Subject: subject goes her
  
  Dieser deutsche Text enthält einen Umlaut!
  EOF
 +'
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >content-type-decl <<EOF
  MIME-Version: 1.0
  Content-Type: text/plain; charset=UTF-8
  Content-Transfer-Encoding: 8bit
  EOF
 +'
  
 -test_expect_success 'asks about and fixes 8bit encodings' '
 +test_expect_success $PREREQ 'asks about and fixes 8bit encodings' '
        clean_fake_sendmail &&
        echo |
        git send-email --from=author@example.com --to=nobody@example.com \
        test_cmp actual content-type-decl
  '
  
 -test_expect_success 'sendemail.8bitEncoding works' '
 +test_expect_success $PREREQ 'sendemail.8bitEncoding works' '
        clean_fake_sendmail &&
        git config sendemail.assume8bitEncoding UTF-8 &&
        echo bogus |
        test_cmp actual content-type-decl
  '
  
 -test_expect_success '--8bit-encoding overrides sendemail.8bitEncoding' '
 +test_expect_success $PREREQ '--8bit-encoding overrides sendemail.8bitEncoding' '
        clean_fake_sendmail &&
        git config sendemail.assume8bitEncoding "bogus too" &&
        echo bogus |
        test_cmp actual content-type-decl
  '
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >email-using-8bit <<EOF
  From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
  Message-Id: <bogus-message-id@example.com>
@@@ -1013,15 -979,12 +1013,15 @@@ Subject: Dieser Betreff enthält auch e
  
  Nothing to see here.
  EOF
 +'
  
 +test_expect_success $PREREQ 'setup expect' '
  cat >expected <<EOF
  Subject: =?UTF-8?q?Dieser=20Betreff=20enth=C3=A4lt=20auch=20einen=20Umlaut!?=
  EOF
 +'
  
 -test_expect_success '--8bit-encoding also treats subject' '
 +test_expect_success $PREREQ '--8bit-encoding also treats subject' '
        clean_fake_sendmail &&
        echo bogus |
        git send-email --from=author@example.com --to=nobody@example.com \
        test_cmp expected actual
  '
  
+ # Note that the patches in this test are deliberately out of order; we
+ # want to make sure it works even if the cover-letter is not in the
+ # first mail.
+ test_expect_success 'refusing to send cover letter template' '
+       clean_fake_sendmail &&
+       rm -fr outdir &&
+       git format-patch --cover-letter -2 -o outdir &&
+       test_must_fail git send-email \
+         --from="Example <nobody@example.com>" \
+         --to=nobody@example.com \
+         --smtp-server="$(pwd)/fake.sendmail" \
+         outdir/0002-*.patch \
+         outdir/0000-*.patch \
+         outdir/0001-*.patch \
+         2>errors >out &&
+       grep "SUBJECT HERE" errors &&
+       test -z "$(ls msgtxt*)"
+ '
+ test_expect_success '--force sends cover letter template anyway' '
+       clean_fake_sendmail &&
+       rm -fr outdir &&
+       git format-patch --cover-letter -2 -o outdir &&
+       git send-email \
+         --force \
+         --from="Example <nobody@example.com>" \
+         --to=nobody@example.com \
+         --smtp-server="$(pwd)/fake.sendmail" \
+         outdir/0002-*.patch \
+         outdir/0000-*.patch \
+         outdir/0001-*.patch \
+         2>errors >out &&
+       ! grep "SUBJECT HERE" errors &&
+       test -n "$(ls msgtxt*)"
+ '
  test_done