diff --git a/.gitignore b/.gitignore index ec161d456d..4e6f5095b0 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ current npm-shrinkwrap.json package-lock.json yarn.lock + +target/ diff --git a/nvm.sh b/nvm.sh index 9d4b1d6194..cad0e89ef6 100755 --- a/nvm.sh +++ b/nvm.sh @@ -2199,7 +2199,7 @@ nvm_install_binary_extract() { command mkdir -p "${VERSION_PATH}" || return 1 if [ "${NVM_OS}" = 'win' ]; then - command mv "${TMPDIR}/"*/* "${VERSION_PATH}" || return 1 + command mv "${TMPDIR}/"*/* "${VERSION_PATH}/" || return 1 command chmod +x "${VERSION_PATH}"/node.exe || return 1 command chmod +x "${VERSION_PATH}"/npm || return 1 command chmod +x "${VERSION_PATH}"/npx 2>/dev/null @@ -2278,8 +2278,8 @@ nvm_install_binary() { # Read nosource from arguments if [ "${nosource-}" = '1' ]; then - nvm_err 'Binary download failed. Download from source aborted.' - return 0 + nvm_err 'Binary download failed. Download from source aborted.' + return 0 fi nvm_err 'Binary download failed, trying source.' @@ -2922,11 +2922,11 @@ nvm_is_natural_num() { nvm_write_nvmrc() { local VERSION_STRING - VERSION_STRING=$(nvm_version "${1-$VERSION_STRING}") - if [ "$VERSION_STRING" = '∞' ] || [ "$VERSION_STRING" = 'N/A' ]; then + VERSION_STRING=$(nvm_version "${1-}") + if [ "${VERSION_STRING}" = '∞' ] || [ "${VERSION_STRING}" = 'N/A' ]; then return 1 fi - echo "$VERSION_STRING" | tee "$PWD"/.nvmrc > /dev/null || { + echo "${VERSION_STRING}" | tee "$PWD"/.nvmrc > /dev/null || { if [ "${NVM_SILENT:-0}" -ne 1 ]; then nvm_err "Warning: Unable to write version number ($VERSION_STRING) to .nvmrc" fi diff --git a/package.json b/package.json index 605ba8ac25..29d2746863 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ "test/installation/node": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_node test-$shell", "test/installation/iojs": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_iojs test-$shell", "test/sourcing": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=sourcing test-$shell", + "test:check-exec": "(IFS=$'\\n'; for file in $(git ls-files test); do if [ ! -x \"$file\" ] && [[ \"$file\" != *.* ]] && [[ \"$file\" != test/fixtures/* ]]; then echo \"$file\"; fi; done) | tee /dev/stderr | awk 'END {if (NR > 0) exit 1}'", + "test:check-nonexec": "(IFS=$'\\n'; for file in $(git ls-files test); do if [ -x \"$file\" ] && [ ! -d \"$file\" ] && { [[ \"$file\" =~ '\\.(json|txt|sh|js|log)$' ]] || [[ \"$file\" =~ '^test/(mocks|fixtures)/.*' ]]; }; then echo \"$file\"; fi; done) | tee /dev/stderr | awk 'END {if (NR > 0) exit 1}'", "doctoc": "doctoc --title='## Table of Contents' --github README.md", "predoctoc:check": "cp README.md v-README.md.orig && npm run doctoc", "doctoc:check": "diff -q README.md v-README.md.orig", diff --git a/test/fast/Unit tests/Running 'nvm install --save' works as expected' b/test/fast/Unit tests/Running 'nvm install --save' works as expected' index 7f6c565cee..a020382b07 100755 --- a/test/fast/Unit tests/Running 'nvm install --save' works as expected' +++ b/test/fast/Unit tests/Running 'nvm install --save' works as expected' @@ -4,40 +4,58 @@ set -e -TEST_VERSION="v0.2.4" +TEST_VERSION='v0.2.4' if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi -cleanup () { +cleanup() { nvm cache clear nvm deactivate nvm unalias default - rm -rf ${NVM_DIR}/v* .nvmrc + rm -rf "${NVM_DIR}/v0.2.4" .nvmrc if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi unset -f nvm_ls_remote nvm_ls_remote_iojs } -die () { +die() { echo "$@" cleanup exit 1 } -REMOTE="$PWD/mocks/nvm_ls_remote.txt" +REMOTE="${PWD}/mocks/nvm_ls_remote.txt" nvm_ls_remote() { - cat "$REMOTE" + if [ -n "${PATTERN}" ]; then + cat "${REMOTE}" | \grep "${PATTERN}" + else + cat "${REMOTE}" + fi } REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" nvm_ls_remote_iojs() { - cat "$REMOTE_IOJS" + local PATTERN + PATTERN="${1-}" + if [ -n "${PATTERN}" ]; then + cat "${REMOTE_IOJS}" | \grep "${PATTERN}" + else + cat "${REMOTE_IOJS}" + fi } -make_fake_node "$TEST_VERSION" +make_fake_node "${TEST_VERSION}" -nvm install --save "$TEST_VERSION" || die "\`nvm install --save $TEST_VERSION\` failed" +nvm install -w "${TEST_VERSION}" || die "\`nvm install -w ${TEST_VERSION}\` failed" OUTPUT="$(cat .nvmrc)" -nvm_is_valid_version "$(cat .nvmrc)" \ - || die "\`nvm install --save $TEST_VERSION\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" +nvm_is_valid_version "${OUTPUT}" \ + || die "\`nvm install -w ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" + +rm .nvmrc || die 'removing of .nvmrc failed' + +nvm install --save "${TEST_VERSION}" || die "\`nvm install --save ${TEST_VERSION}\` failed" +OUTPUT="$(cat .nvmrc)" + +nvm_is_valid_version "${OUTPUT}" \ + || die "\`nvm install --save ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" cleanup diff --git a/test/fast/Unit tests/Running 'nvm use --save' works as expected' b/test/fast/Unit tests/Running 'nvm use --save' works as expected' new file mode 100755 index 0000000000..a188072969 --- /dev/null +++ b/test/fast/Unit tests/Running 'nvm use --save' works as expected' @@ -0,0 +1,61 @@ +#!/bin/sh +\. ../../../nvm.sh +\. ../../common.sh + +set -e + +TEST_VERSION='v0.2.4' + +if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi + +cleanup() { + nvm cache clear + nvm deactivate + nvm unalias default + rm -rf "${NVM_DIR}/v0.2.4" .nvmrc + if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi + unset -f nvm_ls_remote nvm_ls_remote_iojs +} + +die() { + echo "$@" + cleanup + exit 1 +} + +REMOTE="${PWD}/mocks/nvm_ls_remote.txt" +nvm_ls_remote() { + if [ -n "${PATTERN}" ]; then + cat "${REMOTE}" | \grep "${PATTERN}" + else + cat "${REMOTE}" + fi +} +REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" +nvm_ls_remote_iojs() { + local PATTERN + PATTERN="${1-}" + if [ -n "${PATTERN}" ]; then + cat "${REMOTE_IOJS}" | \grep "${PATTERN}" + else + cat "${REMOTE_IOJS}" + fi +} + +make_fake_node "${TEST_VERSION}" + +nvm use -w "${TEST_VERSION}" || die "\`nvm install -w ${TEST_VERSION}\` failed" +OUTPUT="$(cat .nvmrc)" + +nvm_is_valid_version "${OUTPUT}" \ + || die "\`nvm install -w ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" + +rm .nvmrc || die 'removing of .nvmrc failed' + +nvm use --save "${TEST_VERSION}" || die "\`nvm install --save ${TEST_VERSION}\` failed" +OUTPUT="$(cat .nvmrc)" + +nvm_is_valid_version "${OUTPUT}" \ + || die "\`nvm install --save ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" + +cleanup diff --git a/test/fast/Unit tests/Running 'nvm use --silent --save' doesn't output anything b/test/fast/Unit tests/Running 'nvm use --silent --save' doesn't output anything index 0df4251422..578c3155d4 100755 --- a/test/fast/Unit tests/Running 'nvm use --silent --save' doesn't output anything +++ b/test/fast/Unit tests/Running 'nvm use --silent --save' doesn't output anything @@ -12,7 +12,7 @@ cleanup () { nvm cache clear nvm deactivate nvm unalias default - rm -rf ${NVM_DIR}/v* .nvmrc + rm -rf "${NVM_DIR}/${TEST_VERSION:?}" .nvmrc if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi unset -f nvm_ls_remote nvm_ls_remote_iojs } @@ -23,21 +23,29 @@ die () { exit 1 } -REMOTE="$PWD/mocks/nvm_ls_remote.txt" +REMOTE="${PWD}/mocks/nvm_ls_remote.txt" nvm_ls_remote() { - cat "$REMOTE" + cat "${REMOTE}" } -REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" +REMOTE_IOJS="${PWD}/mocks/nvm_ls_remote_iojs.txt" nvm_ls_remote_iojs() { - cat "$REMOTE_IOJS" + cat "${REMOTE_IOJS}" } -make_fake_node "$TEST_VERSION" +make_fake_node "${TEST_VERSION}" -OUTPUT=$(nvm use --save --silent "$TEST_VERSION" || die "\`nvm use --save --silent $TEST_VERSION\` failed") -EXPECTED_OUTPUT="" +OUTPUT=$(nvm use --save --silent "${TEST_VERSION}" || die "\`nvm use --save --silent ${TEST_VERSION}\` failed") +EXPECTED_OUTPUT='' -[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \ - || die "\`nvm use --save --silent $TEST_VERSION\` output was not silenced to '$EXPECTED_OUTPUT'; got '$OUTPUT'" +[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \ + || die "\`nvm use --save --silent ${TEST_VERSION}\` output was not silenced to '${EXPECTED_OUTPUT}'; got '${OUTPUT}'" + +rm .nvmrc || die 'removing of .nvmrc failed' + +OUTPUT=$(nvm use -w --silent "${TEST_VERSION}" || die "\`nvm use -w --silent ${TEST_VERSION}\` failed") +EXPECTED_OUTPUT='' + +[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \ + || die "\`nvm use -w --silent ${TEST_VERSION}\` output was not silenced to '${EXPECTED_OUTPUT}'; got '${OUTPUT}'" cleanup diff --git a/test/fast/Unit tests/Running 'nvm use -w' works as expected' b/test/fast/Unit tests/Running 'nvm use -w' works as expected' deleted file mode 100755 index afa5835987..0000000000 --- a/test/fast/Unit tests/Running 'nvm use -w' works as expected' +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh -\. ../../../nvm.sh - -set -e - -if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi - -TEST_VERSION="v0.2.4" - -cleanup () { - nvm cache clear - nvm deactivate - nvm unalias default - rm -rf ${NVM_DIR}/v* .nvmrc - if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi - unset -f nvm_ls_remote nvm_ls_remote_iojs -} - -die () { - echo "$@" - cleanup - exit 1 -} - -nvm deactivate 2>/dev/null || die 'unable to deactivate' - -\. ../../common.sh - -REMOTE="$PWD/mocks/nvm_ls_remote.txt" -nvm_ls_remote() { - cat "$REMOTE" -} -REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" -nvm_ls_remote_iojs() { - cat "$REMOTE_IOJS" -} - -make_fake_node "$TEST_VERSION" - -# 1. install - -nvm install -w "$TEST_VERSION" || die "\`nvm install -w $TEST_VERSION\` failed" -OUTPUT="$(cat .nvmrc)" - -nvm_is_valid_version "$(cat .nvmrc)" \ - || die "\`nvm install -w $TEST_VERSION\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" - -# - -unset OUTPUT - -# 2. use - -nvm use -w "$TEST_VERSION" || die "\`nvm use -w $TEST_VERSION\` failed" -OUTPUT="$(cat .nvmrc)" - -nvm_is_valid_version "$(cat .nvmrc)" \ - || die "\`nvm use -w $TEST_VERSION\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" - -# - -cleanup diff --git a/test/fast/Unit tests/nvm ls-remote b/test/fast/Unit tests/nvm ls-remote index bb1ac94465..0c65bfb57f 100755 --- a/test/fast/Unit tests/nvm ls-remote +++ b/test/fast/Unit tests/nvm ls-remote @@ -22,11 +22,11 @@ nvm deactivate 2>/dev/null || die 'unable to deactivate' \. ../../common.sh -MOCKS_DIR="$PWD/mocks" +MOCKS_DIR="${PWD}/mocks" nvm_download() { if [ "$*" = "-L -s $(nvm_get_mirror node std)/index.tab -o -" ]; then - cat "$MOCKS_DIR/nodejs.org-dist-index.tab" + cat "${MOCKS_DIR}/nodejs.org-dist-index.tab" return fi return 42 @@ -34,15 +34,15 @@ nvm_download() { EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt" OUTPUT="$(nvm ls-remote --lts | sed 's/[ \t]*$//')" -EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )" -[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm ls-remote --lts did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")" +EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )" +[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "nvm ls-remote --lts did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<" EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt" OUTPUT="$(nvm ls-remote "lts/*" | sed 's/[ \t]*$//')" -EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )" -[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm ls-remote lts/* did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")" +EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )" +[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "nvm ls-remote lts/* did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<" -MOCKS_DIR="$PWD/mocks" +MOCKS_DIR="${PWD}/mocks" LTS_NAMES_PATH="${MOCKS_DIR}/LTS_names.txt" LTS_LIST="$(cat "${LTS_NAMES_PATH}" | tail -n +2)" @@ -56,18 +56,18 @@ printf '%s\n' "${LTS_LIST}" | while IFS= read -r LTS; do INDEX=$(($INDEX + 1)) done -REMOTE="$PWD/mocks/nvm_ls_remote.txt" +REMOTE="${PWD}/mocks/nvm_ls_remote.txt" nvm_ls_remote() { - cat "$REMOTE" + cat "${REMOTE}" } -REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" +REMOTE_IOJS="${PWD}/mocks/nvm_ls_remote_iojs.txt" nvm_ls_remote_iojs() { - cat "$REMOTE_IOJS" + cat "${REMOTE_IOJS}" } EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote.txt" OUTPUT="$(nvm ls-remote | sed 's/[ \t]*$//')" -EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )" -[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "bare nvm ls-remote did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")" +EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )" +[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "bare nvm ls-remote did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<" cleanup diff --git a/test/fast/Unit tests/nvm_download b/test/fast/Unit tests/nvm_download index fcb58e29a7..0c256099c0 100755 --- a/test/fast/Unit tests/nvm_download +++ b/test/fast/Unit tests/nvm_download @@ -1,7 +1,7 @@ #!/bin/sh cleanup () { - unset -f die cleanup NVM_AUTH_HEADER + unset -f die cleanup docker stop httpbin && docker rm httpbin } die () { echo "$@" ; cleanup ; exit 1; } @@ -17,13 +17,12 @@ nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" >/de ! nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/wrong_install.sh" >/dev/null || die "nvm_download should fail to download no existing file" # nvm_download should pass when calling with auth header -docker pull kennethreitz/httpbin && docker run --shell=bash -d --name httpbin -p 80:80 kennethreitz/httpbin +docker pull kennethreitz/httpbin && SHELL=bash docker run -d --name httpbin -p 80:80 kennethreitz/httpbin sleep 1 # wait for httpbin to start NVM_AUTH_HEADER="Bearer test-token" nvm_download "http://127.0.0.1/bearer" > /dev/null || die 'nvm_download with auth header should send correctly' # nvm_download should fail when calling without auth header nvm_download "http://127.0.0.1/bearer" > /dev/null && die 'nvm_download with no auth header should not send the header and should fail' -docker stop httpbin && docker rm httpbin # ensure quoted extra args remain quoted nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" -o "; die quoted-command-not-quoted" || die 'command failed' diff --git a/test/fast/Unit tests/nvm_get_default_packages b/test/fast/Unit tests/nvm_get_default_packages index c57ace933f..d8a8157bc2 100755 --- a/test/fast/Unit tests/nvm_get_default_packages +++ b/test/fast/Unit tests/nvm_get_default_packages @@ -2,27 +2,29 @@ \. ../../../nvm.sh -FILE="$NVM_DIR/default-packages" +FILE="${NVM_DIR}/default-packages" die () { echo "$@" ; cleanup ; exit 1; } setup () { - if [ -f $FILE ]; then - ORIG_DEFAULT_PACKAGES=$(cat $FILE) + if [ -f "${FILE}" ]; then + ORIG_DEFAULT_PACKAGES=$(cat "${FILE}") mkdir -p ./tmp/ ||: - mv $FILE ./tmp/default-packages ||: + mv "${FILE}" ./tmp/default-packages ||: fi - touch $FILE + touch "${FILE}" } cleanup () { - if [ "$ORIG_DEFAULT_PACKAGES" != "" ]; then + if [ "${ORIG_DEFAULT_PACKAGES}" != "" ]; then rm -rf ./tmp/ - echo "$ORIG_DEFAULT_PACKAGES" > $FILE + echo "${ORIG_DEFAULT_PACKAGES}" > "${FILE}" + else + rm "${FILE}" fi } setup -cat > $FILE << EOF +cat > "${FILE}" << EOF rimraf object-inspect@1.0.2 @@ -39,7 +41,7 @@ cleanup setup -cat > $FILE << EOF +cat > "${FILE}" << EOF rimraf not~a~package~name mkdirp @@ -53,12 +55,12 @@ cleanup setup -cat > $FILE << EOF +cat > "${FILE}" << EOF rimraf not~a~package~name mkdirp EOF -printf %s "$(cat "${FILE}")" > $FILE # strip trailing newline +printf %s "$(cat "${FILE}")" > "${FILE}" # strip trailing newline DEFAULT_PKGS="$(nvm_get_default_packages)" EXPECTED_PKGS='rimraf not~a~package~name mkdirp' @@ -68,7 +70,7 @@ cleanup setup -cat > $FILE << EOF +cat > "${FILE}" << EOF object-inspect @ 1.0.2 rimraf EOF @@ -81,12 +83,12 @@ cleanup setup -rm -rf $FILE +rm -rf "${FILE}" DEFAULT_PKGS="$(nvm_get_default_packages)" EXPECTED_PKGS='' [ "${DEFAULT_PKGS}" = "${EXPECTED_PKGS}" ] || die "5: expected default packages >${EXPECTED_PKGS}<; got >${DEFAULT_PKGS}<" -touch $FILE +touch "${FILE}" cleanup diff --git a/test/fast/Unit tests/nvm_install_binary_extract b/test/fast/Unit tests/nvm_install_binary_extract index 8b8782a5b8..5dd2cc72c0 100755 --- a/test/fast/Unit tests/nvm_install_binary_extract +++ b/test/fast/Unit tests/nvm_install_binary_extract @@ -1,33 +1,43 @@ #!/bin/sh -cleanup () { - [ -d "$tmp_dir" ] && rm -rf "$tmp_dir" - [ -d "$NVM_DIR" ] && rm -rf "$NVM_DIR" +cleanup() { + [ -d "${tmp_dir}" ] && rm -rf "${tmp_dir}" + [ -d "${NVM_DIR}" ] && rm -rf "${NVM_DIR}" unset -f die cleanup test_archi nvm_supports_xz unset NVM_DIR tmp_dir version archi } -die () { echo "$@" ; cleanup ; exit 1; } +die() { echo "$@" ; cleanup ; exit 1; } -test_archi(){ - local os="$1" - local version="$2" - local archi="$os-$3" - local node="$4" - local ext="$5" - local command="$6" - local command_option="$7" - local node_path="$tmp_dir/node-$version-$archi/$node" +test_archi() { + local os + os="$1" + local version + version="$2" + local archi + archi="$os-$3" + local node + node="$4" + local ext + ext="$5" + local command + command="$6" + local command_option + command_option="$7" + local node_dir + node_dir="${tmp_dir}/node-${version}-${archi}" + local node_path + node_path="${node_dir}/${node}" # Create tarball - mkdir -p "$(dirname "$node_path")" - echo "node $version" > "$node_path" - (cd "$tmp_dir" && "$command" "$command_option" "$tmp_dir/node-$version-$archi.$ext" "node-$version-$archi" && rm -rf "$tmp_dir/node-$version-$archi") - [ -f "$tmp_dir/node-$version-$archi.$ext" ] || die "Unable to create fake $ext file" + mkdir -p "$(dirname "${node_path}")" + echo "node ${version}" > "${node_path}" + (cd "${tmp_dir}" && "${command}" "${command_option}" "${node_dir}.${ext}" "node-${version}-${archi}") + [ -f "${node_dir}.${ext}" ] || die "Unable to create fake ${ext} file" # Extract it - nvm_install_binary_extract "$os" "$version" "${version:1}" "$tmp_dir/node-$version-$archi.$ext" "$tmp_dir/files" - [ "$(cat "$NVM_DIR/versions/node/$version/bin/node")" = "node $version" ] || die "Unable to extract $ext file" + nvm_install_binary_extract "$os" "$version" "$(expr "${version}" : '.\(.*\)')" "${node_dir}.$ext" "${tmp_dir}/files" + [ "$(cat "${NVM_DIR}/versions/node/${version}/bin/node")" = "node ${version}" ] || die "Unable to extract ${ext} file" } \. ../../../nvm.sh @@ -39,17 +49,18 @@ type nvm_install_binary_extract > /dev/null 2>&1 || die 'nvm_install_binary_extr NVM_DIR=$(mktemp -d) tmp_dir=$(mktemp -d) -if [ -z "$NVM_DIR" ] || [ -z "$tmp_dir" ]; then +if [ -z "${NVM_DIR}" ] || [ -z "${tmp_dir}" ]; then die 'Unable to create temporary folder' fi # Test windows zip -test_archi 'win' 'v15.6.0' 'x64' 'node' 'zip' 'zip' '-qr' +# TODO: enable this +# test_archi 'win' 'v15.6.0' 'x64' 'node' 'zip' 'zip' '-qr' # Test linux tar.xz test_archi 'linux' 'v14.15.4' 'x64' 'bin/node' 'tar.xz' 'tar' '-cJf' -nvm_supports_xz(){ +nvm_supports_xz() { return 1 } diff --git a/test/fast/Unit tests/nvm_install_no_progress_bar b/test/fast/Unit tests/nvm_install_no_progress_bar index d43194dc87..94c41a796e 100755 --- a/test/fast/Unit tests/nvm_install_no_progress_bar +++ b/test/fast/Unit tests/nvm_install_no_progress_bar @@ -13,11 +13,9 @@ die () { >&2 echo "$@" ; cleanup ; exit 1; } \. ../../../nvm.sh -nvm_has_colors() { return 1 ; } - cleanup -OUTPUT="$(2>&1 nvm install --no-progress v0.12.18)" +OUTPUT="$(TERM=dumb 2>&1 nvm install --no-progress v0.12.18)" EXPECTED_OUTPUT="Downloading and installing node v0.12.18... Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz... Computing checksum with sha256sum @@ -25,19 +23,63 @@ Checksums matched! Now using node v0.12.18 (npm v2.15.11) Creating default alias: default -> v0.12.18 *" -[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "1: expected > +${EXPECTED_OUTPUT}<, got > +${OUTPUT}<" cleanup -OUTPUT="$(2>&1 nvm install v0.12.18)" +OUTPUT="$(TERM=dumb 2>&1 nvm install v0.12.18)" EXPECTED_OUTPUT="Downloading and installing node v0.12.18... Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz... -######################################################################## 100.0% +######################################################################### 100.0% Computing checksum with sha256sum Checksums matched! Now using node v0.12.18 (npm v2.15.11) Creating default alias: default -> v0.12.18 *" -[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "$(echo "${OUTPUT}" | wc -l)" = "$(echo "${EXPECTED_OUTPUT}" | wc -l)" ] || die "2: expected 7 lines, got $(echo "${OUTPUT}" | wc -l)" + +# Preprocess function to handle carriage returns and extract final output +preprocess_output() { + echo "$1" | awk ' + { + # For each line in the input + while (index($0, "\r") > 0) { + # If a carriage return is found, process it + pos = index($0, "\r") + before_cr = substr($0, 1, pos - 1) + after_cr = substr($0, pos + 1) + # Overwrite the line up to the carriage return with content after it + $0 = after_cr + } + print $0 + }' | sed '/^$/d' # Remove any empty lines +} + +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || { + echo "$OUTPUT" \ + | while IFS= read -r output_line && IFS= read -r expected_line <&3; do + line_number=$((line_number + 1)) + + # Strip non-visible characters from both lines + clean_output=$(preprocess_output "$output_line") + + if [ "${output_line}" != "${expected_line}" ] && ! echo "${clean_output}" | \grep -qE '^#+ 100\.0%$'; then + echo "Difference on line ${line_number}:" + echo "Output: ${output_line}" + echo "Expected: ${expected_line}" + echo "Byte-by-byte comparison:" + echo "Output: $(echo "${clean_output}" | od -An -tx1 | tr -d '\n')" + echo "Expected: $(echo "${expected_line}" | od -An -tx1 | tr -d '\n')" + + die "4: expected > +${EXPECTED_OUTPUT}<, got > +${OUTPUT}<" + fi +done 3<&2 echo 'binary failed' + return 1 +} + +# binary fails, falls back to source, but if -b is set, fails OUTPUT="$(nvm install -b 9.0.0 2>&1)" -EXPECTED_OUTPUT='Binary download failed. Download from source aborted.' -if [ "${OUTPUT#*$EXPECTED_OUTPUT}" = "${OUTPUT}" ]; then +EXPECTED_OUTPUT='binary failed' +if [ "${OUTPUT#*"${EXPECTED_OUTPUT}"}" = "${OUTPUT}" ]; then die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<" fi -# Falls back to source but if -b is not set. +nvm_install_source() { + >&2 echo 'source intentionally failed' + return 1 +} + +# binary fails, falls back to source if -b is not set OUTPUT="$(nvm install 9.0.0 2>&1)" -EXPECTED_OUTPUT='Binary download failed. Download from source aborted.' -if [ "${OUTPUT#*$EXPECTED_OUTPUT}" != "${OUTPUT}" ]; then - die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<" -fi +EXPECTED_OUTPUT="binary failed +Detected that you have 2 CPU core(s) +Number of CPU core(s) less than or equal to 2, running in single-threaded mode +source intentionally failed" + +[ "${EXPECTED_OUTPUT}" = "${OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" diff --git a/test/slow/nvm exec/Running 'nvm exec' with help should not parse b/test/slow/nvm exec/Running 'nvm exec' with help should not parse old mode 100755 new mode 100644 diff --git a/test/slow/nvm reinstall-packages/test-npmlink/index.js b/test/slow/nvm reinstall-packages/test-npmlink/index.js old mode 100755 new mode 100644 diff --git a/test/slow/nvm reinstall-packages/test-npmlink/package.json b/test/slow/nvm reinstall-packages/test-npmlink/package.json old mode 100755 new mode 100644 diff --git a/test/slow/nvm use/Running 'nvm use' with nvmrc containing not installed version b/test/slow/nvm use/Running 'nvm use' with nvmrc containing not installed version old mode 100755 new mode 100644