mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-10-24 15:23:42 +08:00
[Fix] nvm exec/nvm run: do not treat filenames with digits as versions
`nvm_is_valid_version` accepted strings like `123.js`, `v1.js`, and `1.2.3.4.5.6.js`, because `nvm_version_greater_than_or_equal_to` exits as soon as the first number is greater than zero, without looking at the rest. So `nvm run 123.js` failed with `N/A: version "v123.js" is not yet installed` instead of running the file. It now checks the shape first: one to three dot-separated numbers, optionally with a trailing dot, and a prerelease suffix (rc, nightly, v8-canary, test builds) only after a full `x.y.z`. A suffix with a dot followed by a non-digit, like a file extension, is rejected, so names like `1.2.3-foo.js` are treated as files too. Every version listed in the nodejs.org and iojs.org `index.tab` files is still accepted, so shell startup keeps using a `default` alias that resolves to an installed prerelease. Names that are also valid versions, like `123` or `v1`, are still treated as versions; `nvm run current 123` runs such a file. Refs #1166. See #3931.
This commit is contained in:
39
test/fast/Unit tests/nvm_auto use with a prerelease default
Executable file
39
test/fast/Unit tests/nvm_auto use with a prerelease default
Executable file
@@ -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
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user