t / t9001-send-email.shon commit vcs-svn: make reading of properties binary-safe (e7d04ee)
   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 \
  10    'prepare reference tree' \
  11    'echo "1A quick brown fox jumps over the" >file &&
  12     echo "lazy dog" >>file &&
  13     git add file &&
  14     GIT_AUTHOR_NAME="A" git commit -a -m "Initial."'
  15
  16test_expect_success $PREREQ \
  17    'Setup helper tool' \
  18    '(echo "#!$SHELL_PATH"
  19      echo shift
  20      echo output=1
  21      echo "while test -f commandline\$output; do output=\$((\$output+1)); done"
  22      echo for a
  23      echo do
  24      echo "  echo \"!\$a!\""
  25      echo "done >commandline\$output"
  26      echo "cat > msgtxt\$output"
  27      ) >fake.sendmail &&
  28     chmod +x ./fake.sendmail &&
  29     git add fake.sendmail &&
  30     GIT_AUTHOR_NAME="A" git commit -a -m "Second."'
  31
  32clean_fake_sendmail() {
  33        rm -f commandline* msgtxt*
  34}
  35
  36test_expect_success $PREREQ 'Extract patches' '
  37    patches=`git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1`
  38'
  39
  40# Test no confirm early to ensure remaining tests will not hang
  41test_no_confirm () {
  42        rm -f no_confirm_okay
  43        echo n | \
  44                GIT_SEND_EMAIL_NOTTY=1 \
  45                git send-email \
  46                --from="Example <from@example.com>" \
  47                --to=nobody@example.com \
  48                --smtp-server="$(pwd)/fake.sendmail" \
  49                $@ \
  50                $patches > stdout &&
  51                test_must_fail grep "Send this email" stdout &&
  52                > no_confirm_okay
  53}
  54
  55# Exit immediately to prevent hang if a no-confirm test fails
  56check_no_confirm () {
  57        if ! test -f no_confirm_okay
  58        then
  59                say 'confirm test failed; skipping remaining tests to prevent hanging'
  60                PREREQ="$PREREQ,CHECK_NO_CONFIRM"
  61        fi
  62        return 0
  63}
  64
  65test_expect_success $PREREQ 'No confirm with --suppress-cc' '
  66        test_no_confirm --suppress-cc=sob &&
  67        check_no_confirm
  68'
  69
  70
  71test_expect_success $PREREQ 'No confirm with --confirm=never' '
  72        test_no_confirm --confirm=never &&
  73        check_no_confirm
  74'
  75
  76# leave sendemail.confirm set to never after this so that none of the
  77# remaining tests prompt unintentionally.
  78test_expect_success $PREREQ 'No confirm with sendemail.confirm=never' '
  79        git config sendemail.confirm never &&
  80        test_no_confirm --compose --subject=foo &&
  81        check_no_confirm
  82'
  83
  84test_expect_success $PREREQ 'Send patches' '
  85     git send-email --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
  86'
  87
  88test_expect_success $PREREQ 'setup expect' '
  89cat >expected <<\EOF
  90!nobody@example.com!
  91!author@example.com!
  92!one@example.com!
  93!two@example.com!
  94EOF
  95'
  96
  97test_expect_success $PREREQ \
  98    'Verify commandline' \
  99    'test_cmp expected commandline1'
 100
 101test_expect_success $PREREQ 'Send patches with --envelope-sender' '
 102    clean_fake_sendmail &&
 103     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
 104'
 105
 106test_expect_success $PREREQ 'setup expect' '
 107cat >expected <<\EOF
 108!patch@example.com!
 109!-i!
 110!nobody@example.com!
 111!author@example.com!
 112!one@example.com!
 113!two@example.com!
 114EOF
 115'
 116
 117test_expect_success $PREREQ \
 118    'Verify commandline' \
 119    'test_cmp expected commandline1'
 120
 121test_expect_success $PREREQ 'Send patches with --envelope-sender=auto' '
 122    clean_fake_sendmail &&
 123     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
 124'
 125
 126test_expect_success $PREREQ 'setup expect' '
 127cat >expected <<\EOF
 128!nobody@example.com!
 129!-i!
 130!nobody@example.com!
 131!author@example.com!
 132!one@example.com!
 133!two@example.com!
 134EOF
 135'
 136
 137test_expect_success $PREREQ \
 138    'Verify commandline' \
 139    'test_cmp expected commandline1'
 140
 141test_expect_success $PREREQ 'setup expect' "
 142cat >expected-show-all-headers <<\EOF
 1430001-Second.patch
 144(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 145(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 146(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 147Dry-OK. Log says:
 148Server: relay.example.com
 149MAIL FROM:<from@example.com>
 150RCPT TO:<to@example.com>
 151RCPT TO:<cc@example.com>
 152RCPT TO:<author@example.com>
 153RCPT TO:<one@example.com>
 154RCPT TO:<two@example.com>
 155RCPT TO:<bcc@example.com>
 156From: Example <from@example.com>
 157To: to@example.com
 158Cc: cc@example.com,
 159        A <author@example.com>,
 160        One <one@example.com>,
 161        two@example.com
 162Subject: [PATCH 1/1] Second.
 163Date: DATE-STRING
 164Message-Id: MESSAGE-ID-STRING
 165X-Mailer: X-MAILER-STRING
 166In-Reply-To: <unique-message-id@example.com>
 167References: <unique-message-id@example.com>
 168
 169Result: OK
 170EOF
 171"
 172
 173test_expect_success $PREREQ 'Show all headers' '
 174        git send-email \
 175                --dry-run \
 176                --suppress-cc=sob \
 177                --from="Example <from@example.com>" \
 178                --to=to@example.com \
 179                --cc=cc@example.com \
 180                --bcc=bcc@example.com \
 181                --in-reply-to="<unique-message-id@example.com>" \
 182                --smtp-server relay.example.com \
 183                $patches |
 184        sed     -e "s/^\(Date:\).*/\1 DATE-STRING/" \
 185                -e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
 186                -e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
 187                >actual-show-all-headers &&
 188        test_cmp expected-show-all-headers actual-show-all-headers
 189'
 190
 191test_expect_success $PREREQ 'Prompting works' '
 192        clean_fake_sendmail &&
 193        (echo "Example <from@example.com>"
 194         echo "to@example.com"
 195         echo ""
 196        ) | GIT_SEND_EMAIL_NOTTY=1 git send-email \
 197                --smtp-server="$(pwd)/fake.sendmail" \
 198                $patches \
 199                2>errors &&
 200                grep "^From: Example <from@example.com>\$" msgtxt1 &&
 201                grep "^To: to@example.com\$" msgtxt1
 202'
 203
 204test_expect_success $PREREQ 'tocmd works' '
 205        clean_fake_sendmail &&
 206        cp $patches tocmd.patch &&
 207        echo tocmd--tocmd@example.com >>tocmd.patch &&
 208        {
 209          echo "#!$SHELL_PATH"
 210          echo sed -n -e s/^tocmd--//p \"\$1\"
 211        } > tocmd-sed &&
 212        chmod +x tocmd-sed &&
 213        git send-email \
 214                --from="Example <nobody@example.com>" \
 215                --to-cmd=./tocmd-sed \
 216                --smtp-server="$(pwd)/fake.sendmail" \
 217                tocmd.patch \
 218                &&
 219        grep "^To: tocmd@example.com" msgtxt1
 220'
 221
 222test_expect_success $PREREQ 'cccmd works' '
 223        clean_fake_sendmail &&
 224        cp $patches cccmd.patch &&
 225        echo "cccmd--  cccmd@example.com" >>cccmd.patch &&
 226        {
 227          echo "#!$SHELL_PATH"
 228          echo sed -n -e s/^cccmd--//p \"\$1\"
 229        } > cccmd-sed &&
 230        chmod +x cccmd-sed &&
 231        git send-email \
 232                --from="Example <nobody@example.com>" \
 233                --to=nobody@example.com \
 234                --cc-cmd=./cccmd-sed \
 235                --smtp-server="$(pwd)/fake.sendmail" \
 236                cccmd.patch \
 237                &&
 238        grep "^ cccmd@example.com" msgtxt1
 239'
 240
 241test_expect_success $PREREQ 'reject long lines' '
 242        z8=zzzzzzzz &&
 243        z64=$z8$z8$z8$z8$z8$z8$z8$z8 &&
 244        z512=$z64$z64$z64$z64$z64$z64$z64$z64 &&
 245        clean_fake_sendmail &&
 246        cp $patches longline.patch &&
 247        echo $z512$z512 >>longline.patch &&
 248        test_must_fail git send-email \
 249                --from="Example <nobody@example.com>" \
 250                --to=nobody@example.com \
 251                --smtp-server="$(pwd)/fake.sendmail" \
 252                $patches longline.patch \
 253                2>errors &&
 254        grep longline.patch errors
 255'
 256
 257test_expect_success $PREREQ 'no patch was sent' '
 258        ! test -e commandline1
 259'
 260
 261test_expect_success $PREREQ 'Author From: in message body' '
 262        clean_fake_sendmail &&
 263        git send-email \
 264                --from="Example <nobody@example.com>" \
 265                --to=nobody@example.com \
 266                --smtp-server="$(pwd)/fake.sendmail" \
 267                $patches &&
 268        sed "1,/^\$/d" < msgtxt1 > msgbody1 &&
 269        grep "From: A <author@example.com>" msgbody1
 270'
 271
 272test_expect_success $PREREQ 'Author From: not in message body' '
 273        clean_fake_sendmail &&
 274        git send-email \
 275                --from="A <author@example.com>" \
 276                --to=nobody@example.com \
 277                --smtp-server="$(pwd)/fake.sendmail" \
 278                $patches &&
 279        sed "1,/^\$/d" < msgtxt1 > msgbody1 &&
 280        ! grep "From: A <author@example.com>" msgbody1
 281'
 282
 283test_expect_success $PREREQ 'allow long lines with --no-validate' '
 284        git send-email \
 285                --from="Example <nobody@example.com>" \
 286                --to=nobody@example.com \
 287                --smtp-server="$(pwd)/fake.sendmail" \
 288                --novalidate \
 289                $patches longline.patch \
 290                2>errors
 291'
 292
 293test_expect_success $PREREQ 'Invalid In-Reply-To' '
 294        clean_fake_sendmail &&
 295        git send-email \
 296                --from="Example <nobody@example.com>" \
 297                --to=nobody@example.com \
 298                --in-reply-to=" " \
 299                --smtp-server="$(pwd)/fake.sendmail" \
 300                $patches \
 301                2>errors &&
 302        ! grep "^In-Reply-To: < *>" msgtxt1
 303'
 304
 305test_expect_success $PREREQ 'Valid In-Reply-To when prompting' '
 306        clean_fake_sendmail &&
 307        (echo "From Example <from@example.com>"
 308         echo "To Example <to@example.com>"
 309         echo ""
 310        ) | env GIT_SEND_EMAIL_NOTTY=1 git send-email \
 311                --smtp-server="$(pwd)/fake.sendmail" \
 312                $patches 2>errors &&
 313        ! grep "^In-Reply-To: < *>" msgtxt1
 314'
 315
 316test_expect_success $PREREQ 'In-Reply-To without --chain-reply-to' '
 317        clean_fake_sendmail &&
 318        echo "<unique-message-id@example.com>" >expect &&
 319        git send-email \
 320                --from="Example <nobody@example.com>" \
 321                --to=nobody@example.com \
 322                --nochain-reply-to \
 323                --in-reply-to="$(cat expect)" \
 324                --smtp-server="$(pwd)/fake.sendmail" \
 325                $patches $patches $patches \
 326                2>errors &&
 327        # The first message is a reply to --in-reply-to
 328        sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt1 >actual &&
 329        test_cmp expect actual &&
 330        # Second and subsequent messages are replies to the first one
 331        sed -n -e "s/^Message-Id: *\(.*\)/\1/p" msgtxt1 >expect &&
 332        sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt2 >actual &&
 333        test_cmp expect actual &&
 334        sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt3 >actual &&
 335        test_cmp expect actual
 336'
 337
 338test_expect_success $PREREQ 'In-Reply-To with --chain-reply-to' '
 339        clean_fake_sendmail &&
 340        echo "<unique-message-id@example.com>" >expect &&
 341        git send-email \
 342                --from="Example <nobody@example.com>" \
 343                --to=nobody@example.com \
 344                --chain-reply-to \
 345                --in-reply-to="$(cat expect)" \
 346                --smtp-server="$(pwd)/fake.sendmail" \
 347                $patches $patches $patches \
 348                2>errors &&
 349        sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt1 >actual &&
 350        test_cmp expect actual &&
 351        sed -n -e "s/^Message-Id: *\(.*\)/\1/p" msgtxt1 >expect &&
 352        sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt2 >actual &&
 353        test_cmp expect actual &&
 354        sed -n -e "s/^Message-Id: *\(.*\)/\1/p" msgtxt2 >expect &&
 355        sed -n -e "s/^In-Reply-To: *\(.*\)/\1/p" msgtxt3 >actual &&
 356        test_cmp expect actual
 357'
 358
 359test_expect_success $PREREQ 'setup fake editor' '
 360        (echo "#!$SHELL_PATH" &&
 361         echo "echo fake edit >>\"\$1\""
 362        ) >fake-editor &&
 363        chmod +x fake-editor
 364'
 365
 366test_set_editor "$(pwd)/fake-editor"
 367
 368test_expect_success $PREREQ '--compose works' '
 369        clean_fake_sendmail &&
 370        git send-email \
 371        --compose --subject foo \
 372        --from="Example <nobody@example.com>" \
 373        --to=nobody@example.com \
 374        --smtp-server="$(pwd)/fake.sendmail" \
 375        $patches \
 376        2>errors
 377'
 378
 379test_expect_success $PREREQ 'first message is compose text' '
 380        grep "^fake edit" msgtxt1
 381'
 382
 383test_expect_success $PREREQ 'second message is patch' '
 384        grep "Subject:.*Second" msgtxt2
 385'
 386
 387test_expect_success $PREREQ 'setup expect' "
 388cat >expected-suppress-sob <<\EOF
 3890001-Second.patch
 390(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 391(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 392(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 393Dry-OK. Log says:
 394Server: relay.example.com
 395MAIL FROM:<from@example.com>
 396RCPT TO:<to@example.com>
 397RCPT TO:<cc@example.com>
 398RCPT TO:<author@example.com>
 399RCPT TO:<one@example.com>
 400RCPT TO:<two@example.com>
 401From: Example <from@example.com>
 402To: to@example.com
 403Cc: cc@example.com,
 404        A <author@example.com>,
 405        One <one@example.com>,
 406        two@example.com
 407Subject: [PATCH 1/1] Second.
 408Date: DATE-STRING
 409Message-Id: MESSAGE-ID-STRING
 410X-Mailer: X-MAILER-STRING
 411
 412Result: OK
 413EOF
 414"
 415
 416test_suppression () {
 417        git send-email \
 418                --dry-run \
 419                --suppress-cc=$1 ${2+"--suppress-cc=$2"} \
 420                --from="Example <from@example.com>" \
 421                --to=to@example.com \
 422                --smtp-server relay.example.com \
 423                $patches |
 424        sed     -e "s/^\(Date:\).*/\1 DATE-STRING/" \
 425                -e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
 426                -e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
 427                >actual-suppress-$1${2+"-$2"} &&
 428        test_cmp expected-suppress-$1${2+"-$2"} actual-suppress-$1${2+"-$2"}
 429}
 430
 431test_expect_success $PREREQ 'sendemail.cc set' '
 432        git config sendemail.cc cc@example.com &&
 433        test_suppression sob
 434'
 435
 436test_expect_success $PREREQ 'setup expect' "
 437cat >expected-suppress-sob <<\EOF
 4380001-Second.patch
 439(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 440(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 441(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 442Dry-OK. Log says:
 443Server: relay.example.com
 444MAIL FROM:<from@example.com>
 445RCPT TO:<to@example.com>
 446RCPT TO:<author@example.com>
 447RCPT TO:<one@example.com>
 448RCPT TO:<two@example.com>
 449From: Example <from@example.com>
 450To: to@example.com
 451Cc: A <author@example.com>,
 452        One <one@example.com>,
 453        two@example.com
 454Subject: [PATCH 1/1] Second.
 455Date: DATE-STRING
 456Message-Id: MESSAGE-ID-STRING
 457X-Mailer: X-MAILER-STRING
 458
 459Result: OK
 460EOF
 461"
 462
 463test_expect_success $PREREQ 'sendemail.cc unset' '
 464        git config --unset sendemail.cc &&
 465        test_suppression sob
 466'
 467
 468test_expect_success $PREREQ 'setup expect' "
 469cat >expected-suppress-cccmd <<\EOF
 4700001-Second.patch
 471(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 472(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 473(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 474(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
 475Dry-OK. Log says:
 476Server: relay.example.com
 477MAIL FROM:<from@example.com>
 478RCPT TO:<to@example.com>
 479RCPT TO:<author@example.com>
 480RCPT TO:<one@example.com>
 481RCPT TO:<two@example.com>
 482RCPT TO:<committer@example.com>
 483From: Example <from@example.com>
 484To: to@example.com
 485Cc: A <author@example.com>,
 486        One <one@example.com>,
 487        two@example.com,
 488        C O Mitter <committer@example.com>
 489Subject: [PATCH 1/1] Second.
 490Date: DATE-STRING
 491Message-Id: MESSAGE-ID-STRING
 492X-Mailer: X-MAILER-STRING
 493
 494Result: OK
 495EOF
 496"
 497
 498test_expect_success $PREREQ 'sendemail.cccmd' '
 499        echo echo cc-cmd@example.com > cccmd &&
 500        chmod +x cccmd &&
 501        git config sendemail.cccmd ./cccmd &&
 502        test_suppression cccmd
 503'
 504
 505test_expect_success $PREREQ 'setup expect' '
 506cat >expected-suppress-all <<\EOF
 5070001-Second.patch
 508Dry-OK. Log says:
 509Server: relay.example.com
 510MAIL FROM:<from@example.com>
 511RCPT TO:<to@example.com>
 512From: Example <from@example.com>
 513To: to@example.com
 514Subject: [PATCH 1/1] Second.
 515Date: DATE-STRING
 516Message-Id: MESSAGE-ID-STRING
 517X-Mailer: X-MAILER-STRING
 518
 519Result: OK
 520EOF
 521'
 522
 523test_expect_success $PREREQ '--suppress-cc=all' '
 524        test_suppression all
 525'
 526
 527test_expect_success $PREREQ 'setup expect' "
 528cat >expected-suppress-body <<\EOF
 5290001-Second.patch
 530(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 531(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 532(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 533(cc-cmd) Adding cc: cc-cmd@example.com from: './cccmd'
 534Dry-OK. Log says:
 535Server: relay.example.com
 536MAIL FROM:<from@example.com>
 537RCPT TO:<to@example.com>
 538RCPT TO:<author@example.com>
 539RCPT TO:<one@example.com>
 540RCPT TO:<two@example.com>
 541RCPT TO:<cc-cmd@example.com>
 542From: Example <from@example.com>
 543To: to@example.com
 544Cc: A <author@example.com>,
 545        One <one@example.com>,
 546        two@example.com,
 547        cc-cmd@example.com
 548Subject: [PATCH 1/1] Second.
 549Date: DATE-STRING
 550Message-Id: MESSAGE-ID-STRING
 551X-Mailer: X-MAILER-STRING
 552
 553Result: OK
 554EOF
 555"
 556
 557test_expect_success $PREREQ '--suppress-cc=body' '
 558        test_suppression body
 559'
 560
 561test_expect_success $PREREQ 'setup expect' "
 562cat >expected-suppress-body-cccmd <<\EOF
 5630001-Second.patch
 564(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 565(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 566(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 567Dry-OK. Log says:
 568Server: relay.example.com
 569MAIL FROM:<from@example.com>
 570RCPT TO:<to@example.com>
 571RCPT TO:<author@example.com>
 572RCPT TO:<one@example.com>
 573RCPT TO:<two@example.com>
 574From: Example <from@example.com>
 575To: to@example.com
 576Cc: A <author@example.com>,
 577        One <one@example.com>,
 578        two@example.com
 579Subject: [PATCH 1/1] Second.
 580Date: DATE-STRING
 581Message-Id: MESSAGE-ID-STRING
 582X-Mailer: X-MAILER-STRING
 583
 584Result: OK
 585EOF
 586"
 587
 588test_expect_success $PREREQ '--suppress-cc=body --suppress-cc=cccmd' '
 589        test_suppression body cccmd
 590'
 591
 592test_expect_success $PREREQ 'setup expect' "
 593cat >expected-suppress-sob <<\EOF
 5940001-Second.patch
 595(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 596(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 597(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 598Dry-OK. Log says:
 599Server: relay.example.com
 600MAIL FROM:<from@example.com>
 601RCPT TO:<to@example.com>
 602RCPT TO:<author@example.com>
 603RCPT TO:<one@example.com>
 604RCPT TO:<two@example.com>
 605From: Example <from@example.com>
 606To: to@example.com
 607Cc: A <author@example.com>,
 608        One <one@example.com>,
 609        two@example.com
 610Subject: [PATCH 1/1] Second.
 611Date: DATE-STRING
 612Message-Id: MESSAGE-ID-STRING
 613X-Mailer: X-MAILER-STRING
 614
 615Result: OK
 616EOF
 617"
 618
 619test_expect_success $PREREQ '--suppress-cc=sob' '
 620        test_might_fail git config --unset sendemail.cccmd &&
 621        test_suppression sob
 622'
 623
 624test_expect_success $PREREQ 'setup expect' "
 625cat >expected-suppress-bodycc <<\EOF
 6260001-Second.patch
 627(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 628(mbox) Adding cc: One <one@example.com> from line 'Cc: One <one@example.com>, two@example.com'
 629(mbox) Adding cc: two@example.com from line 'Cc: One <one@example.com>, two@example.com'
 630(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
 631Dry-OK. Log says:
 632Server: relay.example.com
 633MAIL FROM:<from@example.com>
 634RCPT TO:<to@example.com>
 635RCPT TO:<author@example.com>
 636RCPT TO:<one@example.com>
 637RCPT TO:<two@example.com>
 638RCPT TO:<committer@example.com>
 639From: Example <from@example.com>
 640To: to@example.com
 641Cc: A <author@example.com>,
 642        One <one@example.com>,
 643        two@example.com,
 644        C O Mitter <committer@example.com>
 645Subject: [PATCH 1/1] Second.
 646Date: DATE-STRING
 647Message-Id: MESSAGE-ID-STRING
 648X-Mailer: X-MAILER-STRING
 649
 650Result: OK
 651EOF
 652"
 653
 654test_expect_success $PREREQ '--suppress-cc=bodycc' '
 655        test_suppression bodycc
 656'
 657
 658test_expect_success $PREREQ 'setup expect' "
 659cat >expected-suppress-cc <<\EOF
 6600001-Second.patch
 661(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 662(body) Adding cc: C O Mitter <committer@example.com> from line 'Signed-off-by: C O Mitter <committer@example.com>'
 663Dry-OK. Log says:
 664Server: relay.example.com
 665MAIL FROM:<from@example.com>
 666RCPT TO:<to@example.com>
 667RCPT TO:<author@example.com>
 668RCPT TO:<committer@example.com>
 669From: Example <from@example.com>
 670To: to@example.com
 671Cc: A <author@example.com>,
 672        C O Mitter <committer@example.com>
 673Subject: [PATCH 1/1] Second.
 674Date: DATE-STRING
 675Message-Id: MESSAGE-ID-STRING
 676X-Mailer: X-MAILER-STRING
 677
 678Result: OK
 679EOF
 680"
 681
 682test_expect_success $PREREQ '--suppress-cc=cc' '
 683        test_suppression cc
 684'
 685
 686test_confirm () {
 687        echo y | \
 688                GIT_SEND_EMAIL_NOTTY=1 \
 689                git send-email \
 690                --from="Example <nobody@example.com>" \
 691                --to=nobody@example.com \
 692                --smtp-server="$(pwd)/fake.sendmail" \
 693                $@ $patches > stdout &&
 694        grep "Send this email" stdout
 695}
 696
 697test_expect_success $PREREQ '--confirm=always' '
 698        test_confirm --confirm=always --suppress-cc=all
 699'
 700
 701test_expect_success $PREREQ '--confirm=auto' '
 702        test_confirm --confirm=auto
 703'
 704
 705test_expect_success $PREREQ '--confirm=cc' '
 706        test_confirm --confirm=cc
 707'
 708
 709test_expect_success $PREREQ '--confirm=compose' '
 710        test_confirm --confirm=compose --compose
 711'
 712
 713test_expect_success $PREREQ 'confirm by default (due to cc)' '
 714        CONFIRM=$(git config --get sendemail.confirm) &&
 715        git config --unset sendemail.confirm &&
 716        test_confirm
 717        ret="$?"
 718        git config sendemail.confirm ${CONFIRM:-never}
 719        test $ret = "0"
 720'
 721
 722test_expect_success $PREREQ 'confirm by default (due to --compose)' '
 723        CONFIRM=$(git config --get sendemail.confirm) &&
 724        git config --unset sendemail.confirm &&
 725        test_confirm --suppress-cc=all --compose
 726        ret="$?"
 727        git config sendemail.confirm ${CONFIRM:-never}
 728        test $ret = "0"
 729'
 730
 731test_expect_success $PREREQ 'confirm detects EOF (inform assumes y)' '
 732        CONFIRM=$(git config --get sendemail.confirm) &&
 733        git config --unset sendemail.confirm &&
 734        rm -fr outdir &&
 735        git format-patch -2 -o outdir &&
 736        GIT_SEND_EMAIL_NOTTY=1 \
 737                git send-email \
 738                        --from="Example <nobody@example.com>" \
 739                        --to=nobody@example.com \
 740                        --smtp-server="$(pwd)/fake.sendmail" \
 741                        outdir/*.patch < /dev/null
 742        ret="$?"
 743        git config sendemail.confirm ${CONFIRM:-never}
 744        test $ret = "0"
 745'
 746
 747test_expect_success $PREREQ 'confirm detects EOF (auto causes failure)' '
 748        CONFIRM=$(git config --get sendemail.confirm) &&
 749        git config sendemail.confirm auto &&
 750        GIT_SEND_EMAIL_NOTTY=1 &&
 751        export GIT_SEND_EMAIL_NOTTY &&
 752                test_must_fail git send-email \
 753                        --from="Example <nobody@example.com>" \
 754                        --to=nobody@example.com \
 755                        --smtp-server="$(pwd)/fake.sendmail" \
 756                        $patches < /dev/null
 757        ret="$?"
 758        git config sendemail.confirm ${CONFIRM:-never}
 759        test $ret = "0"
 760'
 761
 762test_expect_success $PREREQ 'confirm doesnt loop forever' '
 763        CONFIRM=$(git config --get sendemail.confirm) &&
 764        git config sendemail.confirm auto &&
 765        GIT_SEND_EMAIL_NOTTY=1 &&
 766        export GIT_SEND_EMAIL_NOTTY &&
 767                yes "bogus" | test_must_fail git send-email \
 768                        --from="Example <nobody@example.com>" \
 769                        --to=nobody@example.com \
 770                        --smtp-server="$(pwd)/fake.sendmail" \
 771                        $patches
 772        ret="$?"
 773        git config sendemail.confirm ${CONFIRM:-never}
 774        test $ret = "0"
 775'
 776
 777test_expect_success $PREREQ 'utf8 Cc is rfc2047 encoded' '
 778        clean_fake_sendmail &&
 779        rm -fr outdir &&
 780        git format-patch -1 -o outdir --cc="àéìöú <utf8@example.com>" &&
 781        git send-email \
 782        --from="Example <nobody@example.com>" \
 783        --to=nobody@example.com \
 784        --smtp-server="$(pwd)/fake.sendmail" \
 785        outdir/*.patch &&
 786        grep "^ " msgtxt1 |
 787        grep "=?UTF-8?q?=C3=A0=C3=A9=C3=AC=C3=B6=C3=BA?= <utf8@example.com>"
 788'
 789
 790test_expect_success $PREREQ '--compose adds MIME for utf8 body' '
 791        clean_fake_sendmail &&
 792        (echo "#!$SHELL_PATH" &&
 793         echo "echo utf8 body: àéìöú >>\"\$1\""
 794        ) >fake-editor-utf8 &&
 795        chmod +x fake-editor-utf8 &&
 796          GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
 797          git send-email \
 798          --compose --subject foo \
 799          --from="Example <nobody@example.com>" \
 800          --to=nobody@example.com \
 801          --smtp-server="$(pwd)/fake.sendmail" \
 802          $patches &&
 803        grep "^utf8 body" msgtxt1 &&
 804        grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1
 805'
 806
 807test_expect_success $PREREQ '--compose respects user mime type' '
 808        clean_fake_sendmail &&
 809        (echo "#!$SHELL_PATH" &&
 810         echo "(echo MIME-Version: 1.0"
 811         echo " echo Content-Type: text/plain\\; charset=iso-8859-1"
 812         echo " echo Content-Transfer-Encoding: 8bit"
 813         echo " echo Subject: foo"
 814         echo " echo "
 815         echo " echo utf8 body: àéìöú) >\"\$1\""
 816        ) >fake-editor-utf8-mime &&
 817        chmod +x fake-editor-utf8-mime &&
 818          GIT_EDITOR="\"$(pwd)/fake-editor-utf8-mime\"" \
 819          git send-email \
 820          --compose --subject foo \
 821          --from="Example <nobody@example.com>" \
 822          --to=nobody@example.com \
 823          --smtp-server="$(pwd)/fake.sendmail" \
 824          $patches &&
 825        grep "^utf8 body" msgtxt1 &&
 826        grep "^Content-Type: text/plain; charset=iso-8859-1" msgtxt1 &&
 827        ! grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1
 828'
 829
 830test_expect_success $PREREQ '--compose adds MIME for utf8 subject' '
 831        clean_fake_sendmail &&
 832          GIT_EDITOR="\"$(pwd)/fake-editor\"" \
 833          git send-email \
 834          --compose --subject utf8-sübjëct \
 835          --from="Example <nobody@example.com>" \
 836          --to=nobody@example.com \
 837          --smtp-server="$(pwd)/fake.sendmail" \
 838          $patches &&
 839        grep "^fake edit" msgtxt1 &&
 840        grep "^Subject: =?UTF-8?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1
 841'
 842
 843test_expect_success $PREREQ 'detects ambiguous reference/file conflict' '
 844        echo master > master &&
 845        git add master &&
 846        git commit -m"add master" &&
 847        test_must_fail git send-email --dry-run master 2>errors &&
 848        grep disambiguate errors
 849'
 850
 851test_expect_success $PREREQ 'feed two files' '
 852        rm -fr outdir &&
 853        git format-patch -2 -o outdir &&
 854        git send-email \
 855        --dry-run \
 856        --from="Example <nobody@example.com>" \
 857        --to=nobody@example.com \
 858        outdir/000?-*.patch 2>errors >out &&
 859        grep "^Subject: " out >subjects &&
 860        test "z$(sed -n -e 1p subjects)" = "zSubject: [PATCH 1/2] Second." &&
 861        test "z$(sed -n -e 2p subjects)" = "zSubject: [PATCH 2/2] add master"
 862'
 863
 864test_expect_success $PREREQ 'in-reply-to but no threading' '
 865        git send-email \
 866                --dry-run \
 867                --from="Example <nobody@example.com>" \
 868                --to=nobody@example.com \
 869                --in-reply-to="<in-reply-id@example.com>" \
 870                --nothread \
 871                $patches |
 872        grep "In-Reply-To: <in-reply-id@example.com>"
 873'
 874
 875test_expect_success $PREREQ 'no in-reply-to and no threading' '
 876        git send-email \
 877                --dry-run \
 878                --from="Example <nobody@example.com>" \
 879                --to=nobody@example.com \
 880                --nothread \
 881                $patches $patches >stdout &&
 882        ! grep "In-Reply-To: " stdout
 883'
 884
 885test_expect_success $PREREQ 'threading but no chain-reply-to' '
 886        git send-email \
 887                --dry-run \
 888                --from="Example <nobody@example.com>" \
 889                --to=nobody@example.com \
 890                --thread \
 891                --nochain-reply-to \
 892                $patches $patches >stdout &&
 893        grep "In-Reply-To: " stdout
 894'
 895
 896test_expect_success $PREREQ 'warning with an implicit --chain-reply-to' '
 897        git send-email \
 898        --dry-run \
 899        --from="Example <nobody@example.com>" \
 900        --to=nobody@example.com \
 901        outdir/000?-*.patch 2>errors >out &&
 902        grep "no-chain-reply-to" errors
 903'
 904
 905test_expect_success $PREREQ 'no warning with an explicit --chain-reply-to' '
 906        git send-email \
 907        --dry-run \
 908        --from="Example <nobody@example.com>" \
 909        --to=nobody@example.com \
 910        --chain-reply-to \
 911        outdir/000?-*.patch 2>errors >out &&
 912        ! grep "no-chain-reply-to" errors
 913'
 914
 915test_expect_success $PREREQ 'no warning with an explicit --no-chain-reply-to' '
 916        git send-email \
 917        --dry-run \
 918        --from="Example <nobody@example.com>" \
 919        --to=nobody@example.com \
 920        --nochain-reply-to \
 921        outdir/000?-*.patch 2>errors >out &&
 922        ! grep "no-chain-reply-to" errors
 923'
 924
 925test_expect_success $PREREQ 'no warning with sendemail.chainreplyto = false' '
 926        git config sendemail.chainreplyto false &&
 927        git send-email \
 928        --dry-run \
 929        --from="Example <nobody@example.com>" \
 930        --to=nobody@example.com \
 931        outdir/000?-*.patch 2>errors >out &&
 932        ! grep "no-chain-reply-to" errors
 933'
 934
 935test_expect_success $PREREQ 'no warning with sendemail.chainreplyto = true' '
 936        git config sendemail.chainreplyto true &&
 937        git send-email \
 938        --dry-run \
 939        --from="Example <nobody@example.com>" \
 940        --to=nobody@example.com \
 941        outdir/000?-*.patch 2>errors >out &&
 942        ! grep "no-chain-reply-to" errors
 943'
 944
 945test_expect_success $PREREQ 'sendemail.to works' '
 946        git config --replace-all sendemail.to "Somebody <somebody@ex.com>" &&
 947        git send-email \
 948                --dry-run \
 949                --from="Example <nobody@example.com>" \
 950                $patches $patches >stdout &&
 951        grep "To: Somebody <somebody@ex.com>" stdout
 952'
 953
 954test_expect_success $PREREQ '--no-to overrides sendemail.to' '
 955        git send-email \
 956                --dry-run \
 957                --from="Example <nobody@example.com>" \
 958                --no-to \
 959                --to=nobody@example.com \
 960                $patches $patches >stdout &&
 961        grep "To: nobody@example.com" stdout &&
 962        ! grep "To: Somebody <somebody@ex.com>" stdout
 963'
 964
 965test_expect_success $PREREQ 'sendemail.cc works' '
 966        git config --replace-all sendemail.cc "Somebody <somebody@ex.com>" &&
 967        git send-email \
 968                --dry-run \
 969                --from="Example <nobody@example.com>" \
 970                --to=nobody@example.com \
 971                $patches $patches >stdout &&
 972        grep "Cc: Somebody <somebody@ex.com>" stdout
 973'
 974
 975test_expect_success $PREREQ '--no-cc overrides sendemail.cc' '
 976        git send-email \
 977                --dry-run \
 978                --from="Example <nobody@example.com>" \
 979                --no-cc \
 980                --cc=bodies@example.com \
 981                --to=nobody@example.com \
 982                $patches $patches >stdout &&
 983        grep "Cc: bodies@example.com" stdout &&
 984        ! grep "Cc: Somebody <somebody@ex.com>" stdout
 985'
 986
 987test_expect_success $PREREQ 'sendemail.bcc works' '
 988        git config --replace-all sendemail.bcc "Other <other@ex.com>" &&
 989        git send-email \
 990                --dry-run \
 991                --from="Example <nobody@example.com>" \
 992                --to=nobody@example.com \
 993                --smtp-server relay.example.com \
 994                $patches $patches >stdout &&
 995        grep "RCPT TO:<other@ex.com>" stdout
 996'
 997
 998test_expect_success $PREREQ '--no-bcc overrides sendemail.bcc' '
 999        git send-email \
1000                --dry-run \
1001                --from="Example <nobody@example.com>" \
1002                --no-bcc \
1003                --bcc=bodies@example.com \
1004                --to=nobody@example.com \
1005                --smtp-server relay.example.com \
1006                $patches $patches >stdout &&
1007        grep "RCPT TO:<bodies@example.com>" stdout &&
1008        ! grep "RCPT TO:<other@ex.com>" stdout
1009'
1010
1011test_expect_success $PREREQ 'patches To headers are used by default' '
1012        patch=`git format-patch -1 --to="bodies@example.com"` &&
1013        test_when_finished "rm $patch" &&
1014        git send-email \
1015                --dry-run \
1016                --from="Example <nobody@example.com>" \
1017                --smtp-server relay.example.com \
1018                $patch >stdout &&
1019        grep "RCPT TO:<bodies@example.com>" stdout
1020'
1021
1022test_expect_success $PREREQ 'patches To headers are appended to' '
1023        patch=`git format-patch -1 --to="bodies@example.com"` &&
1024        test_when_finished "rm $patch" &&
1025        git send-email \
1026                --dry-run \
1027                --from="Example <nobody@example.com>" \
1028                --to=nobody@example.com \
1029                --smtp-server relay.example.com \
1030                $patch >stdout &&
1031        grep "RCPT TO:<bodies@example.com>" stdout &&
1032        grep "RCPT TO:<nobody@example.com>" stdout
1033'
1034
1035test_expect_success $PREREQ 'To headers from files reset each patch' '
1036        patch1=`git format-patch -1 --to="bodies@example.com"` &&
1037        patch2=`git format-patch -1 --to="other@example.com" HEAD~` &&
1038        test_when_finished "rm $patch1 && rm $patch2" &&
1039        git send-email \
1040                --dry-run \
1041                --from="Example <nobody@example.com>" \
1042                --to="nobody@example.com" \
1043                --smtp-server relay.example.com \
1044                $patch1 $patch2 >stdout &&
1045        test $(grep -c "RCPT TO:<bodies@example.com>" stdout) = 1 &&
1046        test $(grep -c "RCPT TO:<nobody@example.com>" stdout) = 2 &&
1047        test $(grep -c "RCPT TO:<other@example.com>" stdout) = 1
1048'
1049
1050test_expect_success $PREREQ 'setup expect' '
1051cat >email-using-8bit <<EOF
1052From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
1053Message-Id: <bogus-message-id@example.com>
1054From: author@example.com
1055Date: Sat, 12 Jun 2010 15:53:58 +0200
1056Subject: subject goes here
1057
1058Dieser deutsche Text enthält einen Umlaut!
1059EOF
1060'
1061
1062test_expect_success $PREREQ 'setup expect' '
1063cat >content-type-decl <<EOF
1064MIME-Version: 1.0
1065Content-Type: text/plain; charset=UTF-8
1066Content-Transfer-Encoding: 8bit
1067EOF
1068'
1069
1070test_expect_success $PREREQ 'asks about and fixes 8bit encodings' '
1071        clean_fake_sendmail &&
1072        echo |
1073        git send-email --from=author@example.com --to=nobody@example.com \
1074                        --smtp-server="$(pwd)/fake.sendmail" \
1075                        email-using-8bit >stdout &&
1076        grep "do not declare a Content-Transfer-Encoding" stdout &&
1077        grep email-using-8bit stdout &&
1078        grep "Which 8bit encoding" stdout &&
1079        egrep "Content|MIME" msgtxt1 >actual &&
1080        test_cmp actual content-type-decl
1081'
1082
1083test_expect_success $PREREQ 'sendemail.8bitEncoding works' '
1084        clean_fake_sendmail &&
1085        git config sendemail.assume8bitEncoding UTF-8 &&
1086        echo bogus |
1087        git send-email --from=author@example.com --to=nobody@example.com \
1088                        --smtp-server="$(pwd)/fake.sendmail" \
1089                        email-using-8bit >stdout &&
1090        egrep "Content|MIME" msgtxt1 >actual &&
1091        test_cmp actual content-type-decl
1092'
1093
1094test_expect_success $PREREQ '--8bit-encoding overrides sendemail.8bitEncoding' '
1095        clean_fake_sendmail &&
1096        git config sendemail.assume8bitEncoding "bogus too" &&
1097        echo bogus |
1098        git send-email --from=author@example.com --to=nobody@example.com \
1099                        --smtp-server="$(pwd)/fake.sendmail" \
1100                        --8bit-encoding=UTF-8 \
1101                        email-using-8bit >stdout &&
1102        egrep "Content|MIME" msgtxt1 >actual &&
1103        test_cmp actual content-type-decl
1104'
1105
1106test_expect_success $PREREQ 'setup expect' '
1107cat >email-using-8bit <<EOF
1108From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001
1109Message-Id: <bogus-message-id@example.com>
1110From: author@example.com
1111Date: Sat, 12 Jun 2010 15:53:58 +0200
1112Subject: Dieser Betreff enthält auch einen Umlaut!
1113
1114Nothing to see here.
1115EOF
1116'
1117
1118test_expect_success $PREREQ 'setup expect' '
1119cat >expected <<EOF
1120Subject: =?UTF-8?q?Dieser=20Betreff=20enth=C3=A4lt=20auch=20einen=20Umlaut!?=
1121EOF
1122'
1123
1124test_expect_success $PREREQ '--8bit-encoding also treats subject' '
1125        clean_fake_sendmail &&
1126        echo bogus |
1127        git send-email --from=author@example.com --to=nobody@example.com \
1128                        --smtp-server="$(pwd)/fake.sendmail" \
1129                        --8bit-encoding=UTF-8 \
1130                        email-using-8bit >stdout &&
1131        grep "Subject" msgtxt1 >actual &&
1132        test_cmp expected actual
1133'
1134
1135# Note that the patches in this test are deliberately out of order; we
1136# want to make sure it works even if the cover-letter is not in the
1137# first mail.
1138test_expect_success $PREREQ 'refusing to send cover letter template' '
1139        clean_fake_sendmail &&
1140        rm -fr outdir &&
1141        git format-patch --cover-letter -2 -o outdir &&
1142        test_must_fail git send-email \
1143          --from="Example <nobody@example.com>" \
1144          --to=nobody@example.com \
1145          --smtp-server="$(pwd)/fake.sendmail" \
1146          outdir/0002-*.patch \
1147          outdir/0000-*.patch \
1148          outdir/0001-*.patch \
1149          2>errors >out &&
1150        grep "SUBJECT HERE" errors &&
1151        test -z "$(ls msgtxt*)"
1152'
1153
1154test_expect_success $PREREQ '--force sends cover letter template anyway' '
1155        clean_fake_sendmail &&
1156        rm -fr outdir &&
1157        git format-patch --cover-letter -2 -o outdir &&
1158        git send-email \
1159          --force \
1160          --from="Example <nobody@example.com>" \
1161          --to=nobody@example.com \
1162          --smtp-server="$(pwd)/fake.sendmail" \
1163          outdir/0002-*.patch \
1164          outdir/0000-*.patch \
1165          outdir/0001-*.patch \
1166          2>errors >out &&
1167        ! grep "SUBJECT HERE" errors &&
1168        test -n "$(ls msgtxt*)"
1169'
1170
1171test_done