Skip to content

Commit 568a463

Browse files
Show system Node.js version in nvm ls
Normalize `nvm_version` output when `nvm_ls` returns "system vX" so alias and .nvmrc resolutions treat system correctly. Add fast tests for system alias behavior in `nvm ls`, `nvm use`, and `nvm which`.
1 parent ec8906b commit 568a463

8 files changed

+189
-4
lines changed

nvm.sh

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,11 @@ nvm_version() {
758758
;;
759759
esac
760760
VERSION="$(nvm_ls "${PATTERN}" | command tail -1)"
761+
case "${VERSION}" in
762+
system[[:blank:]]*)
763+
VERSION='system'
764+
;;
765+
esac
761766
if [ -z "${VERSION}" ] || [ "_${VERSION}" = "_N/A" ]; then
762767
nvm_echo "N/A"
763768
return 3
@@ -1457,6 +1462,18 @@ nvm_ls() {
14571462
PATTERN="${PATTERN}-"
14581463
;;
14591464
*)
1465+
local ALIAS_TARGET
1466+
ALIAS_TARGET="$(nvm_resolve_alias "${PATTERN}" 2>/dev/null || nvm_echo)"
1467+
if [ "_${ALIAS_TARGET}" = '_system' ] && (nvm_has_system_iojs || nvm_has_system_node); then
1468+
local SYSTEM_VERSION
1469+
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
1470+
if [ -n "${SYSTEM_VERSION}" ]; then
1471+
nvm_echo "system ${SYSTEM_VERSION}"
1472+
else
1473+
nvm_echo "system"
1474+
fi
1475+
return
1476+
fi
14601477
if nvm_resolve_local_alias "${PATTERN}"; then
14611478
return
14621479
fi
@@ -1560,13 +1577,24 @@ nvm_ls() {
15601577
fi
15611578

15621579
if [ "${NVM_ADD_SYSTEM-}" = true ]; then
1580+
local SYSTEM_VERSION
1581+
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
15631582
case "${PATTERN}" in
15641583
'' | v)
1565-
VERSIONS="${VERSIONS}
1584+
if [ -n "${SYSTEM_VERSION}" ]; then
1585+
VERSIONS="${VERSIONS}
1586+
system ${SYSTEM_VERSION}"
1587+
else
1588+
VERSIONS="${VERSIONS}
15661589
system"
1590+
fi
15671591
;;
15681592
system)
1569-
VERSIONS="system"
1593+
if [ -n "${SYSTEM_VERSION}" ]; then
1594+
VERSIONS="system ${SYSTEM_VERSION}"
1595+
else
1596+
VERSIONS="system"
1597+
fi
15701598
;;
15711599
esac
15721600
fi
@@ -1908,6 +1936,7 @@ BEGIN {
19081936
19091937
fmt_latest_lts = has_colors && latest_lts_color ? ("\033[" latest_lts_color " (Latest LTS: %s)\033[0m") : " (Latest LTS: %s)";
19101938
fmt_old_lts = has_colors && old_lts_color ? ("\033[" old_lts_color " (LTS: %s)\033[0m") : " (LTS: %s)";
1939+
fmt_system_target = has_colors && system_color ? (" (\033[" system_color "-> %s\033[0m)") : " (-> %s)";
19111940
19121941
split(remote_versions, lines, "|");
19131942
split(installed_versions, installed, "|");
@@ -1939,6 +1968,8 @@ BEGIN {
19391968
19401969
if (cols == 1) {
19411970
formatted = sprintf(fmt_version, version);
1971+
} else if (version == "system" && cols >= 2) {
1972+
formatted = sprintf((fmt_version fmt_system_target), version, fields[2]);
19421973
} else if (cols == 2) {
19431974
formatted = sprintf((fmt_version padding fmt_old_lts), version, fields[2]);
19441975
} else if (cols == 3 && fields[3] == "*") {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/sh
2+
3+
set -ex
4+
5+
die () { echo "$@" ; cleanup ; exit 1; }
6+
cleanup() {
7+
rm -f "$(nvm_alias_path)/default"
8+
if [ -n "${SYSTEM_DIR-}" ]; then
9+
rm -rf "${SYSTEM_DIR}"
10+
fi
11+
if [ -n "${ORIG_PATH-}" ]; then
12+
PATH="${ORIG_PATH}"
13+
fi
14+
}
15+
16+
\. ../../../nvm.sh
17+
18+
nvm_make_alias default system
19+
20+
ORIG_PATH="${PATH}"
21+
SYSTEM_DIR="$(mktemp -d)"
22+
cat > "${SYSTEM_DIR}/node" <<'EOF'
23+
#!/bin/sh
24+
echo v0.0.0
25+
EOF
26+
chmod +x "${SYSTEM_DIR}/node"
27+
PATH="${SYSTEM_DIR}:${PATH}"
28+
export PATH
29+
30+
EXPECTED_OUTPUT="$(command which node)"
31+
set +ex # since stderr is needed
32+
OUTPUT="$(nvm which default 2>&1)"
33+
set -ex
34+
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "Could not use system via alias for nvm which. Got >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<"
35+
36+
cleanup
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/bin/sh
2+
3+
die () { echo "$@" ; cleanup ; exit 1; }
4+
cleanup () {
5+
rm -f "$(nvm_alias_path)/default"
6+
unset -f nvm_has_system_node node
7+
}
8+
9+
\. ../../../nvm.sh
10+
\. ../../common.sh
11+
12+
nvm_make_alias default system
13+
nvm_has_system_node() { return 0; }
14+
node() { command printf 'v0.0.0'; }
15+
16+
OUTPUT="$(nvm ls default | strip_colors)"
17+
echo "${OUTPUT}" | command grep -q 'system' \
18+
|| die "Could not list system via alias. Got >${OUTPUT}<"
19+
echo "${OUTPUT}" | command grep -q 'v0.0.0' \
20+
|| die "Could not list system version via alias. Got >${OUTPUT}<"
21+
22+
cleanup

test/fast/Listing versions/Running 'nvm ls' should display all installed versions

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@ iojs-v0.10.2
3838
v0.12.9
3939
v0.12.87"
4040
if nvm_has_system_node || nvm_has_system_iojs; then
41-
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
41+
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
42+
if [ -n "${SYSTEM_VERSION}" ]; then
43+
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
44+
system ${SYSTEM_VERSION}"
45+
else
46+
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
4247
system"
48+
fi
4349
fi
4450
[ "${OUTPUT-}" = "${EXPECTED_OUTPUT-}" ] || die "expected >${EXPECTED_OUTPUT}<; got >${OUTPUT}<"

test/fast/Listing versions/Running 'nvm ls' should not show a trailing slash

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ iojs-v0.10.2
3636
v0.12.9
3737
v0.12.87"
3838
if nvm_has_system_node || nvm_has_system_iojs; then
39-
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
39+
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
40+
if [ -n "${SYSTEM_VERSION}" ]; then
41+
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
42+
system ${SYSTEM_VERSION}"
43+
else
44+
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
4045
system"
46+
fi
4147
fi
4248
[ "${OUTPUT-}" = "${EXPECTED_OUTPUT-}" ] || die "expected >${EXPECTED_OUTPUT}<; got >${OUTPUT}<"
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/bin/sh
2+
3+
set -ex
4+
5+
die () { echo "$@" ; cleanup ; exit 1; }
6+
cleanup () {
7+
rm -f "$(nvm_alias_path)/default"
8+
if [ -n "${SYSTEM_DIR-}" ]; then
9+
rm -rf "${SYSTEM_DIR}"
10+
fi
11+
if [ -n "${ORIG_PATH-}" ]; then
12+
PATH="${ORIG_PATH}"
13+
fi
14+
unset -f nvm_print_npm_version
15+
}
16+
17+
\. ../../nvm.sh
18+
19+
nvm_make_alias default system
20+
21+
ORIG_PATH="${PATH}"
22+
SYSTEM_VERSION="v0.0.0"
23+
SYSTEM_DIR="$(mktemp -d)"
24+
cat > "${SYSTEM_DIR}/node" <<EOF
25+
#!/bin/sh
26+
command printf '%s\n' "${SYSTEM_VERSION}"
27+
EOF
28+
chmod +x "${SYSTEM_DIR}/node"
29+
PATH="${SYSTEM_DIR}:${PATH}"
30+
nvm_print_npm_version() { command printf ' (npm v1.2.3)'; }
31+
32+
EXPECTED_OUTPUT="Now using system version of node: ${SYSTEM_VERSION}$(nvm_print_npm_version)"
33+
set +ex # since stderr is needed
34+
OUTPUT="$(nvm use default 2>&1)"
35+
set -ex
36+
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "Could not use system via alias. Got >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<"
37+
38+
cleanup
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/bin/sh
2+
3+
set -ex
4+
5+
die () { echo "$@" ; cleanup ; exit 1; }
6+
cleanup () {
7+
rm -f .nvmrc
8+
if [ -f .nvmrc.orig ]; then
9+
mv .nvmrc.orig .nvmrc
10+
fi
11+
if [ -n "${SYSTEM_DIR-}" ]; then
12+
rm -rf "${SYSTEM_DIR}"
13+
fi
14+
if [ -n "${ORIG_PATH-}" ]; then
15+
PATH="${ORIG_PATH}"
16+
fi
17+
unset -f nvm_print_npm_version
18+
}
19+
20+
\. ../../nvm.sh
21+
22+
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
23+
printf 'system\n' > .nvmrc
24+
ORIG_PATH="${PATH}"
25+
SYSTEM_VERSION="v0.0.0"
26+
SYSTEM_DIR="$(mktemp -d)"
27+
cat > "${SYSTEM_DIR}/node" <<EOF
28+
#!/bin/sh
29+
command printf '%s\n' "${SYSTEM_VERSION}"
30+
EOF
31+
chmod +x "${SYSTEM_DIR}/node"
32+
PATH="${SYSTEM_DIR}:${PATH}"
33+
nvm_print_npm_version() { command printf ' (npm v1.2.3)'; }
34+
35+
NVMRC_PATH="${PWD}/.nvmrc"
36+
EXPECTED_OUTPUT="Found '${NVMRC_PATH}' with version <system>
37+
Now using system version of node: ${SYSTEM_VERSION}$(nvm_print_npm_version)"
38+
set +ex # since stderr is needed
39+
OUTPUT="$(nvm use 2>&1)"
40+
set -ex
41+
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "Could not use system via .nvmrc. Got >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<"
42+
43+
cleanup

test/fast/Unit tests/nvm_version

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ nvm_ls() {
3333
[ "_$(nvm_version node)" = "_pattern: stable" ] || die '"nvm_version node" did not pass "stable" to "nvm_ls"'
3434
[ "_$(nvm_version node-)" = "_pattern: stable" ] || die '"nvm_version node-" did not pass "stable" to "nvm_ls"'
3535

36+
nvm_ls() { echo "system v20.0.0"; }
37+
[ "_$(nvm_version system)" = "_system" ] || die '"nvm_version system" did not return "system" when "nvm_ls" returns extra columns'
38+
3639
nvm_ls() { echo "N/A"; }
3740
OUTPUT="$(nvm_version foo)"
3841
EXPECTED_OUTPUT="N/A"

0 commit comments

Comments
 (0)