From 81f0f3ec19e08ca782f8a5bb29823a70b8f41177 Mon Sep 17 00:00:00 2001 From: Luke Arms Date: Mon, 27 Dec 2021 16:02:25 +1100 Subject: [PATCH] [Fix] `set -E`: Add test for `node install` on Bash with an ERR trap and `set -E` --- nvm.sh | 9 ++++ .../install on bash with ERR trap and set -E | 50 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100755 test/installation_node/install on bash with ERR trap and set -E diff --git a/nvm.sh b/nvm.sh index e3098b8..f40a9f3 100644 --- a/nvm.sh +++ b/nvm.sh @@ -2742,6 +2742,15 @@ nvm() { EXIT_CODE="$?" set -a return "$EXIT_CODE" + elif [ -n "${BASH-}" ] && [ "${-#*E}" != "$-" ]; then + # shellcheck disable=SC3041 + set +E + local EXIT_CODE + IFS="${DEFAULT_IFS}" nvm "$@" + EXIT_CODE="$?" + # shellcheck disable=SC3041 + set -E + return "$EXIT_CODE" elif [ "${IFS}" != "${DEFAULT_IFS}" ]; then IFS="${DEFAULT_IFS}" nvm "$@" return "$?" diff --git a/test/installation_node/install on bash with ERR trap and set -E b/test/installation_node/install on bash with ERR trap and set -E new file mode 100755 index 0000000..edfad0c --- /dev/null +++ b/test/installation_node/install on bash with ERR trap and set -E @@ -0,0 +1,50 @@ +#!/bin/sh + +set -e + +cleanup() { + nvm cache clear + nvm deactivate + rm -rf "${NVM_DIR}"/v* + nvm unalias default +} + +die() { + echo "$@" + cleanup || true + exit 1 +} + +\. ../../nvm.sh + +if [ -z "${BASH-}" ]; then + echo "This test only applies to Bash; skipping" + exit +fi + +cleanup || true +trap 'echo "==> EXIT signal received (status: $?)"; cleanup' EXIT + +# shellcheck disable=SC3047 +trap 'echo "==> ERR signal received"; exit 1' ERR +# shellcheck disable=SC3041 +set -E + +# shellcheck disable=SC3045,SC3047 +ERR_TRAP_EXPECTED="$(trap -p ERR)" + +# Adding ` || die 'install failed'` implicitly disables error handling and +# prevents ERR trap execution, so for the purposes of this test, `nvm install` +# can't be part of another command or statement +nvm install node + +case "$-" in +*E*) + # shellcheck disable=SC3045,SC3047 + [ "$(trap -p ERR)" = "$ERR_TRAP_EXPECTED" ] || + die "ERR trap not restored after \"nvm install $VERSION\"" + ;; +*) + die "errtrace not restored after \"nvm install $VERSION\"" + ;; +esac