t / t7508-status.shon commit Merge branch 'tr/receive-pack-aliased-update-fix' (cecff3a)
   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 'setup' '
  11        : >tracked &&
  12        : >modified &&
  13        mkdir dir1 &&
  14        : >dir1/tracked &&
  15        : >dir1/modified &&
  16        mkdir dir2 &&
  17        : >dir1/tracked &&
  18        : >dir1/modified &&
  19        git add . &&
  20
  21        git status >output &&
  22
  23        test_tick &&
  24        git commit -m initial &&
  25        : >untracked &&
  26        : >dir1/untracked &&
  27        : >dir2/untracked &&
  28        echo 1 >dir1/modified &&
  29        echo 2 >dir2/modified &&
  30        echo 3 >dir2/added &&
  31        git add dir2/added
  32'
  33
  34test_expect_success 'status (1)' '
  35
  36        grep "use \"git rm --cached <file>\.\.\.\" to unstage" output
  37
  38'
  39
  40cat >expect <<\EOF
  41# On branch master
  42# Changes to be committed:
  43#   (use "git reset HEAD <file>..." to unstage)
  44#
  45#       new file:   dir2/added
  46#
  47# Changed but not updated:
  48#   (use "git add <file>..." to update what will be committed)
  49#   (use "git checkout -- <file>..." to discard changes in working directory)
  50#
  51#       modified:   dir1/modified
  52#
  53# Untracked files:
  54#   (use "git add <file>..." to include in what will be committed)
  55#
  56#       dir1/untracked
  57#       dir2/modified
  58#       dir2/untracked
  59#       expect
  60#       output
  61#       untracked
  62EOF
  63
  64test_expect_success 'status (2)' '
  65
  66        git status >output &&
  67        test_cmp expect output
  68
  69'
  70
  71cat >expect <<\EOF
  72# On branch master
  73# Changes to be committed:
  74#       new file:   dir2/added
  75#
  76# Changed but not updated:
  77#       modified:   dir1/modified
  78#
  79# Untracked files:
  80#       dir1/untracked
  81#       dir2/modified
  82#       dir2/untracked
  83#       expect
  84#       output
  85#       untracked
  86EOF
  87
  88git config advice.statusHints false
  89
  90test_expect_success 'status (advice.statusHints false)' '
  91
  92        git status >output &&
  93        test_cmp expect output
  94
  95'
  96
  97git config --unset advice.statusHints
  98
  99cat >expect <<\EOF
 100 M dir1/modified
 101A  dir2/added
 102?? dir1/untracked
 103?? dir2/modified
 104?? dir2/untracked
 105?? expect
 106?? output
 107?? untracked
 108EOF
 109
 110test_expect_success 'status -s' '
 111
 112        git status -s >output &&
 113        test_cmp expect output
 114
 115'
 116
 117cat >expect <<\EOF
 118## master
 119 M dir1/modified
 120A  dir2/added
 121?? dir1/untracked
 122?? dir2/modified
 123?? dir2/untracked
 124?? expect
 125?? output
 126?? untracked
 127EOF
 128
 129test_expect_success 'status -s -b' '
 130
 131        git status -s -b >output &&
 132        test_cmp expect output
 133
 134'
 135
 136cat >expect <<EOF
 137# On branch master
 138# Changes to be committed:
 139#   (use "git reset HEAD <file>..." to unstage)
 140#
 141#       new file:   dir2/added
 142#
 143# Changed but not updated:
 144#   (use "git add <file>..." to update what will be committed)
 145#   (use "git checkout -- <file>..." to discard changes in working directory)
 146#
 147#       modified:   dir1/modified
 148#
 149# Untracked files not listed (use -u option to show untracked files)
 150EOF
 151test_expect_success 'status -uno' '
 152        mkdir dir3 &&
 153        : >dir3/untracked1 &&
 154        : >dir3/untracked2 &&
 155        git status -uno >output &&
 156        test_cmp expect output
 157'
 158
 159test_expect_success 'status (status.showUntrackedFiles no)' '
 160        git config status.showuntrackedfiles no
 161        git status >output &&
 162        test_cmp expect output
 163'
 164
 165cat >expect <<EOF
 166# On branch master
 167# Changes to be committed:
 168#       new file:   dir2/added
 169#
 170# Changed but not updated:
 171#       modified:   dir1/modified
 172#
 173# Untracked files not listed
 174EOF
 175git config advice.statusHints false
 176test_expect_success 'status -uno (advice.statusHints false)' '
 177        git status -uno >output &&
 178        test_cmp expect output
 179'
 180git config --unset advice.statusHints
 181
 182cat >expect << EOF
 183 M dir1/modified
 184A  dir2/added
 185EOF
 186test_expect_success 'status -s -uno' '
 187        git config --unset status.showuntrackedfiles
 188        git status -s -uno >output &&
 189        test_cmp expect output
 190'
 191
 192test_expect_success 'status -s (status.showUntrackedFiles no)' '
 193        git config status.showuntrackedfiles no
 194        git status -s >output &&
 195        test_cmp expect output
 196'
 197
 198cat >expect <<EOF
 199# On branch master
 200# Changes to be committed:
 201#   (use "git reset HEAD <file>..." to unstage)
 202#
 203#       new file:   dir2/added
 204#
 205# Changed but not updated:
 206#   (use "git add <file>..." to update what will be committed)
 207#   (use "git checkout -- <file>..." to discard changes in working directory)
 208#
 209#       modified:   dir1/modified
 210#
 211# Untracked files:
 212#   (use "git add <file>..." to include in what will be committed)
 213#
 214#       dir1/untracked
 215#       dir2/modified
 216#       dir2/untracked
 217#       dir3/
 218#       expect
 219#       output
 220#       untracked
 221EOF
 222test_expect_success 'status -unormal' '
 223        git status -unormal >output &&
 224        test_cmp expect output
 225'
 226
 227test_expect_success 'status (status.showUntrackedFiles normal)' '
 228        git config status.showuntrackedfiles normal
 229        git status >output &&
 230        test_cmp expect output
 231'
 232
 233cat >expect <<EOF
 234 M dir1/modified
 235A  dir2/added
 236?? dir1/untracked
 237?? dir2/modified
 238?? dir2/untracked
 239?? dir3/
 240?? expect
 241?? output
 242?? untracked
 243EOF
 244test_expect_success 'status -s -unormal' '
 245        git config --unset status.showuntrackedfiles
 246        git status -s -unormal >output &&
 247        test_cmp expect output
 248'
 249
 250test_expect_success 'status -s (status.showUntrackedFiles normal)' '
 251        git config status.showuntrackedfiles normal
 252        git status -s >output &&
 253        test_cmp expect output
 254'
 255
 256cat >expect <<EOF
 257# On branch master
 258# Changes to be committed:
 259#   (use "git reset HEAD <file>..." to unstage)
 260#
 261#       new file:   dir2/added
 262#
 263# Changed but not updated:
 264#   (use "git add <file>..." to update what will be committed)
 265#   (use "git checkout -- <file>..." to discard changes in working directory)
 266#
 267#       modified:   dir1/modified
 268#
 269# Untracked files:
 270#   (use "git add <file>..." to include in what will be committed)
 271#
 272#       dir1/untracked
 273#       dir2/modified
 274#       dir2/untracked
 275#       dir3/untracked1
 276#       dir3/untracked2
 277#       expect
 278#       output
 279#       untracked
 280EOF
 281test_expect_success 'status -uall' '
 282        git status -uall >output &&
 283        test_cmp expect output
 284'
 285test_expect_success 'status (status.showUntrackedFiles all)' '
 286        git config status.showuntrackedfiles all
 287        git status >output &&
 288        rm -rf dir3 &&
 289        git config --unset status.showuntrackedfiles &&
 290        test_cmp expect output
 291'
 292
 293cat >expect <<EOF
 294 M dir1/modified
 295A  dir2/added
 296?? dir1/untracked
 297?? dir2/modified
 298?? dir2/untracked
 299?? expect
 300?? output
 301?? untracked
 302EOF
 303test_expect_success 'status -s -uall' '
 304        git config --unset status.showuntrackedfiles
 305        git status -s -uall >output &&
 306        test_cmp expect output
 307'
 308test_expect_success 'status -s (status.showUntrackedFiles all)' '
 309        git config status.showuntrackedfiles all
 310        git status -s >output &&
 311        rm -rf dir3 &&
 312        git config --unset status.showuntrackedfiles &&
 313        test_cmp expect output
 314'
 315
 316cat >expect <<\EOF
 317# On branch master
 318# Changes to be committed:
 319#   (use "git reset HEAD <file>..." to unstage)
 320#
 321#       new file:   ../dir2/added
 322#
 323# Changed but not updated:
 324#   (use "git add <file>..." to update what will be committed)
 325#   (use "git checkout -- <file>..." to discard changes in working directory)
 326#
 327#       modified:   modified
 328#
 329# Untracked files:
 330#   (use "git add <file>..." to include in what will be committed)
 331#
 332#       untracked
 333#       ../dir2/modified
 334#       ../dir2/untracked
 335#       ../expect
 336#       ../output
 337#       ../untracked
 338EOF
 339
 340test_expect_success 'status with relative paths' '
 341
 342        (cd dir1 && git status) >output &&
 343        test_cmp expect output
 344
 345'
 346
 347cat >expect <<\EOF
 348 M modified
 349A  ../dir2/added
 350?? untracked
 351?? ../dir2/modified
 352?? ../dir2/untracked
 353?? ../expect
 354?? ../output
 355?? ../untracked
 356EOF
 357test_expect_success 'status -s with relative paths' '
 358
 359        (cd dir1 && git status -s) >output &&
 360        test_cmp expect output
 361
 362'
 363
 364cat >expect <<\EOF
 365 M dir1/modified
 366A  dir2/added
 367?? dir1/untracked
 368?? dir2/modified
 369?? dir2/untracked
 370?? expect
 371?? output
 372?? untracked
 373EOF
 374
 375test_expect_success 'status --porcelain ignores relative paths setting' '
 376
 377        (cd dir1 && git status --porcelain) >output &&
 378        test_cmp expect output
 379
 380'
 381
 382test_expect_success 'setup unique colors' '
 383
 384        git config status.color.untracked blue
 385
 386'
 387
 388cat >expect <<\EOF
 389# On branch master
 390# Changes to be committed:
 391#   (use "git reset HEAD <file>..." to unstage)
 392#
 393#       <GREEN>new file:   dir2/added<RESET>
 394#
 395# Changed but not updated:
 396#   (use "git add <file>..." to update what will be committed)
 397#   (use "git checkout -- <file>..." to discard changes in working directory)
 398#
 399#       <RED>modified:   dir1/modified<RESET>
 400#
 401# Untracked files:
 402#   (use "git add <file>..." to include in what will be committed)
 403#
 404#       <BLUE>dir1/untracked<RESET>
 405#       <BLUE>dir2/modified<RESET>
 406#       <BLUE>dir2/untracked<RESET>
 407#       <BLUE>expect<RESET>
 408#       <BLUE>output<RESET>
 409#       <BLUE>untracked<RESET>
 410EOF
 411
 412test_expect_success 'status with color.ui' '
 413
 414        git config color.ui always &&
 415        git status | test_decode_color >output &&
 416        test_cmp expect output
 417
 418'
 419
 420test_expect_success 'status with color.status' '
 421
 422        git config --unset color.ui &&
 423        git config color.status always &&
 424        git status | test_decode_color >output &&
 425        test_cmp expect output
 426
 427'
 428
 429cat >expect <<\EOF
 430 <RED>M<RESET> dir1/modified
 431<GREEN>A<RESET>  dir2/added
 432<BLUE>??<RESET> dir1/untracked
 433<BLUE>??<RESET> dir2/modified
 434<BLUE>??<RESET> dir2/untracked
 435<BLUE>??<RESET> expect
 436<BLUE>??<RESET> output
 437<BLUE>??<RESET> untracked
 438EOF
 439
 440test_expect_success 'status -s with color.ui' '
 441
 442        git config --unset color.status &&
 443        git config color.ui always &&
 444        git status -s | test_decode_color >output &&
 445        test_cmp expect output
 446
 447'
 448
 449test_expect_success 'status -s with color.status' '
 450
 451        git config --unset color.ui &&
 452        git config color.status always &&
 453        git status -s | test_decode_color >output &&
 454        test_cmp expect output
 455
 456'
 457
 458cat >expect <<\EOF
 459## <GREEN>master<RESET>
 460 <RED>M<RESET> dir1/modified
 461<GREEN>A<RESET>  dir2/added
 462<BLUE>??<RESET> dir1/untracked
 463<BLUE>??<RESET> dir2/modified
 464<BLUE>??<RESET> dir2/untracked
 465<BLUE>??<RESET> expect
 466<BLUE>??<RESET> output
 467<BLUE>??<RESET> untracked
 468EOF
 469
 470test_expect_success 'status -s -b with color.status' '
 471
 472        git status -s -b | test_decode_color >output &&
 473        test_cmp expect output
 474
 475'
 476
 477cat >expect <<\EOF
 478 M dir1/modified
 479A  dir2/added
 480?? dir1/untracked
 481?? dir2/modified
 482?? dir2/untracked
 483?? expect
 484?? output
 485?? untracked
 486EOF
 487
 488test_expect_success 'status --porcelain ignores color.ui' '
 489
 490        git config --unset color.status &&
 491        git config color.ui always &&
 492        git status --porcelain | test_decode_color >output &&
 493        test_cmp expect output
 494
 495'
 496
 497test_expect_success 'status --porcelain ignores color.status' '
 498
 499        git config --unset color.ui &&
 500        git config color.status always &&
 501        git status --porcelain | test_decode_color >output &&
 502        test_cmp expect output
 503
 504'
 505
 506# recover unconditionally from color tests
 507git config --unset color.status
 508git config --unset color.ui
 509
 510test_expect_success 'status --porcelain ignores -b' '
 511
 512        git status --porcelain -b >output &&
 513        test_cmp expect output
 514
 515'
 516
 517cat >expect <<\EOF
 518# On branch master
 519# Changes to be committed:
 520#   (use "git reset HEAD <file>..." to unstage)
 521#
 522#       new file:   dir2/added
 523#
 524# Changed but not updated:
 525#   (use "git add <file>..." to update what will be committed)
 526#   (use "git checkout -- <file>..." to discard changes in working directory)
 527#
 528#       modified:   dir1/modified
 529#
 530# Untracked files:
 531#   (use "git add <file>..." to include in what will be committed)
 532#
 533#       dir1/untracked
 534#       dir2/modified
 535#       dir2/untracked
 536#       expect
 537#       output
 538#       untracked
 539EOF
 540
 541
 542test_expect_success 'status without relative paths' '
 543
 544        git config status.relativePaths false
 545        (cd dir1 && git status) >output &&
 546        test_cmp expect output
 547
 548'
 549
 550cat >expect <<\EOF
 551 M dir1/modified
 552A  dir2/added
 553?? dir1/untracked
 554?? dir2/modified
 555?? dir2/untracked
 556?? expect
 557?? output
 558?? untracked
 559EOF
 560
 561test_expect_success 'status -s without relative paths' '
 562
 563        (cd dir1 && git status -s) >output &&
 564        test_cmp expect output
 565
 566'
 567
 568cat <<EOF >expect
 569# On branch master
 570# Changes to be committed:
 571#   (use "git reset HEAD <file>..." to unstage)
 572#
 573#       modified:   dir1/modified
 574#
 575# Untracked files:
 576#   (use "git add <file>..." to include in what will be committed)
 577#
 578#       dir1/untracked
 579#       dir2/
 580#       expect
 581#       output
 582#       untracked
 583EOF
 584test_expect_success 'dry-run of partial commit excluding new file in index' '
 585        git commit --dry-run dir1/modified >output &&
 586        test_cmp expect output
 587'
 588
 589cat >expect <<EOF
 590:100644 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 M      dir1/modified
 591EOF
 592test_expect_success 'status refreshes the index' '
 593        touch dir2/added &&
 594        git status &&
 595        git diff-files >output &&
 596        test_cmp expect output
 597'
 598
 599test_expect_success 'setup status submodule summary' '
 600        test_create_repo sm && (
 601                cd sm &&
 602                >foo &&
 603                git add foo &&
 604                git commit -m "Add foo"
 605        ) &&
 606        git add sm
 607'
 608
 609cat >expect <<EOF
 610# On branch master
 611# Changes to be committed:
 612#   (use "git reset HEAD <file>..." to unstage)
 613#
 614#       new file:   dir2/added
 615#       new file:   sm
 616#
 617# Changed but not updated:
 618#   (use "git add <file>..." to update what will be committed)
 619#   (use "git checkout -- <file>..." to discard changes in working directory)
 620#
 621#       modified:   dir1/modified
 622#
 623# Untracked files:
 624#   (use "git add <file>..." to include in what will be committed)
 625#
 626#       dir1/untracked
 627#       dir2/modified
 628#       dir2/untracked
 629#       expect
 630#       output
 631#       untracked
 632EOF
 633test_expect_success 'status submodule summary is disabled by default' '
 634        git status >output &&
 635        test_cmp expect output
 636'
 637
 638# we expect the same as the previous test
 639test_expect_success 'status --untracked-files=all does not show submodule' '
 640        git status --untracked-files=all >output &&
 641        test_cmp expect output
 642'
 643
 644cat >expect <<EOF
 645 M dir1/modified
 646A  dir2/added
 647A  sm
 648?? dir1/untracked
 649?? dir2/modified
 650?? dir2/untracked
 651?? expect
 652?? output
 653?? untracked
 654EOF
 655test_expect_success 'status -s submodule summary is disabled by default' '
 656        git status -s >output &&
 657        test_cmp expect output
 658'
 659
 660# we expect the same as the previous test
 661test_expect_success 'status -s --untracked-files=all does not show submodule' '
 662        git status -s --untracked-files=all >output &&
 663        test_cmp expect output
 664'
 665
 666head=$(cd sm && git rev-parse --short=7 --verify HEAD)
 667
 668cat >expect <<EOF
 669# On branch master
 670# Changes to be committed:
 671#   (use "git reset HEAD <file>..." to unstage)
 672#
 673#       new file:   dir2/added
 674#       new file:   sm
 675#
 676# Changed but not updated:
 677#   (use "git add <file>..." to update what will be committed)
 678#   (use "git checkout -- <file>..." to discard changes in working directory)
 679#
 680#       modified:   dir1/modified
 681#
 682# Submodule changes to be committed:
 683#
 684# * sm 0000000...$head (1):
 685#   > Add foo
 686#
 687# Untracked files:
 688#   (use "git add <file>..." to include in what will be committed)
 689#
 690#       dir1/untracked
 691#       dir2/modified
 692#       dir2/untracked
 693#       expect
 694#       output
 695#       untracked
 696EOF
 697test_expect_success 'status submodule summary' '
 698        git config status.submodulesummary 10 &&
 699        git status >output &&
 700        test_cmp expect output
 701'
 702
 703cat >expect <<EOF
 704 M dir1/modified
 705A  dir2/added
 706A  sm
 707?? dir1/untracked
 708?? dir2/modified
 709?? dir2/untracked
 710?? expect
 711?? output
 712?? untracked
 713EOF
 714test_expect_success 'status -s submodule summary' '
 715        git status -s >output &&
 716        test_cmp expect output
 717'
 718
 719cat >expect <<EOF
 720# On branch master
 721# Changed but not updated:
 722#   (use "git add <file>..." to update what will be committed)
 723#   (use "git checkout -- <file>..." to discard changes in working directory)
 724#
 725#       modified:   dir1/modified
 726#
 727# Untracked files:
 728#   (use "git add <file>..." to include in what will be committed)
 729#
 730#       dir1/untracked
 731#       dir2/modified
 732#       dir2/untracked
 733#       expect
 734#       output
 735#       untracked
 736no changes added to commit (use "git add" and/or "git commit -a")
 737EOF
 738test_expect_success 'status submodule summary (clean submodule)' '
 739        git commit -m "commit submodule" &&
 740        git config status.submodulesummary 10 &&
 741        test_must_fail git commit --dry-run >output &&
 742        test_cmp expect output &&
 743        git status >output &&
 744        test_cmp expect output
 745'
 746
 747cat >expect <<EOF
 748 M dir1/modified
 749?? dir1/untracked
 750?? dir2/modified
 751?? dir2/untracked
 752?? expect
 753?? output
 754?? untracked
 755EOF
 756test_expect_success 'status -s submodule summary (clean submodule)' '
 757        git status -s >output &&
 758        test_cmp expect output
 759'
 760
 761cat >expect <<EOF
 762# On branch master
 763# Changes to be committed:
 764#   (use "git reset HEAD^1 <file>..." to unstage)
 765#
 766#       new file:   dir2/added
 767#       new file:   sm
 768#
 769# Changed but not updated:
 770#   (use "git add <file>..." to update what will be committed)
 771#   (use "git checkout -- <file>..." to discard changes in working directory)
 772#
 773#       modified:   dir1/modified
 774#
 775# Submodule changes to be committed:
 776#
 777# * sm 0000000...$head (1):
 778#   > Add foo
 779#
 780# Untracked files:
 781#   (use "git add <file>..." to include in what will be committed)
 782#
 783#       dir1/untracked
 784#       dir2/modified
 785#       dir2/untracked
 786#       expect
 787#       output
 788#       untracked
 789EOF
 790test_expect_success 'commit --dry-run submodule summary (--amend)' '
 791        git config status.submodulesummary 10 &&
 792        git commit --dry-run --amend >output &&
 793        test_cmp expect output
 794'
 795
 796test_expect_success POSIXPERM 'status succeeds in a read-only repository' '
 797        (
 798                chmod a-w .git &&
 799                # make dir1/tracked stat-dirty
 800                >dir1/tracked1 && mv -f dir1/tracked1 dir1/tracked &&
 801                git status -s >output &&
 802                ! grep dir1/tracked output &&
 803                # make sure "status" succeeded without writing index out
 804                git diff-files | grep dir1/tracked
 805        )
 806        status=$?
 807        chmod 775 .git
 808        (exit $status)
 809'
 810
 811test_done