diff --git a/nvm.sh b/nvm.sh index f95b95c2c5..d25a93addb 100755 --- a/nvm.sh +++ b/nvm.sh @@ -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 } diff --git a/test/fast/Unit tests/nvm_get_default_packages b/test/fast/Unit tests/nvm_get_default_packages index 05291371b0..c57ace933f 100755 --- a/test/fast/Unit tests/nvm_get_default_packages +++ b/test/fast/Unit tests/nvm_get_default_packages @@ -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