t / t9001-send-email.shon commit send-email: do not reverse the command line arguments (69f4ce5)
   1#!/bin/sh
   2
   3test_description='git send-email'
   4. ./test-lib.sh
   5
   6PROG='git send-email'
   7test_expect_success \
   8    'prepare reference tree' \
   9    'echo "1A quick brown fox jumps over the" >file &&
  10     echo "lazy dog" >>file &&
  11     git add file &&
  12     GIT_AUTHOR_NAME="A" git commit -a -m "Initial."'
  13
  14test_expect_success \
  15    'Setup helper tool' \
  16    '(echo "#!$SHELL_PATH"
  17      echo shift
  18      echo output=1
  19      echo "while test -f commandline\$output; do output=\$((\$output+1)); done"
  20      echo for a
  21      echo do
  22      echo "  echo \"!\$a!\""
  23      echo "done >commandline\$output"
  24      echo "cat > msgtxt\$output"
  25      ) >fake.sendmail &&
  26     chmod +x ./fake.sendmail &&
  27     git add fake.sendmail &&
  28     GIT_AUTHOR_NAME="A" git commit -a -m "Second."'
  29
  30clean_fake_sendmail() {
  31        rm -f commandline* msgtxt*
  32}
  33
  34test_expect_success 'Extract patches' '
  35    patches=`git format-patch -n HEAD^1`
  36'
  37
  38test_expect_success 'Send patches' '
  39     git send-email --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors
  40'
  41
  42cat >expected <<\EOF
  43!nobody@example.com!
  44!author@example.com!
  45EOF
  46test_expect_success \
  47    'Verify commandline' \
  48    'diff commandline1 expected'
  49
  50cat >expected-show-all-headers <<\EOF
  510001-Second.patch
  52(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
  53Dry-OK. Log says:
  54Server: relay.example.com
  55MAIL FROM:<from@example.com>
  56RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>,<bcc@example.com>
  57From: Example <from@example.com>
  58To: to@example.com
  59Cc: cc@example.com, A <author@example.com>
  60Subject: [PATCH 1/1] Second.
  61Date: DATE-STRING
  62Message-Id: MESSAGE-ID-STRING
  63X-Mailer: X-MAILER-STRING
  64In-Reply-To: <unique-message-id@example.com>
  65References: <unique-message-id@example.com>
  66
  67Result: OK
  68EOF
  69
  70test_expect_success 'Show all headers' '
  71        git send-email \
  72                --dry-run \
  73                --from="Example <from@example.com>" \
  74                --to=to@example.com \
  75                --cc=cc@example.com \
  76                --bcc=bcc@example.com \
  77                --in-reply-to="<unique-message-id@example.com>" \
  78                --smtp-server relay.example.com \
  79                $patches |
  80        sed     -e "s/^\(Date:\).*/\1 DATE-STRING/" \
  81                -e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
  82                -e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
  83                >actual-show-all-headers &&
  84        test_cmp expected-show-all-headers actual-show-all-headers
  85'
  86
  87z8=zzzzzzzz
  88z64=$z8$z8$z8$z8$z8$z8$z8$z8
  89z512=$z64$z64$z64$z64$z64$z64$z64$z64
  90test_expect_success 'reject long lines' '
  91        clean_fake_sendmail &&
  92        cp $patches longline.patch &&
  93        echo $z512$z512 >>longline.patch &&
  94        test_must_fail git send-email \
  95                --from="Example <nobody@example.com>" \
  96                --to=nobody@example.com \
  97                --smtp-server="$(pwd)/fake.sendmail" \
  98                $patches longline.patch \
  99                2>errors &&
 100        grep longline.patch errors
 101'
 102
 103test_expect_success 'no patch was sent' '
 104        ! test -e commandline1
 105'
 106
 107test_expect_success 'allow long lines with --no-validate' '
 108        git send-email \
 109                --from="Example <nobody@example.com>" \
 110                --to=nobody@example.com \
 111                --smtp-server="$(pwd)/fake.sendmail" \
 112                --novalidate \
 113                $patches longline.patch \
 114                2>errors
 115'
 116
 117test_expect_success 'Invalid In-Reply-To' '
 118        clean_fake_sendmail &&
 119        git send-email \
 120                --from="Example <nobody@example.com>" \
 121                --to=nobody@example.com \
 122                --in-reply-to=" " \
 123                --smtp-server="$(pwd)/fake.sendmail" \
 124                $patches
 125                2>errors
 126        ! grep "^In-Reply-To: < *>" msgtxt1
 127'
 128
 129test_expect_success 'Valid In-Reply-To when prompting' '
 130        clean_fake_sendmail &&
 131        (echo "From Example <from@example.com>"
 132         echo "To Example <to@example.com>"
 133         echo ""
 134        ) | env GIT_SEND_EMAIL_NOTTY=1 git send-email \
 135                --smtp-server="$(pwd)/fake.sendmail" \
 136                $patches 2>errors &&
 137        ! grep "^In-Reply-To: < *>" msgtxt1
 138'
 139
 140test_expect_success 'setup fake editor' '
 141        (echo "#!$SHELL_PATH" &&
 142         echo "echo fake edit >>\"\$1\""
 143        ) >fake-editor &&
 144        chmod +x fake-editor
 145'
 146
 147test_set_editor "$(pwd)/fake-editor"
 148
 149test_expect_success '--compose works' '
 150        clean_fake_sendmail &&
 151        echo y | \
 152                GIT_SEND_EMAIL_NOTTY=1 \
 153                git send-email \
 154                --compose --subject foo \
 155                --from="Example <nobody@example.com>" \
 156                --to=nobody@example.com \
 157                --smtp-server="$(pwd)/fake.sendmail" \
 158                $patches \
 159                2>errors
 160'
 161
 162test_expect_success 'first message is compose text' '
 163        grep "^fake edit" msgtxt1
 164'
 165
 166test_expect_success 'second message is patch' '
 167        grep "Subject:.*Second" msgtxt2
 168'
 169
 170cat >expected-show-all-headers <<\EOF
 1710001-Second.patch
 172(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 173Dry-OK. Log says:
 174Server: relay.example.com
 175MAIL FROM:<from@example.com>
 176RCPT TO:<to@example.com>,<cc@example.com>,<author@example.com>
 177From: Example <from@example.com>
 178To: to@example.com
 179Cc: cc@example.com, A <author@example.com>
 180Subject: [PATCH 1/1] Second.
 181Date: DATE-STRING
 182Message-Id: MESSAGE-ID-STRING
 183X-Mailer: X-MAILER-STRING
 184
 185Result: OK
 186EOF
 187
 188test_expect_success 'sendemail.cc set' '
 189        git config sendemail.cc cc@example.com &&
 190        git send-email \
 191                --dry-run \
 192                --from="Example <from@example.com>" \
 193                --to=to@example.com \
 194                --smtp-server relay.example.com \
 195                $patches |
 196        sed     -e "s/^\(Date:\).*/\1 DATE-STRING/" \
 197                -e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
 198                -e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
 199                >actual-show-all-headers &&
 200        test_cmp expected-show-all-headers actual-show-all-headers
 201'
 202
 203cat >expected-show-all-headers <<\EOF
 2040001-Second.patch
 205(mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>'
 206Dry-OK. Log says:
 207Server: relay.example.com
 208MAIL FROM:<from@example.com>
 209RCPT TO:<to@example.com>,<author@example.com>
 210From: Example <from@example.com>
 211To: to@example.com
 212Cc: A <author@example.com>
 213Subject: [PATCH 1/1] Second.
 214Date: DATE-STRING
 215Message-Id: MESSAGE-ID-STRING
 216X-Mailer: X-MAILER-STRING
 217
 218Result: OK
 219EOF
 220
 221test_expect_success 'sendemail.cc unset' '
 222        git config --unset sendemail.cc &&
 223        git send-email \
 224                --dry-run \
 225                --from="Example <from@example.com>" \
 226                --to=to@example.com \
 227                --smtp-server relay.example.com \
 228                $patches |
 229        sed     -e "s/^\(Date:\).*/\1 DATE-STRING/" \
 230                -e "s/^\(Message-Id:\).*/\1 MESSAGE-ID-STRING/" \
 231                -e "s/^\(X-Mailer:\).*/\1 X-MAILER-STRING/" \
 232                >actual-show-all-headers &&
 233        test_cmp expected-show-all-headers actual-show-all-headers
 234'
 235
 236test_expect_success '--compose adds MIME for utf8 body' '
 237        clean_fake_sendmail &&
 238        (echo "#!$SHELL_PATH" &&
 239         echo "echo utf8 body: àéìöú >>\"\$1\""
 240        ) >fake-editor-utf8 &&
 241        chmod +x fake-editor-utf8 &&
 242        echo y | \
 243          GIT_EDITOR="\"$(pwd)/fake-editor-utf8\"" \
 244          GIT_SEND_EMAIL_NOTTY=1 \
 245          git send-email \
 246          --compose --subject foo \
 247          --from="Example <nobody@example.com>" \
 248          --to=nobody@example.com \
 249          --smtp-server="$(pwd)/fake.sendmail" \
 250          $patches &&
 251        grep "^utf8 body" msgtxt1 &&
 252        grep "^Content-Type: text/plain; charset=utf-8" msgtxt1
 253'
 254
 255test_expect_success '--compose respects user mime type' '
 256        clean_fake_sendmail &&
 257        (echo "#!$SHELL_PATH" &&
 258         echo "(echo MIME-Version: 1.0"
 259         echo " echo Content-Type: text/plain\\; charset=iso-8859-1"
 260         echo " echo Content-Transfer-Encoding: 8bit"
 261         echo " echo Subject: foo"
 262         echo " echo "
 263         echo " echo utf8 body: àéìöú) >\"\$1\""
 264        ) >fake-editor-utf8-mime &&
 265        chmod +x fake-editor-utf8-mime &&
 266        echo y | \
 267          GIT_EDITOR="\"$(pwd)/fake-editor-utf8-mime\"" \
 268          GIT_SEND_EMAIL_NOTTY=1 \
 269          git send-email \
 270          --compose --subject foo \
 271          --from="Example <nobody@example.com>" \
 272          --to=nobody@example.com \
 273          --smtp-server="$(pwd)/fake.sendmail" \
 274          $patches &&
 275        grep "^utf8 body" msgtxt1 &&
 276        grep "^Content-Type: text/plain; charset=iso-8859-1" msgtxt1 &&
 277        ! grep "^Content-Type: text/plain; charset=utf-8" msgtxt1
 278'
 279
 280test_expect_success '--compose adds MIME for utf8 subject' '
 281        clean_fake_sendmail &&
 282        echo y | \
 283          GIT_EDITOR="\"$(pwd)/fake-editor\"" \
 284          GIT_SEND_EMAIL_NOTTY=1 \
 285          git send-email \
 286          --compose --subject utf8-sübjëct \
 287          --from="Example <nobody@example.com>" \
 288          --to=nobody@example.com \
 289          --smtp-server="$(pwd)/fake.sendmail" \
 290          $patches &&
 291        grep "^fake edit" msgtxt1 &&
 292        grep "^Subject: =?utf-8?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1
 293'
 294
 295test_expect_success 'detects ambiguous reference/file conflict' '
 296        echo master > master &&
 297        git add master &&
 298        git commit -m"add master" &&
 299        test_must_fail git send-email --dry-run master 2>errors &&
 300        grep disambiguate errors
 301'
 302
 303test_expect_success 'feed two files' '
 304        rm -fr outdir &&
 305        git format-patch -2 -o outdir &&
 306        GIT_SEND_EMAIL_NOTTY=1 git send-email \
 307        --dry-run \
 308        --from="Example <nobody@example.com>" \
 309        --to=nobody@example.com \
 310        outdir/000?-*.patch 2>errors >out &&
 311        grep "^Subject: " out >subjects &&
 312        test "z$(sed -n -e 1p subjects)" = "zSubject: [PATCH 1/2] Second." &&
 313        test "z$(sed -n -e 2p subjects)" = "zSubject: [PATCH 2/2] add master"
 314'
 315
 316test_done