From 1d88ecfce5e729846fb15f9c1bc0c3526c9643f9 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sun, 23 Aug 2020 22:50:41 -0700 Subject: [PATCH] [Fix] `nvm_die_on_prefix`: check that the prefix is inside the version dir, not just the nvm dir - also pass the version dir as the third argument --- nvm.sh | 14 ++++++++------ test/fast/Unit tests/nvm_die_on_prefix | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/nvm.sh b/nvm.sh index 4a95dc5..8683949 100644 --- a/nvm.sh +++ b/nvm.sh @@ -2159,7 +2159,7 @@ nvm_npm_global_modules() { nvm_die_on_prefix() { local NVM_DELETE_PREFIX - NVM_DELETE_PREFIX="$1" + NVM_DELETE_PREFIX="${1-}" case "${NVM_DELETE_PREFIX}" in 0 | 1) ;; *) @@ -2168,9 +2168,11 @@ nvm_die_on_prefix() { ;; esac local NVM_COMMAND - NVM_COMMAND="$2" - if [ -z "${NVM_COMMAND}" ]; then - nvm_err 'Second argument "nvm command" must be nonempty' + NVM_COMMAND="${2-}" + local NVM_VERSION_DIR + NVM_VERSION_DIR="${3-}" + if [ -z "${NVM_COMMAND}" ] || [ -z "${NVM_VERSION_DIR}" ]; then + nvm_err 'Second argument "nvm command", and third argument "nvm version dir", must both be nonempty' return 2 fi @@ -2210,7 +2212,7 @@ nvm_die_on_prefix() { local NVM_OS NVM_OS="$(nvm_get_os)" NVM_NPM_PREFIX="$(npm config --loglevel=warn get prefix)" - if ! (nvm_tree_contains_path "${NVM_DIR}" "${NVM_NPM_PREFIX}" >/dev/null 2>&1); then + if [ "${NVM_VERSION_DIR}" != "${NVM_NPM_PREFIX}" ] && ! (nvm_tree_contains_path "${NVM_VERSION_DIR}" "${NVM_NPM_PREFIX}" >/dev/null 2>&1); then if [ "_${NVM_DELETE_PREFIX}" = "_1" ]; then npm config --loglevel=warn delete prefix else @@ -3140,7 +3142,7 @@ nvm() { if [ "${NVM_SILENT:-0}" -eq 1 ]; then NVM_USE_CMD="${NVM_USE_CMD} --silent" fi - if ! nvm_die_on_prefix "${NVM_DELETE_PREFIX}" "${NVM_USE_CMD}"; then + if ! nvm_die_on_prefix "${NVM_DELETE_PREFIX}" "${NVM_USE_CMD}" "${NVM_VERSION_DIR}"; then return 11 fi fi diff --git a/test/fast/Unit tests/nvm_die_on_prefix b/test/fast/Unit tests/nvm_die_on_prefix index 7429cb8..c9b99e1 100755 --- a/test/fast/Unit tests/nvm_die_on_prefix +++ b/test/fast/Unit tests/nvm_die_on_prefix @@ -22,13 +22,13 @@ EXIT_CODE="$(nvm_die_on_prefix 2 >/dev/null 2>&1; echo $?)" [ "_$EXIT_CODE" = "_1" ] || die "'nvm_die_on_prefix' did not exit with 1; got "$EXIT_CODE"" OUTPUT="$(nvm_die_on_prefix 0 2>&1)" -EXPECTED_OUTPUT="Second argument \"nvm command\" must be nonempty" +EXPECTED_OUTPUT='Second argument "nvm command", and third argument "nvm version dir", must both be nonempty' EXIT_CODE="$(nvm_die_on_prefix 0 >/dev/null 2>&1; echo $?)" [ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'" [ "_$EXIT_CODE" = "_2" ] || die "'nvm_die_on_prefix 0' did not exit with 2; got '$EXIT_CODE'" nvm_has() { return 1; } # ie, npm is not installed -OUTPUT="$(nvm_die_on_prefix 0 foo 2>&1)" +OUTPUT="$(nvm_die_on_prefix 0 version_dir foo 2>&1)" [ -z "$OUTPUT" ] || die "nvm_die_on_prefix was not a noop when nvm_has returns 1, got '$OUTPUT'" nvm_has() { return 0; } @@ -40,27 +40,27 @@ npm() { echo "$(nvm_version_dir new)/good prefix" fi } -OUTPUT="$(nvm_die_on_prefix 0 foo 2>&1)" +OUTPUT="$(nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)" [ -z "$OUTPUT" ] || die "'nvm_die_on_prefix' was not a noop when prefix is good; got '$OUTPUT'" -OUTPUT="$(PREFIX=bar nvm_die_on_prefix 0 foo 2>&1)" +OUTPUT="$(PREFIX=bar nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)" EXPECTED_OUTPUT='nvm is not compatible with the "PREFIX" environment variable: currently set to "bar" Run `unset PREFIX` to unset it.' -EXIT_CODE="$(export PREFIX=bar ; nvm_die_on_prefix 0 foo >/dev/null 2>&1; echo $?)" +EXIT_CODE="$(export PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" >/dev/null 2>&1; echo $?)" [ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'" [ "_$EXIT_CODE" = "_3" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 3; got '$EXIT_CODE'" -OUTPUT="$(export NPM_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo 2>&1)" +OUTPUT="$(export NPM_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)" EXPECTED_OUTPUT='nvm is not compatible with the "NPM_CONFIG_PREFIX" environment variable: currently set to "bar" Run `unset NPM_CONFIG_PREFIX` to unset it.' -EXIT_CODE="$(export NPM_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo >/dev/null 2>&1; echo $?)" +EXIT_CODE="$(export NPM_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" >/dev/null 2>&1; echo $?)" [ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'NPM_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'" [ "_$EXIT_CODE" = "_4" ] || die "'NPM_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 4; got '$EXIT_CODE'" -OUTPUT="$(export npm_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo 2>&1)" +OUTPUT="$(export npm_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)" EXPECTED_OUTPUT='nvm is not compatible with the "npm_CONFIG_PREFIX" environment variable: currently set to "bar" Run `unset npm_CONFIG_PREFIX` to unset it.' -EXIT_CODE="$(export npm_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo >/dev/null 2>&1; echo $?)" +EXIT_CODE="$(export npm_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" >/dev/null 2>&1; echo $?)" [ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'npm_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'" [ "_$EXIT_CODE" = "_4" ] || die "'npm_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 4; got '$EXIT_CODE'" @@ -71,10 +71,10 @@ npm() { echo "./bad prefix" fi } -OUTPUT="$(nvm_die_on_prefix 0 foo 2>&1)" +OUTPUT="$(nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)" EXPECTED_OUTPUT="nvm is not compatible with the npm config \"prefix\" option: currently set to \"./bad prefix\" Run \`npm config delete prefix\` or \`foo\` to unset it." -EXIT_CODE="$(nvm_die_on_prefix 0 foo >/dev/null 2>&1; echo $?)" +EXIT_CODE="$(nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" >/dev/null 2>&1; echo $?)" [ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT' with bad prefix set; got '$OUTPUT'" [ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' did not exit with 10 with bad prefix set; got '$EXIT_CODE'"