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