diff --git a/nvm.sh b/nvm.sh index 0e19598..c716d28 100755 --- a/nvm.sh +++ b/nvm.sh @@ -487,11 +487,25 @@ nvm_strip_path() { -e "s#${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*##g" } -nvm_prepend_path() { +nvm_change_path() { + # if there’s no initial path, just return the supplementary path if [ -z "${1-}" ]; then - nvm_echo "${2-}" + nvm_echo "${3-}${2-}" + # if the initial path doesn’t contain an nvm path, prepend the supplementary + # path + elif [ "$(expr "${1-}" : ".*${NVM_DIR}/[^:]*${2-}.*")" = 0 ] || \ + [ "$(expr "${1-}" : ".*${NVM_DIR}/versions/[^/]*/[^/]*${2-}.*")" = 0 ]; then + nvm_echo "${3-}${2-}:${1-}" + # use sed to replace the existing nvm path with the supplementary path. This + # preserves the order of the path. else - nvm_echo "${2-}:${1-}" + nvm_echo "${1-}" | command sed \ + -e "s#${NVM_DIR}/[^/]*${2-}[^:]*:#${3-}${2-}:#g" \ + -e "s#:${NVM_DIR}/[^/]*${2-}[^:]*#:${3-}${2-}#g" \ + -e "s#${NVM_DIR}/[^/]*${2-}[^:]*#${3-}${2-}#g" \ + -e "s#${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*:#${3-}${2-}:#g" \ + -e "s#:${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*#:${3-}${2-}#g" \ + -e "s#${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*#${3-}${2-}#g" fi } @@ -2658,18 +2672,14 @@ nvm() { local NVM_VERSION_DIR NVM_VERSION_DIR="$(nvm_version_path "$VERSION")" - # Strip other version from PATH - PATH="$(nvm_strip_path "$PATH" "/bin")" - # Prepend current version - PATH="$(nvm_prepend_path "$PATH" "$NVM_VERSION_DIR/bin")" + # Change current version + PATH="$(nvm_change_path "$PATH" "/bin" "$NVM_VERSION_DIR")" if nvm_has manpath; then if [ -z "$MANPATH" ]; then MANPATH=$(manpath) fi - # Strip other version from MANPATH - MANPATH="$(nvm_strip_path "$MANPATH" "/share/man")" - # Prepend current version - MANPATH="$(nvm_prepend_path "$MANPATH" "$NVM_VERSION_DIR/share/man")" + # Change current version + MANPATH="$(nvm_change_path "$MANPATH" "/share/man" "$NVM_VERSION_DIR")" export MANPATH fi export PATH @@ -3168,7 +3178,7 @@ nvm() { nvm_ensure_default_set nvm_get_arch nvm_get_os \ nvm_print_implicit_alias nvm_validate_implicit_alias \ nvm_resolve_alias nvm_ls_current nvm_alias \ - nvm_binary_available nvm_prepend_path nvm_strip_path \ + nvm_binary_available nvm_change_path nvm_strip_path \ nvm_num_version_groups nvm_format_version nvm_ensure_version_prefix \ nvm_normalize_version nvm_is_valid_version \ nvm_ensure_version_installed nvm_cache_dir \ @@ -3241,6 +3251,8 @@ nvm_supports_xz() { } nvm_auto() { + local NVM_CURRENT + NVM_CURRENT="$(nvm_ls_current)" local NVM_MODE NVM_MODE="${1-}" local VERSION @@ -3252,11 +3264,13 @@ nvm_auto() { nvm install >/dev/null fi elif [ "_$NVM_MODE" = '_use' ]; then - VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)" - if [ -n "$VERSION" ]; then - nvm use --silent "$VERSION" >/dev/null - elif nvm_rc_version >/dev/null 2>&1; then - nvm use --silent >/dev/null + if [ "_$NVM_CURRENT" = '_system' ]; then + VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)" + if [ -n "$VERSION" ]; then + nvm use --silent "$VERSION" >/dev/null + elif nvm_rc_version >/dev/null 2>&1; then + nvm use --silent >/dev/null + fi fi elif [ "_$NVM_MODE" != '_none' ]; then nvm_err 'Invalid auto mode supplied.' diff --git "a/test/fast/Running \"nvm deactivate\" should unset the nvm environment variables." "b/test/fast/Running \"nvm deactivate\" should unset the nvm environment variables." index af9ecef..3eb1b3f 100755 --- "a/test/fast/Running \"nvm deactivate\" should unset the nvm environment variables." +++ "b/test/fast/Running \"nvm deactivate\" should unset the nvm environment variables." @@ -6,19 +6,19 @@ mkdir -p ../../v0.2.3 die () { echo "$@" ; exit 1; } -[ `expr $PATH : ".*v0.2.3/.*/bin"` = 0 ] || echo "WARNING: Unexpectedly found v0.2.3 already active" >&2 +[ `expr $PATH : ".*v0.2.3/.*/bin.*"` = 0 ] || echo "WARNING: Unexpectedly found v0.2.3 already active" >&2 \. ../../nvm.sh nvm use --delete-prefix v0.2.3 || die "Failed to activate v0.2.3" -[ `expr "$PATH" : ".*v0.2.3/.*/bin"` != 0 ] || die "PATH not set up properly" -[ `expr "$NODE_PATH" : ".*v0.2.3/.*/lib/node_modules"` = 0 ] || die "NODE_PATH should not contain (npm root -g)" -[ `expr "$NVM_BIN" : ".*v0.2.3/bin"` != 0 ] || die "NODE_BIN should contain bin directory path" -[ `expr "$NVM_PATH" : ".*v0.2.3/lib/node"` != 0 ] || die "NODE_PATH should contain lib node directory path" +[ `expr "$PATH" : ".*v0.2.3/.*/bin.*"` != 0 ] || die "PATH not set up properly" +[ `expr "$NODE_PATH" : ".*v0.2.3/.*/lib/node_modules.*"` = 0 ] || die "NODE_PATH should not contain (npm root -g)" +[ `expr "$NVM_BIN" : ".*v0.2.3/bin.*"` != 0 ] || die "NODE_BIN should contain bin directory path" +[ `expr "$NVM_PATH" : ".*v0.2.3/lib/node.*"` != 0 ] || die "NODE_PATH should contain lib node directory path" # ^ note: NODE_PATH should not contain `npm root -g` since globals should not be requireable nvm deactivate || die "Failed to deactivate v0.2.3" -[ `expr "$PATH" : ".*v0.2.3/.*/bin"` = 0 ] || die "PATH not cleaned properly" -[ `expr "$NODE_PATH" : ".*v0.2.3/.*/lib/node_modules"` = 0 ] || die "NODE_PATH not cleaned properly" +[ `expr "$PATH" : ".*v0.2.3/.*/bin.*"` = 0 ] || die "PATH not cleaned properly" +[ `expr "$NODE_PATH" : ".*v0.2.3/.*/lib/node_modules.*"` = 0 ] || die "NODE_PATH not cleaned properly" [ "_$NVM_BIN" = "_" ] || die "NVM_BIN should be unset: got '$NVM_BIN'" [ "_$NVM_PATH" = "_" ] || die "NVM_PATH should be unset: got '$NVM_PATH'" diff --git a/test/fast/Unit tests/nvm_change_path b/test/fast/Unit tests/nvm_change_path new file mode 100755 index 0000000..621729f --- /dev/null +++ b/test/fast/Unit tests/nvm_change_path @@ -0,0 +1,43 @@ +#!/bin/sh + +die () { echo "$@" ; exit 1; } + +\. ../../../nvm.sh + +TEST_PATH=/usr/bin:/usr/local/bin + +# New version dir +NEW_PATH=`nvm_change_path "$TEST_PATH" "/bin" "$NVM_DIR/versions/node/v7.1.0"` + +[ "$NEW_PATH" = "$NVM_DIR/versions/node/v7.1.0/bin:/usr/bin:/usr/local/bin" ] || die "Not correctly changed: $NEW_PATH " + +# Old version dir +NEW_PATH=`nvm_change_path "$TEST_PATH" "/bin" "$NVM_DIR/v0.1.2"` + +[ "$NEW_PATH" = "$NVM_DIR/v0.1.2/bin:/usr/bin:/usr/local/bin" ] || die "Not correctly changed: $NEW_PATH " + + +TEST_PATH=/home/user/code/test/node_modules/.bin:$NVM_DIR/versions/node/v4.5.0/bin:/usr/bin:/usr/local/bin + +# New version dir +NEW_PATH=`nvm_change_path "$TEST_PATH" "/bin" "$NVM_DIR/versions/node/v7.1.0"` + +[ "$NEW_PATH" = "/home/user/code/test/node_modules/.bin:$NVM_DIR/versions/node/v7.1.0/bin:/usr/bin:/usr/local/bin" ] || die "Not correctly changed: $NEW_PATH " + +# Old version dir +NEW_PATH=`nvm_change_path "$TEST_PATH" "/bin" "$NVM_DIR/v0.1.2"` + +[ "$NEW_PATH" = "/home/user/code/test/node_modules/.bin:$NVM_DIR/v0.1.2/bin:/usr/bin:/usr/local/bin" ] || die "Not correctly changed: $NEW_PATH " + + +EMPTY_PATH= + +# New version dir +NEW_PATH=`nvm_change_path "$EMPTY_PATH" "/bin" "$NVM_DIR/versions/node/v7.1.0"` + +[ "$NEW_PATH" = "$NVM_DIR/versions/node/v7.1.0/bin" ] || die "Not correctly prepended: $NEW_PATH " + +# Old version dir +NEW_PATH=`nvm_change_path "$EMPTY_PATH" "/bin" "$NVM_DIR/v0.1.2"` + +[ "$NEW_PATH" = "$NVM_DIR/v0.1.2/bin" ] || die "Not correctly prepended: $NEW_PATH " diff --git a/test/fast/Unit tests/nvm_prepend_path b/test/fast/Unit tests/nvm_prepend_path deleted file mode 100755 index 37df3f9..0000000 --- a/test/fast/Unit tests/nvm_prepend_path +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -die () { echo "$@" ; exit 1; } - -\. ../../../nvm.sh - -TEST_PATH=/usr/bin:/usr/local/bin - -NEW_PATH=`nvm_prepend_path "$TEST_PATH" "$NVM_DIR/v0.2.5/bin"` - -[ "$NEW_PATH" = "$NVM_DIR/v0.2.5/bin:/usr/bin:/usr/local/bin" ] || die "Not correctly prepended: $NEW_PATH " - - -EMPTY_PATH= - -NEW_PATH=`nvm_prepend_path "$EMPTY_PATH" "$NVM_DIR/v0.2.5/bin"` - -[ "$NEW_PATH" = "$NVM_DIR/v0.2.5/bin" ] || die "Not correctly prepended: $NEW_PATH "