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