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