diff --git a/nvm.sh b/nvm.sh index d771dbe4..382e174c 100755 --- a/nvm.sh +++ b/nvm.sh @@ -1015,6 +1015,27 @@ nvm_is_valid_version() { *) local VERSION VERSION="$(nvm_strip_iojs_prefix "${1-}")" + local NVM_VERSION_CORE + NVM_VERSION_CORE="${VERSION#v}" + case "${NVM_VERSION_CORE}" in + *-*) + # prereleases (rc, nightly, v8-canary, ...) need a full x.y.z, and never have a dot followed by a non-digit, like a file extension + case "${NVM_VERSION_CORE#*-}" in + '' | .* | *. | *..* | *.*[!0-9.]* | *[!0-9A-Za-z.-]*) return 1 ;; + esac + NVM_VERSION_CORE="${NVM_VERSION_CORE%%-*}" + case "${NVM_VERSION_CORE}" in + *.*.*) ;; + *) return 1 ;; + esac + ;; + *.) + NVM_VERSION_CORE="${NVM_VERSION_CORE%.}" + ;; + esac + case "${NVM_VERSION_CORE}" in + '' | .* | *. | *..* | *.*.*.* | *[!0-9.]*) return 1 ;; + esac nvm_version_greater_than_or_equal_to "${VERSION}" 0 ;; esac diff --git a/test/fast/Running 'nvm exec' and 'nvm run' treat digit-named files as arguments, not versions b/test/fast/Running 'nvm exec' and 'nvm run' treat digit-named files as arguments, not versions new file mode 100755 index 00000000..756752d7 --- /dev/null +++ b/test/fast/Running 'nvm exec' and 'nvm run' treat digit-named files as arguments, not versions @@ -0,0 +1,66 @@ +#!/bin/sh + +set -ex + +die () { echo "$@" ; cleanup ; exit 1; } + +cleanup() { + cd "${ORIG_PWD}" 2>/dev/null || true + [ -n "${TMP_DIR-}" ] && rm -rf "${TMP_DIR}" +} + +export NVM_DIR="$(cd ../.. && pwd)" + +: nvm.sh +\. ../../nvm.sh + +\. ../common.sh + +ORIG_PWD="$(pwd)" + +# Run from a fresh, empty directory so no ambient .nvmrc above the test dir +# can satisfy the lookup and mask the warning. +TMP_DIR="$(mktemp -d)" +cd "${TMP_DIR}" || die "could not cd to temp dir" + +EXEC_WARNING='WARNING: `nvm exec` was invoked without a version argument and without an .nvmrc file.' +RUN_WARNING='WARNING: `nvm run` was invoked without a version argument and without an .nvmrc file.' + +for FILE in 123.js v1.23.js 1.2.3.js; do + set +ex # needed for stderr + RUN_STDERR="$(nvm run "${FILE}" &1 1>/dev/null)" + set -ex + case "${RUN_STDERR}" in + *"N/A: version \"v${FILE#v}\""*) die "'nvm run ${FILE}' treated the file as a version; got >${RUN_STDERR}<" ;; + *"${RUN_WARNING}"*) ;; + *) die "'nvm run ${FILE}' did not fall back with a warning; got >${RUN_STDERR}<" ;; + esac +done + +set +ex # needed for stderr +EXEC_STDERR="$(nvm exec 1.2.3.js &1 1>/dev/null)" +set -ex +case "${EXEC_STDERR}" in + *'N/A: version "v1.2.3.js"'*) die "'nvm exec 1.2.3.js' treated the command as a version; got >${EXEC_STDERR}<" ;; + *"${EXEC_WARNING}"*) ;; + *) die "'nvm exec 1.2.3.js' did not fall back with a warning; got >${EXEC_STDERR}<" ;; +esac + +# an uninstalled prerelease is still a version, not a file +set +ex # needed for stderr +RUN_RC_STDERR="$(nvm run v999.0.0-rc.1 app.js &1 1>/dev/null)" +set -ex +case "${RUN_RC_STDERR}" in + *'N/A: version "v999.0.0-rc.1" is not yet installed.'*) ;; + *) die "'nvm run v999.0.0-rc.1' did not report the prerelease as not installed; got >${RUN_RC_STDERR}<" ;; +esac + +set +ex # needed for stderr +EXEC_RC_STDERR="$(nvm exec v999.0.0-rc.1 node &1 1>/dev/null)" +set -ex +case "${EXEC_RC_STDERR}" in + *'N/A: version "v999.0.0-rc.1" is not yet installed.'*) ;; + *) die "'nvm exec v999.0.0-rc.1' did not report the prerelease as not installed; got >${EXEC_RC_STDERR}<" ;; +esac + +cleanup diff --git a/test/fast/Unit tests/nvm_auto use with a prerelease default b/test/fast/Unit tests/nvm_auto use with a prerelease default new file mode 100755 index 00000000..101d7b85 --- /dev/null +++ b/test/fast/Unit tests/nvm_auto use with a prerelease default @@ -0,0 +1,39 @@ +#!/bin/sh + +ORIG_NVM_DIR="${NVM_DIR}" +TMP_DIR='' + +cleanup () { + case "${TMP_DIR}" in + /*) rm -rf "${TMP_DIR}" ;; + esac + NVM_DIR="${ORIG_NVM_DIR}" + export NVM_DIR +} + +die () { echo "$@" ; cleanup ; exit 1; } + +: nvm.sh +\. ../../../nvm.sh + +\. ../../common.sh + +TMP_DIR="$(mktemp -d)" +NVM_DIR="${TMP_DIR}/nvm" +export NVM_DIR +mkdir -p "${NVM_DIR}/alias" || die 'could not create alias dir' + +RELEASE='v998.0.0' +NIGHTLY='v999.0.0-nightly20241031996708042b' +make_fake_node "${RELEASE}" || die "fake node ${RELEASE} could not be made" +make_fake_node "${NIGHTLY}" || die "fake node ${NIGHTLY} could not be made" + +for TARGET in "${NIGHTLY}" node; do + nvm_make_alias default "${TARGET}" || die "could not alias default to ${TARGET}" + nvm deactivate >/dev/null 2>&1 + nvm_auto use || die "nvm_auto use failed with default -> ${TARGET}" + CURRENT="$(nvm current)" + [ "${CURRENT}" = "${NIGHTLY}" ] || die "with default -> ${TARGET}, nvm_auto use left 'nvm current' as >${CURRENT}<, expected >${NIGHTLY}<" +done + +cleanup diff --git a/test/fast/Unit tests/nvm_is_valid_version b/test/fast/Unit tests/nvm_is_valid_version index 8bdf9410..8b03d14c 100755 --- a/test/fast/Unit tests/nvm_is_valid_version +++ b/test/fast/Unit tests/nvm_is_valid_version @@ -12,3 +12,32 @@ nvm_is_valid_version iojs || die "nvm_is_valid_version iojs did not return 0" nvm_is_valid_version node || die "nvm_is_valid_version node did not return 0" nvm_is_valid_version stable || die "nvm_is_valid_version stable did not return 0" nvm_is_valid_version unstable || die "nvm_is_valid_version unstable did not return 0" + +nvm_is_valid_version 123.js && die "nvm_is_valid_version 123.js did not return 1" +nvm_is_valid_version v123.js && die "nvm_is_valid_version v123.js did not return 1" +nvm_is_valid_version v1.js && die "nvm_is_valid_version v1.js did not return 1" +nvm_is_valid_version v1.23.js && die "nvm_is_valid_version v1.23.js did not return 1" +nvm_is_valid_version 1.2.3.js && die "nvm_is_valid_version 1.2.3.js did not return 1" +nvm_is_valid_version 1.2.3.4.5.6.js && die "nvm_is_valid_version 1.2.3.4.5.6.js did not return 1" +nvm_is_valid_version 1.2.3.4 && die "nvm_is_valid_version 1.2.3.4 did not return 1" +nvm_is_valid_version 1..2 && die "nvm_is_valid_version 1..2 did not return 1" +nvm_is_valid_version 1.2.3-foo.js && die "nvm_is_valid_version 1.2.3-foo.js did not return 1" +nvm_is_valid_version 2.0.0-migration.js && die "nvm_is_valid_version 2.0.0-migration.js did not return 1" +nvm_is_valid_version 1.2-3.4-5 && die "nvm_is_valid_version 1.2-3.4-5 did not return 1" +nvm_is_valid_version 1.2.3- && die "nvm_is_valid_version 1.2.3- did not return 1" +nvm_is_valid_version 1.2.3-rc..1 && die "nvm_is_valid_version 1.2.3-rc..1 did not return 1" +nvm_is_valid_version '1.js +2' && die "nvm_is_valid_version with an embedded newline did not return 1" + +nvm_is_valid_version 1 || die "nvm_is_valid_version 1 did not return 0" +nvm_is_valid_version v1 || die "nvm_is_valid_version v1 did not return 0" +nvm_is_valid_version 1.2 || die "nvm_is_valid_version 1.2 did not return 0" +nvm_is_valid_version v18.20.0 || die "nvm_is_valid_version v18.20.0 did not return 0" +nvm_is_valid_version 20. || die "nvm_is_valid_version 20. did not return 0" +nvm_is_valid_version v18.20. || die "nvm_is_valid_version v18.20. did not return 0" +nvm_is_valid_version iojs-v1.0.0 || die "nvm_is_valid_version iojs-v1.0.0 did not return 0" +nvm_is_valid_version v9.4.0-rc.1 || die "nvm_is_valid_version v9.4.0-rc.1 did not return 0" +nvm_is_valid_version v9.9.1-nightly201803256591d9f761 || die "nvm_is_valid_version v9.9.1-nightly201803256591d9f761 did not return 0" +nvm_is_valid_version v9.0.0-v8-canary201710301f8f3dcf36 || die "nvm_is_valid_version v9.0.0-v8-canary201710301f8f3dcf36 did not return 0" +nvm_is_valid_version v8.16.2-test201910293843c56739f || die "nvm_is_valid_version v8.16.2-test201910293843c56739f did not return 0" +nvm_is_valid_version iojs-v3.2.1-nightly201508291a531b4e44 || die "nvm_is_valid_version iojs-v3.2.1-nightly201508291a531b4e44 did not return 0"