3 # Copyright (c) 2012 SZEDER Gábor
6 test_description
='test git-specific bash prompt functions'
10 .
"$GIT_BUILD_DIR/contrib/completion/git-prompt.sh"
12 actual
="$TRASH_DIRECTORY/actual"
14 test_expect_success
'setup for prompt tests' '
15 mkdir -p subdir/subsubdir &&
20 git commit -m initial &&
21 git tag -a -m msg1 t1 &&
24 git commit -m "second b1" file &&
26 git commit -m "third b1" file &&
27 git tag -a -m msg2 t2 &&
28 git checkout -b b2 master &&
30 git commit -m "second b2" file &&
32 git commit -m "another b2" file &&
34 git commit -m "yet another b2" file &&
38 test_expect_success
'gitdir - from command line (through $__git_dir)' '
39 echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
41 __git_dir="$TRASH_DIRECTORY/otherrepo/.git" &&
44 test_cmp expected "$actual"
47 test_expect_success
'gitdir - repo as argument' '
48 echo "otherrepo/.git" >expected &&
49 __gitdir "otherrepo" >"$actual" &&
50 test_cmp expected "$actual"
53 test_expect_success
'gitdir - remote as argument' '
54 echo "remote" >expected &&
55 __gitdir "remote" >"$actual" &&
56 test_cmp expected "$actual"
59 test_expect_success
'gitdir - .git directory in cwd' '
60 echo ".git" >expected &&
61 __gitdir >"$actual" &&
62 test_cmp expected "$actual"
65 test_expect_success
'gitdir - .git directory in parent' '
66 echo "$(pwd -P)/.git" >expected &&
68 cd subdir/subsubdir &&
71 test_cmp expected "$actual"
74 test_expect_success
'gitdir - cwd is a .git directory' '
80 test_cmp expected "$actual"
83 test_expect_success
'gitdir - parent is a .git directory' '
84 echo "$(pwd -P)/.git" >expected &&
89 test_cmp expected "$actual"
92 test_expect_success
'gitdir - $GIT_DIR set while .git directory in cwd' '
93 echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
95 GIT_DIR="$TRASH_DIRECTORY/otherrepo/.git" &&
99 test_cmp expected "$actual"
102 test_expect_success
'gitdir - $GIT_DIR set while .git directory in parent' '
103 echo "$TRASH_DIRECTORY/otherrepo/.git" >expected &&
105 GIT_DIR="$TRASH_DIRECTORY/otherrepo/.git" &&
110 test_cmp expected "$actual"
113 test_expect_success
'gitdir - non-existing $GIT_DIR' '
115 GIT_DIR="$TRASH_DIRECTORY/non-existing" &&
117 test_must_fail __gitdir
121 test_expect_success
'gitdir - gitfile in cwd' '
122 echo "$(pwd -P)/otherrepo/.git" >expected &&
123 echo "gitdir: $TRASH_DIRECTORY/otherrepo/.git" >subdir/.git &&
124 test_when_finished "rm -f subdir/.git" &&
129 test_cmp expected "$actual"
132 test_expect_success
'gitdir - gitfile in parent' '
133 echo "$(pwd -P)/otherrepo/.git" >expected &&
134 echo "gitdir: $TRASH_DIRECTORY/otherrepo/.git" >subdir/.git &&
135 test_when_finished "rm -f subdir/.git" &&
137 cd subdir/subsubdir &&
140 test_cmp expected "$actual"
143 test_expect_success SYMLINKS
'gitdir - resulting path avoids symlinks' '
144 echo "$(pwd -P)/otherrepo/.git" >expected &&
145 mkdir otherrepo/dir &&
146 test_when_finished "rm -rf otherrepo/dir" &&
147 ln -s otherrepo/dir link &&
148 test_when_finished "rm -f link" &&
153 test_cmp expected "$actual"
156 test_expect_success
'gitdir - not a git repository' '
158 cd subdir/subsubdir &&
159 GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY" &&
160 export GIT_CEILING_DIRECTORIES &&
161 test_must_fail __gitdir
165 test_expect_success
'prompt - branch name' '
166 printf " (master)" >expected &&
167 __git_ps1 >"$actual" &&
168 test_cmp expected "$actual"
171 test_expect_success
'prompt - detached head' '
172 printf " ((%s...))" $(git log -1 --format="%h" b1^) >expected &&
174 test_when_finished "git checkout master" &&
175 __git_ps1 >"$actual" &&
176 test_cmp expected "$actual"
179 test_expect_success
'prompt - describe detached head - contains' '
180 printf " ((t2~1))" >expected &&
182 test_when_finished "git checkout master" &&
184 GIT_PS1_DESCRIBE_STYLE=contains &&
187 test_cmp expected "$actual"
190 test_expect_success
'prompt - describe detached head - branch' '
191 printf " ((b1~1))" >expected &&
193 test_when_finished "git checkout master" &&
195 GIT_PS1_DESCRIBE_STYLE=branch &&
198 test_cmp expected "$actual"
201 test_expect_success
'prompt - describe detached head - describe' '
202 printf " ((t1-1-g%s))" $(git log -1 --format="%h" b1^) >expected &&
204 test_when_finished "git checkout master" &&
206 GIT_PS1_DESCRIBE_STYLE=describe &&
209 test_cmp expected "$actual"
212 test_expect_success
'prompt - describe detached head - default' '
213 printf " ((t2))" >expected &&
214 git checkout --detach b1 &&
215 test_when_finished "git checkout master" &&
216 __git_ps1 >"$actual" &&
217 test_cmp expected "$actual"
220 test_expect_success
'prompt - inside .git directory' '
221 printf " (GIT_DIR!)" >expected &&
226 test_cmp expected "$actual"
229 test_expect_success
'prompt - deep inside .git directory' '
230 printf " (GIT_DIR!)" >expected &&
232 cd .git/refs/heads &&
235 test_cmp expected "$actual"
238 test_expect_success
'prompt - inside bare repository' '
239 printf " (BARE:master)" >expected &&
240 git init --bare bare.git &&
241 test_when_finished "rm -rf bare.git" &&
246 test_cmp expected "$actual"
249 test_expect_success
'prompt - interactive rebase' '
250 printf " (b1|REBASE-i 2/3)" >expected
251 write_script fake_editor.sh <<-\EOF &&
252 echo "exec echo" >"$1"
253 echo "edit $(git log -1 --format="%h")" >>"$1"
254 echo "exec echo" >>"$1"
256 test_when_finished "rm -f fake_editor.sh" &&
257 test_set_editor "$TRASH_DIRECTORY/fake_editor.sh" &&
259 test_when_finished "git checkout master" &&
260 git rebase -i HEAD^ &&
261 test_when_finished "git rebase --abort"
262 __git_ps1 >"$actual" &&
263 test_cmp expected "$actual"
266 test_expect_success
'prompt - rebase merge' '
267 printf " (b2|REBASE-m 1/3)" >expected &&
269 test_when_finished "git checkout master" &&
270 test_must_fail git rebase --merge b1 b2 &&
271 test_when_finished "git rebase --abort" &&
272 __git_ps1 >"$actual" &&
273 test_cmp expected "$actual"
276 test_expect_success
'prompt - rebase' '
277 printf " (b2|REBASE 1/3)" >expected &&
279 test_when_finished "git checkout master" &&
280 test_must_fail git rebase b1 b2 &&
281 test_when_finished "git rebase --abort" &&
282 __git_ps1 >"$actual" &&
283 test_cmp expected "$actual"
286 test_expect_success
'prompt - merge' '
287 printf " (b1|MERGING)" >expected &&
289 test_when_finished "git checkout master" &&
290 test_must_fail git merge b2 &&
291 test_when_finished "git reset --hard" &&
292 __git_ps1 >"$actual" &&
293 test_cmp expected "$actual"
296 test_expect_success
'prompt - cherry-pick' '
297 printf " (master|CHERRY-PICKING)" >expected &&
298 test_must_fail git cherry-pick b1 &&
299 test_when_finished "git reset --hard" &&
300 __git_ps1 >"$actual" &&
301 test_cmp expected "$actual"
304 test_expect_success
'prompt - bisect' '
305 printf " (master|BISECTING)" >expected &&
307 test_when_finished "git bisect reset" &&
308 __git_ps1 >"$actual" &&
309 test_cmp expected "$actual"
312 test_expect_success
'prompt - dirty status indicator - clean' '
313 printf " (master)" >expected &&
315 GIT_PS1_SHOWDIRTYSTATE=y &&
318 test_cmp expected "$actual"
321 test_expect_success
'prompt - dirty status indicator - dirty worktree' '
322 printf " (master *)" >expected &&
323 echo "dirty" >file &&
324 test_when_finished "git reset --hard" &&
326 GIT_PS1_SHOWDIRTYSTATE=y &&
329 test_cmp expected "$actual"
332 test_expect_success
'prompt - dirty status indicator - dirty index' '
333 printf " (master +)" >expected &&
334 echo "dirty" >file &&
335 test_when_finished "git reset --hard" &&
338 GIT_PS1_SHOWDIRTYSTATE=y &&
341 test_cmp expected "$actual"
344 test_expect_success
'prompt - dirty status indicator - dirty index and worktree' '
345 printf " (master *+)" >expected &&
346 echo "dirty index" >file &&
347 test_when_finished "git reset --hard" &&
349 echo "dirty worktree" >file &&
351 GIT_PS1_SHOWDIRTYSTATE=y &&
354 test_cmp expected "$actual"
357 test_expect_success
'prompt - dirty status indicator - before root commit' '
358 printf " (master #)" >expected &&
360 GIT_PS1_SHOWDIRTYSTATE=y &&
364 test_cmp expected "$actual"
367 test_expect_success
'prompt - dirty status indicator - shell variable unset with config disabled' '
368 printf " (master)" >expected &&
369 echo "dirty" >file &&
370 test_when_finished "git reset --hard" &&
371 test_config bash.showDirtyState false &&
373 sane_unset GIT_PS1_SHOWDIRTYSTATE &&
376 test_cmp expected "$actual"
379 test_expect_success
'prompt - dirty status indicator - shell variable unset with config enabled' '
380 printf " (master)" >expected &&
381 echo "dirty" >file &&
382 test_when_finished "git reset --hard" &&
383 test_config bash.showDirtyState true &&
385 sane_unset GIT_PS1_SHOWDIRTYSTATE &&
388 test_cmp expected "$actual"
391 test_expect_success
'prompt - dirty status indicator - shell variable set with config disabled' '
392 printf " (master)" >expected &&
393 echo "dirty" >file &&
394 test_when_finished "git reset --hard" &&
395 test_config bash.showDirtyState false &&
397 GIT_PS1_SHOWDIRTYSTATE=y &&
400 test_cmp expected "$actual"
403 test_expect_success
'prompt - dirty status indicator - shell variable set with config enabled' '
404 printf " (master *)" >expected &&
405 echo "dirty" >file &&
406 test_when_finished "git reset --hard" &&
407 test_config bash.showDirtyState true &&
409 GIT_PS1_SHOWDIRTYSTATE=y &&
412 test_cmp expected "$actual"
415 test_expect_success
'prompt - dirty status indicator - not shown inside .git directory' '
416 printf " (GIT_DIR!)" >expected &&
417 echo "dirty" >file &&
418 test_when_finished "git reset --hard" &&
420 GIT_PS1_SHOWDIRTYSTATE=y &&
424 test_cmp expected "$actual"
427 test_expect_success
'prompt - stash status indicator - no stash' '
428 printf " (master)" >expected &&
430 GIT_PS1_SHOWSTASHSTATE=y &&
433 test_cmp expected "$actual"
436 test_expect_success
'prompt - stash status indicator - stash' '
437 printf " (master $)" >expected &&
440 test_when_finished "git stash drop" &&
442 GIT_PS1_SHOWSTASHSTATE=y &&
445 test_cmp expected "$actual"
448 test_expect_success
'prompt - stash status indicator - not shown inside .git directory' '
449 printf " (GIT_DIR!)" >expected &&
452 test_when_finished "git stash drop" &&
454 GIT_PS1_SHOWSTASHSTATE=y &&
458 test_cmp expected "$actual"
461 test_expect_success
'prompt - untracked files status indicator - no untracked files' '
462 printf " (master)" >expected &&
464 GIT_PS1_SHOWUNTRACKEDFILES=y &&
468 test_cmp expected "$actual"
471 test_expect_success
'prompt - untracked files status indicator - untracked files' '
472 printf " (master %%)" >expected &&
474 GIT_PS1_SHOWUNTRACKEDFILES=y &&
477 test_cmp expected "$actual"
480 test_expect_success
'prompt - untracked files status indicator - shell variable unset with config disabled' '
481 printf " (master)" >expected &&
482 test_config bash.showUntrackedFiles false &&
484 sane_unset GIT_PS1_SHOWUNTRACKEDFILES &&
487 test_cmp expected "$actual"
490 test_expect_success
'prompt - untracked files status indicator - shell variable unset with config enabled' '
491 printf " (master)" >expected &&
492 test_config bash.showUntrackedFiles true &&
494 sane_unset GIT_PS1_SHOWUNTRACKEDFILES &&
497 test_cmp expected "$actual"
500 test_expect_success
'prompt - untracked files status indicator - shell variable set with config disabled' '
501 printf " (master)" >expected &&
502 test_config bash.showUntrackedFiles false &&
504 GIT_PS1_SHOWUNTRACKEDFILES=y &&
507 test_cmp expected "$actual"
510 test_expect_success
'prompt - untracked files status indicator - shell variable set with config enabled' '
511 printf " (master %%)" >expected &&
512 test_config bash.showUntrackedFiles true &&
514 GIT_PS1_SHOWUNTRACKEDFILES=y &&
517 test_cmp expected "$actual"
520 test_expect_success
'prompt - untracked files status indicator - not shown inside .git directory' '
521 printf " (GIT_DIR!)" >expected &&
523 GIT_PS1_SHOWUNTRACKEDFILES=y &&
527 test_cmp expected "$actual"
530 test_expect_success
'prompt - format string starting with dash' '
531 printf -- "-master" >expected &&
532 __git_ps1 "-%s" >"$actual" &&
533 test_cmp expected "$actual"