mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-10-11 00:00:13 +08:00
[Perf] nvm_is_valid_version, nvm_validate_implicit_alias: avoid forks
This commit is contained in:
@@ -1061,17 +1061,14 @@ ${NVM_LS_REMOTE_POST_MERGED_OUTPUT}" | nvm_grep -v "N/A" | command sed '/^ *$/d'
|
|||||||
}
|
}
|
||||||
|
|
||||||
nvm_is_valid_version() {
|
nvm_is_valid_version() {
|
||||||
if nvm_validate_implicit_alias "${1-}" 2>/dev/null; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
case "${1-}" in
|
case "${1-}" in
|
||||||
"$(nvm_iojs_prefix)" | \
|
"stable" | "unstable" | "iojs" | "node")
|
||||||
"$(nvm_node_prefix)")
|
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
local VERSION
|
local VERSION
|
||||||
VERSION="$(nvm_strip_iojs_prefix "${1-}")"
|
VERSION="${1-}"
|
||||||
|
VERSION="${VERSION#iojs-}"
|
||||||
local NVM_VERSION_CORE
|
local NVM_VERSION_CORE
|
||||||
NVM_VERSION_CORE="${VERSION#v}"
|
NVM_VERSION_CORE="${VERSION#v}"
|
||||||
case "${NVM_VERSION_CORE}" in
|
case "${NVM_VERSION_CORE}" in
|
||||||
@@ -1085,6 +1082,9 @@ nvm_is_valid_version() {
|
|||||||
*.*.*) ;;
|
*.*.*) ;;
|
||||||
*) return 1 ;;
|
*) return 1 ;;
|
||||||
esac
|
esac
|
||||||
|
# a prerelease's `-` makes it unreachable for the pure-shell checks
|
||||||
|
# below, so do the full check now.
|
||||||
|
nvm_version_greater_than_or_equal_to "${VERSION}" 0 || return 1
|
||||||
;;
|
;;
|
||||||
*.)
|
*.)
|
||||||
NVM_VERSION_CORE="${NVM_VERSION_CORE%.}"
|
NVM_VERSION_CORE="${NVM_VERSION_CORE%.}"
|
||||||
@@ -1093,7 +1093,7 @@ nvm_is_valid_version() {
|
|||||||
case "${NVM_VERSION_CORE}" in
|
case "${NVM_VERSION_CORE}" in
|
||||||
'' | .* | *. | *..* | *.*.*.* | *[!0-9.]*) return 1 ;;
|
'' | .* | *. | *..* | *.*.*.* | *[!0-9.]*) return 1 ;;
|
||||||
esac
|
esac
|
||||||
nvm_version_greater_than_or_equal_to "${VERSION}" 0
|
# every version that reaches this point is a number, and so `>= 0`
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
@@ -1741,12 +1741,9 @@ nvm_add_iojs_prefix() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nvm_strip_iojs_prefix() {
|
nvm_strip_iojs_prefix() {
|
||||||
local NVM_IOJS_PREFIX
|
|
||||||
NVM_IOJS_PREFIX="$(nvm_iojs_prefix)"
|
|
||||||
|
|
||||||
case "${1-}" in
|
case "${1-}" in
|
||||||
"${NVM_IOJS_PREFIX}") nvm_echo ;;
|
"iojs") nvm_echo ;;
|
||||||
*) nvm_echo "${1#"${NVM_IOJS_PREFIX}"-}" ;;
|
*) nvm_echo "${1#iojs-}" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2470,17 +2467,12 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nvm_validate_implicit_alias() {
|
nvm_validate_implicit_alias() {
|
||||||
local NVM_IOJS_PREFIX
|
|
||||||
NVM_IOJS_PREFIX="$(nvm_iojs_prefix)"
|
|
||||||
local NVM_NODE_PREFIX
|
|
||||||
NVM_NODE_PREFIX="$(nvm_node_prefix)"
|
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
"stable" | "unstable" | "${NVM_IOJS_PREFIX}" | "${NVM_NODE_PREFIX}")
|
"stable" | "unstable" | "iojs" | "node")
|
||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
nvm_err "Only implicit aliases 'stable', 'unstable', '${NVM_IOJS_PREFIX}', and '${NVM_NODE_PREFIX}' are supported."
|
nvm_err "Only implicit aliases 'stable', 'unstable', 'iojs', and 'node' are supported."
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -41,3 +41,22 @@ nvm_is_valid_version v9.9.1-nightly201803256591d9f761 || die "nvm_is_valid_versi
|
|||||||
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 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 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"
|
nvm_is_valid_version iojs-v3.2.1-nightly201508291a531b4e44 || die "nvm_is_valid_version iojs-v3.2.1-nightly201508291a531b4e44 did not return 0"
|
||||||
|
|
||||||
|
# `nvm_is_valid_version` must not fork a command for a plain version: mock
|
||||||
|
# `awk`, which the version comparisons used, and fail if it runs. (Prereleases
|
||||||
|
# still reach the comparison, which is why this checks a release version.)
|
||||||
|
TEST_DIR="$(pwd)/nvm_is_valid_version_tmp"
|
||||||
|
[ ! -e "${TEST_DIR}" ] && mkdir "${TEST_DIR}"
|
||||||
|
MOCK_BIN="${TEST_DIR}/bin"
|
||||||
|
mkdir -p "${MOCK_BIN}"
|
||||||
|
{
|
||||||
|
echo '#!/bin/sh'
|
||||||
|
echo 'echo "awk was called" >&2'
|
||||||
|
echo 'exit 1'
|
||||||
|
} > "${MOCK_BIN}/awk"
|
||||||
|
chmod +x "${MOCK_BIN}/awk"
|
||||||
|
|
||||||
|
PATH="${MOCK_BIN}:${PATH}" nvm_is_valid_version v18.20.0 \
|
||||||
|
|| die 'nvm_is_valid_version v18.20.0 forked a command'
|
||||||
|
|
||||||
|
rm -rf "${TEST_DIR}"
|
||||||
|
|||||||
Reference in New Issue
Block a user