df36239a59b49ef701a5612e05878e2974e59da1
   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"
  13
  14test_expect_success 'setup for prompt tests' '
  15        git init otherrepo &&
  16        echo 1 >file &&
  17        git add file &&
  18        test_tick &&
  19        git commit -m initial &&
  20        git tag -a -m msg1 t1 &&
  21        git checkout -b b1 &&
  22        echo 2 >file &&
  23        git commit -m "second b1" file &&
  24        echo 3 >file &&
  25        git commit -m "third b1" file &&
  26        git tag -a -m msg2 t2 &&
  27        git checkout -b b2 master &&
  28        echo 0 >file &&
  29        git commit -m "second b2" file &&
  30        echo 00 >file &&
  31        git commit -m "another b2" file &&
  32        echo 000 >file &&
  33        git commit -m "yet another b2" file &&
  34        git checkout master
  35'
  36
  37test_expect_success 'prompt - branch name' '
  38        printf " (master)" >expected &&
  39        __git_ps1 >"$actual" &&
  40        test_cmp expected "$actual"
  41'
  42
  43test_expect_success 'prompt - detached head' '
  44        printf " ((%s...))" $(git log -1 --format="%h" b1^) >expected &&
  45        git checkout b1^ &&
  46        test_when_finished "git checkout master" &&
  47        __git_ps1 >"$actual" &&
  48        test_cmp expected "$actual"
  49'
  50
  51test_expect_success 'prompt - describe detached head - contains' '
  52        printf " ((t2~1))" >expected &&
  53        git checkout b1^ &&
  54        test_when_finished "git checkout master" &&
  55        (
  56                GIT_PS1_DESCRIBE_STYLE=contains &&
  57                __git_ps1 >"$actual"
  58        ) &&
  59        test_cmp expected "$actual"
  60'
  61
  62test_expect_success 'prompt - describe detached head - branch' '
  63        printf " ((b1~1))" >expected &&
  64        git checkout b1^ &&
  65        test_when_finished "git checkout master" &&
  66        (
  67                GIT_PS1_DESCRIBE_STYLE=branch &&
  68                __git_ps1 >"$actual"
  69        ) &&
  70        test_cmp expected "$actual"
  71'
  72
  73test_expect_success 'prompt - describe detached head - describe' '
  74        printf " ((t1-1-g%s))" $(git log -1 --format="%h" b1^) >expected &&
  75        git checkout b1^ &&
  76        test_when_finished "git checkout master" &&
  77        (
  78                GIT_PS1_DESCRIBE_STYLE=describe &&
  79                __git_ps1 >"$actual"
  80        ) &&
  81        test_cmp expected "$actual"
  82'
  83
  84test_expect_success 'prompt - describe detached head - default' '
  85        printf " ((t2))" >expected &&
  86        git checkout --detach b1 &&
  87        test_when_finished "git checkout master" &&
  88        __git_ps1 >"$actual" &&
  89        test_cmp expected "$actual"
  90'
  91
  92test_expect_success 'prompt - inside .git directory' '
  93        printf " (GIT_DIR!)" >expected &&
  94        (
  95                cd .git &&
  96                __git_ps1 >"$actual"
  97        ) &&
  98        test_cmp expected "$actual"
  99'
 100
 101test_expect_success 'prompt - deep inside .git directory' '
 102        printf " (GIT_DIR!)" >expected &&
 103        (
 104                cd .git/refs/heads &&
 105                __git_ps1 >"$actual"
 106        ) &&
 107        test_cmp expected "$actual"
 108'
 109
 110test_expect_success 'prompt - inside bare repository' '
 111        printf " (BARE:master)" >expected &&
 112        git init --bare bare.git &&
 113        test_when_finished "rm -rf bare.git" &&
 114        (
 115                cd bare.git &&
 116                __git_ps1 >"$actual"
 117        ) &&
 118        test_cmp expected "$actual"
 119'
 120
 121test_expect_success 'prompt - interactive rebase' '
 122        printf " (b1|REBASE-i 2/3)" >expected
 123        write_script fake_editor.sh <<-\EOF &&
 124                echo "exec echo" >"$1"
 125                echo "edit $(git log -1 --format="%h")" >>"$1"
 126                echo "exec echo" >>"$1"
 127        EOF
 128        test_when_finished "rm -f fake_editor.sh" &&
 129        test_set_editor "$TRASH_DIRECTORY/fake_editor.sh" &&
 130        git checkout b1 &&
 131        test_when_finished "git checkout master" &&
 132        git rebase -i HEAD^ &&
 133        test_when_finished "git rebase --abort"
 134        __git_ps1 >"$actual" &&
 135        test_cmp expected "$actual"
 136'
 137
 138test_expect_success 'prompt - rebase merge' '
 139        printf " (b2|REBASE-m 1/3)" >expected &&
 140        git checkout b2 &&
 141        test_when_finished "git checkout master" &&
 142        test_must_fail git rebase --merge b1 b2 &&
 143        test_when_finished "git rebase --abort" &&
 144        __git_ps1 >"$actual" &&
 145        test_cmp expected "$actual"
 146'
 147
 148test_expect_success 'prompt - rebase' '
 149        printf " (b2|REBASE 1/3)" >expected &&
 150        git checkout b2 &&
 151        test_when_finished "git checkout master" &&
 152        test_must_fail git rebase b1 b2 &&
 153        test_when_finished "git rebase --abort" &&
 154        __git_ps1 >"$actual" &&
 155        test_cmp expected "$actual"
 156'
 157
 158test_expect_success 'prompt - merge' '
 159        printf " (b1|MERGING)" >expected &&
 160        git checkout b1 &&
 161        test_when_finished "git checkout master" &&
 162        test_must_fail git merge b2 &&
 163        test_when_finished "git reset --hard" &&
 164        __git_ps1 >"$actual" &&
 165        test_cmp expected "$actual"
 166'
 167
 168test_expect_success 'prompt - cherry-pick' '
 169        printf " (master|CHERRY-PICKING)" >expected &&
 170        test_must_fail git cherry-pick b1 &&
 171        test_when_finished "git reset --hard" &&
 172        __git_ps1 >"$actual" &&
 173        test_cmp expected "$actual"
 174'
 175
 176test_expect_success 'prompt - bisect' '
 177        printf " (master|BISECTING)" >expected &&
 178        git bisect start &&
 179        test_when_finished "git bisect reset" &&
 180        __git_ps1 >"$actual" &&
 181        test_cmp expected "$actual"
 182'
 183
 184test_expect_success 'prompt - dirty status indicator - clean' '
 185        printf " (master)" >expected &&
 186        (
 187                GIT_PS1_SHOWDIRTYSTATE=y &&
 188                __git_ps1 >"$actual"
 189        ) &&
 190        test_cmp expected "$actual"
 191'
 192
 193test_expect_success 'prompt - dirty status indicator - dirty worktree' '
 194        printf " (master *)" >expected &&
 195        echo "dirty" >file &&
 196        test_when_finished "git reset --hard" &&
 197        (
 198                GIT_PS1_SHOWDIRTYSTATE=y &&
 199                __git_ps1 >"$actual"
 200        ) &&
 201        test_cmp expected "$actual"
 202'
 203
 204test_expect_success 'prompt - dirty status indicator - dirty index' '
 205        printf " (master +)" >expected &&
 206        echo "dirty" >file &&
 207        test_when_finished "git reset --hard" &&
 208        git add -u &&
 209        (
 210                GIT_PS1_SHOWDIRTYSTATE=y &&
 211                __git_ps1 >"$actual"
 212        ) &&
 213        test_cmp expected "$actual"
 214'
 215
 216test_expect_success 'prompt - dirty status indicator - dirty index and worktree' '
 217        printf " (master *+)" >expected &&
 218        echo "dirty index" >file &&
 219        test_when_finished "git reset --hard" &&
 220        git add -u &&
 221        echo "dirty worktree" >file &&
 222        (
 223                GIT_PS1_SHOWDIRTYSTATE=y &&
 224                __git_ps1 >"$actual"
 225        ) &&
 226        test_cmp expected "$actual"
 227'
 228
 229test_expect_success 'prompt - dirty status indicator - before root commit' '
 230        printf " (master #)" >expected &&
 231        (
 232                GIT_PS1_SHOWDIRTYSTATE=y &&
 233                cd otherrepo &&
 234                __git_ps1 >"$actual"
 235        ) &&
 236        test_cmp expected "$actual"
 237'
 238
 239test_expect_success 'prompt - dirty status indicator - shell variable unset with config disabled' '
 240        printf " (master)" >expected &&
 241        echo "dirty" >file &&
 242        test_when_finished "git reset --hard" &&
 243        test_config bash.showDirtyState false &&
 244        (
 245                sane_unset GIT_PS1_SHOWDIRTYSTATE &&
 246                __git_ps1 >"$actual"
 247        ) &&
 248        test_cmp expected "$actual"
 249'
 250
 251test_expect_success 'prompt - dirty status indicator - shell variable unset with config enabled' '
 252        printf " (master)" >expected &&
 253        echo "dirty" >file &&
 254        test_when_finished "git reset --hard" &&
 255        test_config bash.showDirtyState true &&
 256        (
 257                sane_unset GIT_PS1_SHOWDIRTYSTATE &&
 258                __git_ps1 >"$actual"
 259        ) &&
 260        test_cmp expected "$actual"
 261'
 262
 263test_expect_success 'prompt - dirty status indicator - shell variable set with config disabled' '
 264        printf " (master)" >expected &&
 265        echo "dirty" >file &&
 266        test_when_finished "git reset --hard" &&
 267        test_config bash.showDirtyState false &&
 268        (
 269                GIT_PS1_SHOWDIRTYSTATE=y &&
 270                __git_ps1 >"$actual"
 271        ) &&
 272        test_cmp expected "$actual"
 273'
 274
 275test_expect_success 'prompt - dirty status indicator - shell variable set with config enabled' '
 276        printf " (master *)" >expected &&
 277        echo "dirty" >file &&
 278        test_when_finished "git reset --hard" &&
 279        test_config bash.showDirtyState true &&
 280        (
 281                GIT_PS1_SHOWDIRTYSTATE=y &&
 282                __git_ps1 >"$actual"
 283        ) &&
 284        test_cmp expected "$actual"
 285'
 286
 287test_expect_success 'prompt - dirty status indicator - not shown inside .git directory' '
 288        printf " (GIT_DIR!)" >expected &&
 289        echo "dirty" >file &&
 290        test_when_finished "git reset --hard" &&
 291        (
 292                GIT_PS1_SHOWDIRTYSTATE=y &&
 293                cd .git &&
 294                __git_ps1 >"$actual"
 295        ) &&
 296        test_cmp expected "$actual"
 297'
 298
 299test_expect_success 'prompt - stash status indicator - no stash' '
 300        printf " (master)" >expected &&
 301        (
 302                GIT_PS1_SHOWSTASHSTATE=y &&
 303                __git_ps1 >"$actual"
 304        ) &&
 305        test_cmp expected "$actual"
 306'
 307
 308test_expect_success 'prompt - stash status indicator - stash' '
 309        printf " (master $)" >expected &&
 310        echo 2 >file &&
 311        git stash &&
 312        test_when_finished "git stash drop" &&
 313        (
 314                GIT_PS1_SHOWSTASHSTATE=y &&
 315                __git_ps1 >"$actual"
 316        ) &&
 317        test_cmp expected "$actual"
 318'
 319
 320test_expect_success 'prompt - stash status indicator - not shown inside .git directory' '
 321        printf " (GIT_DIR!)" >expected &&
 322        echo 2 >file &&
 323        git stash &&
 324        test_when_finished "git stash drop" &&
 325        (
 326                GIT_PS1_SHOWSTASHSTATE=y &&
 327                cd .git &&
 328                __git_ps1 >"$actual"
 329        ) &&
 330        test_cmp expected "$actual"
 331'
 332
 333test_expect_success 'prompt - untracked files status indicator - no untracked files' '
 334        printf " (master)" >expected &&
 335        (
 336                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 337                cd otherrepo &&
 338                __git_ps1 >"$actual"
 339        ) &&
 340        test_cmp expected "$actual"
 341'
 342
 343test_expect_success 'prompt - untracked files status indicator - untracked files' '
 344        printf " (master %%)" >expected &&
 345        (
 346                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 347                __git_ps1 >"$actual"
 348        ) &&
 349        test_cmp expected "$actual"
 350'
 351
 352test_expect_success 'prompt - untracked files status indicator - shell variable unset with config disabled' '
 353        printf " (master)" >expected &&
 354        test_config bash.showUntrackedFiles false &&
 355        (
 356                sane_unset GIT_PS1_SHOWUNTRACKEDFILES &&
 357                __git_ps1 >"$actual"
 358        ) &&
 359        test_cmp expected "$actual"
 360'
 361
 362test_expect_success 'prompt - untracked files status indicator - shell variable unset with config enabled' '
 363        printf " (master)" >expected &&
 364        test_config bash.showUntrackedFiles true &&
 365        (
 366                sane_unset GIT_PS1_SHOWUNTRACKEDFILES &&
 367                __git_ps1 >"$actual"
 368        ) &&
 369        test_cmp expected "$actual"
 370'
 371
 372test_expect_success 'prompt - untracked files status indicator - shell variable set with config disabled' '
 373        printf " (master)" >expected &&
 374        test_config bash.showUntrackedFiles false &&
 375        (
 376                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 377                __git_ps1 >"$actual"
 378        ) &&
 379        test_cmp expected "$actual"
 380'
 381
 382test_expect_success 'prompt - untracked files status indicator - shell variable set with config enabled' '
 383        printf " (master %%)" >expected &&
 384        test_config bash.showUntrackedFiles true &&
 385        (
 386                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 387                __git_ps1 >"$actual"
 388        ) &&
 389        test_cmp expected "$actual"
 390'
 391
 392test_expect_success 'prompt - untracked files status indicator - not shown inside .git directory' '
 393        printf " (GIT_DIR!)" >expected &&
 394        (
 395                GIT_PS1_SHOWUNTRACKEDFILES=y &&
 396                cd .git &&
 397                __git_ps1 >"$actual"
 398        ) &&
 399        test_cmp expected "$actual"
 400'
 401
 402test_expect_success 'prompt - format string starting with dash' '
 403        printf -- "-master" >expected &&
 404        __git_ps1 "-%s" >"$actual" &&
 405        test_cmp expected "$actual"
 406'
 407
 408test_done