Bash has a shell option that makes it possible to disable parameter expansion in PS1. Test __git_ps1's ability to detect and react to disabled PS1 expansion by running the "pc mode" tests twice: once with PS1 parameter expansion enabled and once with it disabled. Signed-off-by: Richard Hansen <rhansen@xxxxxxx> --- t/lib-bash.sh | 3 ++ t/t9903-bash-prompt.sh | 75 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/t/lib-bash.sh b/t/lib-bash.sh index 2be955f..37a48fd 100644 --- a/t/lib-bash.sh +++ b/t/lib-bash.sh @@ -14,4 +14,7 @@ else exit 0 fi +ps1_expansion_enable () { shopt -s promptvars; } +ps1_expansion_disable () { shopt -u promptvars; } + . ./test-lib.sh diff --git a/t/t9903-bash-prompt.sh b/t/t9903-bash-prompt.sh index d29dd2b..fbd77e6 100755 --- a/t/t9903-bash-prompt.sh +++ b/t/t9903-bash-prompt.sh @@ -451,57 +451,81 @@ test_expect_success 'prompt - format string starting with dash' ' test_cmp expected "$actual" ' -run_pcmode_tests () { - test_expect_success 'prompt - pc mode' ' - printf "BEFORE: (\${__git_ps1_branch_name}):AFTER\\nmaster" >expected && +pcmode_expected () { + case $ps1expansion in + on) printf "$1" '${__git_ps1_branch_name}' "$2";; + off) printf "$1" "$2" "";; + esac >expected +} + +pcmode_actual () { + case $ps1expansion in + on) printf %s\\n%s "$PS1" "${__git_ps1_branch_name}";; + off) printf %s\\n "$PS1";; + esac >"$actual" +} + +_run_pcmode_tests () { + ps1expansion=$1; shift + + case $ps1expansion in + # if the shell doesn't allow ps1 expansion to be enabled, + # quietly skip the tests (same goes for disabling) + on) ps1_expansion_enable || return 0;; + off) ps1_expansion_disable || return 0;; + *) error "invalid argument to _run_pcmode_tests: $ps1expansion";; + esac + + test_expect_success "prompt - pc mode (PS1 expansion $ps1expansion)" ' + pcmode_expected "BEFORE: (%s):AFTER\\n%s" master && printf "" >expected_output && ( __git_ps1 "BEFORE:" ":AFTER" >"$actual" && test_cmp expected_output "$actual" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' - pfx="prompt - bash color pc mode" + pfx="prompt - bash color pc mode (PS1 expansion $ps1expansion)" test_expect_success "$pfx - branch name" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nmaster" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear}):AFTER\\n%s" master && ( GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" >"$actual" - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - detached head" ' - printf "BEFORE: (${c_red}\${__git_ps1_branch_name}${c_clear}):AFTER\\n(%s...)" $(git log -1 --format="%h" b1^) >expected && + pcmode_expected "BEFORE: (${c_red}%s${c_clear}):AFTER\\n%s" "($(git log -1 --format="%h" b1^)...)" && git checkout b1^ && test_when_finished "git checkout master" && ( GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - dirty status indicator - dirty worktree" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_clear}):AFTER\\nmaster" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear} ${c_red}*${c_clear}):AFTER\\n%s" master && echo "dirty" >file && test_when_finished "git reset --hard" && ( GIT_PS1_SHOWDIRTYSTATE=y && GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - dirty status indicator - dirty index" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}+${c_clear}):AFTER\\nmaster" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear} ${c_green}+${c_clear}):AFTER\\n%s" master && echo "dirty" >file && test_when_finished "git reset --hard" && git add -u && @@ -509,13 +533,13 @@ run_pcmode_tests () { GIT_PS1_SHOWDIRTYSTATE=y && GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - dirty status indicator - dirty index and worktree" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}*${c_green}+${c_clear}):AFTER\\nmaster" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear} ${c_red}*${c_green}+${c_clear}):AFTER\\n%s" master && echo "dirty index" >file && test_when_finished "git reset --hard" && git add -u && @@ -524,25 +548,25 @@ run_pcmode_tests () { GIT_PS1_SHOWCOLORHINTS=y && GIT_PS1_SHOWDIRTYSTATE=y && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - dirty status indicator - before root commit" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_green}#${c_clear}):AFTER\\nmaster" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear} ${c_green}#${c_clear}):AFTER\\n%s" master && ( GIT_PS1_SHOWDIRTYSTATE=y && GIT_PS1_SHOWCOLORHINTS=y && cd otherrepo && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - inside .git directory" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear}):AFTER\\nGIT_DIR!" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear}):AFTER\\n%s" "GIT_DIR!" && echo "dirty" >file && test_when_finished "git reset --hard" && ( @@ -550,13 +574,13 @@ run_pcmode_tests () { GIT_PS1_SHOWCOLORHINTS=y && cd .git && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - stash status indicator" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_lblue}\$${c_clear}):AFTER\\nmaster" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear} ${c_lblue}\$${c_clear}):AFTER\\n%s" master && echo 2 >file && git stash && test_when_finished "git stash drop" && @@ -564,23 +588,28 @@ run_pcmode_tests () { GIT_PS1_SHOWSTASHSTATE=y && GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' test_expect_success "$pfx - untracked files status indicator" ' - printf "BEFORE: (${c_green}\${__git_ps1_branch_name}${c_clear} ${c_red}%%${c_clear}):AFTER\\nmaster" >expected && + pcmode_expected "BEFORE: (${c_green}%s${c_clear} ${c_red}%%${c_clear}):AFTER\\n%s" master && ( GIT_PS1_SHOWUNTRACKEDFILES=y && GIT_PS1_SHOWCOLORHINTS=y && __git_ps1 "BEFORE:" ":AFTER" && - printf "%s\\n%s" "$PS1" "${__git_ps1_branch_name}" >"$actual" + pcmode_actual ) && test_cmp expected "$actual" ' } +run_pcmode_tests () { + _run_pcmode_tests on + _run_pcmode_tests off +} + run_pcmode_tests test_done -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html