t / t7501-commit-basic-functionality.shon commit parse-options: drop OPT_DATE() (0a8a16a)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
   4#
   5
   6# FIXME: Test the various index usages, -i and -o, test reflog,
   7# signoff
   8
   9test_description='git commit'
  10. ./test-lib.sh
  11. "$TEST_DIRECTORY/diff-lib.sh"
  12
  13author='The Real Author <someguy@his.email.org>'
  14
  15test_tick
  16
  17test_expect_success 'initial status' '
  18        echo bongo bongo >file &&
  19        git add file &&
  20        git status >actual &&
  21        test_i18ngrep "No commits yet" actual
  22'
  23
  24test_expect_success 'fail initial amend' '
  25        test_must_fail git commit --amend
  26'
  27
  28test_expect_success 'setup: initial commit' '
  29        git commit -m initial
  30'
  31
  32test_expect_success '-m and -F do not mix' '
  33        git checkout HEAD file && echo >>file && git add file &&
  34        test_must_fail git commit -m foo -m bar -F file
  35'
  36
  37test_expect_success '-m and -C do not mix' '
  38        git checkout HEAD file && echo >>file && git add file &&
  39        test_must_fail git commit -C HEAD -m illegal
  40'
  41
  42test_expect_success 'paths and -a do not mix' '
  43        echo King of the bongo >file &&
  44        test_must_fail git commit -m foo -a file
  45'
  46
  47test_expect_success PERL 'can use paths with --interactive' '
  48        echo bong-o-bong >file &&
  49        # 2: update, 1:st path, that is all, 7: quit
  50        test_write_lines 2 1 "" 7 |
  51        git commit -m foo --interactive file &&
  52        git reset --hard HEAD^
  53'
  54
  55test_expect_success 'removed files and relative paths' '
  56        test_when_finished "rm -rf foo" &&
  57        git init foo &&
  58        >foo/foo.txt &&
  59        git -C foo add foo.txt &&
  60        git -C foo commit -m first &&
  61        git -C foo rm foo.txt &&
  62
  63        mkdir -p foo/bar &&
  64        git -C foo/bar commit -m second ../foo.txt
  65'
  66
  67test_expect_success 'using invalid commit with -C' '
  68        test_must_fail git commit --allow-empty -C bogus
  69'
  70
  71test_expect_success 'nothing to commit' '
  72        git reset --hard &&
  73        test_must_fail git commit -m initial
  74'
  75
  76test_expect_success '--dry-run fails with nothing to commit' '
  77        test_must_fail git commit -m initial --dry-run
  78'
  79
  80test_expect_success '--short fails with nothing to commit' '
  81        test_must_fail git commit -m initial --short
  82'
  83
  84test_expect_success '--porcelain fails with nothing to commit' '
  85        test_must_fail git commit -m initial --porcelain
  86'
  87
  88test_expect_success '--long fails with nothing to commit' '
  89        test_must_fail git commit -m initial --long
  90'
  91
  92test_expect_success 'setup: non-initial commit' '
  93        echo bongo bongo bongo >file &&
  94        git commit -m next -a
  95'
  96
  97test_expect_success '--dry-run with stuff to commit returns ok' '
  98        echo bongo bongo bongo >>file &&
  99        git commit -m next -a --dry-run
 100'
 101
 102test_expect_success '--short with stuff to commit returns ok' '
 103        echo bongo bongo bongo >>file &&
 104        git commit -m next -a --short
 105'
 106
 107test_expect_success '--porcelain with stuff to commit returns ok' '
 108        echo bongo bongo bongo >>file &&
 109        git commit -m next -a --porcelain
 110'
 111
 112test_expect_success '--long with stuff to commit returns ok' '
 113        echo bongo bongo bongo >>file &&
 114        git commit -m next -a --long
 115'
 116
 117test_expect_success 'commit message from non-existing file' '
 118        echo more bongo: bongo bongo bongo bongo >file &&
 119        test_must_fail git commit -F gah -a
 120'
 121
 122test_expect_success 'empty commit message' '
 123        # Empty except stray tabs and spaces on a few lines.
 124        sed -e "s/@//g" >msg <<-\EOF &&
 125                @               @
 126                @@
 127                @  @
 128                @Signed-off-by: hula@
 129        EOF
 130        test_must_fail git commit -F msg -a
 131'
 132
 133test_expect_success 'template "emptyness" check does not kick in with -F' '
 134        git checkout HEAD file && echo >>file && git add file &&
 135        git commit -t file -F file
 136'
 137
 138test_expect_success 'template "emptyness" check' '
 139        git checkout HEAD file && echo >>file && git add file &&
 140        test_must_fail git commit -t file 2>err &&
 141        test_i18ngrep "did not edit" err
 142'
 143
 144test_expect_success 'setup: commit message from file' '
 145        git checkout HEAD file && echo >>file && git add file &&
 146        echo this is the commit message, coming from a file >msg &&
 147        git commit -F msg -a
 148'
 149
 150test_expect_success 'amend commit' '
 151        cat >editor <<-\EOF &&
 152        #!/bin/sh
 153        sed -e "s/a file/an amend commit/g" < "$1" > "$1-"
 154        mv "$1-" "$1"
 155        EOF
 156        chmod 755 editor &&
 157        EDITOR=./editor git commit --amend
 158'
 159
 160test_expect_success 'amend --only ignores staged contents' '
 161        cp file file.expect &&
 162        echo changed >file &&
 163        git add file &&
 164        git commit --no-edit --amend --only &&
 165        git cat-file blob HEAD:file >file.actual &&
 166        test_cmp file.expect file.actual &&
 167        git diff --exit-code
 168'
 169
 170test_expect_success 'allow-empty --only ignores staged contents' '
 171        echo changed-again >file &&
 172        git add file &&
 173        git commit --allow-empty --only -m "empty" &&
 174        git cat-file blob HEAD:file >file.actual &&
 175        test_cmp file.expect file.actual &&
 176        git diff --exit-code
 177'
 178
 179test_expect_success 'set up editor' '
 180        cat >editor <<-\EOF &&
 181        #!/bin/sh
 182        sed -e "s/unamended/amended/g" <"$1" >"$1-"
 183        mv "$1-" "$1"
 184        EOF
 185        chmod 755 editor
 186'
 187
 188test_expect_success 'amend without launching editor' '
 189        echo unamended >expect &&
 190        git commit --allow-empty -m "unamended" &&
 191        echo needs more bongo >file &&
 192        git add file &&
 193        EDITOR=./editor git commit --no-edit --amend &&
 194        git diff --exit-code HEAD -- file &&
 195        git diff-tree -s --format=%s HEAD >msg &&
 196        test_cmp expect msg
 197'
 198
 199test_expect_success '--amend --edit' '
 200        echo amended >expect &&
 201        git commit --allow-empty -m "unamended" &&
 202        echo bongo again >file &&
 203        git add file &&
 204        EDITOR=./editor git commit --edit --amend &&
 205        git diff-tree -s --format=%s HEAD >msg &&
 206        test_cmp expect msg
 207'
 208
 209test_expect_success '--amend --edit of empty message' '
 210        cat >replace <<-\EOF &&
 211        #!/bin/sh
 212        echo "amended" >"$1"
 213        EOF
 214        chmod 755 replace &&
 215        git commit --allow-empty --allow-empty-message -m "" &&
 216        echo more bongo >file &&
 217        git add file &&
 218        EDITOR=./replace git commit --edit --amend &&
 219        git diff-tree -s --format=%s HEAD >msg &&
 220        ./replace expect &&
 221        test_cmp expect msg
 222'
 223
 224test_expect_success '--amend to set message to empty' '
 225        echo bata >file &&
 226        git add file &&
 227        git commit -m "unamended" &&
 228        git commit --amend --allow-empty-message -m "" &&
 229        git diff-tree -s --format=%s HEAD >msg &&
 230        echo "" >expect &&
 231        test_cmp expect msg
 232'
 233
 234test_expect_success '--amend to set empty message needs --allow-empty-message' '
 235        echo conga >file &&
 236        git add file &&
 237        git commit -m "unamended" &&
 238        test_must_fail git commit --amend -m "" &&
 239        git diff-tree -s --format=%s HEAD >msg &&
 240        echo "unamended" >expect &&
 241        test_cmp expect msg
 242'
 243
 244test_expect_success '-m --edit' '
 245        echo amended >expect &&
 246        git commit --allow-empty -m buffer &&
 247        echo bongo bongo >file &&
 248        git add file &&
 249        EDITOR=./editor git commit -m unamended --edit &&
 250        git diff-tree -s  --format=%s HEAD >msg &&
 251        test_cmp expect msg
 252'
 253
 254test_expect_success '-m and -F do not mix' '
 255        echo enough with the bongos >file &&
 256        test_must_fail git commit -F msg -m amending .
 257'
 258
 259test_expect_success 'using message from other commit' '
 260        git commit -C HEAD^ .
 261'
 262
 263test_expect_success 'editing message from other commit' '
 264        cat >editor <<-\EOF &&
 265        #!/bin/sh
 266        sed -e "s/amend/older/g"  < "$1" > "$1-"
 267        mv "$1-" "$1"
 268        EOF
 269        chmod 755 editor &&
 270        echo hula hula >file &&
 271        EDITOR=./editor git commit -c HEAD^ -a
 272'
 273
 274test_expect_success 'message from stdin' '
 275        echo silly new contents >file &&
 276        echo commit message from stdin |
 277        git commit -F - -a
 278'
 279
 280test_expect_success 'overriding author from command line' '
 281        echo gak >file &&
 282        git commit -m author \
 283                --author "Rubber Duck <rduck@convoy.org>" -a >output 2>&1 &&
 284        grep Rubber.Duck output
 285'
 286
 287test_expect_success PERL 'interactive add' '
 288        echo 7 |
 289        git commit --interactive |
 290        grep "What now"
 291'
 292
 293test_expect_success PERL "commit --interactive doesn't change index if editor aborts" '
 294        echo zoo >file &&
 295        test_must_fail git diff --exit-code >diff1 &&
 296        test_write_lines u "*" q |
 297        (
 298                EDITOR=: &&
 299                export EDITOR &&
 300                test_must_fail git commit --interactive
 301        ) &&
 302        git diff >diff2 &&
 303        compare_diff_patch diff1 diff2
 304'
 305
 306test_expect_success 'editor not invoked if -F is given' '
 307        cat >editor <<-\EOF &&
 308        #!/bin/sh
 309        sed -e s/good/bad/g <"$1" >"$1-"
 310        mv "$1-" "$1"
 311        EOF
 312        chmod 755 editor &&
 313
 314        echo A good commit message. >msg &&
 315        echo moo >file &&
 316
 317        EDITOR=./editor git commit -a -F msg &&
 318        git show -s --pretty=format:%s >subject &&
 319        grep -q good subject &&
 320
 321        echo quack >file &&
 322        echo Another good message. |
 323        EDITOR=./editor git commit -a -F - &&
 324        git show -s --pretty=format:%s >subject &&
 325        grep -q good subject
 326'
 327
 328test_expect_success 'partial commit that involves removal (1)' '
 329
 330        git rm --cached file &&
 331        mv file elif &&
 332        git add elif &&
 333        git commit -m "Partial: add elif" elif &&
 334        git diff-tree --name-status HEAD^ HEAD >current &&
 335        echo "A elif" >expected &&
 336        test_cmp expected current
 337
 338'
 339
 340test_expect_success 'partial commit that involves removal (2)' '
 341
 342        git commit -m "Partial: remove file" file &&
 343        git diff-tree --name-status HEAD^ HEAD >current &&
 344        echo "D file" >expected &&
 345        test_cmp expected current
 346
 347'
 348
 349test_expect_success 'partial commit that involves removal (3)' '
 350
 351        git rm --cached elif &&
 352        echo elif >elif &&
 353        git commit -m "Partial: modify elif" elif &&
 354        git diff-tree --name-status HEAD^ HEAD >current &&
 355        echo "M elif" >expected &&
 356        test_cmp expected current
 357
 358'
 359
 360test_expect_success 'amend commit to fix author' '
 361
 362        oldtick=$GIT_AUTHOR_DATE &&
 363        test_tick &&
 364        git reset --hard &&
 365        git cat-file -p HEAD |
 366        sed -e "s/author.*/author $author $oldtick/" \
 367                -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
 368                expected &&
 369        git commit --amend --author="$author" &&
 370        git cat-file -p HEAD > current &&
 371        test_cmp expected current
 372
 373'
 374
 375test_expect_success 'amend commit to fix date' '
 376
 377        test_tick &&
 378        newtick=$GIT_AUTHOR_DATE &&
 379        git reset --hard &&
 380        git cat-file -p HEAD |
 381        sed -e "s/author.*/author $author $newtick/" \
 382                -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
 383                expected &&
 384        git commit --amend --date="$newtick" &&
 385        git cat-file -p HEAD > current &&
 386        test_cmp expected current
 387
 388'
 389
 390test_expect_success 'commit mentions forced date in output' '
 391        git commit --amend --date=2010-01-02T03:04:05 >output &&
 392        grep "Date: *Sat Jan 2 03:04:05 2010" output
 393'
 394
 395test_expect_success 'commit complains about completely bogus dates' '
 396        test_must_fail git commit --amend --date=seventeen
 397'
 398
 399test_expect_success 'commit --date allows approxidate' '
 400        git commit --amend \
 401                --date="midnight the 12th of october, anno domini 1979" &&
 402        echo "Fri Oct 12 00:00:00 1979 +0000" >expect &&
 403        git log -1 --format=%ad >actual &&
 404        test_cmp expect actual
 405'
 406
 407test_expect_success 'sign off (1)' '
 408
 409        echo 1 >positive &&
 410        git add positive &&
 411        git commit -s -m "thank you" &&
 412        git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
 413        (
 414                echo thank you &&
 415                echo &&
 416                git var GIT_COMMITTER_IDENT |
 417                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 418        ) >expected &&
 419        test_cmp expected actual
 420
 421'
 422
 423test_expect_success 'sign off (2)' '
 424
 425        echo 2 >positive &&
 426        git add positive &&
 427        existing="Signed-off-by: Watch This <watchthis@example.com>" &&
 428        git commit -s -m "thank you
 429
 430$existing" &&
 431        git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
 432        (
 433                echo thank you &&
 434                echo &&
 435                echo $existing &&
 436                git var GIT_COMMITTER_IDENT |
 437                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 438        ) >expected &&
 439        test_cmp expected actual
 440
 441'
 442
 443test_expect_success 'signoff gap' '
 444
 445        echo 3 >positive &&
 446        git add positive &&
 447        alt="Alt-RFC-822-Header: Value" &&
 448        git commit -s -m "welcome
 449
 450$alt" &&
 451        git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
 452        (
 453                echo welcome &&
 454                echo &&
 455                echo $alt &&
 456                git var GIT_COMMITTER_IDENT |
 457                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 458        ) >expected &&
 459        test_cmp expected actual
 460'
 461
 462test_expect_success 'signoff gap 2' '
 463
 464        echo 4 >positive &&
 465        git add positive &&
 466        alt="fixed: 34" &&
 467        git commit -s -m "welcome
 468
 469We have now
 470$alt" &&
 471        git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
 472        (
 473                echo welcome &&
 474                echo &&
 475                echo We have now &&
 476                echo $alt &&
 477                echo &&
 478                git var GIT_COMMITTER_IDENT |
 479                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 480        ) >expected &&
 481        test_cmp expected actual
 482'
 483
 484test_expect_success 'signoff respects trailer config' '
 485
 486        echo 5 >positive &&
 487        git add positive &&
 488        git commit -s -m "subject
 489
 490non-trailer line
 491Myfooter: x" &&
 492        git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
 493        (
 494                echo subject &&
 495                echo &&
 496                echo non-trailer line &&
 497                echo Myfooter: x &&
 498                echo &&
 499                echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
 500        ) >expected &&
 501        test_cmp expected actual &&
 502
 503        echo 6 >positive &&
 504        git add positive &&
 505        git -c "trailer.Myfooter.ifexists=add" commit -s -m "subject
 506
 507non-trailer line
 508Myfooter: x" &&
 509        git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
 510        (
 511                echo subject &&
 512                echo &&
 513                echo non-trailer line &&
 514                echo Myfooter: x &&
 515                echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
 516        ) >expected &&
 517        test_cmp expected actual
 518'
 519
 520test_expect_success 'signoff not confused by ---' '
 521        cat >expected <<-EOF &&
 522                subject
 523
 524                body
 525                ---
 526                these dashes confuse the parser!
 527
 528                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 529        EOF
 530        # should be a noop, since we already signed
 531        git commit --allow-empty --signoff -F expected &&
 532        git log -1 --pretty=format:%B >actual &&
 533        test_cmp expected actual
 534'
 535
 536test_expect_success 'multiple -m' '
 537
 538        >negative &&
 539        git add negative &&
 540        git commit -m "one" -m "two" -m "three" &&
 541        git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
 542        (
 543                echo one &&
 544                echo &&
 545                echo two &&
 546                echo &&
 547                echo three
 548        ) >expected &&
 549        test_cmp expected actual
 550
 551'
 552
 553test_expect_success 'amend commit to fix author' '
 554
 555        oldtick=$GIT_AUTHOR_DATE &&
 556        test_tick &&
 557        git reset --hard &&
 558        git cat-file -p HEAD |
 559        sed -e "s/author.*/author $author $oldtick/" \
 560                -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
 561                expected &&
 562        git commit --amend --author="$author" &&
 563        git cat-file -p HEAD > current &&
 564        test_cmp expected current
 565
 566'
 567
 568test_expect_success 'git commit <file> with dirty index' '
 569        echo tacocat > elif &&
 570        echo tehlulz > chz &&
 571        git add chz &&
 572        git commit elif -m "tacocat is a palindrome" &&
 573        git show --stat | grep elif &&
 574        git diff --cached | grep chz
 575'
 576
 577test_expect_success 'same tree (single parent)' '
 578
 579        git reset --hard &&
 580        test_must_fail git commit -m empty
 581
 582'
 583
 584test_expect_success 'same tree (single parent) --allow-empty' '
 585
 586        git commit --allow-empty -m "forced empty" &&
 587        git cat-file commit HEAD | grep forced
 588
 589'
 590
 591test_expect_success 'same tree (merge and amend merge)' '
 592
 593        git checkout -b side HEAD^ &&
 594        echo zero >zero &&
 595        git add zero &&
 596        git commit -m "add zero" &&
 597        git checkout master &&
 598
 599        git merge -s ours side -m "empty ok" &&
 600        git diff HEAD^ HEAD >actual &&
 601        test_must_be_empty actual &&
 602
 603        git commit --amend -m "empty really ok" &&
 604        git diff HEAD^ HEAD >actual &&
 605        test_must_be_empty actual
 606
 607'
 608
 609test_expect_success 'amend using the message from another commit' '
 610
 611        git reset --hard &&
 612        test_tick &&
 613        git commit --allow-empty -m "old commit" &&
 614        old=$(git rev-parse --verify HEAD) &&
 615        test_tick &&
 616        git commit --allow-empty -m "new commit" &&
 617        new=$(git rev-parse --verify HEAD) &&
 618        test_tick &&
 619        git commit --allow-empty --amend -C "$old" &&
 620        git show --pretty="format:%ad %s" "$old" >expected &&
 621        git show --pretty="format:%ad %s" HEAD >actual &&
 622        test_cmp expected actual
 623
 624'
 625
 626test_expect_success 'amend using the message from a commit named with tag' '
 627
 628        git reset --hard &&
 629        test_tick &&
 630        git commit --allow-empty -m "old commit" &&
 631        old=$(git rev-parse --verify HEAD) &&
 632        git tag -a -m "tag on old" tagged-old HEAD &&
 633        test_tick &&
 634        git commit --allow-empty -m "new commit" &&
 635        new=$(git rev-parse --verify HEAD) &&
 636        test_tick &&
 637        git commit --allow-empty --amend -C tagged-old &&
 638        git show --pretty="format:%ad %s" "$old" >expected &&
 639        git show --pretty="format:%ad %s" HEAD >actual &&
 640        test_cmp expected actual
 641
 642'
 643
 644test_expect_success 'amend can copy notes' '
 645
 646        git config notes.rewrite.amend true &&
 647        git config notes.rewriteRef "refs/notes/*" &&
 648        test_commit foo &&
 649        git notes add -m"a note" &&
 650        test_tick &&
 651        git commit --amend -m"new foo" &&
 652        test "$(git notes show)" = "a note"
 653
 654'
 655
 656test_expect_success 'commit a file whose name is a dash' '
 657        git reset --hard &&
 658        for i in 1 2 3 4 5
 659        do
 660                echo $i
 661        done >./- &&
 662        git add ./- &&
 663        test_tick &&
 664        git commit -m "add dash" >output </dev/null &&
 665        test_i18ngrep " changed, 5 insertions" output
 666'
 667
 668test_expect_success '--only works on to-be-born branch' '
 669        # This test relies on having something in the index, as it
 670        # would not otherwise actually prove much.  So check this.
 671        test -n "$(git ls-files)" &&
 672        git checkout --orphan orphan &&
 673        echo foo >newfile &&
 674        git add newfile &&
 675        git commit --only newfile -m"--only on unborn branch" &&
 676        echo newfile >expected &&
 677        git ls-tree -r --name-only HEAD >actual &&
 678        test_cmp expected actual
 679'
 680
 681test_expect_success '--dry-run with conflicts fixed from a merge' '
 682        # setup two branches with conflicting information
 683        # in the same file, resolve the conflict,
 684        # call commit with --dry-run
 685        echo "Initial contents, unimportant" >test-file &&
 686        git add test-file &&
 687        git commit -m "Initial commit" &&
 688        echo "commit-1-state" >test-file &&
 689        git commit -m "commit 1" -i test-file &&
 690        git tag commit-1 &&
 691        git checkout -b branch-2 HEAD^1 &&
 692        echo "commit-2-state" >test-file &&
 693        git commit -m "commit 2" -i test-file &&
 694        test_must_fail git merge --no-commit commit-1 &&
 695        echo "commit-2-state" >test-file &&
 696        git add test-file &&
 697        git commit --dry-run &&
 698        git commit -m "conflicts fixed from merge."
 699'
 700
 701test_expect_success '--dry-run --short' '
 702        >test-file &&
 703        git add test-file &&
 704        git commit --dry-run --short
 705'
 706
 707test_done