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