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() {
|
||||
if nvm_validate_implicit_alias "${1-}" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
case "${1-}" in
|
||||
"$(nvm_iojs_prefix)" | \
|
||||
"$(nvm_node_prefix)")
|
||||
"stable" | "unstable" | "iojs" | "node")
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
local VERSION
|
||||
VERSION="$(nvm_strip_iojs_prefix "${1-}")"
|
||||
VERSION="${1-}"
|
||||
VERSION="${VERSION#iojs-}"
|
||||
local NVM_VERSION_CORE
|
||||
NVM_VERSION_CORE="${VERSION#v}"
|
||||
case "${NVM_VERSION_CORE}" in
|
||||
@@ -1085,6 +1082,9 @@ nvm_is_valid_version() {
|
||||
*.*.*) ;;
|
||||
*) return 1 ;;
|
||||
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%.}"
|
||||
@@ -1093,7 +1093,7 @@ nvm_is_valid_version() {
|
||||
case "${NVM_VERSION_CORE}" in
|
||||
'' | .* | *. | *..* | *.*.*.* | *[!0-9.]*) return 1 ;;
|
||||
esac
|
||||
nvm_version_greater_than_or_equal_to "${VERSION}" 0
|
||||
# every version that reaches this point is a number, and so `>= 0`
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -1741,12 +1741,9 @@ nvm_add_iojs_prefix() {
|
||||
}
|
||||
|
||||
nvm_strip_iojs_prefix() {
|
||||
local NVM_IOJS_PREFIX
|
||||
NVM_IOJS_PREFIX="$(nvm_iojs_prefix)"
|
||||
|
||||
case "${1-}" in
|
||||
"${NVM_IOJS_PREFIX}") nvm_echo ;;
|
||||
*) nvm_echo "${1#"${NVM_IOJS_PREFIX}"-}" ;;
|
||||
"iojs") nvm_echo ;;
|
||||
*) nvm_echo "${1#iojs-}" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -2470,17 +2467,12 @@ BEGIN {
|
||||
}
|
||||
|
||||
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
|
||||
"stable" | "unstable" | "${NVM_IOJS_PREFIX}" | "${NVM_NODE_PREFIX}")
|
||||
"stable" | "unstable" | "iojs" | "node")
|
||||
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
|
||||
;;
|
||||
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 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` 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