[New] select versions by category: alpha, lts, non-lts, iojs; exclude alphas by default

Node 27 and later publish Alpha prereleases, like `v27.0.0-alpha.1.0.0`, in the main `index.tab`,
so `nvm install node` or `nvm install 27` would otherwise pick one.
Every version is in exactly one category: `alpha` and `lts` or `non-lts` (by index.tab's LTS column) on the node mirror, and `iojs` on the io.js mirror.
Commands select from every category but `alpha`, unless `$NVM_ONLY` lists others,
and every command that selects or lists versions takes `--only=<categories>` to override both;
an exact alpha needs `alpha` selected, like any other.
An LTS selection, like `--lts` or an `lts/` version, can't combine with an `--only=` that excludes `lts`.
Telling installed `lts` and `non-lts` versions apart uses the recorded LTS status, and fails rather than guess without it.
`nvm alias` also stores `--only=`, so `nvm alias default --only=alpha node` makes the latest installed alpha the default, including in a new shell.
This commit is contained in:
Jordan Harband committed 2026-10-21 14:09:18 -07:00
1 parent 11df5ed6f1
commit 3fda4d5542
13 files changed
+1213 -51

No files matched your search

@@ -0,0 +1,63 @@
#!/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}" || die 'could not create NVM_DIR'
unset NVM_ONLY
ALPHA='v27.0.0-alpha.1.0.0'
ALPHA_BIN="${NVM_DIR}/versions/node/${ALPHA}/bin"
mkdir -p "${ALPHA_BIN}" || die 'fake alpha could not be made'
make_echo "${ALPHA_BIN}/node" "${ALPHA}"
make_fake_node v20.1.1 || die 'fake node v20.1.1 could not be made'
printf 'v20.1.1\t2023-01-01\tsrc\t-\t-\t-\t-\t-\t-\tIron\t-\n' | nvm_record_lts_status || die 'could not record LTS status'
HINT='Include its category with `--only=<categories>`, or in `$NVM_ONLY`.'
for COMMAND in use which; do
for PAIR in "${ALPHA}:${ALPHA}" "27:27 -> ${ALPHA}"; do
try_err nvm "${COMMAND}" "${PAIR%%:*}"
[ "_${CAPTURED_EXIT_CODE}" != '_0' ] || die "nvm ${COMMAND} ${PAIR%%:*} should fail when alphas are excluded"
EXPECTED="N/A: version \"${PAIR#*:}\" is installed, but excluded by the selected version categories (lts,non-lts,iojs)."
[ "_$(echo "${CAPTURED_STDERR}" | strip_colors | head -1)" = "_${EXPECTED}" ] || die "nvm ${COMMAND} ${PAIR%%:*} printed >${CAPTURED_STDERR}<, expected >${EXPECTED}<"
case "${CAPTURED_STDERR}" in
*"${HINT}"*) ;;
*) die "nvm ${COMMAND} ${PAIR%%:*} did not print >${HINT}<; got >${CAPTURED_STDERR}<" ;;
esac
done
done
try_err nvm which --only=lts "${ALPHA}"
EXPECTED="N/A: version \"${ALPHA}\" is installed, but excluded by the selected version categories (lts)."
[ "_$(echo "${CAPTURED_STDERR}" | strip_colors | head -1)" = "_${EXPECTED}" ] || die "nvm which --only=lts ${ALPHA} printed >${CAPTURED_STDERR}<, expected >${EXPECTED}<"
[ "_$(nvm which --only=alpha "${ALPHA}")" = "_${ALPHA_BIN}/node" ] || die "nvm which --only=alpha ${ALPHA} should print its node path"
[ "_$(NVM_ONLY=alpha nvm which 27)" = "_${ALPHA_BIN}/node" ] || die 'NVM_ONLY=alpha nvm which 27 should print the alpha node path'
nvm use --silent --only=alpha "${ALPHA}" || die "nvm use --only=alpha ${ALPHA} failed"
case ":${PATH}:" in
*":${ALPHA_BIN}:"*) ;;
*) die "nvm use --only=alpha did not put ${ALPHA_BIN} on PATH; got ${PATH}" ;;
esac
[ "_$(nvm current)" = "_${ALPHA}" ] || die "nvm current should be ${ALPHA}; got $(nvm current)"
nvm deactivate >/dev/null 2>&1
cleanup
+78
View File
@@ -0,0 +1,78 @@
#!/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
unset NVM_ONLY
unset -f nvm_download
}
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}" || die 'could not create NVM_DIR'
unset NVM_ONLY
DOWNLOADS="${TMP_DIR}/downloads"
nvm_download () {
echo "$*" >> "${DOWNLOADS}"
return 1
}
downloads () {
if [ -f "${DOWNLOADS}" ]; then
wc -l < "${DOWNLOADS}" | tr -d ' '
else
echo 0
fi
}
for VERSION in v21.0.0 v22.11.0 v27.0.0-alpha.1.0.0; do
mkdir -p "${NVM_DIR}/versions/node/${VERSION}/bin" || die "fake node ${VERSION} could not be made"
make_echo "${NVM_DIR}/versions/node/${VERSION}/bin/node" "${VERSION}"
done
make_fake_iojs v3.3.1 || die 'fake iojs could not be made'
# without recorded LTS status, selecting only one of lts and non-lts fails rather than guess
try_err nvm ls --no-colors --only=lts
[ "_${CAPTURED_EXIT_CODE}" = '_3' ] || die "nvm ls --only=lts without recorded LTS status should exit 3; got ${CAPTURED_EXIT_CODE}"
[ "_${CAPTURED_STDERR}" = '_The LTS status of installed versions is not recorded yet; run `nvm ls-remote` to record it.' ] || die "got >${CAPTURED_STDERR}<"
[ "_$(downloads)" = '_1' ] || die "missing LTS status should be downloaded once; got $(downloads)"
# so do internal lookups, rather than treat every version as non-LTS
OUTPUT="$(printf 'v21.0.0\nv22.11.0\n' | NVM_ONLY=non-lts nvm_filter_installed_versions 2>/dev/null)"
[ -z "${OUTPUT}" ] || die "nvm_filter_installed_versions without recorded LTS status should print nothing; got >${OUTPUT}<"
[ "_$(NVM_ONLY=non-lts nvm_version 21 2>/dev/null)" = '_N/A' ] || die 'NVM_ONLY=non-lts nvm_version 21 without recorded LTS status should be N/A'
# selecting both, or neither, needs no LTS status
[ "_$(nvm ls --no-colors --no-alias --only=lts,non-lts | nvm_grep -v system | tr -d ' *' | tr '\n' ' ')" = '_v21.0.0 v22.11.0 ' ] || die 'nvm ls --only=lts,non-lts should list both'
[ "_$(nvm ls --no-colors --no-alias --only=alpha,iojs | nvm_grep -v system | tr -d ' *' | tr '\n' ' ')" = '_iojs-v3.3.1 v27.0.0-alpha.1.0.0 ' ] || die 'nvm ls --only=alpha,iojs should list the alpha and io.js'
[ "_$(downloads)" = '_1' ] || die "selecting both or neither of lts and non-lts should not download; got $(downloads)"
printf 'v22.11.0\t2024-10-29\tsrc\t-\t-\t-\t-\t-\t-\tJod\t-\nv21.0.0\t2023-10-17\tsrc\t-\t-\t-\t-\t-\t-\t-\t-\n' | nvm_record_lts_status || die 'could not record LTS status'
INPUT="$(printf 'system\nv21.0.0\nv22.11.0\nv23.0.0\nv27.0.0-alpha.1.0.0\niojs-v3.3.1\nN/A')"
for PAIR in 'lts:system v22.11.0 N/A ' 'non-lts:system v21.0.0 v23.0.0 N/A ' 'alpha:system v27.0.0-alpha.1.0.0 N/A ' 'iojs:system iojs-v3.3.1 N/A ' \
'lts,non-lts:system v21.0.0 v22.11.0 v23.0.0 N/A ' 'alpha,lts,non-lts,iojs:system v21.0.0 v22.11.0 v23.0.0 v27.0.0-alpha.1.0.0 iojs-v3.3.1 N/A '; do
OUTPUT="$(echo "${INPUT}" | NVM_ONLY="${PAIR%%:*}" nvm_filter_installed_versions | tr '\n' ' ')"
[ "_${OUTPUT}" = "_${PAIR#*:}" ] || die "NVM_ONLY=${PAIR%%:*} nvm_filter_installed_versions printed >${OUTPUT}<, expected >${PAIR#*:}<"
done
[ "_$(nvm ls --no-colors --no-alias --only=lts | nvm_grep -v system | tr -d ' *')" = '_v22.11.0' ] || die 'nvm ls --only=lts should list the recorded LTS version'
[ "_$(nvm version --only=non-lts 21)" = '_v21.0.0' ] || die 'nvm version --only=non-lts 21 should be v21.0.0'
[ "_$(nvm version --only=lts 21)" = '_N/A' ] || die 'nvm version --only=lts 21 should be N/A'
[ "_$(downloads)" = '_1' ] || die "recorded LTS status should not be downloaded again; got $(downloads)"
cleanup
+16
View File
@@ -0,0 +1,16 @@
#!/bin/sh
die () { echo "$@" ; exit 1; }
: nvm.sh
\. ../../../nvm.sh
for VERSION in 'v27.0.0-alpha.0.0.0' 'v27.0.0-alpha.1.10.2' '27.0.0-alpha.1.2.0' 'v28.1.2-alpha.10.20.30'; do
nvm_is_alpha_version "${VERSION}" || die "${VERSION} should be an alpha version"
done
for VERSION in '' 'v27.0.0' 'v27.0.0-alpha.1.0' 'v27.0.0-alpha.1' 'v27.0.0-alpha.1.0.0.0' 'v27.0.0-alpha.1..0' 'v27.0.0-alpha.1.0.0-' \
'v27.0-alpha.1.0.0' 'v27.0.0-alpha.' 'v27.0.0-alpha.a.b.c' 'v27.0.0-beta.1.0.0' 'iojs-v3.0.0' 'iojs-v27.0.0-alpha.1.0.0' \
'v11.0.0-nightly201810011be804d625' 'v24.0.0-rc.1' 'node' 'lts/*' 'system'; do
! nvm_is_alpha_version "${VERSION}" || die "${VERSION} should not be an alpha version"
done
+56
View File
@@ -0,0 +1,56 @@
#!/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}" || die 'could not create NVM_DIR'
unset NVM_ONLY
for VERSION in v26.12.1 v27.0.0 v27.0.0-alpha.1.1.1 v27.0.0-alpha.1.1.10 v27.0.0-alpha.1.2.0 v27.0.0-alpha.10.0.0 v27.0.0-alpha.20.0.10; do
mkdir -p "${NVM_DIR}/versions/node/${VERSION}/bin" || die "fake node ${VERSION} could not be made"
make_echo "${NVM_DIR}/versions/node/${VERSION}/bin/node" "${VERSION}"
nvm_is_version_installed "${VERSION}" || die "fake node ${VERSION} is not installed"
done
check () {
EXPECTED="$1"
shift
OUTPUT="$(nvm_ls "$@" | nvm_grep -v '^system' | tr '\n' ' ')"
[ "_${OUTPUT}" = "_${EXPECTED}" ] || die "nvm_ls $* (NVM_ONLY=${NVM_ONLY-}) printed >${OUTPUT}<, expected >${EXPECTED}<"
}
check 'v26.12.1 v27.0.0 '
check 'v27.0.0 ' 27
check 'N/A ' v27.0.0-alpha.1.1.1
NVM_ONLY=alpha
check 'v27.0.0-alpha.1.1.1 v27.0.0-alpha.1.1.10 v27.0.0-alpha.1.2.0 v27.0.0-alpha.10.0.0 v27.0.0-alpha.20.0.10 '
check 'v27.0.0-alpha.1.1.1 ' v27.0.0-alpha.1.1.1
check 'v27.0.0-alpha.1.1.1 v27.0.0-alpha.1.1.10 ' v27.0.0-alpha.1.1
check 'v27.0.0-alpha.1.1.1 v27.0.0-alpha.1.1.10 v27.0.0-alpha.1.2.0 ' v27.0.0-alpha.1
check 'v27.0.0-alpha.10.0.0 ' v27.0.0-alpha.10
check 'N/A ' v27.0.0-alpha.20.0.1
NVM_ONLY='alpha,lts,non-lts,iojs'
check 'v26.12.1 v27.0.0-alpha.1.1.1 v27.0.0-alpha.1.1.10 v27.0.0-alpha.1.2.0 v27.0.0-alpha.10.0.0 v27.0.0-alpha.20.0.10 v27.0.0 '
unset NVM_ONLY
cleanup
+43
View File
@@ -0,0 +1,43 @@
#!/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
unset NVM_ONLY
}
die () { echo "$@" ; cleanup ; exit 1; }
: nvm.sh
\. ../../../nvm.sh
TMP_DIR="$(mktemp -d)"
NVM_DIR="${TMP_DIR}/nvm"
export NVM_DIR
unset NVM_ONLY
CACHE_DIR="$(nvm_cache_dir)"
SUFFIX="$(nvm_get_os)-$(nvm_get_arch)"
mkdir -p "${CACHE_DIR}/bin/node-v27.0.0-alpha.1.2.0-${SUFFIX}" "${CACHE_DIR}/src/node-v27.0.0-alpha.1.10.0" "${CACHE_DIR}/bin/node-v26.12.1-${SUFFIX}" \
|| die 'could not create cached artifacts'
OUTPUT="$(nvm_ls_cached | tr '\n' ' ')"
[ "_${OUTPUT}" = '_v26.12.1 ' ] || die "cached alphas should be excluded by default; got >${OUTPUT}<"
NVM_ONLY=alpha
OUTPUT="$(nvm_ls_cached | tr '\n' ' ')"
[ "_${OUTPUT}" = '_v27.0.0-alpha.1.2.0 v27.0.0-alpha.1.10.0 ' ] || die "NVM_ONLY=alpha should list cached alphas, in order; got >${OUTPUT}<"
OUTPUT="$(nvm_ls_cached 27.0.0-alpha.1.2 | tr '\n' ' ')"
[ "_${OUTPUT}" = '_v27.0.0-alpha.1.2.0 ' ] || die "a partial alpha should match only at a dot; got >${OUTPUT}<"
NVM_ONLY='alpha,lts,non-lts,iojs'
OUTPUT="$(nvm_ls_cached v27.0.0)"
[ -z "${OUTPUT}" ] || die "v27.0.0 is not one of its alphas; got >${OUTPUT}<"
cleanup
+92
View File
@@ -0,0 +1,92 @@
#!/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
unset -f nvm_download index_row
}
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}" || die 'could not create NVM_DIR'
unset NVM_ONLY NVM_LTS
index_row () {
printf '%s\t2026-01-01\tsrc\t-\t-\t-\t-\t-\t-\t%s\t-\n' "$1" "${2:--}"
}
nvm_download () {
case "$*" in
*iojs*index.tab*)
printf 'version\tdate\tfiles\tnpm\tv8\tuv\tzlib\topenssl\tmodules\n'
printf 'v3.3.1\t2015-09-15\tsrc\t2.14.3\t4.4.63.30\t1.7.4\t1.2.8\t1.0.2d\t45\n'
printf 'v1.0.0\t2015-01-14\tsrc\t1.1.0\t3.31.74.1\t1.2.0\t1.2.8\t1.0.1k\t42\n'
;;
*index.tab*)
printf 'version\tdate\tfiles\tnpm\tv8\tuv\tzlib\topenssl\tmodules\tlts\tsecurity\n'
index_row v27.0.0-alpha.1.10.2
index_row v27.0.0-alpha.1.2.0
index_row v27.0.0-alpha.0.0.0
index_row v26.12.10
index_row v26.12.2
index_row v24.11.0 Krypton
index_row v22.11.0 Jod
index_row v21.0.0
;;
*) return 1 ;;
esac
}
OUTPUT="$(nvm_ls_remote | awk '{ print $1 }')"
EXPECTED='v21.0.0
v22.11.0
v24.11.0
v26.12.2
v26.12.10'
[ "_${OUTPUT}" = "_${EXPECTED}" ] || die "nvm_ls_remote should exclude alphas by default; got >${OUTPUT}<"
for PAIR in 'node:v26.12.10' '27:N/A' 'v27.0.0-alpha.1.2.0:N/A'; do
OUTPUT="$(nvm_remote_version "${PAIR%%:*}")"
[ "_${OUTPUT}" = "_${PAIR#*:}" ] || die "nvm_remote_version ${PAIR%%:*} printed >${OUTPUT}<, expected >${PAIR#*:}<"
done
OUTPUT="$(NVM_ONLY=alpha nvm_ls_remote | awk '{ print $1 }')"
EXPECTED='v27.0.0-alpha.0.0.0
v27.0.0-alpha.1.2.0
v27.0.0-alpha.1.10.2'
[ "_${OUTPUT}" = "_${EXPECTED}" ] || die "NVM_ONLY=alpha nvm_ls_remote should list only alphas, in order; got >${OUTPUT}<"
for PAIR in '27:v27.0.0-alpha.1.10.2' 'v27.0.0-alpha.1.2.0:v27.0.0-alpha.1.2.0' 'node:v27.0.0-alpha.1.10.2'; do
OUTPUT="$(NVM_ONLY=alpha nvm_remote_version "${PAIR%%:*}")"
[ "_${OUTPUT}" = "_${PAIR#*:}" ] || die "NVM_ONLY=alpha nvm_remote_version ${PAIR%%:*} printed >${OUTPUT}<, expected >${PAIR#*:}<"
done
ALL="$(NVM_ONLY='alpha,lts,non-lts,iojs' nvm_remote_versions | awk '{ print $1 }' | sort)"
[ "_$(echo "${ALL}" | wc -l | tr -d ' ')" = '_10' ] || die "every category should list all 10 versions; got >${ALL}<"
UNION=''
for CATEGORY in alpha lts non-lts iojs; do
LIST="$(NVM_ONLY="${CATEGORY}" nvm_remote_versions | awk '{ print $1 }')"
[ -n "${LIST}" ] || die "category ${CATEGORY} listed nothing"
UNION="${UNION:+${UNION}
}${LIST}"
done
[ "_$(echo "${UNION}" | sort)" = "_${ALL}" ] || die "categories should partition the versions; got >${UNION}<, expected >${ALL}<"
[ "_$(NVM_ONLY=lts nvm_remote_versions | awk '{ print $1 }' | tr '\n' ' ')" = '_v22.11.0 v24.11.0 ' ] || die 'NVM_ONLY=lts listed the wrong versions'
[ "_$(NVM_ONLY=iojs nvm_remote_versions | awk '{ print $1 }' | tr '\n' ' ')" = '_iojs-v1.0.0 iojs-v3.3.1 ' ] || die 'NVM_ONLY=iojs listed the wrong versions'
cleanup
+23
View File
@@ -0,0 +1,23 @@
#!/bin/sh
die () { echo "$@" ; exit 1; }
: nvm.sh
\. ../../../nvm.sh
\. ../../common.sh
for PAIR in 'alpha:alpha' 'iojs,lts:lts,iojs' 'non-lts,alpha,iojs,lts:alpha,lts,non-lts,iojs' 'lts,lts,non-lts,lts:lts,non-lts'; do
try nvm_normalize_only "${PAIR%%:*}" 'SOURCE'
[ "_${CAPTURED_EXIT_CODE}" = '_0' ] || die "nvm_normalize_only ${PAIR%%:*} exited ${CAPTURED_EXIT_CODE}"
[ "_${CAPTURED_STDOUT}" = "_${PAIR#*:}" ] || die "nvm_normalize_only ${PAIR%%:*} printed >${CAPTURED_STDOUT}<, expected >${PAIR#*:}<"
done
for VALUE in '' 'beta' 'lts,beta' ',lts' 'lts,' 'lts,,iojs' 'LTS' 'lts non-lts' 'nonlts' 'all'; do
try_err nvm_normalize_only "${VALUE}" 'SOURCE'
[ "_${CAPTURED_EXIT_CODE}" = '_55' ] || die "nvm_normalize_only >${VALUE}< exited ${CAPTURED_EXIT_CODE}, expected 55"
EXPECTED="Invalid SOURCE value \"${VALUE}\": it must be a comma-separated list of any of: alpha, lts, non-lts, iojs"
[ "_${CAPTURED_STDERR}" = "_${EXPECTED}" ] || die "nvm_normalize_only >${VALUE}< printed >${CAPTURED_STDERR}<, expected >${EXPECTED}<"
try nvm_normalize_only "${VALUE}" 'SOURCE'
[ -z "${CAPTURED_STDOUT}" ] || die "nvm_normalize_only >${VALUE}< printed >${CAPTURED_STDOUT}< to stdout"
done
+66
View File
@@ -0,0 +1,66 @@
#!/bin/sh
die () { echo "$@" ; exit 1; }
: nvm.sh
\. ../../../nvm.sh
\. ../../common.sh
unset NVM_ONLY NVM_ONLY_SELECTED
NVM_NO_LTS_STATUS=1
export NVM_NO_LTS_STATUS
check () {
EXPECTED="$1"
shift
try nvm_resolve_only "$@"
[ "_${CAPTURED_EXIT_CODE}" = '_0' ] || die "nvm_resolve_only $* (NVM_ONLY=${NVM_ONLY-}) exited ${CAPTURED_EXIT_CODE}"
[ "_${CAPTURED_STDOUT}" = "_${EXPECTED}" ] || die "nvm_resolve_only $* (NVM_ONLY=${NVM_ONLY-}) printed >${CAPTURED_STDOUT}<, expected >${EXPECTED}<"
}
check_err () {
EXPECTED="$1"
shift
try_err nvm_resolve_only "$@"
[ "_${CAPTURED_EXIT_CODE}" = "_${EXPECTED_CODE:-55}" ] || die "nvm_resolve_only $* (NVM_ONLY=${NVM_ONLY-}) exited ${CAPTURED_EXIT_CODE}, expected ${EXPECTED_CODE:-55}"
[ "_${CAPTURED_STDERR}" = "_${EXPECTED}" ] || die "nvm_resolve_only $* (NVM_ONLY=${NVM_ONLY-}) printed >${CAPTURED_STDERR}<, expected >${EXPECTED}<"
}
check 'lts,non-lts,iojs' 0 '' ''
check 'alpha,iojs' 1 'iojs,alpha' ''
check 'lts,non-lts' 0 '' '*'
check 'lts,non-lts' 1 'alpha,lts' 'argon'
check_err '`--only=alpha,iojs` excludes LTS versions, so it cannot be combined with an LTS selection like `--lts`.' 1 'alpha,iojs' '*'
check_err '`--only` may only be provided once.' 2 'alpha' ''
check_err 'Invalid `--only` value "": it must be a comma-separated list of any of: alpha, lts, non-lts, iojs' 1 '' ''
check_err 'Invalid `--only` value ",alpha": it must be a comma-separated list of any of: alpha, lts, non-lts, iojs' 1 ',alpha' ''
NVM_ONLY='iojs,alpha'
check 'alpha,iojs' 0 '' ''
check 'non-lts' 1 'non-lts' ''
check 'lts,non-lts' 0 '' '*'
NVM_ONLY='alpha,bogus'
check_err 'Invalid `$NVM_ONLY` value "alpha,bogus": it must be a comma-separated list of any of: alpha, lts, non-lts, iojs' 0 '' ''
check 'lts' 1 'lts' ''
NVM_ONLY='lts'
NVM_ONLY_SELECTED='alpha'
check 'alpha' 0 '' ''
check 'non-lts' 1 'non-lts' ''
unset NVM_ONLY NVM_ONLY_SELECTED NVM_NO_LTS_STATUS
# selecting only one of lts and non-lts needs recorded LTS status; an LTS selection does not
NVM_INDEX_NO_FETCH=1
export NVM_INDEX_NO_FETCH
nvm_download() { return 1; }
TMP_DIR="$(mktemp -d)"
ORIG_NVM_DIR="${NVM_DIR}"
NVM_DIR="${TMP_DIR}"
EXPECTED_CODE=3
check_err 'The LTS status of installed versions is not recorded yet; run `nvm ls-remote` to record it.' 1 'lts' ''
unset EXPECTED_CODE
check 'lts,non-lts' 0 '' '*'
NVM_DIR="${ORIG_NVM_DIR}"
rm -rf "${TMP_DIR}"
unset NVM_INDEX_NO_FETCH
+56
View File
@@ -0,0 +1,56 @@
#!/bin/sh
die () { echo "$@" ; exit 1; }
: nvm.sh
\. ../../../nvm.sh
INPUT='v27.0.0
v27.0.0-alpha.1.10.2
v26.12.10
v27.0.0-alpha.1.2.0
v26.12.2
v27.0.0-alpha.0.0.0
v26.12.2
v4.0.0'
EXPECTED='v4.0.0
v26.12.2
v26.12.10
v27.0.0-alpha.0.0.0
v27.0.0-alpha.1.2.0
v27.0.0-alpha.1.10.2
v27.0.0'
OUTPUT="$(echo "${INPUT}" | nvm_sort_versions)"
[ "_${OUTPUT}" = "_${EXPECTED}" ] || die "nvm_sort_versions printed >${OUTPUT}<, expected >${EXPECTED}<"
OUTPUT="$(echo "${INPUT}" | nvm_sort_versions 1)"
[ "_${OUTPUT}" = "_${EXPECTED}" ] || die "nvm_sort_versions 1 printed >${OUTPUT}<, expected >${EXPECTED}<"
INPUT='v3.3.1.iojs
v10.0.0.node
v27.0.0-alpha.1.0.0.node
v1.0.0.iojs
v2.0.0.node'
EXPECTED='v1.0.0.iojs
v2.0.0.node
v3.3.1.iojs
v10.0.0.node
v27.0.0-alpha.1.0.0.node'
OUTPUT="$(echo "${INPUT}" | nvm_sort_versions)"
[ "_${OUTPUT}" = "_${EXPECTED}" ] || die "nvm_sort_versions with suffixes printed >${OUTPUT}<, expected >${EXPECTED}<"
INPUT='v11.1.0-nightly20181101af6d26281f
v11.0.0-nightly201810011be804d625
v11.0.0-nightly20181002aaaaaaaaaa'
OUTPUT="$(echo "${INPUT}" | nvm_sort_versions 1)"
[ "_$(echo "${OUTPUT}" | grep -c 'v11\.0\.0-nightly')" = '_1' ] || die "nvm_sort_versions 1 should collapse same-release nightlies; got >${OUTPUT}<"
[ "_$(echo "${OUTPUT}" | sed -n '2p')" = '_v11.1.0-nightly20181101af6d26281f' ] || die "nvm_sort_versions 1 should keep other nightlies; got >${OUTPUT}<"
[ "_$(echo "${OUTPUT}" | wc -l | tr -d ' ')" = '_2' ] || die "nvm_sort_versions 1 printed the wrong number of lines; got >${OUTPUT}<"
OUTPUT="$(echo "${INPUT}" | nvm_sort_versions)"
[ "_$(echo "${OUTPUT}" | wc -l | tr -d ' ')" = '_3' ] || die "nvm_sort_versions should keep every distinct line; got >${OUTPUT}<"
INPUT='v24.11.0 Krypton *
v22.11.0 Jod'
EXPECTED='v22.11.0 Jod
v24.11.0 Krypton *'
OUTPUT="$(echo "${INPUT}" | nvm_sort_versions 1)"
[ "_${OUTPUT}" = "_${EXPECTED}" ] || die "nvm_sort_versions 1 should keep trailing fields; got >${OUTPUT}<"