From eba50de75eb99e94bd1b50f4d2c4f39eca93519d Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Wed, 10 Aug 2016 23:10:41 -0700 Subject: [PATCH 01/17] Add `nvm_compare_checksum`, `nvm_compute_checksum`, and `nvm_get_checksum` --- nvm.sh | 95 ++++++++++++++++++++++- test/fast/Unit tests/nvm_compare_checksum | 72 +++++++++++++++++ test/fast/Unit tests/nvm_compute_checksum | 23 ++++++ test/fast/Unit tests/nvm_get_checksum | 31 ++++++++ 4 files changed, 218 insertions(+), 3 deletions(-) create mode 100755 test/fast/Unit tests/nvm_compare_checksum create mode 100755 test/fast/Unit tests/nvm_compute_checksum create mode 100755 test/fast/Unit tests/nvm_get_checksum diff --git a/nvm.sh b/nvm.sh index dfc75b9..42fb74a 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1036,6 +1036,94 @@ nvm_get_checksum_alg() { fi } +nvm_compute_checksum() { + local FILE + FILE="${1-}" + if [ -z "${FILE}" ]; then + nvm_err 'Provided file to checksum is empty.' + return 2 + elif ! [ -f "${FILE}" ]; then + nvm_err 'Provided file to checksum does not exist.' + return 1 + fi + + if nvm_has "sha256sum" && ! nvm_is_alias "sha256sum"; then + nvm_err 'Computing checksum with sha256sum' + command sha256sum "${FILE}" | command awk '{print $1}' + elif nvm_has "shasum" && ! nvm_is_alias "shasum"; then + nvm_err 'Computing checksum with shasum -a 256' + command shasum -a 256 "${FILE}" | command awk '{print $1}' + elif nvm_has "sha256" && ! nvm_is_alias "sha256"; then + nvm_err 'Computing checksum with sha256 -q' + command sha256 -q "${FILE}" | command awk '{print $1}' + elif nvm_has "gsha256sum" && ! nvm_is_alias "gsha256sum"; then + nvm_err 'Computing checksum with gsha256sum' + command gsha256sum "${FILE}" | command awk '{print $1}' + elif nvm_has "openssl" && ! nvm_is_alias "openssl"; then + nvm_err 'Computing checksum with openssl dgst -sha256' + command openssl dgst -sha256 "${FILE}" | rev | command awk '{print $1}' | rev + elif nvm_has "libressl" && ! nvm_is_alias "libressl"; then + nvm_err 'Computing checksum with libressl dgst -sha256' + command libressl dgst -sha256 "${FILE}" | rev | command awk '{print $1}' | rev + elif nvm_has "bssl" && ! nvm_is_alias "bssl"; then + nvm_err 'Computing checksum with bssl sha256sum' + command bssl sha256sum "${FILE}" | command awk '{print $1}' + elif nvm_has "sha1sum" && ! nvm_is_alias "sha1sum"; then + nvm_err 'Computing checksum with sha1sum' + command sha1sum "${FILE}" | command awk '{print $1}' + elif nvm_has "sha1" && ! nvm_is_alias "sha1"; then + nvm_err 'Computing checksum with sha1 -q' + command sha1 -q "${FILE}" + elif nvm_has "shasum" && ! nvm_is_alias "shasum"; then + nvm_err 'Computing checksum with shasum' + command shasum "${FILE}" | command awk '{print $1}' + fi +} + +nvm_compare_checksum() { + local FILE + FILE="${1-}" + if [ -z "${FILE}" ]; then + nvm_err 'Provided file to checksum is empty.' + return 4 + elif ! [ -f "${FILE}" ]; then + nvm_err 'Provided file to checksum does not exist.' + return 3 + fi + + local COMPUTED_SUM + COMPUTED_SUM="$(nvm_compute_checksum "${FILE}")" + + local CHECKSUM + CHECKSUM="${2-}" + if [ -z "${CHECKSUM}" ]; then + nvm_err 'Provided checksum to compare to is empty.' + return 2 + fi + + if [ -z "${COMPUTED_SUM}" ]; then + nvm_err "Computed checksum of '${FILE}' is empty." # missing in raspberry pi binary + nvm_err 'WARNING: Continuing *without checksum verification*' + return + elif [ "${COMPUTED_SUM}" != "${CHECKSUM}" ]; then + nvm_err "Checksums do not match: '${COMPUTED_SUM}' found, '${CHECKSUM}' expected." + return 1 + fi + nvm_err 'Checksums matched!' +} + +nvm_get_checksum() { + local SHASUMS_URL + if [ "$(nvm_get_checksum_alg)" = 'sha-256' ]; then + SHASUMS_URL="${NVM_NODEJS_ORG_MIRROR}/${1}/SHASUMS256.txt" + else + SHASUMS_URL="${NVM_NODEJS_ORG_MIRROR}/${1}/SHASUMS.txt" + fi + nvm_download -L -s "${SHASUMS_URL}" -o - | \ + nvm_grep "${2}.tar.${3}" | \ + command awk '{print $1}' +} + nvm_checksum() { local NVM_CHECKSUM if [ -z "${3-}" ] || [ "${3-}" = 'sha1' ]; then @@ -2923,7 +3011,7 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | nvm_grep -v "N/A" | command sed '/^$/d')" nvm_echo '0.31.7' ;; "unload" ) - unset -f nvm nvm_print_versions nvm_checksum \ + unset -f nvm \ nvm_iojs_prefix nvm_node_prefix \ nvm_add_iojs_prefix nvm_strip_iojs_prefix \ nvm_is_iojs_version nvm_is_alias \ @@ -2932,7 +3020,8 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | nvm_grep -v "N/A" | command sed '/^$/d')" nvm_install_iojs_binary nvm_install_node_binary \ nvm_install_merged_node_binary nvm_get_mirror \ nvm_install_node_source nvm_check_file_permissions \ - nvm_get_checksum_alg \ + nvm_print_versions nvm_compute_checksum nvm_checksum \ + nvm_get_checksum_alg nvm_get_checksum nvm_compare_checksum \ nvm_version nvm_rc_version nvm_match_version \ nvm_ensure_default_set nvm_get_arch nvm_get_os \ nvm_print_implicit_alias nvm_validate_implicit_alias \ @@ -2956,7 +3045,7 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | nvm_grep -v "N/A" | command sed '/^$/d')" nvm_print_default_alias nvm_print_formatted_alias nvm_resolve_local_alias \ nvm_sanitize_path nvm_has_colors nvm_process_parameters \ > /dev/null 2>&1 - unset RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_DIR NVM_CD_FLAGS > /dev/null 2>&1 + unset RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR NVM_CD_FLAGS > /dev/null 2>&1 ;; * ) >&2 nvm --help diff --git a/test/fast/Unit tests/nvm_compare_checksum b/test/fast/Unit tests/nvm_compare_checksum new file mode 100755 index 0000000..e74adb1 --- /dev/null +++ b/test/fast/Unit tests/nvm_compare_checksum @@ -0,0 +1,72 @@ +#!/bin/sh + +cleanup () { + unset -f nvm_compute_checksum +} +die () { echo $@ ; cleanup ; exit 1; } + +. ../../../nvm.sh + +set -ex + +nvm_compute_checksum() { + echo +} + +set +x +OUTPUT="$(nvm_compare_checksum 2>&1 >/dev/null || echo)" +EXIT_CODE="$(nvm_compare_checksum >/dev/null 2>&1 || echo $?)" +set -x +EXPECTED_OUTPUT='Provided file to checksum is empty.' +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 4 ] || die "expected to exit with code 4, got ${EXIT_CODE}" + +set +x +OUTPUT="$(nvm_compare_checksum foo 2>&1 >/dev/null || echo)" +EXIT_CODE="$(nvm_compare_checksum foo >/dev/null 2>&1 || echo $?)" +set -x +EXPECTED_OUTPUT='Provided file to checksum does not exist.' +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 3 ] || die "expected to exit with code 3, got ${EXIT_CODE}" + +set +x +OUTPUT="$(nvm_compare_checksum ../../../nvm.sh 2>&1 >/dev/null || echo)" +EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh >/dev/null 2>&1 || echo $?)" +set -x +EXPECTED_OUTPUT='Provided checksum to compare to is empty.' +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 2 ] || die "expected to exit with code 2, got ${EXIT_CODE}" + +set +x +OUTPUT="$(nvm_compare_checksum ../../../nvm.sh checksum 2>&1 >/dev/null)" +EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh checksum >/dev/null 2>&1 ; echo $?)" +set -x +EXPECTED_OUTPUT="Computed checksum of '../../../nvm.sh' is empty. +WARNING: Continuing *without checksum verification*" +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 0 ] || die "expected to exit with code 0, got ${EXIT_CODE}" + +nvm_compute_checksum() { + echo "not checksum: ${1}" +} + +set +x +OUTPUT="$(nvm_compare_checksum ../../../nvm.sh checksum 2>&1 >/dev/null || echo)" +EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh checksum >/dev/null 2>&1 || echo $?)" +set -x +EXPECTED_OUTPUT="Checksums do not match: 'not checksum: ../../../nvm.sh' found, 'checksum' expected." +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 1 ] || die "expected to exit with code 1, got ${EXIT_CODE}" + +nvm_compute_checksum() { + echo checksum +} +set +x +OUTPUT="$(nvm_compare_checksum ../../../nvm.sh checksum 2>&1 >/dev/null)" +EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh checksum >/dev/null 2>&1; echo $?)" +set -x +EXPECTED_OUTPUT='Checksums matched!' +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 0 ] || die "expected to exit with code 0, got ${EXIT_CODE}" + +cleanup diff --git a/test/fast/Unit tests/nvm_compute_checksum b/test/fast/Unit tests/nvm_compute_checksum new file mode 100755 index 0000000..2684c4c --- /dev/null +++ b/test/fast/Unit tests/nvm_compute_checksum @@ -0,0 +1,23 @@ +#!/bin/sh + +set -ex + +die () { echo $@ ; exit 1; } + +. ../../../nvm.sh + +set +x +OUTPUT="$(nvm_compute_checksum 2>&1 >/dev/null || echo)" +EXIT_CODE="$(nvm_compute_checksum >/dev/null 2>&1 || echo $?)" +set -x +EXPECTED_OUTPUT='Provided file to checksum is empty.' +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 2 ] || die "expected to exit with code 2, got ${EXIT_CODE}" + +set +x +OUTPUT="$(nvm_compute_checksum foo 2>&1 >/dev/null || echo)" +EXIT_CODE="$(nvm_compute_checksum foo >/dev/null 2>&1 || echo $?)" +set -x +EXPECTED_OUTPUT='Provided file to checksum does not exist.' +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 1 ] || die "expected to exit with code 1, got ${EXIT_CODE}" diff --git a/test/fast/Unit tests/nvm_get_checksum b/test/fast/Unit tests/nvm_get_checksum new file mode 100755 index 0000000..9e3816a --- /dev/null +++ b/test/fast/Unit tests/nvm_get_checksum @@ -0,0 +1,31 @@ +#!/bin/sh + +set -ex + +cleanup () { + unset -f nvm_download nvm_get_checksum_alg +} +die () { echo $@ ; cleanup ; exit 1; } + +. ../../../nvm.sh + +nvm_download() { + echo "ERROR_FAILED_MATCH no_match more fields" + echo "${3} bar.tar.baz more fields" +} + +nvm_get_checksum_alg() { + echo 'sha-256' +} +OUTPUT="$(nvm_get_checksum foo bar baz)" +EXPECTED_OUTPUT="${NVM_NODEJS_ORG_MIRROR}/foo/SHASUMS256.txt" +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" + +nvm_get_checksum_alg() { + echo 'sha-1' +} +OUTPUT="$(nvm_get_checksum foo bar baz)" +EXPECTED_OUTPUT="${NVM_NODEJS_ORG_MIRROR}/foo/SHASUMS.txt" +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" + +cleanup From ba3ad8e460b88aab281d203276b354ce3c9df52f Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Wed, 10 Aug 2016 23:21:56 -0700 Subject: [PATCH 02/17] [Breaking] cache previously downloaded artifacts for binaries - consolidate `nvm_install_merged_node_binary` with `nvm_install_node_binary` - add `nvm_get_download_slug`, `nvm_download_artifact` - `nvm uninstall` no longer removes artifacts --- .gitignore | 1 + nvm.sh | 247 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 143 insertions(+), 105 deletions(-) diff --git a/.gitignore b/.gitignore index b44ec8f..57f44a7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ HEAD +bin src v* alias diff --git a/nvm.sh b/nvm.sh index 42fb74a..ddcc7b3 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1470,79 +1470,54 @@ nvm_get_mirror() { esac } -nvm_install_merged_node_binary() { - local NVM_NODE_TYPE - NVM_NODE_TYPE="${1}" +nvm_install_node_binary() { local MIRROR - if [ "${NVM_NODE_TYPE}" = 'std' ]; then - MIRROR="${NVM_NODEJS_ORG_MIRROR}" - else - nvm_err 'unknown type of node.js release' + MIRROR="$(nvm_get_mirror node "${1}")" + if [ -z "${MIRROR}" ]; then return 4 fi + local VERSION VERSION="${2}" - if ! nvm_is_merged_node_version "${VERSION}" || nvm_is_iojs_version "${VERSION}"; then - nvm_err 'nvm_install_merged_node_binary requires a node version v4.0 or greater.' + if nvm_is_iojs_version "${VERSION}"; then + nvm_err 'nvm_install_node_binary does not allow an iojs-prefixed version.' return 10 fi local VERSION_PATH VERSION_PATH="$(nvm_version_path "${VERSION}")" - local NVM_OS - NVM_OS="$(nvm_get_os)" - local t - local url - local sum - local NODE_PREFIX - local compression - compression='gz' - local tar_compression_flag - tar_compression_flag='z' - if nvm_supports_xz "${VERSION}"; then - compression='xz' - tar_compression_flag='J' - fi - NODE_PREFIX="$(nvm_node_prefix)" - if [ -z "${NVM_OS}" ]; then + if [ -z "$(nvm_get_os)" ]; then return 2 fi - t="${VERSION}-${NVM_OS}-$(nvm_get_arch)" - url="${MIRROR}/$VERSION/$NODE_PREFIX-${t}.tar.${compression}" - sum="$( - nvm_download -L -s "${MIRROR}/${VERSION}/SHASUMS256.txt" -o - \ - | nvm_grep "${NODE_PREFIX}-${t}.tar.${compression}" \ - | command awk '{print $1}' - )" - local tmpdir - tmpdir="${NVM_DIR}/bin/node-${t}" - local tmptarball - tmptarball="${tmpdir}/node-${t}.tar.${compression}" - local NVM_INSTALL_ERRORED - command mkdir -p "${tmpdir}" && \ - nvm_echo "Downloading ${url}..." && \ - nvm_download -L -C - --progress-bar "${url}" -o "${tmptarball}" || \ - NVM_INSTALL_ERRORED=true - if nvm_grep '404 Not Found' "${tmptarball}" >/dev/null; then - NVM_INSTALL_ERRORED=true - nvm_err "HTTP 404 at URL $url"; + local tar_compression_flag + tar_compression_flag='z' + if nvm_supports_xz "${VERSION}"; then + tar_compression_flag='J' fi + + local TARBALL + local TMPDIR + local VERSION_PATH + if ( - [ "$NVM_INSTALL_ERRORED" != true ] && \ - nvm_checksum "${tmptarball}" "${sum}" "{sha256}" && \ - command tar -x${tar_compression_flag}f "${tmptarball}" -C "${tmpdir}" --strip-components 1 && \ - command rm -f "${tmptarball}" && \ + TARBALL="$(nvm_download_artifact node binary std "${VERSION}" | command tail -1)" && \ + [ -f "${TARBALL}" ] && \ + TMPDIR="$(dirname "${TARBALL}")/files" && \ + command mkdir -p "${TMPDIR}" && \ + command tar -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 && \ + VERSION_PATH="$(nvm_version_path "${VERSION}")" && \ command mkdir -p "${VERSION_PATH}" && \ - command mv "${tmpdir}"/* "${VERSION_PATH}" + command mv "${TMPDIR}/"* "${VERSION_PATH}" && \ + command rm -rf "${TMPDIR}" ); then return 0 fi nvm_err 'Binary download failed, trying source.' - command rm -rf "${tmptarball}" "${tmpdir}" + command rm -rf "${TMPDIR}" return 1 } @@ -1619,62 +1594,127 @@ nvm_install_iojs_binary() { return 2 } -nvm_install_node_binary() { +# args: flavor, kind, version +nvm_get_download_slug() { + local FLAVOR + case "${1-}" in + node | iojs) FLAVOR="${1}" ;; + *) + nvm_err 'supported flavors: node, iojs' + return 1 + ;; + esac + + local KIND + case "${2-}" in + binary | source) KIND="${2}" ;; + *) + nvm_err 'supported kinds: binary, source' + return 2 + ;; + esac + local VERSION - VERSION="$1" + VERSION="${3}" - if nvm_is_iojs_version "$VERSION"; then - nvm_err 'nvm_install_node_binary does not allow an iojs-prefixed version.' - return 10 - fi - - local VERSION_PATH - VERSION_PATH="$(nvm_version_path "$VERSION")" local NVM_OS NVM_OS="$(nvm_get_os)" - local t - local url - local sum - if [ -n "$NVM_OS" ]; then - if nvm_binary_available "$VERSION"; then - local NVM_ARCH - NVM_ARCH="$(nvm_get_arch)" - if [ "_$NVM_ARCH" = '_armv6l' ] || [ "_$NVM_ARCH" = 'armv7l' ]; then - NVM_ARCH="arm-pi" - fi - t="$VERSION-$NVM_OS-$NVM_ARCH" - url="$NVM_NODEJS_ORG_MIRROR/$VERSION/node-${t}.tar.gz" - sum=$(nvm_download -L -s "$NVM_NODEJS_ORG_MIRROR/$VERSION/SHASUMS.txt" -o - | nvm_grep "node-${t}.tar.gz" | command awk '{print $1}') - local tmpdir - tmpdir="$NVM_DIR/bin/node-${t}" - local tmptarball - tmptarball="$tmpdir/node-${t}.tar.gz" - local NVM_INSTALL_ERRORED - command mkdir -p "$tmpdir" && \ - nvm_download -L -C - --progress-bar "$url" -o "$tmptarball" || \ - NVM_INSTALL_ERRORED=true - if nvm_grep '404 Not Found' "$tmptarball" >/dev/null; then - NVM_INSTALL_ERRORED=true - nvm_err "HTTP 404 at URL $url"; - fi - if ( - [ "$NVM_INSTALL_ERRORED" != true ] && \ - nvm_checksum "$tmptarball" "$sum" && \ - command tar -xzf "$tmptarball" -C "$tmpdir" --strip-components 1 && \ - command rm -f "$tmptarball" && \ - command mkdir -p "$VERSION_PATH" && \ - command mv "$tmpdir"/* "$VERSION_PATH" - ); then - return 0 - else - nvm_err 'Binary download failed, trying source.' - command rm -rf "$tmptarball" "$tmpdir" - return 1 - fi + local NVM_ARCH + NVM_ARCH="$(nvm_get_arch)" + if ! nvm_is_merged_node_version "${VERSION}"; then + if [ "${NVM_ARCH}" = 'armv6l' ] || [ "${NVM_ARCH}" = 'armv7l' ]; then + NVM_ARCH="arm-pi" fi fi - return 2 + + if [ "${KIND}" = 'binary' ]; then + nvm_echo "${FLAVOR}-${VERSION}-${NVM_OS}-${NVM_ARCH}" + elif [ "${KIND}" = 'source' ]; then + nvm_echo "${FLAVOR}-${VERSION}" + fi +} + +# args: flavor, kind, type, version +nvm_download_artifact() { + local FLAVOR + case "${1-}" in + node | iojs) FLAVOR="${1}" ;; + *) + nvm_err 'supported flavors: node, iojs' + return 1 + ;; + esac + + local KIND + case "${2-}" in + binary | source) KIND="${2}" ;; + *) + nvm_err 'supported kinds: binary, source' + return 1 + ;; + esac + + local MIRROR + MIRROR="$(nvm_get_mirror "${FLAVOR}" "${3-}")" + if [ -z "${MIRROR}" ]; then + return 2 + fi + + local VERSION + VERSION="${4}" + + if ! nvm_binary_available "${VERSION}"; then + return + fi + + local SLUG + SLUG="$(nvm_get_download_slug "${FLAVOR}" "${KIND}" "${VERSION}")" + + local COMPRESSION + COMPRESSION='gz' + if nvm_supports_xz "${VERSION}"; then + COMPRESSION='xz' + fi + + local CHECKSUM + CHECKSUM="$(nvm_get_checksum "${VERSION}" "${SLUG}" "${COMPRESSION}")" + + local tmpdir + tmpdir="${NVM_DIR}/bin/${SLUG}" + command mkdir -p "${tmpdir}/files" || ( + nvm_err "creating directory ${tmpdir}/files failed" + return 3 + ) + + local TARBALL + TARBALL="${tmpdir}/${SLUG}.tar.${COMPRESSION}" + local TARBALL_URL + TARBALL_URL="${MIRROR}/${VERSION}/${SLUG}.tar.${COMPRESSION}" + + if nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" >/dev/null 2>&1; then + nvm_err "Checksums match! Using existing downloaded archive ${TARBALL}" + else + nvm_echo "Downloading ${TARBALL_URL}..." + nvm_download -L -C - --progress-bar "${TARBALL_URL}" -o "${TARBALL}" || ( + command rm -rf "${TARBALL}" "${tmpdir}" + nvm_err "Binary download from ${TARBALL_URL} failed, trying source." + return 4 + ) + + if nvm_grep '404 Not Found' "${TARBALL}" >/dev/null; then + command rm -rf "${TARBALL}" "$tmpdir" + nvm_err "HTTP 404 at URL ${TARBALL_URL}"; + return 5 + fi + + nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" || ( + command rm -rf "${tmpdir}/files" + return 6 + ) + fi + + nvm_echo "${TARBALL}" } nvm_get_make_jobs() { @@ -2251,9 +2291,7 @@ nvm() { if [ $nobinary -ne 1 ] && nvm_binary_available "$VERSION"; then if [ "$NVM_IOJS" = true ] && nvm_install_iojs_binary std "$VERSION"; then NVM_INSTALL_SUCCESS=true - elif [ "$NVM_NODE_MERGED" = true ] && nvm_install_merged_node_binary std "$VERSION"; then - NVM_INSTALL_SUCCESS=true - elif [ "$NVM_IOJS" != true ] && nvm_install_node_binary "$VERSION"; then + elif [ "$NVM_IOJS" != true ] && nvm_install_node_binary std "$VERSION"; then NVM_INSTALL_SUCCESS=true fi fi @@ -2354,8 +2392,7 @@ nvm() { # Delete all files related to target version. command rm -rf "$NVM_DIR/src/$NVM_PREFIX-$VERSION" \ "$NVM_DIR/src/$NVM_PREFIX-$VERSION.tar.*" \ - "$NVM_DIR/bin/$NVM_PREFIX-${t}" \ - "$NVM_DIR/bin/$NVM_PREFIX-${t}.tar.*" \ + "$NVM_DIR/bin/$NVM_PREFIX-${t}/files" \ "$VERSION_PATH" 2>/dev/null nvm_echo "$NVM_SUCCESS_MSG" @@ -3018,7 +3055,7 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | nvm_grep -v "N/A" | command sed '/^$/d')" nvm_ls_remote nvm_ls_remote_iojs nvm_ls_remote_index_tab \ nvm_ls nvm_remote_version nvm_remote_versions \ nvm_install_iojs_binary nvm_install_node_binary \ - nvm_install_merged_node_binary nvm_get_mirror \ + nvm_get_mirror nvm_get_download_slug nvm_download_artifact \ nvm_install_node_source nvm_check_file_permissions \ nvm_print_versions nvm_compute_checksum nvm_checksum \ nvm_get_checksum_alg nvm_get_checksum nvm_compare_checksum \ From 2214cb7ad7e200a6cb713d4af1827653e5106d73 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sat, 13 Aug 2016 09:14:45 -0700 Subject: [PATCH 03/17] [Breaking] cache previously downloaded artifacts for source installs - `nvm uninstall` no longer removes source artifacts --- nvm.sh | 147 +++++++++--------- ... should remove the appropriate directory." | 2 +- 2 files changed, 77 insertions(+), 72 deletions(-) diff --git a/nvm.sh b/nvm.sh index ddcc7b3..ff96d1b 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1392,7 +1392,7 @@ nvm_get_arch() { if [ $EXIT_CODE -ne 0 ]; then HOST_ARCH=$(isainfo -n) else - HOST_ARCH=$(echo "$HOST_ARCH" | tail -1) + HOST_ARCH=$(echo "$HOST_ARCH" | command tail -1) fi else HOST_ARCH="$(command uname -m)" @@ -1664,7 +1664,8 @@ nvm_download_artifact() { local VERSION VERSION="${4}" - if ! nvm_binary_available "${VERSION}"; then + if [ "${KIND}" = 'binary' ] && ! nvm_binary_available "${VERSION}"; then + nvm_err "No precompiled binary available for ${VERSION}." return fi @@ -1681,7 +1682,11 @@ nvm_download_artifact() { CHECKSUM="$(nvm_get_checksum "${VERSION}" "${SLUG}" "${COMPRESSION}")" local tmpdir - tmpdir="${NVM_DIR}/bin/${SLUG}" + if [ "${KIND}" = 'binary' ]; then + tmpdir="${NVM_DIR}/bin/${SLUG}" + else + tmpdir="${NVM_DIR}/src/${SLUG}" + fi command mkdir -p "${tmpdir}/files" || ( nvm_err "creating directory ${tmpdir}/files failed" return 3 @@ -1690,7 +1695,12 @@ nvm_download_artifact() { local TARBALL TARBALL="${tmpdir}/${SLUG}.tar.${COMPRESSION}" local TARBALL_URL - TARBALL_URL="${MIRROR}/${VERSION}/${SLUG}.tar.${COMPRESSION}" + if nvm_version_greater_than_or_equal_to "${VERSION}" 0.1.14; then + TARBALL_URL="${MIRROR}/${VERSION}/${SLUG}.tar.${COMPRESSION}" + else + # node <= 0.1.13 does not have a directory + TARBALL_URL="${MIRROR}/${SLUG}.tar.${COMPRESSION}" + fi if nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" >/dev/null 2>&1; then nvm_err "Checksums match! Using existing downloaded archive ${TARBALL}" @@ -1754,65 +1764,56 @@ nvm_get_make_jobs() { nvm_install_node_source() { local VERSION - VERSION="$1" + VERSION="${1}" local NVM_MAKE_JOBS - NVM_MAKE_JOBS="$2" + NVM_MAKE_JOBS="${2}" local ADDITIONAL_PARAMETERS - ADDITIONAL_PARAMETERS="$3" + ADDITIONAL_PARAMETERS="${3}" local NVM_ARCH NVM_ARCH="$(nvm_get_arch)" - if [ "_$NVM_ARCH" = '_armv6l' ] || [ "_$NVM_ARCH" = '_armv7l' ]; then - ADDITIONAL_PARAMETERS="--without-snapshot $ADDITIONAL_PARAMETERS" + if [ "${NVM_ARCH}" = 'armv6l' ] || [ "${NVM_ARCH}" = 'armv7l' ]; then + ADDITIONAL_PARAMETERS="--without-snapshot ${ADDITIONAL_PARAMETERS}" fi - if [ -n "$ADDITIONAL_PARAMETERS" ]; then - nvm_echo "Additional options while compiling: $ADDITIONAL_PARAMETERS" + if [ -n "${ADDITIONAL_PARAMETERS}" ]; then + nvm_echo "Additional options while compiling: ${ADDITIONAL_PARAMETERS}" fi - local VERSION_PATH - VERSION_PATH="$(nvm_version_path "$VERSION")" local NVM_OS NVM_OS="$(nvm_get_os)" - local tarball - tarball='' - local sum - sum='' local make make='make' - if [ "_$NVM_OS" = "_freebsd" ]; then + if [ "${NVM_OS}" = 'freebsd' ]; then make='gmake' - MAKE_CXX="CXX=c++" + MAKE_CXX='CXX=c++' fi - local tmpdir - tmpdir="$NVM_DIR/src" - local tmptarball - tmptarball="$tmpdir/node-$VERSION.tar.gz" - - if [ "$(nvm_download -L -s -I "$NVM_NODEJS_ORG_MIRROR/$VERSION/node-$VERSION.tar.gz" -o - 2>&1 | nvm_grep '200 OK')" != '' ]; then - tarball="$NVM_NODEJS_ORG_MIRROR/$VERSION/node-$VERSION.tar.gz" - sum=$(nvm_download -L -s "$NVM_NODEJS_ORG_MIRROR/$VERSION/SHASUMS.txt" -o - | nvm_grep "node-${VERSION}.tar.gz" | command awk '{print $1}') - elif [ "$(nvm_download -L -s -I "$NVM_NODEJS_ORG_MIRROR/node-$VERSION.tar.gz" -o - | nvm_grep '200 OK')" != '' ]; then - tarball="$NVM_NODEJS_ORG_MIRROR/node-$VERSION.tar.gz" + local tar_compression_flag + tar_compression_flag='z' + if nvm_supports_xz "${VERSION}"; then + tar_compression_flag='J' fi - # shellcheck disable=SC2086 + local TARBALL + local TMPDIR + local VERSION_PATH + if ( - [ -n "$tarball" ] && \ - command mkdir -p "$tmpdir" && \ - nvm_echo "Downloading $tarball..." && \ - nvm_download -L --progress-bar "$tarball" -o "$tmptarball" && \ - nvm_checksum "$tmptarball" "$sum" && \ - command tar -xzf "$tmptarball" -C "$tmpdir" && \ - cd "$tmpdir/node-$VERSION" && \ - ./configure --prefix="$VERSION_PATH" $ADDITIONAL_PARAMETERS && \ - $make -j "$NVM_MAKE_JOBS" ${MAKE_CXX-} && \ - command rm -f "$VERSION_PATH" 2>/dev/null && \ - $make -j "$NVM_MAKE_JOBS" ${MAKE_CXX-} install - ) - then + TARBALL="$(nvm_download_artifact node source std "${VERSION}" | command tail -1)" && \ + [ -f "${TARBALL}" ] && \ + TMPDIR="$(dirname "${TARBALL}")/files" && \ + command mkdir -p "${TMPDIR}" && \ + command tar -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 && \ + VERSION_PATH="$(nvm_version_path "${VERSION}")" && \ + cd "${TMPDIR}" && \ + ./configure --prefix="${VERSION_PATH}" $ADDITIONAL_PARAMETERS && \ + $make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} && \ + command rm -f "${VERSION_PATH}" 2>/dev/null && \ + $make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} install && \ + command rm -rf "${TMPDIR}" + ); then if ! nvm_has "npm" ; then nvm_echo 'Installing npm...' if nvm_version_greater 0.2.0 "$VERSION"; then @@ -1827,12 +1828,11 @@ nvm_install_node_source() { nvm_download -L https://npmjs.org/install.sh -o - | clean=yes sh fi fi - else - nvm_err "nvm: install $VERSION failed!" - return 1 + return $? fi - return $? + nvm_err "nvm: install ${VERSION} failed!" + return 1 } nvm_match_version() { @@ -2352,49 +2352,54 @@ nvm() { ;; esac - if [ "_$VERSION" = "_$(nvm_ls_current)" ]; then - if nvm_is_iojs_version "$VERSION"; then - nvm_err "nvm: Cannot uninstall currently-active io.js version, $VERSION (inferred from $PATTERN)." + if [ "_${VERSION}" = "_$(nvm_ls_current)" ]; then + if nvm_is_iojs_version "${VERSION}"; then + nvm_err "nvm: Cannot uninstall currently-active io.js version, ${VERSION} (inferred from ${PATTERN})." else - nvm_err "nvm: Cannot uninstall currently-active node version, $VERSION (inferred from $PATTERN)." + nvm_err "nvm: Cannot uninstall currently-active node version, ${VERSION} (inferred from ${PATTERN})." fi return 1 fi - if ! nvm_is_version_installed "$VERSION"; then - nvm_err "$VERSION version is not installed..." + if ! nvm_is_version_installed "${VERSION}"; then + nvm_err "${VERSION} version is not installed..." return; fi - t="$VERSION-$(nvm_get_os)-$(nvm_get_arch)" - - local NVM_PREFIX - local NVM_SUCCESS_MSG - if nvm_is_iojs_version "$VERSION"; then - NVM_PREFIX="$(nvm_iojs_prefix)" - NVM_SUCCESS_MSG="Uninstalled io.js $(nvm_strip_iojs_prefix "$VERSION")" + local SLUG_BINARY + local SLUG_SOURCE + if nvm_is_iojs_version "${VERSION}"; then + SLUG_BINARY="$(nvm_get_download_slug iojs binary std "${VERSION}")" + SLUG_SOURCE="$(nvm_get_download_slug iojs source std "${VERSION}")" else - NVM_PREFIX="$(nvm_node_prefix)" - NVM_SUCCESS_MSG="Uninstalled node $VERSION" + SLUG_BINARY="$(nvm_get_download_slug node binary std "${VERSION}")" + SLUG_SOURCE="$(nvm_get_download_slug node source std "${VERSION}")" + fi + + local NVM_SUCCESS_MSG + if nvm_is_iojs_version "${VERSION}"; then + NVM_SUCCESS_MSG="Uninstalled io.js $(nvm_strip_iojs_prefix "${VERSION}")" + else + NVM_SUCCESS_MSG="Uninstalled node ${VERSION}" fi local VERSION_PATH - VERSION_PATH="$(nvm_version_path "$VERSION")" - if ! nvm_check_file_permissions "$VERSION_PATH"; then + VERSION_PATH="$(nvm_version_path "${VERSION}")" + if ! nvm_check_file_permissions "${VERSION_PATH}"; then nvm_err 'Cannot uninstall, incorrect permissions on installation folder.' nvm_err 'This is usually caused by running `npm install -g` as root. Run the following commands as root to fix the permissions and then try again.' nvm_err - nvm_err " chown -R $(whoami) \"$(nvm_sanitize_path "$VERSION_PATH")\"" - nvm_err " chmod -R u+w \"$(nvm_sanitize_path "$VERSION_PATH")\"" + nvm_err " chown -R $(whoami) \"$(nvm_sanitize_path "${VERSION_PATH}")\"" + nvm_err " chmod -R u+w \"$(nvm_sanitize_path "${VERSION_PATH}")\"" return 1 fi # Delete all files related to target version. - command rm -rf "$NVM_DIR/src/$NVM_PREFIX-$VERSION" \ - "$NVM_DIR/src/$NVM_PREFIX-$VERSION.tar.*" \ - "$NVM_DIR/bin/$NVM_PREFIX-${t}/files" \ - "$VERSION_PATH" 2>/dev/null - nvm_echo "$NVM_SUCCESS_MSG" + command rm -rf \ + "${NVM_DIR}/bin/${SLUG_BINARY}/files" \ + "${NVM_DIR}/src/${SLUG_SOURCE}/files" \ + "${VERSION_PATH}" 2>/dev/null + nvm_echo "${NVM_SUCCESS_MSG}" # rm any aliases that point to uninstalled version. for ALIAS in $(nvm_grep -l "$VERSION" "$(nvm_alias_path)/*" 2>/dev/null) diff --git "a/test/fast/Running \"nvm uninstall\" should remove the appropriate directory." "b/test/fast/Running \"nvm uninstall\" should remove the appropriate directory." index 0123ab7..5ef1827 100755 --- "a/test/fast/Running \"nvm uninstall\" should remove the appropriate directory." +++ "b/test/fast/Running \"nvm uninstall\" should remove the appropriate directory." @@ -9,4 +9,4 @@ mkdir src/node-v0.0.1 . ./nvm.sh nvm uninstall v0.0.1 -[ ! -d 'v0.0.1' ] && [ ! -d 'src/node-v0.0.1' ] +[ ! -d 'v0.0.1' ] && [ ! -d 'src/node-v0.0.1/files' ] From 57c2004ab24da3ccf10026200a03efae563be8d6 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Thu, 11 Aug 2016 01:45:11 -0700 Subject: [PATCH 04/17] [Breaking] adapt `nvm_install_node_binary` to `nvm_install_binary`, eg, io.js too. - `nvm_get_checksum` now accepts 5 args (from 3): flavor (node/iojs), type (binary/source), version, slug, compression (xz/gz) - `nvm_install_binary` accepts 3 args (from 2): flavor (node/iojs), kind (std), version - remove `nvm_install_iojs_binary` --- nvm.sh | 152 ++++++++++---------------- test/fast/Unit tests/nvm_get_checksum | 24 +++- 2 files changed, 74 insertions(+), 102 deletions(-) diff --git a/nvm.sh b/nvm.sh index ff96d1b..55c963c 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1112,15 +1112,32 @@ nvm_compare_checksum() { nvm_err 'Checksums matched!' } +# args: flavor, type, version, slug, compression nvm_get_checksum() { + local FLAVOR + case "${1-}" in + node | iojs) FLAVOR="${1}" ;; + *) + nvm_err 'supported flavors: node, iojs' + return 2 + ;; + esac + + local MIRROR + MIRROR="$(nvm_get_mirror "${FLAVOR}" "${2-}")" + if [ -z "${MIRROR}" ]; then + return 1 + fi + local SHASUMS_URL if [ "$(nvm_get_checksum_alg)" = 'sha-256' ]; then - SHASUMS_URL="${NVM_NODEJS_ORG_MIRROR}/${1}/SHASUMS256.txt" + SHASUMS_URL="${MIRROR}/${3}/SHASUMS256.txt" else - SHASUMS_URL="${NVM_NODEJS_ORG_MIRROR}/${1}/SHASUMS.txt" + SHASUMS_URL="${MIRROR}/${3}/SHASUMS.txt" fi + nvm_download -L -s "${SHASUMS_URL}" -o - | \ - nvm_grep "${2}.tar.${3}" | \ + nvm_grep "${4}.tar.${5}" | \ command awk '{print $1}' } @@ -1470,23 +1487,29 @@ nvm_get_mirror() { esac } -nvm_install_node_binary() { +# args: flavor, kind, version, reinstall +nvm_install_binary() { + local FLAVOR + case "${1-}" in + node | iojs) FLAVOR="${1}" ;; + *) + nvm_err 'supported flavors: node, iojs' + return 4 + ;; + esac + local MIRROR - MIRROR="$(nvm_get_mirror node "${1}")" + MIRROR="$(nvm_get_mirror node "${2-}")" if [ -z "${MIRROR}" ]; then - return 4 + return 3 fi + local PREFIXED_VERSION + PREFIXED_VERSION="${3-}" local VERSION - VERSION="${2}" - - if nvm_is_iojs_version "${VERSION}"; then - nvm_err 'nvm_install_node_binary does not allow an iojs-prefixed version.' - return 10 - fi + VERSION="$(nvm_strip_iojs_prefix "${PREFIXED_VERSION}")" local VERSION_PATH - VERSION_PATH="$(nvm_version_path "${VERSION}")" if [ -z "$(nvm_get_os)" ]; then return 2 @@ -1502,13 +1525,15 @@ nvm_install_node_binary() { local TMPDIR local VERSION_PATH + TARBALL="$(nvm_download_artifact "${FLAVOR}" binary std "${VERSION}" | command tail -1)" + if [ -f "${TARBALL}" ]; then + TMPDIR="$(dirname "${TARBALL}")/files" + fi if ( - TARBALL="$(nvm_download_artifact node binary std "${VERSION}" | command tail -1)" && \ - [ -f "${TARBALL}" ] && \ - TMPDIR="$(dirname "${TARBALL}")/files" && \ + [ -n "${TMPDIR-}" ] && \ command mkdir -p "${TMPDIR}" && \ command tar -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 && \ - VERSION_PATH="$(nvm_version_path "${VERSION}")" && \ + VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" && \ command mkdir -p "${VERSION_PATH}" && \ command mv "${TMPDIR}/"* "${VERSION_PATH}" && \ command rm -rf "${TMPDIR}" @@ -1517,83 +1542,12 @@ nvm_install_node_binary() { fi nvm_err 'Binary download failed, trying source.' - command rm -rf "${TMPDIR}" + if [ -n "${TMPDIR-}" ]; then + command rm -rf "${TMPDIR}" + fi return 1 } -nvm_install_iojs_binary() { - local NVM_IOJS_TYPE - NVM_IOJS_TYPE="$1" - local MIRROR - if [ "_$NVM_IOJS_TYPE" = "_std" ]; then - MIRROR="$NVM_IOJS_ORG_MIRROR" - else - nvm_err 'unknown type of io.js release' - return 4 - fi - local PREFIXED_VERSION - PREFIXED_VERSION="$2" - - if ! nvm_is_iojs_version "$PREFIXED_VERSION"; then - nvm_err 'nvm_install_iojs_binary requires an iojs-prefixed version.' - return 10 - fi - - local VERSION - VERSION="$(nvm_strip_iojs_prefix "$PREFIXED_VERSION")" - local VERSION_PATH - VERSION_PATH="$(nvm_version_path "$PREFIXED_VERSION")" - local NVM_OS - NVM_OS="$(nvm_get_os)" - local t - local url - local sum - local compression - compression="gz" - local tar_compression_flag - tar_compression_flag="x" - if nvm_supports_xz "$VERSION"; then - compression="xz" - tar_compression_flag="J" - fi - - if [ -n "$NVM_OS" ]; then - if nvm_binary_available "$VERSION"; then - t="$VERSION-$NVM_OS-$(nvm_get_arch)" - url="$MIRROR/$VERSION/$(nvm_iojs_prefix)-${t}.tar.${compression}" - sum="$(nvm_download -L -s "$MIRROR/$VERSION/SHASUMS256.txt" -o - | nvm_grep "$(nvm_iojs_prefix)-${t}.tar.${compression}" | command awk '{print $1}')" - local tmpdir - tmpdir="$NVM_DIR/bin/iojs-${t}" - local tmptarball - tmptarball="$tmpdir/iojs-${t}.tar.${compression}" - local NVM_INSTALL_ERRORED - command mkdir -p "$tmpdir" && \ - nvm_echo "Downloading $url..." && \ - nvm_download -L -C - --progress-bar "$url" -o "$tmptarball" || \ - NVM_INSTALL_ERRORED=true - if nvm_grep '404 Not Found' "$tmptarball" >/dev/null; then - NVM_INSTALL_ERRORED=true - nvm_err "HTTP 404 at URL $url"; - fi - if ( - [ "$NVM_INSTALL_ERRORED" != true ] && \ - nvm_checksum "$tmptarball" "$sum" "sha256" && \ - command tar -x${tar_compression_flag}f "$tmptarball" -C "$tmpdir" --strip-components 1 && \ - command rm -f "$tmptarball" && \ - command mkdir -p "$VERSION_PATH" && \ - command mv "$tmpdir"/* "$VERSION_PATH" - ); then - return 0 - else - nvm_err 'Binary download failed, trying source.' - command rm -rf "$tmptarball" "$tmpdir" - return 1 - fi - fi - fi - return 2 -} - # args: flavor, kind, version nvm_get_download_slug() { local FLAVOR @@ -1655,8 +1609,11 @@ nvm_download_artifact() { ;; esac + local TYPE + TYPE="${3-}" + local MIRROR - MIRROR="$(nvm_get_mirror "${FLAVOR}" "${3-}")" + MIRROR="$(nvm_get_mirror "${FLAVOR}" "${TYPE}")" if [ -z "${MIRROR}" ]; then return 2 fi @@ -1679,7 +1636,7 @@ nvm_download_artifact() { fi local CHECKSUM - CHECKSUM="$(nvm_get_checksum "${VERSION}" "${SLUG}" "${COMPRESSION}")" + CHECKSUM="$(nvm_get_checksum "${FLAVOR}" "${TYPE}" "${VERSION}" "${SLUG}" "${COMPRESSION}")" local tmpdir if [ "${KIND}" = 'binary' ]; then @@ -1703,7 +1660,7 @@ nvm_download_artifact() { fi if nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" >/dev/null 2>&1; then - nvm_err "Checksums match! Using existing downloaded archive ${TARBALL}" + nvm_err "Checksums match! Using existing downloaded archive $(nvm_sanitize_path "${TARBALL}")" else nvm_echo "Downloading ${TARBALL_URL}..." nvm_download -L -C - --progress-bar "${TARBALL_URL}" -o "${TARBALL}" || ( @@ -1800,6 +1757,7 @@ nvm_install_node_source() { local TMPDIR local VERSION_PATH + # shellcheck disable=SC2086 if ( TARBALL="$(nvm_download_artifact node source std "${VERSION}" | command tail -1)" && \ [ -f "${TARBALL}" ] && \ @@ -2289,9 +2247,9 @@ nvm() { local NVM_INSTALL_SUCCESS # skip binary install if "nobinary" option specified. if [ $nobinary -ne 1 ] && nvm_binary_available "$VERSION"; then - if [ "$NVM_IOJS" = true ] && nvm_install_iojs_binary std "$VERSION"; then + if [ "${NVM_IOJS}" = true ] && nvm_install_binary iojs std "${VERSION}"; then NVM_INSTALL_SUCCESS=true - elif [ "$NVM_IOJS" != true ] && nvm_install_node_binary std "$VERSION"; then + elif [ "${NVM_IOJS}" != true ] && nvm_install_binary node std "${VERSION}"; then NVM_INSTALL_SUCCESS=true fi fi @@ -3059,7 +3017,7 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | nvm_grep -v "N/A" | command sed '/^$/d')" nvm_is_iojs_version nvm_is_alias \ nvm_ls_remote nvm_ls_remote_iojs nvm_ls_remote_index_tab \ nvm_ls nvm_remote_version nvm_remote_versions \ - nvm_install_iojs_binary nvm_install_node_binary \ + nvm_install_binary \ nvm_get_mirror nvm_get_download_slug nvm_download_artifact \ nvm_install_node_source nvm_check_file_permissions \ nvm_print_versions nvm_compute_checksum nvm_checksum \ diff --git a/test/fast/Unit tests/nvm_get_checksum b/test/fast/Unit tests/nvm_get_checksum index 9e3816a..1ac8868 100755 --- a/test/fast/Unit tests/nvm_get_checksum +++ b/test/fast/Unit tests/nvm_get_checksum @@ -3,11 +3,25 @@ set -ex cleanup () { - unset -f nvm_download nvm_get_checksum_alg + unset -f nvm_download nvm_get_checksum_alg nvm_get_mirror } die () { echo $@ ; cleanup ; exit 1; } +set +e # TODO: fix . ../../../nvm.sh +set -e + +nvm_get_mirror() { + echo "mirror-${1}-${2}" +} + +set +ex # needed to capture error output +OUTPUT="$(nvm_get_checksum 2>&1 >/dev/null)" +EXPECTED_OUTPUT='supported flavors: node, iojs' +EXIT_CODE="$(nvm_get_checksum >/dev/null 2>&1 ; echo $?)" +set -ex +[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected error output >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" +[ "${EXIT_CODE}" = 2 ] || die "expected exit code 2, got ${EXIT_CODE}" nvm_download() { echo "ERROR_FAILED_MATCH no_match more fields" @@ -17,15 +31,15 @@ nvm_download() { nvm_get_checksum_alg() { echo 'sha-256' } -OUTPUT="$(nvm_get_checksum foo bar baz)" -EXPECTED_OUTPUT="${NVM_NODEJS_ORG_MIRROR}/foo/SHASUMS256.txt" +OUTPUT="$(nvm_get_checksum node std foo bar baz)" +EXPECTED_OUTPUT="mirror-node-std/foo/SHASUMS256.txt" [ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" nvm_get_checksum_alg() { echo 'sha-1' } -OUTPUT="$(nvm_get_checksum foo bar baz)" -EXPECTED_OUTPUT="${NVM_NODEJS_ORG_MIRROR}/foo/SHASUMS.txt" +OUTPUT="$(nvm_get_checksum iojs std foo bar baz)" +EXPECTED_OUTPUT="mirror-iojs-std/foo/SHASUMS.txt" [ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" cleanup From e546149f7b01a5fc3779118d3b8ceaa9d3ab3bfc Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sat, 13 Aug 2016 21:15:12 -0700 Subject: [PATCH 05/17] =?UTF-8?q?[New]=20add=20`nvm=20cache`=20with=20?= =?UTF-8?q?=E2=80=9Cdir=E2=80=9D=20and=20=E2=80=9Cclean=E2=80=9D=20command?= =?UTF-8?q?s.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cache the nvm cache on travis --- .gitignore | 3 +-- .travis.yml | 1 + nvm.sh | 36 ++++++++++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 57f44a7..fc578cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ HEAD -bin -src +.cache v* alias diff --git a/.travis.yml b/.travis.yml index e891e22..7598244 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ addons: cache: directories: - $HOME/.stack + - $TRAVIS_BUILD_DIR/.cache before_install: - $SHELL --version 2> /dev/null || dpkg -s $SHELL 2> /dev/null || which $SHELL - curl --version diff --git a/nvm.sh b/nvm.sh index 55c963c..e10084f 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1640,9 +1640,9 @@ nvm_download_artifact() { local tmpdir if [ "${KIND}" = 'binary' ]; then - tmpdir="${NVM_DIR}/bin/${SLUG}" + tmpdir="$(nvm_cache_dir)/bin/${SLUG}" else - tmpdir="${NVM_DIR}/src/${SLUG}" + tmpdir="$(nvm_cache_dir)/src/${SLUG}" fi command mkdir -p "${tmpdir}/files" || ( nvm_err "creating directory ${tmpdir}/files failed" @@ -1975,6 +1975,10 @@ nvm_check_file_permissions() { return 0 } +nvm_cache_dir() { + nvm_echo "${NVM_DIR}/.cache" +} + nvm() { if [ $# -lt 1 ]; then nvm --help @@ -2043,6 +2047,8 @@ nvm() { nvm_echo ' nvm reinstall-packages Reinstall global `npm` packages contained in to current version' nvm_echo ' nvm unload Unload `nvm` from shell' nvm_echo ' nvm which [] Display path to installed node version. Uses .nvmrc if available' + nvm_echo ' nvm cache dir Display path to the cache directory for nvm' + nvm_echo ' nvm cache clear Empty cache directory for nvm' nvm_echo nvm_echo 'Example:' nvm_echo ' nvm install v0.10.32 Install a specific version number' @@ -2056,6 +2062,26 @@ nvm() { nvm_echo ;; + "cache" ) + case "${1-}" in + dir) nvm_cache_dir ;; + clear) + local DIR + DIR="$(nvm_cache_dir)" + if command rm -rf "${DIR}" && command mkdir -p "${DIR}"; then + nvm_echo 'Cache cleared.' + else + nvm_err "Unable to clear cache: ${DIR}" + return 1 + fi + ;; + *) + >&2 nvm --help + return 127 + ;; + esac + ;; + "debug" ) local ZSH_HAS_SHWORDSPLIT_UNSET ZSH_HAS_SHWORDSPLIT_UNSET=1 @@ -2353,9 +2379,11 @@ nvm() { fi # Delete all files related to target version. + local CACHE_DIR + CACHE_DIR="$(nvm_cache_dir)" command rm -rf \ - "${NVM_DIR}/bin/${SLUG_BINARY}/files" \ - "${NVM_DIR}/src/${SLUG_SOURCE}/files" \ + "${CACHE_DIR}/bin/${SLUG_BINARY}/files" \ + "${CACHE_DIR}/src/${SLUG_SOURCE}/files" \ "${VERSION_PATH}" 2>/dev/null nvm_echo "${NVM_SUCCESS_MSG}" From 9b8eab31633003ed56debb567d990d016182338e Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sun, 25 Jan 2015 12:00:52 -0800 Subject: [PATCH 06/17] [New] Add `nvm install -s iojs` support. --- nvm.sh | 73 ++++++++++++++++++- test/installation_iojs/install from source | 19 +++++ ...ll version specified in .nvmrc from source | 24 ++++++ test/installation_iojs/teardown_dir | 1 + 4 files changed, 114 insertions(+), 3 deletions(-) create mode 100755 test/installation_iojs/install from source create mode 100755 test/installation_iojs/install version specified in .nvmrc from source diff --git a/nvm.sh b/nvm.sh index e10084f..f58b234 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1719,6 +1719,73 @@ nvm_get_make_jobs() { fi } +nvm_install_iojs_source() { + local VERSION + VERSION="$(nvm_strip_iojs_prefix "$1")" + local PREFIXED_VERSION + PREFIXED_VERSION="$(nvm_add_iojs_prefix "$VERSION")" + local ADDITIONAL_PARAMETERS + ADDITIONAL_PARAMETERS="$2" + + local NVM_ARCH + NVM_ARCH="$(nvm_get_arch)" + if [ $NVM_ARCH = "armv6l" ] || [ $NVM_ARCH = "armv7l" ]; then + ADDITIONAL_PARAMETERS="--without-snapshot $ADDITIONAL_PARAMETERS" + fi + + if [ -n "$ADDITIONAL_PARAMETERS" ]; then + echo "Additional options while compiling: $ADDITIONAL_PARAMETERS" + fi + + local VERSION_PATH + VERSION_PATH="$(nvm_version_path "$PREFIXED_VERSION")" + local NVM_OS + NVM_OS="$(nvm_get_os)" + + local tarball + tarball='' + local sum + sum='' + local make + make='make' + if [ "_$NVM_OS" = "_freebsd" ]; then + make='gmake' + MAKE_CXX="CXX=c++" + fi + local tmpdir + tmpdir="$NVM_DIR/src" + local tmptarball + tmptarball="$tmpdir/iojs-$VERSION.tar.gz" + + if [ "`nvm_download -L -s -I "$NVM_IOJS_ORG_MIRROR/$VERSION/iojs-$VERSION.tar.gz" -o - 2>&1 | command grep '200 OK'`" != '' ]; then + tarball="$NVM_IOJS_ORG_MIRROR/$VERSION/iojs-$VERSION.tar.gz" + sum="$(nvm_download -L -s $NVM_IOJS_ORG_MIRROR/$VERSION/SHASUMS256.txt -o - | command grep "iojs-$VERSION.tar.gz" | command awk '{print $1}')" + elif [ "`nvm_download -L -s -I "$NVM_IOJS_ORG_MIRROR/iojs-$VERSION.tar.gz" -o - | command grep '200 OK'`" != '' ]; then + tarball="$NVM_IOJS_ORG_MIRROR/iojs-$VERSION.tar.gz" + fi + + if ( + [ -n "$tarball" ] && \ + command mkdir -p "$tmpdir" && \ + nvm_download -L --progress-bar "$tarball" -o "$tmptarball" && \ + echo "WARNING: checksums are currently disabled for io.js" >&2 && \ + # nvm_checksum "$tmptarball" "$sum" && \ + command tar -xzf "$tmptarball" -C "$tmpdir" && \ + cd "$tmpdir/$PREFIXED_VERSION" && \ + ./configure --prefix="$VERSION_PATH" $ADDITIONAL_PARAMETERS && \ + $make -j $MAKE_CXX && \ + command rm -f "$VERSION_PATH" 2>/dev/null && \ + $make -j $MAKE_CXX install + ); then + return 0 + else + echo "nvm: install $PREFIXED_VERSION from source failed!" >&2 + return 105 + fi + + return $? +} + nvm_install_node_source() { local VERSION VERSION="${1}" @@ -2286,9 +2353,9 @@ nvm() { case "true" in "$NVM_IOJS") - # nvm_install_iojs_source "$VERSION" "$NVM_MAKE_JOBS" "$ADDITIONAL_PARAMETERS" - nvm_err 'Installing iojs from source is not currently supported' - return 105 + if nvm_install_iojs_source "$VERSION" "$NVM_MAKE_JOBS" "$ADDITIONAL_PARAMETERS"; then + NVM_INSTALL_SUCCESS=true + fi ;; "$NVM_NODE_MERGED") # nvm_install_merged_node_source "$VERSION" "$NVM_MAKE_JOBS" "$ADDITIONAL_PARAMETERS" diff --git a/test/installation_iojs/install from source b/test/installation_iojs/install from source new file mode 100755 index 0000000..7b44643 --- /dev/null +++ b/test/installation_iojs/install from source @@ -0,0 +1,19 @@ +#!/bin/sh + +die () { echo $@ ; exit 1; } + +. ../../nvm.sh + +NVM_TEST_VERSION="v1.0.0" +NVM_PREFIXED_TEST_VERSION="iojs-$NVM_TEST_VERSION" + +# Remove the stuff we're clobbering. +[ -e ../../versions/io.js/$NVM_TEST_VERSION ] && rm -R ../../versions/io.js/$NVM_TEST_VERSION + +# Install from source +nvm install -s $NVM_PREFIXED_TEST_VERSION || die "'nvm install -s $NVM_PREFIXED_TEST_VERSION' failed" + +# Check +[ -d ../../versions/io.js/$NVM_TEST_VERSION ] +nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION || "'nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION' failed" + diff --git a/test/installation_iojs/install version specified in .nvmrc from source b/test/installation_iojs/install version specified in .nvmrc from source new file mode 100755 index 0000000..d17a6bb --- /dev/null +++ b/test/installation_iojs/install version specified in .nvmrc from source @@ -0,0 +1,24 @@ +#!/bin/sh + +die () { echo $@ ; exit 1; } + +. ../../nvm.sh + +NVM_TEST_VERSION=v1.0.3 +NVM_PREFIXED_TEST_VERSION="iojs-$NVM_TEST_VERSION" +VERSION_PATH="../../versions/io.js/$NVM_TEST_VERSION" + +# Remove the stuff we're clobbering. +[ -e "$VERSION_PATH" ] && rm -R "$VERSION_PATH" + +# Install from binary +echo "$NVM_PREFIXED_TEST_VERSION" > .nvmrc + +nvm install -s || "'nvm install -s' failed" + +# Check +[ -d "$VERSION_PATH" ] || die "$VERSION_PATH did not exist" +nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION \ + || die "'nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION' failed" + + diff --git a/test/installation_iojs/teardown_dir b/test/installation_iojs/teardown_dir index 9f6d025..d45c66a 100755 --- a/test/installation_iojs/teardown_dir +++ b/test/installation_iojs/teardown_dir @@ -3,6 +3,7 @@ . ../../nvm.sh nvm deactivate nvm uninstall iojs-v1.0.0 +nvm uninstall iojs-v1.0.3 if [ -f ".nvmrc" ]; then rm .nvmrc From 715bb59c3b5021bbfa6e098ff7ef68e3a602528a Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Mon, 28 Dec 2015 12:52:11 -0800 Subject: [PATCH 07/17] Adapt `nvm_install_iojs_source` to support specifying `make` jobs. --- nvm.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/nvm.sh b/nvm.sh index f58b234..faf8ac7 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1724,8 +1724,10 @@ nvm_install_iojs_source() { VERSION="$(nvm_strip_iojs_prefix "$1")" local PREFIXED_VERSION PREFIXED_VERSION="$(nvm_add_iojs_prefix "$VERSION")" + local NVM_MAKE_JOBS + NVM_MAKE_JOBS="$2" local ADDITIONAL_PARAMETERS - ADDITIONAL_PARAMETERS="$2" + ADDITIONAL_PARAMETERS="$3" local NVM_ARCH NVM_ARCH="$(nvm_get_arch)" @@ -1773,9 +1775,9 @@ nvm_install_iojs_source() { command tar -xzf "$tmptarball" -C "$tmpdir" && \ cd "$tmpdir/$PREFIXED_VERSION" && \ ./configure --prefix="$VERSION_PATH" $ADDITIONAL_PARAMETERS && \ - $make -j $MAKE_CXX && \ + $make -j $NVM_MAKE_JOBS ${MAKE_CXX-} && \ command rm -f "$VERSION_PATH" 2>/dev/null && \ - $make -j $MAKE_CXX install + $make -j $NVM_MAKE_JOBS ${MAKE_CXX-} install ); then return 0 else From 4060de52852fc93d69bf68f6a62b23f5a4499d6c Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Thu, 11 Aug 2016 23:19:47 -0700 Subject: [PATCH 08/17] [New] enable io.js and node 4+ source installs. - consolidate `nvm_install_iojs_source` and `nvm_install_node_source` into `nvm_install_source` --- nvm.sh | 132 ++++++++++++++------------------------------------------- 1 file changed, 32 insertions(+), 100 deletions(-) diff --git a/nvm.sh b/nvm.sh index faf8ac7..383b0b7 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1719,82 +1719,30 @@ nvm_get_make_jobs() { fi } -nvm_install_iojs_source() { - local VERSION - VERSION="$(nvm_strip_iojs_prefix "$1")" +# args: flavor, type, version, make jobs, additional +nvm_install_source() { + local FLAVOR + case "${1-}" in + node | iojs) FLAVOR="${1}" ;; + *) + nvm_err 'supported flavors: node, iojs' + return 4 + ;; + esac + + local TYPE + TYPE="${2-}" + local PREFIXED_VERSION - PREFIXED_VERSION="$(nvm_add_iojs_prefix "$VERSION")" - local NVM_MAKE_JOBS - NVM_MAKE_JOBS="$2" - local ADDITIONAL_PARAMETERS - ADDITIONAL_PARAMETERS="$3" - - local NVM_ARCH - NVM_ARCH="$(nvm_get_arch)" - if [ $NVM_ARCH = "armv6l" ] || [ $NVM_ARCH = "armv7l" ]; then - ADDITIONAL_PARAMETERS="--without-snapshot $ADDITIONAL_PARAMETERS" - fi - - if [ -n "$ADDITIONAL_PARAMETERS" ]; then - echo "Additional options while compiling: $ADDITIONAL_PARAMETERS" - fi - - local VERSION_PATH - VERSION_PATH="$(nvm_version_path "$PREFIXED_VERSION")" - local NVM_OS - NVM_OS="$(nvm_get_os)" - - local tarball - tarball='' - local sum - sum='' - local make - make='make' - if [ "_$NVM_OS" = "_freebsd" ]; then - make='gmake' - MAKE_CXX="CXX=c++" - fi - local tmpdir - tmpdir="$NVM_DIR/src" - local tmptarball - tmptarball="$tmpdir/iojs-$VERSION.tar.gz" - - if [ "`nvm_download -L -s -I "$NVM_IOJS_ORG_MIRROR/$VERSION/iojs-$VERSION.tar.gz" -o - 2>&1 | command grep '200 OK'`" != '' ]; then - tarball="$NVM_IOJS_ORG_MIRROR/$VERSION/iojs-$VERSION.tar.gz" - sum="$(nvm_download -L -s $NVM_IOJS_ORG_MIRROR/$VERSION/SHASUMS256.txt -o - | command grep "iojs-$VERSION.tar.gz" | command awk '{print $1}')" - elif [ "`nvm_download -L -s -I "$NVM_IOJS_ORG_MIRROR/iojs-$VERSION.tar.gz" -o - | command grep '200 OK'`" != '' ]; then - tarball="$NVM_IOJS_ORG_MIRROR/iojs-$VERSION.tar.gz" - fi - - if ( - [ -n "$tarball" ] && \ - command mkdir -p "$tmpdir" && \ - nvm_download -L --progress-bar "$tarball" -o "$tmptarball" && \ - echo "WARNING: checksums are currently disabled for io.js" >&2 && \ - # nvm_checksum "$tmptarball" "$sum" && \ - command tar -xzf "$tmptarball" -C "$tmpdir" && \ - cd "$tmpdir/$PREFIXED_VERSION" && \ - ./configure --prefix="$VERSION_PATH" $ADDITIONAL_PARAMETERS && \ - $make -j $NVM_MAKE_JOBS ${MAKE_CXX-} && \ - command rm -f "$VERSION_PATH" 2>/dev/null && \ - $make -j $NVM_MAKE_JOBS ${MAKE_CXX-} install - ); then - return 0 - else - echo "nvm: install $PREFIXED_VERSION from source failed!" >&2 - return 105 - fi - - return $? -} - -nvm_install_node_source() { + PREFIXED_VERSION="${3-}" local VERSION - VERSION="${1}" + VERSION="$(nvm_strip_iojs_prefix "${PREFIXED_VERSION}")" + local NVM_MAKE_JOBS - NVM_MAKE_JOBS="${2}" + NVM_MAKE_JOBS="${4-}" + local ADDITIONAL_PARAMETERS - ADDITIONAL_PARAMETERS="${3}" + ADDITIONAL_PARAMETERS="${5-}" local NVM_ARCH NVM_ARCH="$(nvm_get_arch)" @@ -1828,12 +1776,12 @@ nvm_install_node_source() { # shellcheck disable=SC2086 if ( - TARBALL="$(nvm_download_artifact node source std "${VERSION}" | command tail -1)" && \ + TARBALL="$(nvm_download_artifact "${FLAVOR}" source "${TYPE}" "${VERSION}" | command tail -1)" && \ [ -f "${TARBALL}" ] && \ TMPDIR="$(dirname "${TARBALL}")/files" && \ command mkdir -p "${TMPDIR}" && \ command tar -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 && \ - VERSION_PATH="$(nvm_version_path "${VERSION}")" && \ + VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" && \ cd "${TMPDIR}" && \ ./configure --prefix="${VERSION_PATH}" $ADDITIONAL_PARAMETERS && \ $make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} && \ @@ -2307,12 +2255,11 @@ nvm() { return 5 fi - local NVM_NODE_MERGED - local NVM_IOJS + local FLAVOR if nvm_is_iojs_version "$VERSION"; then - NVM_IOJS=true - elif nvm_is_merged_node_version "$VERSION"; then - NVM_NODE_MERGED=true + FLAVOR="$(nvm_iojs_prefix)" + else + FLAVOR="$(nvm_node_prefix)" fi if nvm_is_version_installed "$VERSION"; then @@ -2339,12 +2286,11 @@ nvm() { nvm_err "Currently, there is no binary of version $VERSION for $NVM_OS" fi fi + local NVM_INSTALL_SUCCESS # skip binary install if "nobinary" option specified. if [ $nobinary -ne 1 ] && nvm_binary_available "$VERSION"; then - if [ "${NVM_IOJS}" = true ] && nvm_install_binary iojs std "${VERSION}"; then - NVM_INSTALL_SUCCESS=true - elif [ "${NVM_IOJS}" != true ] && nvm_install_binary node std "${VERSION}"; then + if nvm_install_binary "${FLAVOR}" std "${VERSION}"; then NVM_INSTALL_SUCCESS=true fi fi @@ -2353,23 +2299,9 @@ nvm() { nvm_get_make_jobs fi - case "true" in - "$NVM_IOJS") - if nvm_install_iojs_source "$VERSION" "$NVM_MAKE_JOBS" "$ADDITIONAL_PARAMETERS"; then - NVM_INSTALL_SUCCESS=true - fi - ;; - "$NVM_NODE_MERGED") - # nvm_install_merged_node_source "$VERSION" "$NVM_MAKE_JOBS" "$ADDITIONAL_PARAMETERS" - nvm_err 'Installing node v1.0 and greater from source is not currently supported' - return 106 - ;; - *) - if nvm_install_node_source "$VERSION" "$NVM_MAKE_JOBS" "$ADDITIONAL_PARAMETERS"; then - NVM_INSTALL_SUCCESS=true - fi - ;; - esac + if nvm_install_source "${FLAVOR}" std "${VERSION}" "${NVM_MAKE_JOBS}" "${ADDITIONAL_PARAMETERS}"; then + NVM_INSTALL_SUCCESS=true + fi fi if [ "$NVM_INSTALL_SUCCESS" = true ] && nvm use "$VERSION"; then @@ -3116,7 +3048,7 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | nvm_grep -v "N/A" | command sed '/^$/d')" nvm_ls nvm_remote_version nvm_remote_versions \ nvm_install_binary \ nvm_get_mirror nvm_get_download_slug nvm_download_artifact \ - nvm_install_node_source nvm_check_file_permissions \ + nvm_install_source nvm_check_file_permissions \ nvm_print_versions nvm_compute_checksum nvm_checksum \ nvm_get_checksum_alg nvm_get_checksum nvm_compare_checksum \ nvm_version nvm_rc_version nvm_match_version \ From 88ce2103f5f56de992e06a06b70b3ea94d20fb68 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Thu, 26 May 2016 08:48:15 +0200 Subject: [PATCH 09/17] Use `watch` to keepalive stdout while installing. --- test/common.sh | 12 ++++++++++++ test/installation_iojs/install from source | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/test/common.sh b/test/common.sh index 033817c..98be7b3 100644 --- a/test/common.sh +++ b/test/common.sh @@ -63,3 +63,15 @@ make_fake_iojs() { return 3 } } + +watch() { + $@ & + local JOB + JOB=$! + while true; do sleep 15; echo '* ping *'; done & + wait $JOB; + local EXIT_CODE + EXIT_CODE=$? + kill %2; + return $EXIT_CODE +} diff --git a/test/installation_iojs/install from source b/test/installation_iojs/install from source index 7b44643..5496b2c 100755 --- a/test/installation_iojs/install from source +++ b/test/installation_iojs/install from source @@ -1,5 +1,7 @@ #!/bin/sh +. ../common.sh + die () { echo $@ ; exit 1; } . ../../nvm.sh @@ -11,7 +13,7 @@ NVM_PREFIXED_TEST_VERSION="iojs-$NVM_TEST_VERSION" [ -e ../../versions/io.js/$NVM_TEST_VERSION ] && rm -R ../../versions/io.js/$NVM_TEST_VERSION # Install from source -nvm install -s $NVM_PREFIXED_TEST_VERSION || die "'nvm install -s $NVM_PREFIXED_TEST_VERSION' failed" +(watch nvm install -s $NVM_PREFIXED_TEST_VERSION) || die "'nvm install -s $NVM_PREFIXED_TEST_VERSION' failed" # Check [ -d ../../versions/io.js/$NVM_TEST_VERSION ] From 32a1b4124cbc31492db7dfd4faca1968af88edd5 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sun, 14 Aug 2016 15:40:39 -0700 Subject: [PATCH 10/17] Use `watch` to keepalive stdout while installing. --- test/common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/common.sh b/test/common.sh index 98be7b3..095c1a8 100644 --- a/test/common.sh +++ b/test/common.sh @@ -68,7 +68,7 @@ watch() { $@ & local JOB JOB=$! - while true; do sleep 15; echo '* ping *'; done & + while true; do sleep 15; >&2 echo '* ping *'; done & wait $JOB; local EXIT_CODE EXIT_CODE=$? From adb6a187a939bca6deb3436066f9ba07a4f09ebe Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sun, 14 Aug 2016 19:43:47 -0700 Subject: [PATCH 11/17] [Tests] try v3.3 instead of v1 in hopes they will compile faster. --- test/installation_iojs/install from source | 15 ++++++++------- ...ll version specified in .nvmrc from source | 19 +++++++++---------- test/installation_iojs/teardown_dir | 2 ++ 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/test/installation_iojs/install from source b/test/installation_iojs/install from source index 5496b2c..354de49 100755 --- a/test/installation_iojs/install from source +++ b/test/installation_iojs/install from source @@ -6,16 +6,17 @@ die () { echo $@ ; exit 1; } . ../../nvm.sh -NVM_TEST_VERSION="v1.0.0" -NVM_PREFIXED_TEST_VERSION="iojs-$NVM_TEST_VERSION" +set -ex + +NVM_TEST_VERSION='v3.3.1' +NVM_PREFIXED_TEST_VERSION="iojs-${NVM_TEST_VERSION}" # Remove the stuff we're clobbering. -[ -e ../../versions/io.js/$NVM_TEST_VERSION ] && rm -R ../../versions/io.js/$NVM_TEST_VERSION +nvm uninstall "${NVM_TEST_VERSION}" || echo 'not installed' # Install from source -(watch nvm install -s $NVM_PREFIXED_TEST_VERSION) || die "'nvm install -s $NVM_PREFIXED_TEST_VERSION' failed" +(watch nvm install -s "${NVM_PREFIXED_TEST_VERSION}") || die "'nvm install -s ${NVM_PREFIXED_TEST_VERSION}' failed" # Check -[ -d ../../versions/io.js/$NVM_TEST_VERSION ] -nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION || "'nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION' failed" - +nvm_is_version_installed "${NVM_PREFIXED_TEST_VERSION}" || die 'version not installed' +nvm run "${NVM_PREFIXED_TEST_VERSION}" --version | grep "${NVM_TEST_VERSION}" || "'nvm run ${NVM_PREFIXED_TEST_VERSION} --version | grep ${NVM_TEST_VERSION}' failed" diff --git a/test/installation_iojs/install version specified in .nvmrc from source b/test/installation_iojs/install version specified in .nvmrc from source index d17a6bb..df3f46c 100755 --- a/test/installation_iojs/install version specified in .nvmrc from source +++ b/test/installation_iojs/install version specified in .nvmrc from source @@ -4,21 +4,20 @@ die () { echo $@ ; exit 1; } . ../../nvm.sh -NVM_TEST_VERSION=v1.0.3 -NVM_PREFIXED_TEST_VERSION="iojs-$NVM_TEST_VERSION" -VERSION_PATH="../../versions/io.js/$NVM_TEST_VERSION" +set -ex + +NVM_TEST_VERSION='v3.3.0' +NVM_PREFIXED_TEST_VERSION="iojs-${NVM_TEST_VERSION}" # Remove the stuff we're clobbering. -[ -e "$VERSION_PATH" ] && rm -R "$VERSION_PATH" +nvm uninstall "${NVM_TEST_VERSION}" || echo 'not installed' # Install from binary -echo "$NVM_PREFIXED_TEST_VERSION" > .nvmrc +echo "${NVM_PREFIXED_TEST_VERSION}" > .nvmrc nvm install -s || "'nvm install -s' failed" # Check -[ -d "$VERSION_PATH" ] || die "$VERSION_PATH did not exist" -nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION \ - || die "'nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION' failed" - - +nvm_is_version_installed "${NVM_PREFIXED_TEST_VERSION}" || die 'version is not installed' +nvm run "${NVM_PREFIXED_TEST_VERSION}" --version | grep "${NVM_TEST_VERSION}" \ + || die "'nvm run ${NVM_PREFIXED_TEST_VERSION} --version | grep ${NVM_TEST_VERSION}' failed" diff --git a/test/installation_iojs/teardown_dir b/test/installation_iojs/teardown_dir index d45c66a..295db62 100755 --- a/test/installation_iojs/teardown_dir +++ b/test/installation_iojs/teardown_dir @@ -4,6 +4,8 @@ nvm deactivate nvm uninstall iojs-v1.0.0 nvm uninstall iojs-v1.0.3 +nvm uninstall iojs-v3.3.0 +nvm uninstall iojs-v3.3.1 if [ -f ".nvmrc" ]; then rm .nvmrc From 494aa60bd805633394e40151ac2fad28e70eb506 Mon Sep 17 00:00:00 2001 From: Myles Borins Date: Mon, 28 Dec 2015 15:38:42 -0800 Subject: [PATCH 12/17] travis: enable trusty beta --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7598244..d511d72 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: generic +sudo: required +dist: trusty addons: apt_packages: - zsh From 62696cb0d635a07306c9f8ef8c10cb9867439e3e Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sun, 8 May 2016 22:33:39 -0700 Subject: [PATCH 13/17] Partially revert 494aa60bd805633394e40151ac2fad28e70eb506 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d511d72..fbf3db5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: generic sudo: required -dist: trusty addons: apt_packages: - zsh From f178a09d89fea6caf05ead9c99df89a397ca6299 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Mon, 15 Aug 2016 12:55:49 -0700 Subject: [PATCH 14/17] [Tests] update gcc to 4.8 --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index fbf3db5..80dbc99 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,9 @@ cache: - $HOME/.stack - $TRAVIS_BUILD_DIR/.cache before_install: + - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + - sudo apt-get update -q + - sudo apt-get install gcc-4.8 -y - $SHELL --version 2> /dev/null || dpkg -s $SHELL 2> /dev/null || which $SHELL - curl --version - wget --version From c7515bf108737a0db54daa90103ca58b5c30a045 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Mon, 15 Aug 2016 12:58:51 -0700 Subject: [PATCH 15/17] [Tests] trying an alternative syntax for gcc upgrades --- .travis.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 80dbc99..2b9ba00 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,20 @@ language: generic sudo: required addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.8 + - g++-4.8 apt_packages: - - zsh - - ksh + - zsh + - ksh cache: directories: - $HOME/.stack - $TRAVIS_BUILD_DIR/.cache before_install: - - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - - sudo apt-get update -q - - sudo apt-get install gcc-4.8 -y - $SHELL --version 2> /dev/null || dpkg -s $SHELL 2> /dev/null || which $SHELL - curl --version - wget --version From a5d7ff7440468b76efb6188a5b3b1c73fd2302c5 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Mon, 15 Aug 2016 14:45:42 -0700 Subject: [PATCH 16/17] [Tests] explicitly set `$CXX` and `$CC` --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2b9ba00..8a02d11 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,8 @@ install: - chmod +x /tmp/urchin/package/urchin - '[ -z "$WITHOUT_CURL" ] || sudo apt-get remove curl -y' script: + - export CXX=g++-4.8 + - export CC=gcc-4.8 - export PATH=$(echo $PATH | sed 's/::/:/') - export NVM_DIR="${TRAVIS_BUILD_DIR}" - if [ -n "${SHELLCHECK-}" ]; then shellcheck -s bash nvm.sh && shellcheck -s sh nvm.sh && shellcheck -s dash nvm.sh && shellcheck -s ksh nvm.sh && shellcheck -s bash install.sh ; fi From d5f1d4530fcbdc9dd4c388840704a4a7081740ab Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Sun, 21 Aug 2016 22:52:54 -0700 Subject: [PATCH 17/17] [Tests] `chmod a-x` on io.js source tests, for now. TODO: fix. --- test/installation_iojs/install from source | 0 .../install version specified in .nvmrc from source | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 test/installation_iojs/install from source mode change 100755 => 100644 test/installation_iojs/install version specified in .nvmrc from source diff --git a/test/installation_iojs/install from source b/test/installation_iojs/install from source old mode 100755 new mode 100644 diff --git a/test/installation_iojs/install version specified in .nvmrc from source b/test/installation_iojs/install version specified in .nvmrc from source old mode 100755 new mode 100644