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