t / t7508-status.shon commit Merge branch 'di/readme-markup-fix' (75ce486)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Johannes E. Schindelin
   4#
   5
   6test_description='git status'
   7
   8. ./test-lib.sh
   9. "$TEST_DIRECTORY"/lib-terminal.sh
  10
  11test_expect_success 'status -h in broken repository' '
  12        git config --global advice.statusuoption false &&
  13        mkdir broken &&
  14        test_when_finished "rm -fr broken" &&
  15        (
  16                cd broken &&
  17                git init &&
  18                echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
  19                test_expect_code 129 git status -h >usage 2>&1
  20        ) &&
  21        test_i18ngrep "[Uu]sage" broken/usage
  22'
  23
  24test_expect_success 'commit -h in broken repository' '
  25        mkdir broken &&
  26        test_when_finished "rm -fr broken" &&
  27        (
  28                cd broken &&
  29                git init &&
  30                echo "[status] showuntrackedfiles = CORRUPT" >>.git/config &&
  31                test_expect_code 129 git commit -h >usage 2>&1
  32        ) &&
  33        test_i18ngrep "[Uu]sage" broken/usage
  34'
  35
  36test_expect_success 'create upstream branch' '
  37        git checkout -b upstream &&
  38        test_commit upstream1 &&
  39        test_commit upstream2 &&
  40        # leave the first commit on master as root because several
  41        # tests depend on this case; for our upstream we only
  42        # care about commit counts anyway, so a totally divergent
  43        # history is OK
  44        git checkout --orphan master
  45'
  46
  47test_expect_success 'setup' '
  48        : >tracked &&
  49        : >modified &&
  50        mkdir dir1 &&
  51        : >dir1/tracked &&
  52        : >dir1/modified &&
  53        mkdir dir2 &&
  54        : >dir1/tracked &&
  55        : >dir1/modified &&
  56        git add . &&
  57
  58        git status >output &&
  59
  60        test_tick &&
  61        git commit -m initial &&
  62        : >untracked &&
  63        : >dir1/untracked &&
  64        : >dir2/untracked &&
  65        echo 1 >dir1/modified &&
  66        echo 2 >dir2/modified &&
  67        echo 3 >dir2/added &&
  68        git add dir2/added &&
  69
  70        git branch --set-upstream-to=upstream
  71'
  72
  73test_expect_success 'status (1)' '
  74        test_i18ngrep "use \"git rm --cached <file>\.\.\.\" to unstage" output
  75'
  76
  77strip_comments () {
  78        tab='   '
  79        sed "s/^\# //; s/^\#$//; s/^#$tab/$tab/" <"$1" >"$1".tmp &&
  80        rm "$1" && mv "$1".tmp "$1"
  81}
  82
  83cat >.gitignore <<\EOF
  84.gitignore
  85expect*
  86output*
  87EOF
  88
  89test_expect_success 'status --column' '
  90        cat >expect <<\EOF &&
  91# On branch master
  92# Your branch and '\''upstream'\'' have diverged,
  93# and have 1 and 2 different commits each, respectively.
  94#   (use "git pull" to merge the remote branch into yours)
  95#
  96# Changes to be committed:
  97#   (use "git restore --staged <file>..." to unstage)
  98#       new file:   dir2/added
  99#
 100# Changes not staged for commit:
 101#   (use "git add <file>..." to update what will be committed)
 102#   (use "git restore <file>..." to discard changes in working directory)
 103#       modified:   dir1/modified
 104#
 105# Untracked files:
 106#   (use "git add <file>..." to include in what will be committed)
 107#       dir1/untracked dir2/untracked
 108#       dir2/modified  untracked
 109#
 110EOF
 111        COLUMNS=50 git -c status.displayCommentPrefix=true status --column="column dense" >output &&
 112        test_i18ncmp expect output
 113'
 114
 115test_expect_success 'status --column status.displayCommentPrefix=false' '
 116        strip_comments expect &&
 117        COLUMNS=49 git -c status.displayCommentPrefix=false status --column="column dense" >output &&
 118        test_i18ncmp expect output
 119'
 120
 121cat >expect <<\EOF
 122# On branch master
 123# Your branch and 'upstream' have diverged,
 124# and have 1 and 2 different commits each, respectively.
 125#   (use "git pull" to merge the remote branch into yours)
 126#
 127# Changes to be committed:
 128#   (use "git restore --staged <file>..." to unstage)
 129#       new file:   dir2/added
 130#
 131# Changes not staged for commit:
 132#   (use "git add <file>..." to update what will be committed)
 133#   (use "git restore <file>..." to discard changes in working directory)
 134#       modified:   dir1/modified
 135#
 136# Untracked files:
 137#   (use "git add <file>..." to include in what will be committed)
 138#       dir1/untracked
 139#       dir2/modified
 140#       dir2/untracked
 141#       untracked
 142#
 143EOF
 144
 145test_expect_success 'status with status.displayCommentPrefix=true' '
 146        git -c status.displayCommentPrefix=true status >output &&
 147        test_i18ncmp expect output
 148'
 149
 150test_expect_success 'status with status.displayCommentPrefix=false' '
 151        strip_comments expect &&
 152        git -c status.displayCommentPrefix=false status >output &&
 153        test_i18ncmp expect output
 154'
 155
 156test_expect_success 'status -v' '
 157        (cat expect && git diff --cached) >expect-with-v &&
 158        git status -v >output &&
 159        test_i18ncmp expect-with-v output
 160'
 161
 162test_expect_success 'status -v -v' '
 163        (cat expect &&
 164         echo "Changes to be committed:" &&
 165         git -c diff.mnemonicprefix=true diff --cached &&
 166         echo "--------------------------------------------------" &&
 167         echo "Changes not staged for commit:" &&
 168         git -c diff.mnemonicprefix=true diff) >expect-with-v &&
 169        git status -v -v >output &&
 170        test_i18ncmp expect-with-v output
 171'
 172
 173test_expect_success 'setup fake editor' '
 174        cat >.git/editor <<-\EOF &&
 175        #! /bin/sh
 176        cp "$1" output
 177EOF
 178        chmod 755 .git/editor
 179'
 180
 181commit_template_commented () {
 182        (
 183                EDITOR=.git/editor &&
 184                export EDITOR &&
 185                # Fails due to empty message
 186                test_must_fail git commit
 187        ) &&
 188        ! grep '^[^#]' output
 189}
 190
 191test_expect_success 'commit ignores status.displayCommentPrefix=false in COMMIT_EDITMSG' '
 192        commit_template_commented
 193'
 194
 195cat >expect <<\EOF
 196On branch master
 197Your branch and 'upstream' have diverged,
 198and have 1 and 2 different commits each, respectively.
 199
 200Changes to be committed:
 201        new file:   dir2/added
 202
 203Changes not staged for commit:
 204        modified:   dir1/modified
 205
 206Untracked files:
 207        dir1/untracked
 208        dir2/modified
 209        dir2/untracked
 210        untracked
 211
 212EOF
 213
 214test_expect_success 'status (advice.statusHints false)' '
 215        test_config advice.statusHints false &&
 216        git status >output &&
 217        test_i18ncmp expect output
 218
 219'
 220
 221cat >expect <<\EOF
 222 M dir1/modified
 223A  dir2/added
 224?? dir1/untracked
 225?? dir2/modified
 226?? dir2/untracked
 227?? untracked
 228EOF
 229
 230test_expect_success 'status -s' '
 231
 232        git status -s >output &&
 233        test_cmp expect output
 234
 235'
 236
 237test_expect_success 'status with gitignore' '
 238        {
 239                echo ".gitignore" &&
 240                echo "expect*" &&
 241                echo "output" &&
 242                echo "untracked"
 243        } >.gitignore &&
 244
 245        cat >expect <<-\EOF &&
 246         M dir1/modified
 247        A  dir2/added
 248        ?? dir2/modified
 249        EOF
 250        git status -s >output &&
 251        test_cmp expect output &&
 252
 253        cat >expect <<-\EOF &&
 254         M dir1/modified
 255        A  dir2/added
 256        ?? dir2/modified
 257        !! .gitignore
 258        !! dir1/untracked
 259        !! dir2/untracked
 260        !! expect
 261        !! expect-with-v
 262        !! output
 263        !! untracked
 264        EOF
 265        git status -s --ignored >output &&
 266        test_cmp expect output &&
 267
 268        cat >expect <<\EOF &&
 269On branch master
 270Your branch and '\''upstream'\'' have diverged,
 271and have 1 and 2 different commits each, respectively.
 272  (use "git pull" to merge the remote branch into yours)
 273
 274Changes to be committed:
 275  (use "git restore --staged <file>..." to unstage)
 276        new file:   dir2/added
 277
 278Changes not staged for commit:
 279  (use "git add <file>..." to update what will be committed)
 280  (use "git restore <file>..." to discard changes in working directory)
 281        modified:   dir1/modified
 282
 283Untracked files:
 284  (use "git add <file>..." to include in what will be committed)
 285        dir2/modified
 286
 287Ignored files:
 288  (use "git add -f <file>..." to include in what will be committed)
 289        .gitignore
 290        dir1/untracked
 291        dir2/untracked
 292        expect
 293        expect-with-v
 294        output
 295        untracked
 296
 297EOF
 298        git status --ignored >output &&
 299        test_i18ncmp expect output
 300'
 301
 302test_expect_success 'status with gitignore (nothing untracked)' '
 303        {
 304                echo ".gitignore" &&
 305                echo "expect*" &&
 306                echo "dir2/modified" &&
 307                echo "output" &&
 308                echo "untracked"
 309        } >.gitignore &&
 310
 311        cat >expect <<-\EOF &&
 312         M dir1/modified
 313        A  dir2/added
 314        EOF
 315        git status -s >output &&
 316        test_cmp expect output &&
 317
 318        cat >expect <<-\EOF &&
 319         M dir1/modified
 320        A  dir2/added
 321        !! .gitignore
 322        !! dir1/untracked
 323        !! dir2/modified
 324        !! dir2/untracked
 325        !! expect
 326        !! expect-with-v
 327        !! output
 328        !! untracked
 329        EOF
 330        git status -s --ignored >output &&
 331        test_cmp expect output &&
 332
 333        cat >expect <<\EOF &&
 334On branch master
 335Your branch and '\''upstream'\'' have diverged,
 336and have 1 and 2 different commits each, respectively.
 337  (use "git pull" to merge the remote branch into yours)
 338
 339Changes to be committed:
 340  (use "git restore --staged <file>..." to unstage)
 341        new file:   dir2/added
 342
 343Changes not staged for commit:
 344  (use "git add <file>..." to update what will be committed)
 345  (use "git restore <file>..." to discard changes in working directory)
 346        modified:   dir1/modified
 347
 348Ignored files:
 349  (use "git add -f <file>..." to include in what will be committed)
 350        .gitignore
 351        dir1/untracked
 352        dir2/modified
 353        dir2/untracked
 354        expect
 355        expect-with-v
 356        output
 357        untracked
 358
 359EOF
 360        git status --ignored >output &&
 361        test_i18ncmp expect output
 362'
 363
 364cat >.gitignore <<\EOF
 365.gitignore
 366expect*
 367output*
 368EOF
 369
 370cat >expect <<\EOF
 371## master...upstream [ahead 1, behind 2]
 372 M dir1/modified
 373A  dir2/added
 374?? dir1/untracked
 375?? dir2/modified
 376?? dir2/untracked
 377?? untracked
 378EOF
 379
 380test_expect_success 'status -s -b' '
 381
 382        git status -s -b >output &&
 383        test_i18ncmp expect output
 384
 385'
 386
 387test_expect_success 'status -s -z -b' '
 388        tr "\\n" Q <expect >expect.q &&
 389        mv expect.q expect &&
 390        git status -s -z -b >output &&
 391        nul_to_q <output >output.q &&
 392        mv output.q output &&
 393        test_i18ncmp expect output
 394'
 395
 396test_expect_success 'setup dir3' '
 397        mkdir dir3 &&
 398        : >dir3/untracked1 &&
 399        : >dir3/untracked2
 400'
 401
 402test_expect_success 'status -uno' '
 403        cat >expect <<EOF &&
 404On branch master
 405Your branch and '\''upstream'\'' have diverged,
 406and have 1 and 2 different commits each, respectively.
 407  (use "git pull" to merge the remote branch into yours)
 408
 409Changes to be committed:
 410  (use "git restore --staged <file>..." to unstage)
 411        new file:   dir2/added
 412
 413Changes not staged for commit:
 414  (use "git add <file>..." to update what will be committed)
 415  (use "git restore <file>..." to discard changes in working directory)
 416        modified:   dir1/modified
 417
 418Untracked files not listed (use -u option to show untracked files)
 419EOF
 420        git status -uno >output &&
 421        test_i18ncmp expect output
 422'
 423
 424test_expect_success 'status (status.showUntrackedFiles no)' '
 425        test_config status.showuntrackedfiles no &&
 426        git status >output &&
 427        test_i18ncmp expect output
 428'
 429
 430test_expect_success 'status -uno (advice.statusHints false)' '
 431        cat >expect <<EOF &&
 432On branch master
 433Your branch and '\''upstream'\'' have diverged,
 434and have 1 and 2 different commits each, respectively.
 435
 436Changes to be committed:
 437        new file:   dir2/added
 438
 439Changes not staged for commit:
 440        modified:   dir1/modified
 441
 442Untracked files not listed
 443EOF
 444        test_config advice.statusHints false &&
 445        git status -uno >output &&
 446        test_i18ncmp expect output
 447'
 448
 449cat >expect << EOF
 450 M dir1/modified
 451A  dir2/added
 452EOF
 453test_expect_success 'status -s -uno' '
 454        git status -s -uno >output &&
 455        test_cmp expect output
 456'
 457
 458test_expect_success 'status -s (status.showUntrackedFiles no)' '
 459        git config status.showuntrackedfiles no &&
 460        git status -s >output &&
 461        test_cmp expect output
 462'
 463
 464test_expect_success 'status -unormal' '
 465        cat >expect <<EOF &&
 466On branch master
 467Your branch and '\''upstream'\'' have diverged,
 468and have 1 and 2 different commits each, respectively.
 469  (use "git pull" to merge the remote branch into yours)
 470
 471Changes to be committed:
 472  (use "git restore --staged <file>..." to unstage)
 473        new file:   dir2/added
 474
 475Changes not staged for commit:
 476  (use "git add <file>..." to update what will be committed)
 477  (use "git restore <file>..." to discard changes in working directory)
 478        modified:   dir1/modified
 479
 480Untracked files:
 481  (use "git add <file>..." to include in what will be committed)
 482        dir1/untracked
 483        dir2/modified
 484        dir2/untracked
 485        dir3/
 486        untracked
 487
 488EOF
 489        git status -unormal >output &&
 490        test_i18ncmp expect output
 491'
 492
 493test_expect_success 'status (status.showUntrackedFiles normal)' '
 494        test_config status.showuntrackedfiles normal &&
 495        git status >output &&
 496        test_i18ncmp expect output
 497'
 498
 499cat >expect <<EOF
 500 M dir1/modified
 501A  dir2/added
 502?? dir1/untracked
 503?? dir2/modified
 504?? dir2/untracked
 505?? dir3/
 506?? untracked
 507EOF
 508test_expect_success 'status -s -unormal' '
 509        git status -s -unormal >output &&
 510        test_cmp expect output
 511'
 512
 513test_expect_success 'status -s (status.showUntrackedFiles normal)' '
 514        git config status.showuntrackedfiles normal &&
 515        git status -s >output &&
 516        test_cmp expect output
 517'
 518
 519test_expect_success 'status -uall' '
 520        cat >expect <<EOF &&
 521On branch master
 522Your branch and '\''upstream'\'' have diverged,
 523and have 1 and 2 different commits each, respectively.
 524  (use "git pull" to merge the remote branch into yours)
 525
 526Changes to be committed:
 527  (use "git restore --staged <file>..." to unstage)
 528        new file:   dir2/added
 529
 530Changes not staged for commit:
 531  (use "git add <file>..." to update what will be committed)
 532  (use "git restore <file>..." to discard changes in working directory)
 533        modified:   dir1/modified
 534
 535Untracked files:
 536  (use "git add <file>..." to include in what will be committed)
 537        dir1/untracked
 538        dir2/modified
 539        dir2/untracked
 540        dir3/untracked1
 541        dir3/untracked2
 542        untracked
 543
 544EOF
 545        git status -uall >output &&
 546        test_i18ncmp expect output
 547'
 548
 549test_expect_success 'status (status.showUntrackedFiles all)' '
 550        test_config status.showuntrackedfiles all &&
 551        git status >output &&
 552        test_i18ncmp expect output
 553'
 554
 555test_expect_success 'teardown dir3' '
 556        rm -rf dir3
 557'
 558
 559cat >expect <<EOF
 560 M dir1/modified
 561A  dir2/added
 562?? dir1/untracked
 563?? dir2/modified
 564?? dir2/untracked
 565?? untracked
 566EOF
 567test_expect_success 'status -s -uall' '
 568        test_unconfig status.showuntrackedfiles &&
 569        git status -s -uall >output &&
 570        test_cmp expect output
 571'
 572test_expect_success 'status -s (status.showUntrackedFiles all)' '
 573        test_config status.showuntrackedfiles all &&
 574        git status -s >output &&
 575        rm -rf dir3 &&
 576        test_cmp expect output
 577'
 578
 579test_expect_success 'status with relative paths' '
 580        cat >expect <<\EOF &&
 581On branch master
 582Your branch and '\''upstream'\'' have diverged,
 583and have 1 and 2 different commits each, respectively.
 584  (use "git pull" to merge the remote branch into yours)
 585
 586Changes to be committed:
 587  (use "git restore --staged <file>..." to unstage)
 588        new file:   ../dir2/added
 589
 590Changes not staged for commit:
 591  (use "git add <file>..." to update what will be committed)
 592  (use "git restore <file>..." to discard changes in working directory)
 593        modified:   modified
 594
 595Untracked files:
 596  (use "git add <file>..." to include in what will be committed)
 597        untracked
 598        ../dir2/modified
 599        ../dir2/untracked
 600        ../untracked
 601
 602EOF
 603        (cd dir1 && git status) >output &&
 604        test_i18ncmp expect output
 605'
 606
 607cat >expect <<\EOF
 608 M modified
 609A  ../dir2/added
 610?? untracked
 611?? ../dir2/modified
 612?? ../dir2/untracked
 613?? ../untracked
 614EOF
 615test_expect_success 'status -s with relative paths' '
 616
 617        (cd dir1 && git status -s) >output &&
 618        test_cmp expect output
 619
 620'
 621
 622cat >expect <<\EOF
 623 M dir1/modified
 624A  dir2/added
 625?? dir1/untracked
 626?? dir2/modified
 627?? dir2/untracked
 628?? untracked
 629EOF
 630
 631test_expect_success 'status --porcelain ignores relative paths setting' '
 632
 633        (cd dir1 && git status --porcelain) >output &&
 634        test_cmp expect output
 635
 636'
 637
 638test_expect_success 'setup unique colors' '
 639
 640        git config status.color.untracked blue &&
 641        git config status.color.branch green &&
 642        git config status.color.localBranch yellow &&
 643        git config status.color.remoteBranch cyan
 644
 645'
 646
 647test_expect_success TTY 'status with color.ui' '
 648        cat >expect <<\EOF &&
 649On branch <GREEN>master<RESET>
 650Your branch and '\''upstream'\'' have diverged,
 651and have 1 and 2 different commits each, respectively.
 652  (use "git pull" to merge the remote branch into yours)
 653
 654Changes to be committed:
 655  (use "git restore --staged <file>..." to unstage)
 656        <GREEN>new file:   dir2/added<RESET>
 657
 658Changes not staged for commit:
 659  (use "git add <file>..." to update what will be committed)
 660  (use "git restore <file>..." to discard changes in working directory)
 661        <RED>modified:   dir1/modified<RESET>
 662
 663Untracked files:
 664  (use "git add <file>..." to include in what will be committed)
 665        <BLUE>dir1/untracked<RESET>
 666        <BLUE>dir2/modified<RESET>
 667        <BLUE>dir2/untracked<RESET>
 668        <BLUE>untracked<RESET>
 669
 670EOF
 671        test_config color.ui auto &&
 672        test_terminal git status | test_decode_color >output &&
 673        test_i18ncmp expect output
 674'
 675
 676test_expect_success TTY 'status with color.status' '
 677        test_config color.status auto &&
 678        test_terminal git status | test_decode_color >output &&
 679        test_i18ncmp expect output
 680'
 681
 682cat >expect <<\EOF
 683 <RED>M<RESET> dir1/modified
 684<GREEN>A<RESET>  dir2/added
 685<BLUE>??<RESET> dir1/untracked
 686<BLUE>??<RESET> dir2/modified
 687<BLUE>??<RESET> dir2/untracked
 688<BLUE>??<RESET> untracked
 689EOF
 690
 691test_expect_success TTY 'status -s with color.ui' '
 692
 693        git config color.ui auto &&
 694        test_terminal git status -s | test_decode_color >output &&
 695        test_cmp expect output
 696
 697'
 698
 699test_expect_success TTY 'status -s with color.status' '
 700
 701        git config --unset color.ui &&
 702        git config color.status auto &&
 703        test_terminal git status -s | test_decode_color >output &&
 704        test_cmp expect output
 705
 706'
 707
 708cat >expect <<\EOF
 709## <YELLOW>master<RESET>...<CYAN>upstream<RESET> [ahead <YELLOW>1<RESET>, behind <CYAN>2<RESET>]
 710 <RED>M<RESET> dir1/modified
 711<GREEN>A<RESET>  dir2/added
 712<BLUE>??<RESET> dir1/untracked
 713<BLUE>??<RESET> dir2/modified
 714<BLUE>??<RESET> dir2/untracked
 715<BLUE>??<RESET> untracked
 716EOF
 717
 718test_expect_success TTY 'status -s -b with color.status' '
 719
 720        test_terminal git status -s -b | test_decode_color >output &&
 721        test_i18ncmp expect output
 722
 723'
 724
 725cat >expect <<\EOF
 726 M dir1/modified
 727A  dir2/added
 728?? dir1/untracked
 729?? dir2/modified
 730?? dir2/untracked
 731?? untracked
 732EOF
 733
 734test_expect_success TTY 'status --porcelain ignores color.ui' '
 735
 736        git config --unset color.status &&
 737        git config color.ui auto &&
 738        test_terminal git status --porcelain | test_decode_color >output &&
 739        test_cmp expect output
 740
 741'
 742
 743test_expect_success TTY 'status --porcelain ignores color.status' '
 744
 745        git config --unset color.ui &&
 746        git config color.status auto &&
 747        test_terminal git status --porcelain | test_decode_color >output &&
 748        test_cmp expect output
 749
 750'
 751
 752# recover unconditionally from color tests
 753git config --unset color.status
 754git config --unset color.ui
 755
 756test_expect_success 'status --porcelain respects -b' '
 757
 758        git status --porcelain -b >output &&
 759        {
 760                echo "## master...upstream [ahead 1, behind 2]" &&
 761                cat expect
 762        } >tmp &&
 763        mv tmp expect &&
 764        test_cmp expect output
 765
 766'
 767
 768
 769
 770test_expect_success 'status without relative paths' '
 771        cat >expect <<\EOF &&
 772On branch master
 773Your branch and '\''upstream'\'' have diverged,
 774and have 1 and 2 different commits each, respectively.
 775  (use "git pull" to merge the remote branch into yours)
 776
 777Changes to be committed:
 778  (use "git restore --staged <file>..." to unstage)
 779        new file:   dir2/added
 780
 781Changes not staged for commit:
 782  (use "git add <file>..." to update what will be committed)
 783  (use "git restore <file>..." to discard changes in working directory)
 784        modified:   dir1/modified
 785
 786Untracked files:
 787  (use "git add <file>..." to include in what will be committed)
 788        dir1/untracked
 789        dir2/modified
 790        dir2/untracked
 791        untracked
 792
 793EOF
 794        test_config status.relativePaths false &&
 795        (cd dir1 && git status) >output &&
 796        test_i18ncmp expect output
 797
 798'
 799
 800cat >expect <<\EOF
 801 M dir1/modified
 802A  dir2/added
 803?? dir1/untracked
 804?? dir2/modified
 805?? dir2/untracked
 806?? untracked
 807EOF
 808
 809test_expect_success 'status -s without relative paths' '
 810
 811        test_config status.relativePaths false &&
 812        (cd dir1 && git status -s) >output &&
 813        test_cmp expect output
 814
 815'
 816
 817test_expect_success 'dry-run of partial commit excluding new file in index' '
 818        cat >expect <<EOF &&
 819On branch master
 820Your branch and '\''upstream'\'' have diverged,
 821and have 1 and 2 different commits each, respectively.
 822  (use "git pull" to merge the remote branch into yours)
 823
 824Changes to be committed:
 825  (use "git restore --staged <file>..." to unstage)
 826        modified:   dir1/modified
 827
 828Untracked files:
 829  (use "git add <file>..." to include in what will be committed)
 830        dir1/untracked
 831        dir2/
 832        untracked
 833
 834EOF
 835        git commit --dry-run dir1/modified >output &&
 836        test_i18ncmp expect output
 837'
 838
 839cat >expect <<EOF
 840:100644 100644 $EMPTY_BLOB 0000000000000000000000000000000000000000 M   dir1/modified
 841EOF
 842test_expect_success 'status refreshes the index' '
 843        touch dir2/added &&
 844        git status &&
 845        git diff-files >output &&
 846        test_cmp expect output
 847'
 848
 849test_expect_success 'setup status submodule summary' '
 850        test_create_repo sm && (
 851                cd sm &&
 852                >foo &&
 853                git add foo &&
 854                git commit -m "Add foo"
 855        ) &&
 856        git add sm
 857'
 858
 859test_expect_success 'status submodule summary is disabled by default' '
 860        cat >expect <<EOF &&
 861On branch master
 862Your branch and '\''upstream'\'' have diverged,
 863and have 1 and 2 different commits each, respectively.
 864  (use "git pull" to merge the remote branch into yours)
 865
 866Changes to be committed:
 867  (use "git restore --staged <file>..." to unstage)
 868        new file:   dir2/added
 869        new file:   sm
 870
 871Changes not staged for commit:
 872  (use "git add <file>..." to update what will be committed)
 873  (use "git restore <file>..." to discard changes in working directory)
 874        modified:   dir1/modified
 875
 876Untracked files:
 877  (use "git add <file>..." to include in what will be committed)
 878        dir1/untracked
 879        dir2/modified
 880        dir2/untracked
 881        untracked
 882
 883EOF
 884        git status >output &&
 885        test_i18ncmp expect output
 886'
 887
 888# we expect the same as the previous test
 889test_expect_success 'status --untracked-files=all does not show submodule' '
 890        git status --untracked-files=all >output &&
 891        test_i18ncmp expect output
 892'
 893
 894cat >expect <<EOF
 895 M dir1/modified
 896A  dir2/added
 897A  sm
 898?? dir1/untracked
 899?? dir2/modified
 900?? dir2/untracked
 901?? untracked
 902EOF
 903test_expect_success 'status -s submodule summary is disabled by default' '
 904        git status -s >output &&
 905        test_cmp expect output
 906'
 907
 908# we expect the same as the previous test
 909test_expect_success 'status -s --untracked-files=all does not show submodule' '
 910        git status -s --untracked-files=all >output &&
 911        test_cmp expect output
 912'
 913
 914head=$(cd sm && git rev-parse --short=7 --verify HEAD)
 915
 916test_expect_success 'status submodule summary' '
 917        cat >expect <<EOF &&
 918On branch master
 919Your branch and '\''upstream'\'' have diverged,
 920and have 1 and 2 different commits each, respectively.
 921  (use "git pull" to merge the remote branch into yours)
 922
 923Changes to be committed:
 924  (use "git restore --staged <file>..." to unstage)
 925        new file:   dir2/added
 926        new file:   sm
 927
 928Changes not staged for commit:
 929  (use "git add <file>..." to update what will be committed)
 930  (use "git restore <file>..." to discard changes in working directory)
 931        modified:   dir1/modified
 932
 933Submodule changes to be committed:
 934
 935* sm 0000000...$head (1):
 936  > Add foo
 937
 938Untracked files:
 939  (use "git add <file>..." to include in what will be committed)
 940        dir1/untracked
 941        dir2/modified
 942        dir2/untracked
 943        untracked
 944
 945EOF
 946        git config status.submodulesummary 10 &&
 947        git status >output &&
 948        test_i18ncmp expect output
 949'
 950
 951test_expect_success 'status submodule summary with status.displayCommentPrefix=false' '
 952        strip_comments expect &&
 953        git -c status.displayCommentPrefix=false status >output &&
 954        test_i18ncmp expect output
 955'
 956
 957test_expect_success 'commit with submodule summary ignores status.displayCommentPrefix' '
 958        commit_template_commented
 959'
 960
 961cat >expect <<EOF
 962 M dir1/modified
 963A  dir2/added
 964A  sm
 965?? dir1/untracked
 966?? dir2/modified
 967?? dir2/untracked
 968?? untracked
 969EOF
 970test_expect_success 'status -s submodule summary' '
 971        git status -s >output &&
 972        test_cmp expect output
 973'
 974
 975test_expect_success 'status submodule summary (clean submodule): commit' '
 976        cat >expect <<EOF &&
 977On branch master
 978Your branch and '\''upstream'\'' have diverged,
 979and have 2 and 2 different commits each, respectively.
 980  (use "git pull" to merge the remote branch into yours)
 981
 982Changes not staged for commit:
 983  (use "git add <file>..." to update what will be committed)
 984  (use "git restore <file>..." to discard changes in working directory)
 985        modified:   dir1/modified
 986
 987Untracked files:
 988  (use "git add <file>..." to include in what will be committed)
 989        dir1/untracked
 990        dir2/modified
 991        dir2/untracked
 992        untracked
 993
 994no changes added to commit (use "git add" and/or "git commit -a")
 995EOF
 996        git commit -m "commit submodule" &&
 997        git config status.submodulesummary 10 &&
 998        test_must_fail git commit --dry-run >output &&
 999        test_i18ncmp expect output &&
