diff --git a/.github/workflows/nvm-install-test.yml b/.github/workflows/nvm-install-test.yml new file mode 100644 index 0000000..32ca8aa --- /dev/null +++ b/.github/workflows/nvm-install-test.yml @@ -0,0 +1,98 @@ +name: 'Tests: nvm install with set -e' + +on: + pull_request: + push: + workflow_dispatch: + inputs: + ref: + description: 'git ref to use' + required: false + default: 'HEAD' + +jobs: + matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - id: matrix + run: | + if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ -n "${{ github.event.inputs.ref }}" ]; then + echo "matrix=\"[\"${{ github.event.inputs.ref }}\"]\"" >> $GITHUB_OUTPUT + else + TAGS="$((echo "HEAD" && git tag --sort=-v:refname --merged HEAD --format='%(refname:strip=2) %(creatordate:short)' | grep '^v' | while read tag date; do + if [ "$(uname)" == "Darwin" ]; then + timestamp=$(date -j -f "%Y-%m-%d" "$date" +%s) + threshold=$(date -j -v-4y +%s) + else + timestamp=$(date -d "$date" +%s) + threshold=$(date -d "4 years ago" +%s) + fi + if [ $timestamp -ge $threshold ]; then echo "$tag"; fi + done) | xargs)" + echo $TAGS + TAGS_JSON=$(printf "%s\n" $TAGS | jq -R . | jq -sc .) + echo "matrix=${TAGS_JSON}" >> $GITHUB_OUTPUT + fi + + test: + needs: [matrix] + runs-on: ubuntu-latest + continue-on-error: ${{ matrix.ref == 'v0.40.0' }} # https://github.com/nvm-sh/nvm/issues/3405 + strategy: + fail-fast: false + matrix: + ref: ${{ fromJson(needs.matrix.outputs.matrix) }} + has-nvmrc: + - 'no nvmrc' + - 'nvmrc' + shell-level: + - 1 shlvl + - 2 shlvls + + steps: + - uses: actions/checkout@v4 + - name: resolve HEAD to sha + run: | + if [ '${{ matrix.ref }}' = 'HEAD' ]; then + REF="$(git rev-parse HEAD)" + else + REF="${{ matrix.ref }}" + fi + echo "resolved ref: ${REF}" + echo "ref="$REF"" >> $GITHUB_ENV + - run: echo $- # which options are set + - run: echo node > .nvmrc + if: ${{ matrix.has-nvmrc == 'nvmrc' }} + - run: curl -I --compressed -v https://nodejs.org/dist/ + - name: 'install nvm' + run: | + set -e + curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/${ref}/install.sh" | bash + - name: nvm install in 1 shell level, ${{ matrix.has-nvmrc }} + if: ${{ matrix.shell-level == '1 shlvl' }} + run: | + set -e && source ~/.nvm/nvm.sh + echo nvm.sh sourced + nvm --version + if [ '${{ matrix.has-nvmrc }}' == 'nvmrc' ]; then + nvm install + fi + - name: nvm install in 2 shell levels, ${{ matrix.has-nvmrc }} + if: ${{ matrix.shell-level == '2 shlvls' }} + run: | + if [ '${{ matrix.has-nvmrc }}' == 'nvmrc' ]; then + bash -c "set -e && source ~/.nvm/nvm.sh && echo nvm.sh sourced && nvm --version && nvm install" + else + bash -c "set -e && source ~/.nvm/nvm.sh && echo nvm.sh sourced && nvm --version" + fi + + finisher: + runs-on: ubuntu-latest + needs: [test] + steps: + - run: true diff --git a/nvm.sh b/nvm.sh index 8c410df..9e9792a 100755 --- a/nvm.sh +++ b/nvm.sh @@ -3360,6 +3360,10 @@ nvm() { shift ;; --save | -w) + if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then + nvm_err '--save and -w may only be provided once' + return 6 + fi NVM_WRITE_TO_NVMRC=1 shift ;; @@ -3511,6 +3515,11 @@ nvm() { nvm_ensure_default_set "${provided_version}" fi + if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then + nvm_write_nvmrc "${VERSION}" + EXIT_CODE=$? + fi + if [ $EXIT_CODE -ne 0 ] && [ -n "${ALIAS-}" ]; then nvm alias "${ALIAS}" "${provided_version}" EXIT_CODE=$? @@ -3746,6 +3755,8 @@ nvm() { local NVM_LTS local IS_VERSION_FROM_NVMRC IS_VERSION_FROM_NVMRC=0 + local NVM_WRITE_TO_NVMRC + NVM_WRITE_TO_NVMRC=0 while [ $# -ne 0 ]; do case "$1" in @@ -3757,7 +3768,13 @@ nvm() { --) ;; --lts) NVM_LTS='*' ;; --lts=*) NVM_LTS="${1##--lts=}" ;; - --save | -w) NVM_WRITE_TO_NVMRC=1 ;; + --save | -w) + if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then + nvm_err '--save and -w may only be provided once' + return 6 + fi + NVM_WRITE_TO_NVMRC=1 + ;; --*) ;; *) if [ -n "${1-}" ]; then @@ -3791,8 +3808,8 @@ nvm() { return 127 fi - if [ "${NVM_WRITE_TO_NVMRC:-0}" -eq 1 ]; then - nvm_write_nvmrc "$VERSION" + if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then + nvm_write_nvmrc "${VERSION}" fi if [ "_${VERSION}" = '_system' ]; then @@ -4539,31 +4556,41 @@ nvm_supports_xz() { nvm_auto() { local NVM_MODE NVM_MODE="${1-}" - local VERSION - local NVM_CURRENT - if [ "_${NVM_MODE}" = '_install' ]; then - VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)" - if [ -n "${VERSION}" ] && ! [ "_${VERSION}" = '_N/A' ] && nvm_is_valid_version "${VERSION}"; then - nvm install "${VERSION}" >/dev/null - elif nvm_rc_version >/dev/null 2>&1; then - nvm install >/dev/null - fi - elif [ "_$NVM_MODE" = '_use' ]; then - NVM_CURRENT="$(nvm_ls_current)" - if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then - VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)" - if [ -n "${VERSION}" ] && ! [ "_${VERSION}" = '_N/A' ] && nvm_is_valid_version "${VERSION}"; then - nvm use --silent "${VERSION}" >/dev/null - elif nvm_rc_version >/dev/null 2>&1; then - nvm use --silent >/dev/null + + case "${NVM_MODE}" in + none) return 0 ;; + use | install) + local VERSION + local NVM_CURRENT + NVM_CURRENT="$(nvm_ls_current)" + if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then + VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)" + if [ -n "${VERSION}" ]; then + if [ "_${VERSION}" != '_N/A' ] && nvm_is_valid_version "${VERSION}"; then + if [ "_${NVM_MODE}" = '_install' ]; then + nvm install "${VERSION}" >/dev/null + else + nvm use --silent "${VERSION}" >/dev/null + fi + else + return 0 + fi + elif nvm_rc_version >/dev/null 2>&1; then + if [ "_${NVM_MODE}" = '_install' ]; then + nvm install >/dev/null + else + nvm use --silent >/dev/null + fi + fi + else + nvm use --silent "${NVM_CURRENT}" >/dev/null fi - else - nvm use --silent "${NVM_CURRENT}" >/dev/null - fi - elif [ "_${NVM_MODE}" != '_none' ]; then - nvm_err 'Invalid auto mode supplied.' - return 1 - fi + ;; + *) + nvm_err 'Invalid auto mode supplied.' + return 1 + ;; + esac } nvm_process_parameters() {