t / t9903-bash-prompt.shon commit Sync with maint (3034dab)
   1#!/bin/sh
   2#
   3# Copyright (c) 2012 SZEDER Gábor
   4#
   5
   6test_description='test git-specific bash prompt functions'
   7
   8. ./lib-bash.sh
   9
  10. "$GIT_BUILD_DIR/contrib/completion/git-prompt.sh"
  11
  12actual="$TRASH_DIRECTORY/actual"
  13c_red='\\[\\e[31m\\]'
  14c_green='\\[\\e[32m\\]'
  15c_lblue='\\[\\e[1;34m\\]'
  16c_clear='\\[\\e[0m\\]'
  17
  18test_expect_success 'setup for prompt tests' '
  19        git init otherrepo &&
  20        echo 1 >file &&
  21        git add file &&
  22        test_tick &&
  23        git commit -m initial &&
  24        git tag -a -m msg1 t1 &&
  25        git checkout -b b1 &&
  26        echo 2 >file &&
  27        git commit -m "second b1" file &&
  28        echo 3 >file &&
  29        git commit -m "third b1" file &&
  30        git tag -a -m msg2 t2 &&
  31        git checkout -b b2 master &&
  32        echo 0 >file &&
  33        git commit -m "second b2" file &&
  34        echo 00 >file &&
  35        git commit -m "another b2" file &&
  36        echo 000 >file &&
  37        git commit -m "yet another b2" file &&
  38        mkdir ignored_dir &&
  39        echo "ignored_dir/" >>.gitignore &&
  40        git checkout master
  41'
  42
  43test_expect_success 'prompt - branch name' '
  44        printf " (master)" >expected &&
  45        __git_ps1 >"$actual" &&
  46        test_cmp expected "$actual"
  47'
  48
  49test_expect_success SYMLINKS 'prompt - branch name - symlink symref' '
  50        printf " (master)" >expected &&
  51        test_when_finished "git checkout master" &&
  52        test_config core.preferSymlinkRefs true &&
  53        git checkout master &&
  54        __git_ps1 >"$actual" &&
  55        test_cmp expected "$actual"
  56'
  57
  58test_expect_success 'prompt - unborn branch' '
  59        printf " (unborn)" >expected &&
  60        git checkout --orphan unborn &&
  61        test_when_finished "git checkout master" &&
  62        __git_ps1 >"$actual" &&
  63        test_cmp expected "$actual"
  64'
  65
  66if test_have_prereq !FUNNYNAMES; then
  67        say 'Your filesystem does not allow newlines in filenames.'
  68fi
  69
  70test_expect_success FUNNYNAMES 'prompt - with newline in path' '
  71    repo_with_newline="repo
  72with
  73newline" &&
  74        mkdir "$repo_with_newline" &&
  75        printf " (master)" >expected &&
  76        git init "$repo_with_newline" &&
  77        test_when_finished "rm -rf \"$repo_with_newline\"" &&
  78        mkdir "$repo_with_newline"/subdir &&
  79        (
  80                cd "$repo_with_newline/subdir" &&
  81                __git_ps1 >"$actual"
  82        ) &&
  83        test_cmp expected "$actual"
  84'
  85
  86test_expect_success 'prompt - detached head' '
  87        printf " ((%s...))" $(git log -1 --format="%h" --abbrev=13 b1^) >expected &&
  88        test_config core.abbrev 13 &&
  89        git checkout b1^ &&
  90        test_when_finished "git checkout master" &&
  91        __git_ps1 >"$actual" &&
  92        test_cmp expected "$actual"
  93'
  94
  95test_expect_success 'prompt - describe detached head - contains' '
  96        printf " ((t2~1))" >expected &&
  97        git checkout b1^ &&
  98        test_when_finished "git checkout master" &&
  99        (
 100                GIT_PS1_DESCRIBE_STYLE=contains &&
 101                __git_ps1 >"$actual"
 102        ) &&
 103        test_cmp expected "$actual"
 104'
 105
 106test_expect_success 'prompt - describe detached head - branch' '
 107        printf " ((tags/t2~1))" >expected &&
 108        git checkout b1^ &&
 109        test_when_finished "git checkout master" &&
 110        (
 111                GIT_PS1_DESCRIBE_STYLE=branch &&
 112                __git_ps1 >"$actual"
 113        ) &&
 114        test_cmp expected "$actual"
 115'
 116
 117test_expect_success 'prompt - describe detached head - describe' '
 118        printf " ((t1-1-g%s))" $(git log -1 --format="%h" b1^) >expected &&
 119        git checkout b1^ &&
 120        test_when_finished "git checkout master" &&
 121        (
 122                GIT_PS1_DESCRIBE_STYLE=describe &&
 123                __git_ps1 >"$actual"
 124        ) &&
 125        test_cmp expected "$actual"
 126'
 127
 128test_expect_success 'prompt - describe detached head - default' '
 129        printf " ((t2))" >expected &&
 130        git checkout --detach b1 &&
 131        test_when_finished "git checkout master" &&
 132        __git_ps1 >"$actual" &&
 133        test_cmp expected "$actual"
 134'
 135
 136test_expect_success 'prompt - inside .git directory' '
 137        printf " (GIT_DIR!)" >expected &&
 138        (
 139                cd .git &&
 140                __git_ps1 >"$actual"
 141        ) &&
 142        test_cmp expected "$actual"
 143'
 144
 145test_expect_success 'prompt - deep inside .git directory' '
 146        printf " (GIT_DIR!)" >expected &&
 147        (
 148                cd .git/objects &&
 149                __git_ps1 >"$actual"
 150        ) &&
 151        test_cmp expected "$actual"
 152'
 153
 154test_expect_success 'prompt - inside bare repository' '
 155        printf " (BARE:master)" >expected &&
 156        git init --bare bare.git &&
 157        test_when_finished "rm -rf bare.git" &&
 158        (
 159                cd bare.git &&
 160                __git_ps1 >"$actual"
 161        ) &&
 162        test_cmp expected "$actual"
 163'
 164
 165test_expect_success 'prompt - interactive rebase' '
 166        printf " (b1|REBASE-i 2/3)" >expected &&
 167        write_script fake_editor.sh <<-\EOF &&
 168                echo "exec echo" >"$1"
 169                echo "edit $(git log -1 --format="%h")" >>"$1"
 170                echo "exec echo" >>"$1"
 171        EOF
 172        test_when_finished "rm -f fake_editor.sh" &&
 173        test_set_editor "$TRASH_DIRECTORY/fake_editor.sh" &&
 174        git checkout b1 &&
 175        test_when_finished "git checkout master" &&
 176        git rebase -i HEAD^ &&
 177        test_when_finished "git rebase --abort" &&
 178        __git_ps1 >"$actual" &&
 179        test_cmp expected "$actual"
 180'
 181
 182test_expect_success 'prompt - rebase merge' '
 183        printf " (b2|REBASE-i 1/3)" >expected &&
 184        git checkout b2 &&
 185        test_when_finished "git checkout master" &&
 186        test_must_fail git rebase --merge b1 b2 &&
 187        test_when_finished "git rebase --abort" &&
 188        __git_ps1 >"$actual" &&
 189        test_cmp expected "$actual"
 190'
 191
 192test_expect_success 'prompt - rebase' '
 193        printf " (b2|REBASE 1/3)" >expected &&
 194        git checkout b2 &&
 195        test_when_finished "git checkout master" &&
 196        test_must_fail git rebase b1 b2 &&
 197        test_when_finished "git rebase --abort" &&
 198        __git_ps1 >"$actual" &&
 199        test_cmp expected "$actual"
 200'
 201
 202test_expect_success 'prompt - merge' '
 203        printf " (b1|MERGING)" >expected &&
 204        git checkout b1 &&
 205        test_when_finished "git checkout master" &&
 206        test_must_fail git merge b2 &&
 207        test_when_finished "git reset --hard" &&
 208        __git_ps1 >"$actual" &&
 209        test_cmp expected "$actual"
 210'
 211
 212test_expect_success 'prompt - cherry-pick' '
 213        printf " (master|CHERRY-PICKING)" >expected &&
 214        test_must_fail git cherry-pick b1 b1^ &&
 215        test_when_finished "git cherry-pick --abort" &&
 216        __git_ps1 >"$actual" &&
 217        test_cmp expected "$actual" &&
 218        git reset --merge &&
 219        test_must_fail git rev-parse CHERRY_PICK_HEAD &&
 220        __git_ps1 >"$actual" &&
 221        test_cmp expected "$actual"
 222'
 223
 224test_expect_success 'prompt - revert' '
 225        printf " (master|REVERTING)" >expected &&
 226        test_must_fail git revert b1^ b1 &&
 227        test_when_finished "git revert --abort" &&
 228        __git_ps1 >"$actual" &&
 229        test_cmp expected "$actual" &&
 230        git reset --merge &&
 231        test_must_fail git rev-parse REVERT_HEAD &&
 232        __git_ps1 >"$actual" &&
 233        test_cmp expected "$actual"
 234'
 235
 236test_expect_success 'prompt - bisect' '
 237        printf " (master|BISECTING)" >expected &&
 238        git bisect start &&
 239        test_when_finished "git bisect reset" &&
 240        __git_ps1 >"$actual" &&
 241        test_cmp expected "$actual"
 242'
 243
 244test_expect_success 'prompt - dirty status indicator - clean' '
 245        printf " (master)" >expected &&
 246        (
 247                GIT_PS1_SHOWDIRTYSTATE=y &&
 248                __git_ps1 >"$actual"
 249        ) &&
 250        test_cmp expected "$actual"
 251'
 252
 253test_expect_success 'prompt - dirty status indicator - dirty worktree' '
 254        printf " (master *)" >expected &&
 255        echo "dirty" >file &&
 256        test_when_finished "git reset --hard" &&
 257        (
 258                GIT_PS1_SHOWDIRTYSTATE=y &&
 259                __git_ps1 >"$actual"
 260        ) &&
 261        test_cmp expected "$actual"
 262'
 263
 264test_expect_success 'prompt - dirty status indicator - dirty index' '
 265        printf " (master +)" >expected &&
 266        echo "dirty" >file &&
 267        test_when_finished "git reset --hard" &&
 268        git add -u &&
 269        (
 270                GIT_PS1_SHOWDIRTYSTATE=y &&
 271                __git_ps1 >"$actual"
 272        ) &&
 273        test_cmp expected "$actual"
 274'
 275
 276test_expect_success 'prompt - dirty status indicator - dirty index and worktree' '
 277        printf " (master *+)" >expected &&
 278        echo "dirty index" >file &&
 279        test_when_finished "git reset --hard" &&
 280        git add -u &&
 281        echo "dirty worktree" >file &&
 282        (
 283                GIT_PS1_SHOWDIRTYSTATE=y &&
 284                __git_ps1 >"$actual"
 285        ) &&
 286        test_cmp expected "$actual"
 287'
 288
 289test_expect_success 'prompt - dirty status indicator - orphan branch - clean' '
 290        printf " (orphan #)" >expected &&
 291        test_when_finished "git checkout master" &&
 292        git checkout --orphan orphan &&
 293        git reset --hard &&
 294        (
 295                GIT_PS1_SHOWDIRTYSTATE=y &&
 296                __git_ps1 >"$actual"
 297        ) &&
 298        test_cmp expected "$actual"
 299'
 300
 301test_expect_success 'prompt - dirty status indicator - orphan branch - dirty index' '
 302        printf " (orphan +)" >expected &&
 303        test_when_finished "git checkout master" &&
 304        git checkout --orphan orphan &&
 305        (
 306                GIT_PS1_SHOWDIRTYSTATE=y &&
 307                __git_ps1 >"$actual"
 308        ) &&
 309        test_cmp expected "$actual"
 310'
 311
 312test_expect_success 'prompt - dirty status indicator - orphan branch - dirty index and worktree' '
 313        printf " (orphan *+)" >expected &&
 314        test_when_finished "git checkout master" &&
 315        git checkout --orphan orphan &&
 316        >file &&
 317        (
 318                GIT_PS1_SHOWDIRTYSTATE=y &&
 319                __git_ps1 >"$actual"
 320        ) &&
 321        test_cmp expected "$actual"
 322'
 323
 324test_expect_success 'prompt - dirty status indicator - shell variable unset with config disabled' '
 325        printf " (master)" >expected &&
 326        echo "dirty" >file &&
 327        test_when_finished "git reset --hard" &&
 328        test_config bash.showDirtyState false &&
 329        (
 330                sane_unset GIT_PS1_SHOWDIRTYSTATE &&
 331                __git_ps1 >"$actual"
 332        ) &&
 333        test_cmp expected "$actual"
 334'
 335
 336test_expect_success 'prompt - dirty status indicator - shell variable unset with config enabled' '
 337        printf " (master)" >expected &&
 338        echo "dirty" >file &&
 339        test_when_finished "git reset --hard" &&
 340        test_config bash.showDirtyState true &&
 341        (
 342                sane_unset GIT_PS1_SHOWDIRTYSTATE &&
 343                __git_ps1 >"$actual"
 344        ) &&
 345        test_cmp expected "$actual"
 346'
 347
 348test_expect_success 'prompt - dirty status indicator - shell variable set with config disabled' '
 349        printf " (master)" >expected &&
 350        echo "dirty" >file &&
 351        test_when_finished "git reset --hard" &&
 352        test_config bash.showDirtyState false &&
 353        (
 354                GIT_PS1_SHOWDIRTYSTATE=y &&
 355                __git_ps1 >"$actual"
 356        ) &&
 357        test_cmp expected "$actual"
 358'
 359
 360test_expect_success 'prompt - dirty status indicator - shell variable set with config enabled' '
 361        printf " (master *)" >expected &&
 362        echo "dirty" >file &&
 363        test_when_finished "git reset --hard" &&
 364        test_config bash.showDirtyState true &&
 365        (
 366                GIT_PS1_SHOWDIRTYSTATE=y &&
 367                __git_ps1 >"$actual"
 368        ) &&
 369        test_cmp expected "$actual"
 370'
 371
 372test_expect_success 'prompt - dirty status indicator - not shown inside .git directory' '
 373        printf " (GIT_DIR!)" >expected &&
 374        echo "dirty" >file &&
 375        test_when_finished "git reset --hard" &&
 376        (
 377                GIT_PS1_SHOWDIRTYSTATE=y &&
 378                cd .git &&
 379                __git_ps1 >"$actual"
 380        ) &&
 381        test_cmp expected "$actual"
 382'
 383
 384test_expect_success 'prompt - stash status indicator - no stash' '
 385        printf " (master)" >expected &&
 386        (
 387                GIT_PS1_SHOWSTASHSTATE=y &&
 388                __git_ps1 >"$actual"
 389        ) &&
 390        test_cmp expected "$actual"
 391'
 392
 393test_expect_success 'prompt - stash status indicator - stash' '
 394        printf " (master $)" >expected &&
 395        echo 2 >file &&
 396        git stash &&
 397        test_when_finished "git stash drop" &&
 398        git pack-refs --all &&
 399        (
 400                GIT_PS1_SHOWSTASHSTATE=y &&
 401                __git_ps1 >"$actual"
 402        ) &&
 403        test_cmp expected "$actual"
 404'
 405
 406test_expect_success 'prompt - stash status indicator - not shown inside .git directory' '
 407        printf " (GIT_DIR!)" >expected &&
 408        echo 2 >file &&
 409        git stash &&
 410        test_when_finished "git stash drop" &&
 411        (
 412                GIT_PS1_SHOWSTASHSTATE=y &&
 413                cd .git &&
 414                __git_ps1 >"$actual"
 415        ) &&
 416        test_cmp expected "$actual"
 417'
 418
 419test_expect_success 'prompt - untracked files status indicator - no untracked files' '
 420        printf " (master)" >expected &&
 421        (
 422                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 423                cd otherrepo &&
 424                __git_ps1 >"$actual"
 425        ) &&
 426        test_cmp expected "$actual"
 427'
 428
 429test_expect_success 'prompt - untracked files status indicator - untracked files' '
 430        printf " (master %%)" >expected &&
 431        (
 432                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 433                __git_ps1 >"$actual"
 434        ) &&
 435        test_cmp expected "$actual"
 436'
 437
 438test_expect_success 'prompt - untracked files status indicator - empty untracked dir' '
 439        printf " (master)" >expected &&
 440        mkdir otherrepo/untracked-dir &&
 441        test_when_finished "rm -rf otherrepo/untracked-dir" &&
 442        (
 443                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 444                cd otherrepo &&
 445                __git_ps1 >"$actual"
 446        ) &&
 447        test_cmp expected "$actual"
 448'
 449
 450test_expect_success 'prompt - untracked files status indicator - non-empty untracked dir' '
 451        printf " (master %%)" >expected &&
 452        mkdir otherrepo/untracked-dir &&
 453        test_when_finished "rm -rf otherrepo/untracked-dir" &&
 454        >otherrepo/untracked-dir/untracked-file &&
 455        (
 456                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 457                cd otherrepo &&
 458                __git_ps1 >"$actual"
 459        ) &&
 460        test_cmp expected "$actual"
 461'
 462
 463test_expect_success 'prompt - untracked files status indicator - untracked files outside cwd' '
 464        printf " (master %%)" >expected &&
 465        (
 466                mkdir -p ignored_dir &&
 467                cd ignored_dir &&
 468                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 469                __git_ps1 >"$actual"
 470        ) &&
 471        test_cmp expected "$actual"
 472'
 473
 474test_expect_success 'prompt - untracked files status indicator - shell variable unset with config disabled' '
 475        printf " (master)" >expected &&
 476        test_config bash.showUntrackedFiles false &&
 477        (
 478                sane_unset GIT_PS1_SHOWUNTRACKEDFILES &&
 479                __git_ps1 >"$actual"
 480        ) &&
 481        test_cmp expected "$actual"
 482'
 483
 484test_expect_success 'prompt - untracked files status indicator - shell variable unset with config enabled' '
 485        printf " (master)" >expected &&
 486        test_config bash.showUntrackedFiles true &&
 487        (
 488                sane_unset GIT_PS1_SHOWUNTRACKEDFILES &&
 489                __git_ps1 >"$actual"
 490        ) &&
 491        test_cmp expected "$actual"
 492'
 493
 494test_expect_success 'prompt - untracked files status indicator - shell variable set with config disabled' '
 495        printf " (master)" >expected &&
 496        test_config bash.showUntrackedFiles false &&
 497        (
 498                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 499                __git_ps1 >"$actual"
 500        ) &&
 501        test_cmp expected "$actual"
 502'
 503
 504test_expect_success 'prompt - untracked files status indicator - shell variable set with config enabled' '
 505        printf " (master %%)" >expected &&
 506        test_config bash.showUntrackedFiles true &&
 507        (
 508                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 509                __git_ps1 >"$actual"
 510        ) &&
 511        test_cmp expected "$actual"
 512'
 513
 514test_expect_success 'prompt - untracked files status indicator - not shown inside .git directory' '
 515        printf " (GIT_DIR!)" >expected &&
 516        (
 517                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 518                cd .git &&
 519                __git_ps1 >"$actual"
 520        ) &&
 521        test_cmp expected "$actual"
 522'
 523
 524test_expect_success 'prompt - format string starting with dash' '
 525        printf -- "-master" >expected &&
 526        __git_ps1 "-%s" >"$actual" &&
 527        test_cmp expected "$actual"
 528'
 529
 530test_expect_success 'prompt - pc mode' '
 531        printf "BEFORE: (\${__git_ps1_branch_name}):AFTER\\nmaster" >expected &&
 532        (
 533                __git_ps1 "BEFORE:" ":AFTER" >"$actual" &&
 534                test_must_be_empty "$actual" &&
 535                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 536        ) &&
 537        test_cmp expected "$actual"
 538'
 539
 540test_expect_success 'prompt - bash color pc mode - branch name' '
 541        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nmaster" >expected &&
 542        (
 543                GIT_PS1_SHOWCOLORHINTS=y &&
 544                __git_ps1 "BEFORE:" ":AFTER" >"$actual" &&
 545                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 546        ) &&
 547        test_cmp expected "$actual"
 548'
 549
 550test_expect_success 'prompt - bash color pc mode - detached head' '
 551        printf "BEFORE: (${c_red}\${__git_ps1_branch_name}${c_clear}):AFTER\\n(%s...)" $(git log -1 --format="%h" b1^) >expected &&
 552        git checkout b1^ &&
 553        test_when_finished "git checkout master" &&
 554        (
 555                GIT_PS1_SHOWCOLORHINTS=y &&
 556                __git_ps1 "BEFORE:" ":AFTER" &&
 557                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 558        ) &&
 559        test_cmp expected "$actual"
 560'
 561
 562test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty worktree' '
 563        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_clear}):AFTER\\nmaster" >expected &&
 564        echo "dirty" >file &&
 565        test_when_finished "git reset --hard" &&
 566        (
 567                GIT_PS1_SHOWDIRTYSTATE=y &&
 568                GIT_PS1_SHOWCOLORHINTS=y &&
 569                __git_ps1 "BEFORE:" ":AFTER" &&
 570                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 571        ) &&
 572        test_cmp expected "$actual"
 573'
 574
 575test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty index' '
 576        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}+${c_clear}):AFTER\\nmaster" >expected &&
 577        echo "dirty" >file &&
 578        test_when_finished "git reset --hard" &&
 579        git add -u &&
 580        (
 581                GIT_PS1_SHOWDIRTYSTATE=y &&
 582                GIT_PS1_SHOWCOLORHINTS=y &&
 583                __git_ps1 "BEFORE:" ":AFTER" &&
 584                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 585        ) &&
 586        test_cmp expected "$actual"
 587'
 588
 589test_expect_success 'prompt - bash color pc mode - dirty status indicator - dirty index and worktree' '
 590        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_green}+${c_clear}):AFTER\\nmaster" >expected &&
 591        echo "dirty index" >file &&
 592        test_when_finished "git reset --hard" &&
 593        git add -u &&
 594        echo "dirty worktree" >file &&
 595        (
 596                GIT_PS1_SHOWCOLORHINTS=y &&
 597                GIT_PS1_SHOWDIRTYSTATE=y &&
 598                __git_ps1 "BEFORE:" ":AFTER" &&
 599                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 600        ) &&
 601        test_cmp expected "$actual"
 602'
 603
 604test_expect_success 'prompt - bash color pc mode - dirty status indicator - before root commit' '
 605        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}#${c_clear}):AFTER\\nmaster" >expected &&
 606        (
 607                GIT_PS1_SHOWDIRTYSTATE=y &&
 608                GIT_PS1_SHOWCOLORHINTS=y &&
 609                cd otherrepo &&
 610                __git_ps1 "BEFORE:" ":AFTER" &&
 611                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 612        ) &&
 613        test_cmp expected "$actual"
 614'
 615
 616test_expect_success 'prompt - bash color pc mode - inside .git directory' '
 617        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nGIT_DIR!" >expected &&
 618        echo "dirty" >file &&
 619        test_when_finished "git reset --hard" &&
 620        (
 621                GIT_PS1_SHOWDIRTYSTATE=y &&
 622                GIT_PS1_SHOWCOLORHINTS=y &&
 623                cd .git &&
 624                __git_ps1 "BEFORE:" ":AFTER" &&
 625                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 626        ) &&
 627        test_cmp expected "$actual"
 628'
 629
 630test_expect_success 'prompt - bash color pc mode - stash status indicator' '
 631        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_lblue}\$${c_clear}):AFTER\\nmaster" >expected &&
 632        echo 2 >file &&
 633        git stash &&
 634        test_when_finished "git stash drop" &&
 635        (
 636                GIT_PS1_SHOWSTASHSTATE=y &&
 637                GIT_PS1_SHOWCOLORHINTS=y &&
 638                __git_ps1 "BEFORE:" ":AFTER" &&
 639                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 640        ) &&
 641        test_cmp expected "$actual"
 642'
 643
 644test_expect_success 'prompt - bash color pc mode - untracked files status indicator' '
 645        printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}%%${c_clear}):AFTER\\nmaster" >expected &&
 646        (
 647                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 648                GIT_PS1_SHOWCOLORHINTS=y &&
 649                __git_ps1 "BEFORE:" ":AFTER" &&
 650                printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual"
 651        ) &&
 652        test_cmp expected "$actual"
 653'
 654
 655test_expect_success 'prompt - zsh color pc mode' '
 656        printf "BEFORE: (%%F{green}master%%f):AFTER" >expected &&
 657        (
 658                ZSH_VERSION=5.0.0 &&
 659                GIT_PS1_SHOWCOLORHINTS=y &&
 660                __git_ps1 "BEFORE:" ":AFTER" &&
 661                printf "%s" "$PS1" >"$actual"
 662        ) &&
 663        test_cmp expected "$actual"
 664'
 665
 666test_expect_success 'prompt - hide if pwd ignored - env var unset, config disabled' '
 667        printf " (master)" >expected &&
 668        test_config bash.hideIfPwdIgnored false &&
 669        (
 670                cd ignored_dir &&
 671                __git_ps1 >"$actual"
 672        ) &&
 673        test_cmp expected "$actual"
 674'
 675
 676test_expect_success 'prompt - hide if pwd ignored - env var unset, config disabled, pc mode' '
 677        printf "BEFORE: (\${__git_ps1_branch_name}):AFTER" >expected &&
 678        test_config bash.hideIfPwdIgnored false &&
 679        (
 680                cd ignored_dir &&
 681                __git_ps1 "BEFORE:" ":AFTER" &&
 682                printf "%s" "$PS1" >"$actual"
 683        ) &&
 684        test_cmp expected "$actual"
 685'
 686
 687test_expect_success 'prompt - hide if pwd ignored - env var unset, config unset' '
 688        printf " (master)" >expected &&
 689        (
 690                cd ignored_dir &&
 691                __git_ps1 >"$actual"
 692        ) &&
 693        test_cmp expected "$actual"
 694'
 695
 696test_expect_success 'prompt - hide if pwd ignored - env var unset, config unset, pc mode' '
 697        printf "BEFORE: (\${__git_ps1_branch_name}):AFTER" >expected &&
 698        (
 699                cd ignored_dir &&
 700                __git_ps1 "BEFORE:" ":AFTER" &&
 701                printf "%s" "$PS1" >"$actual"
 702        ) &&
 703        test_cmp expected "$actual"
 704'
 705
 706test_expect_success 'prompt - hide if pwd ignored - env var set, config disabled' '
 707        printf " (master)" >expected &&
 708        test_config bash.hideIfPwdIgnored false &&
 709        (
 710                cd ignored_dir &&
 711                GIT_PS1_HIDE_IF_PWD_IGNORED=y &&
 712                __git_ps1 >"$actual"
 713        ) &&
 714        test_cmp expected "$actual"
 715'
 716
 717test_expect_success 'prompt - hide if pwd ignored - env var set, config disabled, pc mode' '
 718        printf "BEFORE: (\${__git_ps1_branch_name}):AFTER" >expected &&
 719        test_config bash.hideIfPwdIgnored false &&
 720        (
 721                cd ignored_dir &&
 722                GIT_PS1_HIDE_IF_PWD_IGNORED=y &&
 723                __git_ps1 "BEFORE:" ":AFTER" &&
 724                printf "%s" "$PS1" >"$actual"
 725        ) &&
 726        test_cmp expected "$actual"
 727'
 728
 729test_expect_success 'prompt - hide if pwd ignored - env var set, config unset' '
 730        (
 731                cd ignored_dir &&
 732                GIT_PS1_HIDE_IF_PWD_IGNORED=y &&
 733                __git_ps1 >"$actual"
 734        ) &&
 735        test_must_be_empty "$actual"
 736'
 737
 738test_expect_success 'prompt - hide if pwd ignored - env var set, config unset, pc mode' '
 739        printf "BEFORE::AFTER" >expected &&
 740        (
 741                cd ignored_dir &&
 742                GIT_PS1_HIDE_IF_PWD_IGNORED=y &&
 743                __git_ps1 "BEFORE:" ":AFTER" &&
 744                printf "%s" "$PS1" >"$actual"
 745        ) &&
 746        test_cmp expected "$actual"
 747'
 748
 749test_expect_success 'prompt - hide if pwd ignored - inside gitdir' '
 750        printf " (GIT_DIR!)" >expected &&
 751        (
 752                GIT_PS1_HIDE_IF_PWD_IGNORED=y &&
 753                cd .git &&
 754                __git_ps1 >"$actual"
 755        ) &&
 756        test_cmp expected "$actual"
 757'
 758
 759test_done