Skip to content

Commit

Permalink
[Fix] nvm_get_default_packages: use awk for more reliable file pr…
Browse files Browse the repository at this point in the history
…ocessing

See db19450

Fixes 3382
  • Loading branch information
ljharb committed Jul 28, 2024
1 parent f439acd commit acd5391
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 30 deletions.
47 changes: 18 additions & 29 deletions nvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4436,37 +4436,26 @@ nvm() {
}

nvm_get_default_packages() {
local NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages"
local NVM_DEFAULT_PACKAGE_FILE
NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages"
if [ -f "${NVM_DEFAULT_PACKAGE_FILE}" ]; then
local DEFAULT_PACKAGES
DEFAULT_PACKAGES=''

# Read lines from $NVM_DIR/default-packages
local line
# ensure a trailing newline
WORK=$(mktemp -d) || exit $?
# shellcheck disable=SC2064
trap "command rm -rf '$WORK'" EXIT
# shellcheck disable=SC1003
sed -e '$a\' "${NVM_DEFAULT_PACKAGE_FILE}" > "${WORK}/default-packages"
while IFS=' ' read -r line; do
# Skip empty lines.
[ -n "${line-}" ] || continue

# Skip comment lines that begin with `#`.
[ "$(nvm_echo "${line}" | command cut -c1)" != "#" ] || continue

# Fail on lines that have multiple space-separated words
case $line in
*\ *)
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."
return 1
;;
esac
command awk -v filename="${NVM_DEFAULT_PACKAGE_FILE}" '
/^[[:space:]]*#/ { next } # Skip lines that begin with #
/^[[:space:]]*$/ { next } # Skip empty lines
/[[:space:]]/ && !/^[[:space:]]*#/ {
print "Only one package per line is allowed in `" filename "`. Please remove any lines with multiple space-separated values."
err = 1
next
}
{
if (NR > 1 && !prev_space) printf " "
printf "%s", $0
prev_space = 0
}
END { if (err) exit 1; if (NR > 0) printf "\n" }
' "${NVM_DEFAULT_PACKAGE_FILE}"

DEFAULT_PACKAGES="${DEFAULT_PACKAGES}${line} "
done < "${WORK}/default-packages"
echo "${DEFAULT_PACKAGES}" | command xargs
return $?
fi
}

Expand Down
2 changes: 1 addition & 1 deletion test/fast/Unit tests/nvm_get_default_packages
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ rimraf
EOF

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

cleanup
Expand Down

0 comments on commit acd5391

Please sign in to comment.