diff --git a/nvm.sh b/nvm.sh index 1e9f6da1..ecc39e4b 100755 --- a/nvm.sh +++ b/nvm.sh @@ -1673,11 +1673,18 @@ nvm_resolve_local_alias() { if [ -z "${VERSION}" ]; then return $EXIT_CODE fi - if [ "_${VERSION}" != '_∞' ]; then - nvm_version "${VERSION}" - else + if [ "_${VERSION}" = '_∞' ]; then nvm_echo "${VERSION}" + return fi + + # Fast path: an exact, installed vX.Y.Z needs no further resolution. + if nvm_is_installed_exact_version "${VERSION}"; then + nvm_echo "${VERSION}" + return + fi + + nvm_version "${VERSION}" } nvm_iojs_prefix() { diff --git a/test/fast/Aliases/nvm_resolve_local_alias skips nvm_version for an exact installed version b/test/fast/Aliases/nvm_resolve_local_alias skips nvm_version for an exact installed version new file mode 100755 index 00000000..c5372243 --- /dev/null +++ b/test/fast/Aliases/nvm_resolve_local_alias skips nvm_version for an exact installed version @@ -0,0 +1,20 @@ +#!/bin/sh + +die () { echo "$@" ; exit 1; } + +: nvm.sh +\. ../../../nvm.sh + +nvm_version() { + echo 'nvm_version was called' >&2 + return 42 +} + +EXACT="$(nvm_resolve_local_alias test-stable-1)" +[ "_$EXACT" = "_v0.0.1" ] || die "'nvm_resolve_local_alias test-stable-1' was not v0.0.1; got $EXACT" + +echo v0.0.99 > ../../../alias/test-not-installed +NOT_INSTALLED="$(nvm_resolve_local_alias test-not-installed 2>/dev/null)" +EXIT_CODE=$? +rm -f ../../../alias/test-not-installed +[ "_$EXIT_CODE" = "_42" ] || die "an exact version that is not installed should still go through nvm_version; got exit code $EXIT_CODE"