diff --git a/.github/workflows/scripts/test_init_scripts.sh b/.github/workflows/scripts/test_init_scripts.sh index 843e8d26..1065163b 100755 --- a/.github/workflows/scripts/test_init_scripts.sh +++ b/.github/workflows/scripts/test_init_scripts.sh @@ -154,17 +154,30 @@ for shell in ${SHELLS[@]}; do # Optional test 11, check if the prompt has been updated if [ "$shell" = "bash" ] || [ "$shell" = "ksh" ] || [ "$shell" = "zsh" ] || [ "$shell" = "sh" ]; then + # Let's configure things to use the EESSI module within the PR + sed 's|export MODULEPATH=.*|export MODULEPATH=init/modules|' init/lmod/sh >init/lmod/sh.test + ln -srf init/lmod/sh.test init/lmod/bash.test + ln -srf init/lmod/sh.test init/lmod/ksh.test + ln -srf init/lmod/sh.test init/lmod/zsh.test # Typically this is a non-interactive shell, so manually unset PS1 and reset to a non-exported variable when testing - TEST_EESSI_PS1_UPDATE=$($shell -c "unset PS1 ; PS1='$ ' ; . init/lmod/$shell 2>/dev/null ; echo \"\$PS1\"") - TEST_EESSI_NO_PS1_UPDATE=$($shell -c "unset PS1 ; . init/lmod/$shell 2>/dev/null ; echo \"\$PS1\"") + TEST_EESSI_PS1_UPDATE=$($shell -c "unset PS1 ; PS1='$ ' ; . init/lmod/$shell.test 2>/dev/null ; echo \"\$PS1\"") + TEST_EESSI_NO_PS1_UPDATE=$($shell -c "unset PS1 ; . init/lmod/$shell.test 2>/dev/null ; echo \"\$PS1\"") pattern="{EESSI/${EESSI_VERSION}} " assert_raises 'echo "$TEST_EESSI_PS1_UPDATE" | grep "$pattern"' assert_raises 'echo "$TEST_EESSI_NO_PS1_UPDATE" | grep "$pattern"' 1 # Also check when we explicitly ask for it not to be updated - TEST_EESSI_EXPLICIT_NO_PS1_UPDATE=$($shell -c "unset PS1 ; PS1='test> ' ; export EESSI_MODULE_UPDATE_PS1=0 ; . init/lmod/$shell 2>/dev/null ; echo \"\$PS1\"") - TEST_EESSI_EXPLICIT_NO_PS1_UPDATE_CALLED_TWICE=$($shell -c "unset PS1 ; PS1='$ ' ; export EESSI_MODULE_UPDATE_PS1=0 ; . init/lmod/$shell 2>/dev/null ; . init/lmod/$shell 2>/dev/null ; echo \"\$PS1\"") + TEST_EESSI_EXPLICIT_NO_PS1_UPDATE=$($shell -c "unset PS1 ; PS1='test> ' ; export EESSI_MODULE_UPDATE_PS1=0 ; . init/lmod/$shell.test 2>/dev/null ; echo \"\$PS1\"") + TEST_EESSI_EXPLICIT_NO_PS1_UPDATE_CALLED_TWICE=$($shell -c "unset PS1 ; PS1='$ ' ; export EESSI_MODULE_UPDATE_PS1=0 ; . init/lmod/$shell.test 2>/dev/null ; . init/lmod/$shell.test 2>/dev/null ; echo \"\$PS1\"") assert_raises 'echo "$TEST_EESSI_EXPLICIT_NO_PS1_UPDATE" | grep "$pattern"' 1 assert_raises 'echo "$TEST_EESSI_EXPLICIT_NO_PS1_UPDATE_CALLED_TWICE" | grep "$pattern"' 1 + # Also check complex prompts, and unloading/purging the EESSI module + prompt="\$(echo '\['✘) $ " + promptstr="\[✘ $ " + updated_promptstr="{EESSI/${EESSI_VERSION}} \[✘ $ " + TEST_EESSI_PS1_UPDATE=$($shell -c "unset PS1 ; PS1=\"$prompt\" ; . init/lmod/$shell.test >/dev/null ; echo \"\$PS1\"") + TEST_EESSI_PS1_REVERT=$($shell -c "unset PS1 ; PS1=\"$prompt\" ; . init/lmod/$shell.test >/dev/null ; module purge; echo \"\$PS1\"") + assert 'echo "$TEST_EESSI_PS1_UPDATE"' "$updated_promptstr" + assert 'echo "$TEST_EESSI_PS1_REVERT"' "$promptstr" fi # End Test Suite diff --git a/init/modules/EESSI/2023.06.lua b/init/modules/EESSI/2023.06.lua index 7db50728..fca0d69c 100644 --- a/init/modules/EESSI/2023.06.lua +++ b/init/modules/EESSI/2023.06.lua @@ -222,7 +222,14 @@ local quiet_load = false if os.getenv("EESSI_MODULE_UPDATE_PS1") then local prompt = os.getenv("PS1") if prompt then - pushenv("PS1", "{EESSI/" .. eessi_version .. "} " .. prompt) + local prefix = "{EESSI/" .. eessi_version .. "} " + if mode() == "load" then + -- Prepend prefix to PS1 without evaluating its contents + execute{cmd="PS1=\"" .. prefix .. "$PS1\"", modeA={"load"}} + elseif mode() == "unload" then + -- Strip the prefix from beginning of PS1 + execute{cmd="PS1=\"${PS1#\"" .. prefix .. "\"}\"", modeA={"unload"}} + end end end