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