Skip to content

Commit 87a7097

Browse files
committed
[Fix] nvm_get_default_packages: use awk for more reliable file processing
See db19450 Fixes #3382
1 parent f439acd commit 87a7097

File tree

2 files changed

+17
-31
lines changed

2 files changed

+17
-31
lines changed

nvm.sh

+16-30
Original file line numberDiff line numberDiff line change
@@ -4436,37 +4436,23 @@ nvm() {
44364436
}
44374437

44384438
nvm_get_default_packages() {
4439-
local NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages"
4439+
local NVM_DEFAULT_PACKAGE_FILE
4440+
NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages"
44404441
if [ -f "${NVM_DEFAULT_PACKAGE_FILE}" ]; then
4441-
local DEFAULT_PACKAGES
4442-
DEFAULT_PACKAGES=''
4443-
4444-
# Read lines from $NVM_DIR/default-packages
4445-
local line
4446-
# ensure a trailing newline
4447-
WORK=$(mktemp -d) || exit $?
4448-
# shellcheck disable=SC2064
4449-
trap "command rm -rf '$WORK'" EXIT
4450-
# shellcheck disable=SC1003
4451-
sed -e '$a\' "${NVM_DEFAULT_PACKAGE_FILE}" > "${WORK}/default-packages"
4452-
while IFS=' ' read -r line; do
4453-
# Skip empty lines.
4454-
[ -n "${line-}" ] || continue
4455-
4456-
# Skip comment lines that begin with `#`.
4457-
[ "$(nvm_echo "${line}" | command cut -c1)" != "#" ] || continue
4458-
4459-
# Fail on lines that have multiple space-separated words
4460-
case $line in
4461-
*\ *)
4462-
nvm_err "Only one package per line is allowed in the ${NVM_DIR}/default-packages file. Please remove any lines with multiple space-separated values."
4463-
return 1
4464-
;;
4465-
esac
4466-
4467-
DEFAULT_PACKAGES="${DEFAULT_PACKAGES}${line} "
4468-
done < "${WORK}/default-packages"
4469-
echo "${DEFAULT_PACKAGES}" | command xargs
4442+
command awk -v filename="${NVM_DEFAULT_PACKAGE_FILE}" '
4443+
/^[[:space:]]*#/ { next } # Skip lines that begin with #
4444+
/^[[:space:]]*$/ { next } # Skip empty lines
4445+
/[[:space:]]/ && !/^[[:space:]]*#/ {
4446+
print "Only one package per line is allowed in `" filename "`. Please remove any lines with multiple space-separated values." > "/dev/stderr"
4447+
err = 1
4448+
exit 1
4449+
}
4450+
{
4451+
if (NR > 1 && !prev_space) printf " "
4452+
printf "%s", $0
4453+
prev_space = 0
4454+
}
4455+
' "${NVM_DEFAULT_PACKAGE_FILE}"
44704456
fi
44714457
}
44724458

test/fast/Unit tests/nvm_get_default_packages

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ rimraf
7474
EOF
7575

7676
DEFAULT_PKGS="$(nvm_get_default_packages 2>&1 >/dev/null)"
77-
EXPECTED_PKGS="Only one package per line is allowed in the $FILE file. Please remove any lines with multiple space-separated values."
77+
EXPECTED_PKGS="Only one package per line is allowed in \`${FILE}\`. Please remove any lines with multiple space-separated values."
7878
[ "${DEFAULT_PKGS}" = "${EXPECTED_PKGS}" ] || die "4: expected default packages >${EXPECTED_PKGS}<; got >${DEFAULT_PKGS}<"
7979

8080
cleanup

0 commit comments

Comments
 (0)