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