1000        git status >output &&
1001        test_i18ncmp expect output
1002'
1003
1004cat >expect <<EOF
1005 M dir1/modified
1006?? dir1/untracked
1007?? dir2/modified
1008?? dir2/untracked
1009?? untracked
1010EOF
1011test_expect_success 'status -s submodule summary (clean submodule)' '
1012        git status -s >output &&
1013        test_cmp expect output
1014'
1015
1016test_expect_success 'status -z implies porcelain' '
1017        git status --porcelain |
1018        perl -pe "s/\012/\000/g" >expect &&
1019        git status -z >output &&
1020        test_cmp expect output
1021'
1022
1023test_expect_success 'commit --dry-run submodule summary (--amend)' '
1024        cat >expect <<EOF &&
1025On branch master
1026Your branch and '\''upstream'\'' have diverged,
1027and have 2 and 2 different commits each, respectively.
1028  (use "git pull" to merge the remote branch into yours)
1029
1030Changes to be committed:
1031  (use "git restore --source=HEAD^1 --staged <file>..." to unstage)
1032        new file:   dir2/added
1033        new file:   sm
1034
1035Changes not staged for commit:
1036  (use "git add <file>..." to update what will be committed)
1037  (use "git restore <file>..." to discard changes in working directory)
1038        modified:   dir1/modified
1039
1040Submodule changes to be committed:
1041
1042* sm 0000000...$head (1):
1043  > Add foo
1044
1045Untracked files:
1046  (use "git add <file>..." to include in what will be committed)
1047        dir1/untracked
1048        dir2/modified
1049        dir2/untracked
1050        untracked
1051
1052EOF
1053        git config status.submodulesummary 10 &&
1054        git commit --dry-run --amend >output &&
1055        test_i18ncmp expect output
1056'
1057
1058test_expect_success POSIXPERM,SANITY 'status succeeds in a read-only repository' '
1059        test_when_finished "chmod 775 .git" &&
1060        (
1061                chmod a-w .git &&
1062                # make dir1/tracked stat-dirty
1063                >dir1/tracked1 && mv -f dir1/tracked1 dir1/tracked &&
1064                git status -s >output &&
1065                ! grep dir1/tracked output &&
1066                # make sure "status" succeeded without writing index out
1067                git diff-files | grep dir1/tracked
1068        )
1069'
1070
1071(cd sm && echo > bar && git add bar && git commit -q -m 'Add bar') && git add sm
1072new_head=$(cd sm && git rev-parse --short=7 --verify HEAD)
1073touch .gitmodules
1074
1075test_expect_success '--ignore-submodules=untracked suppresses submodules with untracked content' '
1076        cat > expect << EOF &&
1077On branch master
1078Your branch and '\''upstream'\'' have diverged,
1079and have 2 and 2 different commits each, respectively.
1080  (use "git pull" to merge the remote branch into yours)
1081
1082Changes to be committed:
1083  (use "git restore --staged <file>..." to unstage)
1084        modified:   sm
1085
1086Changes not staged for commit:
1087  (use "git add <file>..." to update what will be committed)
1088  (use "git restore <file>..." to discard changes in working directory)
1089        modified:   dir1/modified
1090
1091Submodule changes to be committed:
1092
1093* sm $head...$new_head (1):
1094  > Add bar
1095
1096Untracked files:
1097  (use "git add <file>..." to include in what will be committed)
1098        .gitmodules
1099        dir1/untracked
1100        dir2/modified
1101        dir2/untracked
1102        untracked
1103
1104EOF
1105        echo modified  sm/untracked &&
1106        git status --ignore-submodules=untracked >output &&
1107        test_i18ncmp expect output
1108'
1109
1110test_expect_success '.gitmodules ignore=untracked suppresses submodules with untracked content' '
1111        test_config diff.ignoreSubmodules dirty &&
1112        git status >output &&
1113        test_i18ncmp expect output &&
1114        git config --add -f .gitmodules submodule.subname.ignore untracked &&
1115        git config --add -f .gitmodules submodule.subname.path sm &&
1116        git status >output &&
1117        test_i18ncmp expect output &&
1118        git config -f .gitmodules  --remove-section submodule.subname
1119'
1120
1121test_expect_success '.git/config ignore=untracked suppresses submodules with untracked content' '
1122        git config --add -f .gitmodules submodule.subname.ignore none &&
1123        git config --add -f .gitmodules submodule.subname.path sm &&
1124        git config --add submodule.subname.ignore untracked &&
1125        git config --add submodule.subname.path sm &&
1126        git status >output &&
1127        test_i18ncmp expect output &&
1128        git config --remove-section submodule.subname &&
1129        git config --remove-section -f .gitmodules submodule.subname
1130'
1131
1132test_expect_success '--ignore-submodules=dirty suppresses submodules with untracked content' '
1133        git status --ignore-submodules=dirty >output &&
1134        test_i18ncmp expect output
1135'
1136
1137test_expect_success '.gitmodules ignore=dirty suppresses submodules with untracked content' '
1138        test_config diff.ignoreSubmodules dirty &&
1139        git status >output &&
1140        ! test -s actual &&
1141        git config --add -f .gitmodules submodule.subname.ignore dirty &&
1142        git config --add -f .gitmodules submodule.subname.path sm &&
1143        git status >output &&
1144        test_i18ncmp expect output &&
1145        git config -f .gitmodules  --remove-section submodule.subname
1146'
1147
1148test_expect_success '.git/config ignore=dirty suppresses submodules with untracked content' '
1149        git config --add -f .gitmodules submodule.subname.ignore none &&
1150        git config --add -f .gitmodules submodule.subname.path sm &&
1151        git config --add submodule.subname.ignore dirty &&
1152        git config --add submodule.subname.path sm &&
1153        git status >output &&
1154        test_i18ncmp expect output &&
1155        git config --remove-section submodule.subname &&
1156        git config -f .gitmodules  --remove-section submodule.subname
1157'
1158
1159test_expect_success '--ignore-submodules=dirty suppresses submodules with modified content' '
1160        echo modified >sm/foo &&
1161        git status --ignore-submodules=dirty >output &&
1162        test_i18ncmp expect output
1163'
1164
1165test_expect_success '.gitmodules ignore=dirty suppresses submodules with modified content' '
1166        git config --add -f .gitmodules submodule.subname.ignore dirty &&
1167        git config --add -f .gitmodules submodule.subname.path sm &&
1168        git status >output &&
1169        test_i18ncmp expect output &&
1170        git config -f .gitmodules  --remove-section submodule.subname
1171'
1172
1173test_expect_success '.git/config ignore=dirty suppresses submodules with modified content' '
1174        git config --add -f .gitmodules submodule.subname.ignore none &&
1175        git config --add -f .gitmodules submodule.subname.path sm &&
1176        git config --add submodule.subname.ignore dirty &&
1177        git config --add submodule.subname.path sm &&
1178        git status >output &&
1179        test_i18ncmp expect output &&
1180        git config --remove-section submodule.subname &&
1181        git config -f .gitmodules  --remove-section submodule.subname
1182'
1183
1184test_expect_success "--ignore-submodules=untracked doesn't suppress submodules with modified content" '
1185        cat > expect << EOF &&
1186On branch master
1187Your branch and '\''upstream'\'' have diverged,
1188and have 2 and 2 different commits each, respectively.
1189  (use "git pull" to merge the remote branch into yours)
1190
1191Changes to be committed:
1192  (use "git restore --staged <file>..." to unstage)
1193        modified:   sm
1194
1195Changes not staged for commit:
1196  (use "git add <file>..." to update what will be committed)
1197  (use "git restore <file>..." to discard changes in working directory)
1198  (commit or discard the untracked or modified content in submodules)
1199        modified:   dir1/modified
1200        modified:   sm (modified content)
1201
1202Submodule changes to be committed:
1203
1204* sm $head...$new_head (1):
1205  > Add bar
1206
1207Untracked files:
1208  (use "git add <file>..." to include in what will be committed)
1209        .gitmodules
1210        dir1/untracked
1211        dir2/modified
1212        dir2/untracked
1213        untracked
1214
1215EOF
1216        git status --ignore-submodules=untracked > output &&
1217        test_i18ncmp expect output
1218'
1219
1220test_expect_success ".gitmodules ignore=untracked doesn't suppress submodules with modified content" '
1221        git config --add -f .gitmodules submodule.subname.ignore untracked &&
1222        git config --add -f .gitmodules submodule.subname.path sm &&
1223        git status >output &&
1224        test_i18ncmp expect output &&
1225        git config -f .gitmodules  --remove-section submodule.subname
1226'
1227
1228test_expect_success ".git/config ignore=untracked doesn't suppress submodules with modified content" '
1229        git config --add -f .gitmodules submodule.subname.ignore none &&
1230        git config --add -f .gitmodules submodule.subname.path sm &&
1231        git config --add submodule.subname.ignore untracked &&
1232        git config --add submodule.subname.path sm &&
1233        git status >output &&
1234        test_i18ncmp expect output &&
1235        git config --remove-section submodule.subname &&
1236        git config -f .gitmodules  --remove-section submodule.subname
1237'
1238
1239head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --verify HEAD)
1240
1241test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" '
1242        cat > expect << EOF &&
1243On branch master
1244Your branch and '\''upstream'\'' have diverged,
1245and have 2 and 2 different commits each, respectively.
1246  (use "git pull" to merge the remote branch into yours)
1247
1248Changes to be committed:
1249  (use "git restore --staged <file>..." to unstage)
1250        modified:   sm
1251
1252Changes not staged for commit:
1253  (use "git add <file>..." to update what will be committed)
1254  (use "git restore <file>..." to discard changes in working directory)
1255        modified:   dir1/modified
1256        modified:   sm (new commits)
1257
1258Submodule changes to be committed:
1259
1260* sm $head...$new_head (1):
1261  > Add bar
1262
1263Submodules changed but not updated:
1264
1265* sm $new_head...$head2 (1):
1266  > 2nd commit
1267
1268Untracked files:
1269  (use "git add <file>..." to include in what will be committed)
1270        .gitmodules
1271        dir1/untracked
1272        dir2/modified
1273        dir2/untracked
1274        untracked
1275
1276EOF
1277        git status --ignore-submodules=untracked > output &&
1278        test_i18ncmp expect output
1279'
1280
1281test_expect_success ".gitmodules ignore=untracked doesn't suppress submodule summary" '
1282        git config --add -f .gitmodules submodule.subname.ignore untracked &&
1283        git config --add -f .gitmodules submodule.subname.path sm &&
1284        git status >output &&
1285        test_i18ncmp expect output &&
1286        git config -f .gitmodules  --remove-section submodule.subname
1287'
1288
1289test_expect_success ".git/config ignore=untracked doesn't suppress submodule summary" '
1290        git config --add -f .gitmodules submodule.subname.ignore none &&
1291        git config --add -f .gitmodules submodule.subname.path sm &&
1292        git config --add submodule.subname.ignore untracked &&
1293        git config --add submodule.subname.path sm &&
1294        git status >output &&
1295        test_i18ncmp expect output &&
1296        git config --remove-section submodule.subname &&
1297        git config -f .gitmodules  --remove-section submodule.subname
1298'
1299
1300test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summary" '
1301        git status --ignore-submodules=dirty > output &&
1302        test_i18ncmp expect output
1303'
1304test_expect_success ".gitmodules ignore=dirty doesn't suppress submodule summary" '
1305        git config --add -f .gitmodules submodule.subname.ignore dirty &&
1306        git config --add -f .gitmodules submodule.subname.path sm &&
1307        git status >output &&
1308        test_i18ncmp expect output &&
1309        git config -f .gitmodules  --remove-section submodule.subname
1310'
1311
1312test_expect_success ".git/config ignore=dirty doesn't suppress submodule summary" '
1313        git config --add -f .gitmodules submodule.subname.ignore none &&
1314        git config --add -f .gitmodules submodule.subname.path sm &&
1315        git config --add submodule.subname.ignore dirty &&
1316        git config --add submodule.subname.path sm &&
1317        git status >output &&
1318        test_i18ncmp expect output &&
1319        git config --remove-section submodule.subname &&
1320        git config -f .gitmodules  --remove-section submodule.subname
1321'
1322
1323cat > expect << EOF
1324; On branch master
1325; Your branch and 'upstream' have diverged,
1326; and have 2 and 2 different commits each, respectively.
1327;   (use "git pull" to merge the remote branch into yours)
1328;
1329; Changes to be committed:
1330;   (use "git restore --staged <file>..." to unstage)
1331;       modified:   sm
1332;
1333; Changes not staged for commit:
1334;   (use "git add <file>..." to update what will be committed)
1335;   (use "git restore <file>..." to discard changes in working directory)
1336;       modified:   dir1/modified
1337;       modified:   sm (new commits)
1338;
1339; Submodule changes to be committed:
1340;
1341; * sm $head...$new_head (1):
1342;   > Add bar
1343;
1344; Submodules changed but not updated:
1345;
1346; * sm $new_head...$head2 (1):
1347;   > 2nd commit
1348;
1349; Untracked files:
1350;   (use "git add <file>..." to include in what will be committed)
1351;       .gitmodules
1352;       dir1/untracked
1353;       dir2/modified
1354;       dir2/untracked
1355;       untracked
1356;
1357EOF
1358
1359test_expect_success "status (core.commentchar with submodule summary)" '
1360        test_config core.commentchar ";" &&
1361        git -c status.displayCommentPrefix=true status >output &&
1362        test_i18ncmp expect output
1363'
1364
1365test_expect_success "status (core.commentchar with two chars with submodule summary)" '
1366        test_config core.commentchar ";;" &&
1367        test_must_fail git -c status.displayCommentPrefix=true status
1368'
1369
1370test_expect_success "--ignore-submodules=all suppresses submodule summary" '
1371        cat > expect << EOF &&
1372On branch master
1373Your branch and '\''upstream'\'' have diverged,
1374and have 2 and 2 different commits each, respectively.
1375  (use "git pull" to merge the remote branch into yours)
1376
1377Changes not staged for commit:
1378  (use "git add <file>..." to update what will be committed)
1379  (use "git restore <file>..." to discard changes in working directory)
1380        modified:   dir1/modified
1381
1382Untracked files:
1383  (use "git add <file>..." to include in what will be committed)
1384        .gitmodules
1385        dir1/untracked
1386        dir2/modified
1387        dir2/untracked
1388        untracked
1389
1390no changes added to commit (use "git add" and/or "git commit -a")
1391EOF
1392        git status --ignore-submodules=all > output &&
1393        test_i18ncmp expect output
1394'
1395
1396test_expect_success '.gitmodules ignore=all suppresses unstaged submodule summary' '
1397        cat > expect << EOF &&
1398On branch master
1399Your branch and '\''upstream'\'' have diverged,
1400and have 2 and 2 different commits each, respectively.
1401  (use "git pull" to merge the remote branch into yours)
1402
1403Changes to be committed:
1404  (use "git restore --staged <file>..." to unstage)
1405        modified:   sm
1406
1407Changes not staged for commit:
1408  (use "git add <file>..." to update what will be committed)
1409  (use "git restore <file>..." to discard changes in working directory)
1410        modified:   dir1/modified
1411
1412Untracked files:
1413  (use "git add <file>..." to include in what will be committed)
1414        .gitmodules
1415        dir1/untracked
1416        dir2/modified
1417        dir2/untracked
1418        untracked
1419
1420EOF
1421        git config --add -f .gitmodules submodule.subname.ignore all &&
1422        git config --add -f .gitmodules submodule.subname.path sm &&
1423        git status > output &&
1424        test_i18ncmp expect output &&
1425        git config -f .gitmodules  --remove-section submodule.subname
1426'
1427
1428test_expect_success '.git/config ignore=all suppresses unstaged submodule summary' '
1429        git config --add -f .gitmodules submodule.subname.ignore none &&
1430        git config --add -f .gitmodules submodule.subname.path sm &&
1431        git config --add submodule.subname.ignore all &&
1432        git config --add submodule.subname.path sm &&
1433        git status > output &&
1434        test_i18ncmp expect output &&
1435        git config --remove-section submodule.subname &&
1436        git config -f .gitmodules  --remove-section submodule.subname
1437'
1438
1439test_expect_success 'setup of test environment' '
1440        git config status.showUntrackedFiles no &&
1441        git status -s >expected_short &&
1442        git status --no-short >expected_noshort
1443'
1444
1445test_expect_success '"status.short=true" same as "-s"' '
1446        git -c status.short=true status >actual &&
1447        test_cmp expected_short actual
1448'
1449
1450test_expect_success '"status.short=true" weaker than "--no-short"' '
1451        git -c status.short=true status --no-short >actual &&
1452        test_cmp expected_noshort actual
1453'
1454
1455test_expect_success '"status.short=false" same as "--no-short"' '
1456        git -c status.short=false status >actual &&
1457        test_cmp expected_noshort actual
1458'
1459
1460test_expect_success '"status.short=false" weaker than "-s"' '
1461        git -c status.short=false status -s >actual &&
1462        test_cmp expected_short actual
1463'
1464
1465test_expect_success '"status.branch=true" same as "-b"' '
1466        git status -sb >expected_branch &&
1467        git -c status.branch=true status -s >actual &&
1468        test_cmp expected_branch actual
1469'
1470
1471test_expect_success '"status.branch=true" different from "--no-branch"' '
1472        git status -s --no-branch  >expected_nobranch &&
1473        git -c status.branch=true status -s >actual &&
1474        test_must_fail test_cmp expected_nobranch actual
1475'
1476
1477test_expect_success '"status.branch=true" weaker than "--no-branch"' '
1478        git -c status.branch=true status -s --no-branch >actual &&
1479        test_cmp expected_nobranch actual
1480'
1481
1482test_expect_success '"status.branch=true" weaker than "--porcelain"' '
1483       git -c status.branch=true status --porcelain >actual &&
1484       test_cmp expected_nobranch actual
1485'
1486
1487test_expect_success '"status.branch=false" same as "--no-branch"' '
1488        git -c status.branch=false status -s >actual &&
1489        test_cmp expected_nobranch actual
1490'
1491
1492test_expect_success '"status.branch=false" weaker than "-b"' '
1493        git -c status.branch=false status -sb >actual &&
1494        test_cmp expected_branch actual
1495'
1496
1497test_expect_success 'Restore default test environment' '
1498        git config --unset status.showUntrackedFiles
1499'
1500
1501test_expect_success 'git commit will commit a staged but ignored submodule' '
1502        git config --add -f .gitmodules submodule.subname.ignore all &&
1503        git config --add -f .gitmodules submodule.subname.path sm &&
1504        git config --add submodule.subname.ignore all &&
1505        git status -s --ignore-submodules=dirty >output &&
1506        test_i18ngrep "^M. sm" output &&
1507        GIT_EDITOR="echo hello >>\"\$1\"" &&
1508        export GIT_EDITOR &&
1509        git commit -uno &&
1510        git status -s --ignore-submodules=dirty >output &&
1511        test_i18ngrep ! "^M. sm" output
1512'
1513
1514test_expect_success 'git commit --dry-run will show a staged but ignored submodule' '
1515        git reset HEAD^ &&
1516        git add sm &&
1517        cat >expect << EOF &&
1518On branch master
1519Your branch and '\''upstream'\'' have diverged,
1520and have 2 and 2 different commits each, respectively.
1521  (use "git pull" to merge the remote branch into yours)
1522
1523Changes to be committed:
1524  (use "git restore --staged <file>..." to unstage)
1525        modified:   sm
1526
1527Changes not staged for commit:
1528  (use "git add <file>..." to update what will be committed)
1529  (use "git restore <file>..." to discard changes in working directory)
1530        modified:   dir1/modified
1531
1532Untracked files not listed (use -u option to show untracked files)
1533EOF
1534        git commit -uno --dry-run >output &&
1535        test_i18ncmp expect output &&
1536        git status -s --ignore-submodules=dirty >output &&
1537        test_i18ngrep "^M. sm" output
1538'
1539
1540test_expect_success 'git commit -m will commit a staged but ignored submodule' '
1541        git commit -uno -m message &&
1542        git status -s --ignore-submodules=dirty >output &&
1543        test_i18ngrep ! "^M. sm" output &&
1544        git config --remove-section submodule.subname &&
1545        git config -f .gitmodules  --remove-section submodule.subname
1546'
1547
1548test_expect_success 'show stash info with "--show-stash"' '
1549        git reset --hard &&
1550        git stash clear &&
1551        echo 1 >file &&
1552        git add file &&
1553        git stash &&
1554        git status >expected_default &&
1555        git status --show-stash >expected_with_stash &&
1556        test_i18ngrep "^Your stash currently has 1 entry$" expected_with_stash
1557'
1558
1559test_expect_success 'no stash info with "--show-stash --no-show-stash"' '
1560        git status --show-stash --no-show-stash >expected_without_stash &&
1561        test_cmp expected_default expected_without_stash
1562'
1563
1564test_expect_success '"status.showStash=false" weaker than "--show-stash"' '
1565        git -c status.showStash=false status --show-stash >actual &&
1566        test_cmp expected_with_stash actual
1567'
1568
1569test_expect_success '"status.showStash=true" weaker than "--no-show-stash"' '
1570        git -c status.showStash=true status --no-show-stash >actual &&
1571        test_cmp expected_without_stash actual
1572'
1573
1574test_expect_success 'no additionnal info if no stash entries' '
1575        git stash clear &&
1576        git -c status.showStash=true status >actual &&
1577        test_cmp expected_without_stash actual
1578'
1579
1580test_expect_success '"No commits yet" should be noted in status output' '
1581        git checkout --orphan empty-branch-1 &&
1582        git status >output &&
1583        test_i18ngrep "No commits yet" output
1584'
1585
1586test_expect_success '"No commits yet" should not be noted in status output' '
1587        git checkout --orphan empty-branch-2 &&
1588        test_commit test-commit-1 &&
1589        git status >output &&
1590        test_i18ngrep ! "No commits yet" output
1591'
1592
1593test_expect_success '"Initial commit" should be noted in commit template' '
1594        git checkout --orphan empty-branch-3 &&
1595        touch to_be_committed_1 &&
1596        git add to_be_committed_1 &&
1597        git commit --dry-run >output &&
1598        test_i18ngrep "Initial commit" output
1599'
1600
1601test_expect_success '"Initial commit" should not be noted in commit template' '
1602        git checkout --orphan empty-branch-4 &&
1603        test_commit test-commit-2 &&
1604        touch to_be_committed_2 &&
1605        git add to_be_committed_2 &&
1606        git commit --dry-run >output &&
1607        test_i18ngrep ! "Initial commit" output
1608'
1609
1610test_expect_success '--no-optional-locks prevents index update' '
1611        test-tool chmtime =1234567890 .git/index &&
1612        git --no-optional-locks status &&
1613        test-tool chmtime --get .git/index >out &&
1614        grep ^1234567890 out &&
1615        git status &&
1616        test-tool chmtime --get .git/index >out &&
1617        ! grep ^1234567890 out
1618'
1619
1620test_done