Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

show only versions newer than NVM_MIN if set #3277

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 33 additions & 8 deletions nvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1857,12 +1857,15 @@ nvm_print_versions() {
fi

command awk \
-v remote_versions="$(printf '%s' "${1-}" | tr '\n' '|')" \
-v remote_versions="$(printf '%s' "${1-}" | tr '\n' '|')" -v min="${NVM_MIN:-v0}" \
-v installed_versions="$(nvm_ls | tr '\n' '|')" -v current="$NVM_CURRENT" \
-v installed_color="$INSTALLED_COLOR" -v system_color="$SYSTEM_COLOR" \
-v current_color="$CURRENT_COLOR" -v default_color="$DEFAULT_COLOR" \
-v old_lts_color="$DEFAULT_COLOR" -v has_colors="$NVM_HAS_COLORS" '
function alen(arr, i, len) { len=0; for(i in arr) len++; return len; }
function v2a(v, a) { sub(/^(iojs-)?v/, "", v); split(v, a, "."); }
function v2m(v, a) { sub(/^(iojs-)?v/, "", v); split(v, a, "."); return a[1]; }
function vcmp(v1,v2,a1,a2,i,d) { v2a(v1,a1); v2a(v2,a2); for(i=1;i<4;i++) { d = a1[i] - a2[i]; if(d!=0) return d; } return 0; }
BEGIN {
fmt_installed = has_colors ? (installed_color ? "\033[" installed_color "%15s\033[0m" : "%15s") : "%15s *";
fmt_system = has_colors ? (system_color ? "\033[" system_color "%15s\033[0m" : "%15s") : "%15s *";
Expand All @@ -1877,20 +1880,30 @@ BEGIN {
split(remote_versions, lines, "|");
split(installed_versions, installed, "|");
rows = alen(lines);

for (n = 1; n <= rows; n++) {
filter_on = (vcmp("v0.0.0", min) != 0);
current_major = -1;
for (m = n = 1; n <= rows; n++) {
split(lines[n], fields, "[[:blank:]]+");
cols = alen(fields);
version = fields[1];
is_installed = 0;

for (i in installed) {
if (version == installed[i]) {
is_installed = 1;
break;
}
}

if (filter_on != 0) {
if (is_installed) {
current_major = v2m(version);
} else if (vcmp(version, min) >= 0) {
filter_on = 0;
} else if (v2m(version) != current_major) {
continue;
}
}

fmt_version = "%15s";
if (version == current) {
fmt_version = fmt_current;
Expand All @@ -1900,8 +1913,7 @@ BEGIN {
fmt_version = fmt_installed;
}

padding = (!has_colors && is_installed) ? "" : " ";

padding = (is_installed && !has_colors) ? "" : " ";
ryenus marked this conversation as resolved.
Show resolved Hide resolved
if (cols == 1) {
formatted = sprintf(fmt_version, version);
} else if (cols == 2) {
Expand All @@ -1910,10 +1922,15 @@ BEGIN {
formatted = sprintf((fmt_version padding fmt_latest_lts), version, fields[2]);
}

output[n] = formatted;
output[m++] = formatted;
}

skipped = rows - m + 1
if (skipped > 0) {
printf("[WARN] %d version(s) skipped.\n", skipped) > "/dev/stderr"
}

for (n = 1; n <= rows; n++) {
for (n = 1; n < m; n++) {
print output[n]
}

Expand Down Expand Up @@ -3080,6 +3097,7 @@ nvm() {
nvm_echo ' nvm ls-remote [<version>] List remote versions available for install, matching a given <version> if provided'
nvm_echo ' --lts When listing, only show LTS (long-term support) versions'
nvm_echo ' --lts=<LTS name> When listing, only show versions for a specific LTS line'
nvm_echo ' --min=<version> When listing, only show versions greater than or equal to <version>, including minor/patch updates for installed versions'
ryenus marked this conversation as resolved.
Show resolved Hide resolved
nvm_echo ' --no-colors Suppress colored output'
nvm_echo ' nvm version <version> Resolve the given description to a single local version'
nvm_echo ' nvm version-remote <version> Resolve the given description to a single remote version'
Expand Down Expand Up @@ -4098,6 +4116,10 @@ nvm() {
local NVM_LTS
local PATTERN
local NVM_NO_COLORS
local NVM_MIN_ENV
NVM_MIN_ENV="${NVM_MIN-}"
local NVM_MIN
NVM_MIN="${NVM_MIN_ENV-}"

while [ $# -gt 0 ]; do
case "${1-}" in
Expand All @@ -4108,6 +4130,9 @@ nvm() {
--lts=*)
NVM_LTS="${1##--lts=}"
;;
--min=*)
NVM_MIN="${1##--min=}"
;;
--no-colors) NVM_NO_COLORS="${1}" ;;
--*)
nvm_err "Unsupported option \"${1}\"."
Expand Down
146 changes: 146 additions & 0 deletions test/fast/Unit tests/nvm_print_versions
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
#!/bin/sh

# shellcheck disable=SC2317

die () { echo "$@" ; cleanup ; exit 1; }

cleanup() {
unset -f nvm_remote_versions nvm_ls nvm_ls_current
if [ -n "$TEMP_NVM_MIN" ]; then
export NVM_MIN="$TEMP_NVM_MIN"
unset TEMP_NVM_MIN
fi
}

\. ../../../nvm.sh


if [ -n "$NVM_MIN" ]; then
TEMP_NVM_MIN="$NVM_MIN"
unset NVM_MIN
fi

# mock currently installed versions
nvm_ls() {
echo "v16.20.2
v18.20.3
system"
}

# mock currently active version
nvm_ls_current() {
echo "v18.20.3"
}

nvm_remote_versions() {
echo "v16.0.0
v16.20.2 Gallium
v16.20.3 Gallium *
v17.0.0
v17.9.1
v18.0.0
v18.1.0
v18.20.2 Hydrogen
v18.20.3 Hydrogen *
v19.0.0
v19.9.0
v20.0.0
v20.8.1
v20.9.0 Iron *
v21.0.0
v21.1.0"
}


# nvm_print_versions should print all versions from nvm_remote_versions
OUTPUT="$(NVM_NO_COLORS='--no-colors' nvm_print_versions "$(nvm_remote_versions)" | sed -r 's/^[ \t]+//')"
EXPECTED_OUTPUT="v16.0.0
v16.20.2 * (LTS: Gallium)
v16.20.3 (Latest LTS: Gallium)
v17.0.0
v17.9.1
v18.0.0
v18.1.0
v18.20.2 (LTS: Hydrogen)
-> v18.20.3 * (Latest LTS: Hydrogen)
v19.0.0
v19.9.0
v20.0.0
v20.8.1
v20.9.0 (Latest LTS: Iron)
v21.0.0
v21.1.0"

[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "(1) nvm_print_versions did not output all expected versions; got $OUTPUT"


# versions lower than 18 should be filtered out, but v16.20.2 should be kept since it's installed
OUTPUT="$(NVM_NO_COLORS='--no-colors' NVM_MIN=v18 nvm_print_versions "$(nvm_remote_versions)" | sed -r 's/^[ \t]+//')"
EXPECTED_OUTPUT="v16.20.2 * (LTS: Gallium)
v16.20.3 (Latest LTS: Gallium)
v18.0.0
v18.1.0
v18.20.2 (LTS: Hydrogen)
-> v18.20.3 * (Latest LTS: Hydrogen)
v19.0.0
v19.9.0
v20.0.0
v20.8.1
v20.9.0 (Latest LTS: Iron)
v21.0.0
v21.1.0"

[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "(2) NVM_MIN=18 nvm_print_versions did not output all expected versions; got $OUTPUT"


# versions lower than 19 should be filtered out
OUTPUT="$(NVM_NO_COLORS='--no-colors' NVM_MIN=19 nvm_print_versions "$(nvm_remote_versions)" | sed -r 's/^[ \t]+//')"
EXPECTED_OUTPUT="v16.20.2 * (LTS: Gallium)
v16.20.3 (Latest LTS: Gallium)
-> v18.20.3 * (Latest LTS: Hydrogen)
v19.0.0
v19.9.0
v20.0.0
v20.8.1
v20.9.0 (Latest LTS: Iron)
v21.0.0
v21.1.0"

[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "(3) NVM_MIN=19 nvm_print_versions did not output all expected versions; got $OUTPUT"


# versions lower than 20.1 should be filtered out, so v20.0.0 is out
OUTPUT="$(NVM_NO_COLORS='--no-colors' NVM_MIN=v20.1 nvm_print_versions "$(nvm_remote_versions)" | sed -r 's/^[ \t]+//')"
EXPECTED_OUTPUT="v16.20.2 * (LTS: Gallium)
v16.20.3 (Latest LTS: Gallium)
-> v18.20.3 * (Latest LTS: Hydrogen)
v20.8.1
v20.9.0 (Latest LTS: Iron)
v21.0.0
v21.1.0"

[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "(4) NVM_MIN=20.1 nvm_print_versions did not output all expected versions; got $OUTPUT"


# assume v18.20.3 is NOT installed, so now it should be filtered out
nvm_ls() {
echo "v16.20.2
system"
}

nvm_ls_current() {
echo "v16.20.2"
}

OUTPUT="$(NVM_NO_COLORS='--no-colors' NVM_MIN=20.1 nvm_print_versions "$(nvm_remote_versions)" | sed -r 's/^[ \t]+//')"
EXPECTED_OUTPUT="-> v16.20.2 * (LTS: Gallium)
v16.20.3 (Latest LTS: Gallium)
v20.8.1
v20.9.0 (Latest LTS: Iron)
v21.0.0
v21.1.0"

[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "(5) NVM_MIN=20.1 nvm_print_versions did not output all expected versions; got $OUTPUT"


cleanup
Loading