Compare commits

...

10 Commits

Author SHA1 Message Date
Martin
f439acda4a
[New] nvm use/nvm install: add --save option
Fixes #2849.

Co-authored-by: Martin <maartin00000@gmail.com>
Co-authored-by: Jordan Harband <ljharb@gmail.com>
2022-08-29 16:01:36 +01:00
Ally Summers
dd89af53f5
[patch] Fix issue where zsh global aliases would break nvm help
Fix issue with the color codes in the nvm help text where zsh global aliases would display an inline error in the nvm help text.
2024-07-26 03:35:55 +10:00
David Welch
bd090ef7f8
[New] Add support for NVM_AUTH_HEADER env var
Closes #3366

Co-authored-by: David Welch <david@davidwelch.co>
Co-authored-by: Andre Kradolfer <narfdre@gmail.com>
2024-06-21 08:55:22 -06:00
Jordan Harband
4c7d899447
[Tests] ignore travis-ci env vars; improve debug output 2024-07-26 12:04:07 -07:00
Andre Kradolfer
80cb39d712
[debug] adding logging to makefile 2024-07-22 14:07:07 -06:00
Jordan Harband
93277112ae
[Fix] install-latest-npm: npm ^8.7 breaks npm ls with file: deps 2024-07-26 09:16:03 -07:00
Jordan Harband
762f9ef9d1
[Tests] only install python 2.7 if not already installed
See ee6f7667 / #3067
2024-07-06 10:29:55 -05:00
Jordan Harband
e597bb208e
[Tests] use a better JSON parsing implementation 2024-06-10 11:33:12 -07:00
Jordan Harband
aa427ad396
[Tests] ensure travis can access public repo submodules 2024-06-10 09:15:16 -07:00
Jordan Harband
c20db2ab86
[actions] improve default action permissions 2024-06-10 08:59:48 -07:00
24 changed files with 568 additions and 140 deletions

View File

@ -8,6 +8,7 @@ test/bak
.urchin.log .urchin.log
.urchin_stdout .urchin_stdout
test/**/test_output test/**/test_output
test/**/.nvmrc
node_modules/ node_modules/
npm-debug.log npm-debug.log

View File

@ -2,6 +2,9 @@ name: 'Tests: `nvm install-latest-npm`'
on: [pull_request, push] on: [pull_request, push]
permissions:
contents: read
jobs: jobs:
matrix: matrix:
runs-on: ubuntu-latest runs-on: ubuntu-latest

View File

@ -2,10 +2,11 @@ name: 'Tests: linting'
on: [pull_request, push] on: [pull_request, push]
permissions:
contents: read
jobs: jobs:
eclint: eclint:
permissions:
contents: read
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: step-security/harden-runner@v2 - uses: step-security/harden-runner@v2
@ -23,8 +24,6 @@ jobs:
- run: npm run eclint - run: npm run eclint
dockerfile_lint: dockerfile_lint:
permissions:
contents: read
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: step-security/harden-runner@v2 - uses: step-security/harden-runner@v2
@ -44,8 +43,6 @@ jobs:
- run: npm run dockerfile_lint - run: npm run dockerfile_lint
doctoc: doctoc:
permissions:
contents: read
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: step-security/harden-runner@v2 - uses: step-security/harden-runner@v2
@ -63,8 +60,6 @@ jobs:
- run: npm run doctoc:check - run: npm run doctoc:check
test_naming: test_naming:
permissions:
contents: read
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: step-security/harden-runner@v2 - uses: step-security/harden-runner@v2

View File

@ -2,6 +2,9 @@ name: Automatic Rebase
on: [pull_request_target] on: [pull_request_target]
permissions:
contents: read
jobs: jobs:
_: _:
permissions: permissions:

View File

@ -2,10 +2,11 @@ name: 'Tests: release process'
on: [pull_request, push] on: [pull_request, push]
permissions:
contents: read
jobs: jobs:
release: release:
permissions:
contents: read
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner

View File

@ -2,6 +2,9 @@ name: Require “Allow Edits”
on: [pull_request_target] on: [pull_request_target]
permissions:
contents: read
jobs: jobs:
_: _:
permissions: permissions:

View File

@ -2,10 +2,11 @@ name: 'Tests: shellcheck'
on: [pull_request, push] on: [pull_request, push]
permissions:
contents: read
jobs: jobs:
shellcheck_matrix: shellcheck_matrix:
permissions:
contents: read
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
@ -52,8 +53,4 @@ jobs:
needs: [shellcheck_matrix] needs: [shellcheck_matrix]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner
uses: step-security/harden-runner@v2
with:
egress-policy: block
- run: true - run: true

View File

@ -2,6 +2,9 @@ name: urchin tests
on: [push] on: [push]
permissions:
contents: read
jobs: jobs:
tests: tests:
permissions: permissions:
@ -49,6 +52,8 @@ jobs:
- run: make TERM=xterm-256color TEST_SUITE="${{ matrix.suite }}" SHELL="${{ matrix.shell }}" URCHIN="$(npx which urchin)" test-${{ matrix.shell }} - run: make TERM=xterm-256color TEST_SUITE="${{ matrix.suite }}" SHELL="${{ matrix.shell }}" URCHIN="$(npx which urchin)" test-${{ matrix.shell }}
nvm: nvm:
permissions:
contents: none
name: 'all test suites, all shells' name: 'all test suites, all shells'
needs: [tests] needs: [tests]
runs-on: ubuntu-latest runs-on: ubuntu-latest

View File

@ -2,6 +2,9 @@ name: update readme TOC
on: [push] on: [push]
permissions:
contents: read
jobs: jobs:
_: _:
permissions: permissions:

View File

@ -2,6 +2,9 @@ name: 'Tests on Windows: `nvm install`'
on: [pull_request, push] on: [pull_request, push]
permissions:
contents: read
env: env:
NVM_INSTALL_GITHUB_REPO: ${{ github.repository }} NVM_INSTALL_GITHUB_REPO: ${{ github.repository }}
NVM_INSTALL_VERSION: ${{ github.sha }} NVM_INSTALL_VERSION: ${{ github.sha }}

1
.gitignore vendored
View File

@ -9,6 +9,7 @@ test/bak
.urchin.log .urchin.log
.urchin_stdout .urchin_stdout
test/**/test_output test/**/test_output
test/**/.nvmrc
node_modules/ node_modules/
npm-debug.log npm-debug.log

View File

@ -8,6 +8,10 @@ addons:
# - gcc-4.8 # - gcc-4.8
# - g++-4.8 # - g++-4.8
# https://gist.github.com/iedemam/9830045
git:
submodules: false
cache: cache:
ccache: true ccache: true
directories: directories:
@ -16,6 +20,11 @@ cache:
before_install: before_install:
- sudo sed -i 's/mozilla\/DST_Root_CA_X3.crt/!mozilla\/DST_Root_CA_X3.crt/g' /etc/ca-certificates.conf - sudo sed -i 's/mozilla\/DST_Root_CA_X3.crt/!mozilla\/DST_Root_CA_X3.crt/g' /etc/ca-certificates.conf
- sudo update-ca-certificates -f - sudo update-ca-certificates -f
# https://gist.github.com/iedemam/9830045
- sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
- git submodule update --init --recursive
- $SHELL --version 2> /dev/null || dpkg -s $SHELL 2> /dev/null || which $SHELL - $SHELL --version 2> /dev/null || dpkg -s $SHELL 2> /dev/null || which $SHELL
- curl --version - curl --version
- wget --version - wget --version
@ -23,7 +32,7 @@ before_install:
- zsh --version - zsh --version
- dpkg -s dash | grep ^Version | awk '{print $2}' - dpkg -s dash | grep ^Version | awk '{print $2}'
# install python # install python
- pyenv install 2.7.18 - pyenv local 2.7.18 || pyenv install 2.7.18
- pyenv local 2.7.18 || echo 'pyenv failed' - pyenv local 2.7.18 || echo 'pyenv failed'
- python -V - python -V
install: install:

View File

@ -40,10 +40,14 @@ list:
# Note that preexisting NVM_* variables are unset to avoid interfering with tests, except when running the Travis tests (where NVM_DIR must be passed in and the env. is assumed to be pristine). # Note that preexisting NVM_* variables are unset to avoid interfering with tests, except when running the Travis tests (where NVM_DIR must be passed in and the env. is assumed to be pristine).
.PHONY: $(SHELL_TARGETS) .PHONY: $(SHELL_TARGETS)
$(SHELL_TARGETS): $(SHELL_TARGETS):
@shell='$@'; shell=$${shell##*-}; which "$$shell" >/dev/null || { printf '\033[0;31m%s\033[0m\n' "WARNING: Cannot test with shell '$$shell': not found." >&2; exit 0; } && \ @shell='$@'; shell=$${shell##*-}; \
which "$$shell" >/dev/null || { printf '\033[0;31m%s\033[0m\n' "WARNING: Cannot test with shell '$$shell': not found." >&2; exit 0; } && \
printf '\n\033[0;34m%s\033[0m\n' "Running tests in $$shell"; \ printf '\n\033[0;34m%s\033[0m\n' "Running tests in $$shell"; \
[ -z "$$TRAVIS_BUILD_DIR" ] && for v in $$(set | awk -F'=' '$$1 ~ "^NVM_" { print $$1 }'); do unset $$v; done && unset v; \ [ -z "$$TRAVIS_BUILD_DIR" ] && for v in $$(set | awk -F'=' '$$1 ~ "^NVM_" { print $$1 }'); do unset $$v; done && unset v; \
for suite in $(TEST_SUITE); do $(URCHIN) -f -s $$shell test/$$suite || exit; done for suite in $(TEST_SUITE); do \
echo "Running test suite: $$suite"; \
$(URCHIN) -f -s $$shell test/$$suite || exit; \
done
# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS). # All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
.PHONY: test .PHONY: test

View File

@ -39,6 +39,7 @@
- [Restoring PATH](#restoring-path) - [Restoring PATH](#restoring-path)
- [Set default node version](#set-default-node-version) - [Set default node version](#set-default-node-version)
- [Use a mirror of node binaries](#use-a-mirror-of-node-binaries) - [Use a mirror of node binaries](#use-a-mirror-of-node-binaries)
- [Pass Authorization header to mirror](#pass-authorization-header-to-mirror)
- [.nvmrc](#nvmrc) - [.nvmrc](#nvmrc)
- [Deeper Shell Integration](#deeper-shell-integration) - [Deeper Shell Integration](#deeper-shell-integration)
- [Calling `nvm use` automatically in a directory with a `.nvmrc` file](#calling-nvm-use-automatically-in-a-directory-with-a-nvmrc-file) - [Calling `nvm use` automatically in a directory with a `.nvmrc` file](#calling-nvm-use-automatically-in-a-directory-with-a-nvmrc-file)
@ -530,6 +531,13 @@ NVM_IOJS_ORG_MIRROR=https://iojs.org/dist nvm install iojs-v1.0.3
`nvm use` will not, by default, create a "current" symlink. Set `$NVM_SYMLINK_CURRENT` to "true" to enable this behavior, which is sometimes useful for IDEs. Note that using `nvm` in multiple shell tabs with this environment variable enabled can cause race conditions. `nvm use` will not, by default, create a "current" symlink. Set `$NVM_SYMLINK_CURRENT` to "true" to enable this behavior, which is sometimes useful for IDEs. Note that using `nvm` in multiple shell tabs with this environment variable enabled can cause race conditions.
#### Pass Authorization header to mirror
To pass an Authorization header through to the mirror url, set `$NVM_AUTH_HEADER`
```sh
NVM_AUTH_HEADER="Bearer secret-token" nvm install node
```
### .nvmrc ### .nvmrc
You can create a `.nvmrc` file containing a node version number (or any other string that `nvm` understands; see `nvm --help` for details) in the project root directory (or any parent directory). You can create a `.nvmrc` file containing a node version number (or any other string that `nvm` understands; see `nvm --help` for details) in the project root directory (or any parent directory).

85
nvm.sh Normal file → Executable file
View File

@ -116,12 +116,19 @@ nvm_get_latest() {
} }
nvm_download() { nvm_download() {
local CURL_COMPRESSED_FLAG
if nvm_has "curl"; then if nvm_has "curl"; then
local CURL_COMPRESSED_FLAG=""
local CURL_HEADER_FLAG=""
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
sanitized_header=$(nvm_sanitize_auth_header "${NVM_AUTH_HEADER}")
CURL_HEADER_FLAG="--header \"Authorization: ${sanitized_header}\""
fi
if nvm_curl_use_compression; then if nvm_curl_use_compression; then
CURL_COMPRESSED_FLAG="--compressed" CURL_COMPRESSED_FLAG="--compressed"
fi fi
curl --fail ${CURL_COMPRESSED_FLAG:-} -q "$@" eval "curl -q --fail ${CURL_COMPRESSED_FLAG:-} ${CURL_HEADER_FLAG:-} $*"
elif nvm_has "wget"; then elif nvm_has "wget"; then
# Emulate curl with wget # Emulate curl with wget
ARGS=$(nvm_echo "$@" | command sed -e 's/--progress-bar /--progress=bar /' \ ARGS=$(nvm_echo "$@" | command sed -e 's/--progress-bar /--progress=bar /' \
@ -133,11 +140,20 @@ nvm_download() {
-e 's/-sS /-nv /' \ -e 's/-sS /-nv /' \
-e 's/-o /-O /' \ -e 's/-o /-O /' \
-e 's/-C - /-c /') -e 's/-C - /-c /')
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
ARGS="${ARGS} --header \"${NVM_AUTH_HEADER}\""
fi
# shellcheck disable=SC2086 # shellcheck disable=SC2086
eval wget $ARGS eval wget $ARGS
fi fi
} }
nvm_sanitize_auth_header() {
# Remove potentially dangerous characters
nvm_echo "$1" | command sed 's/[^a-zA-Z0-9:;_. -]//g'
}
nvm_has_system_node() { nvm_has_system_node() {
[ "$(nvm deactivate >/dev/null 2>&1 && command -v node)" != '' ] [ "$(nvm deactivate >/dev/null 2>&1 && command -v node)" != '' ]
} }
@ -370,8 +386,9 @@ nvm_install_latest_npm() {
|| { [ $NVM_IS_16_OR_ABOVE -eq 1 ] && [ $NVM_IS_16_LTS_OR_ABOVE -eq 0 ]; } \ || { [ $NVM_IS_16_OR_ABOVE -eq 1 ] && [ $NVM_IS_16_LTS_OR_ABOVE -eq 0 ]; } \
|| { [ $NVM_IS_17_OR_ABOVE -eq 1 ] && [ $NVM_IS_18_OR_ABOVE -eq 0 ]; } \ || { [ $NVM_IS_17_OR_ABOVE -eq 1 ] && [ $NVM_IS_18_OR_ABOVE -eq 0 ]; } \
; then ; then
nvm_echo '* `npm` `v8.x` is the last version that works on `node` `v12`, `v14.13` - `v14.16`, or `v16.0` - `v16.12`' nvm_echo '* `npm` `v8.6` is the last version that works on `node` `v12`, `v14.13` - `v14.16`, or `v16.0` - `v16.12`'
$NVM_NPM_CMD install -g npm@8 # ^8.7 breaks `npm ls` on file: deps
$NVM_NPM_CMD install -g npm@8.6
elif \ elif \
[ $NVM_IS_18_17_OR_ABOVE -eq 0 ] \ [ $NVM_IS_18_17_OR_ABOVE -eq 0 ] \
|| { [ $NVM_IS_19_OR_ABOVE -eq 1 ] && [ $NVM_IS_20_5_OR_ABOVE -eq 0 ]; } \ || { [ $NVM_IS_19_OR_ABOVE -eq 1 ] && [ $NVM_IS_20_5_OR_ABOVE -eq 0 ]; } \
@ -480,9 +497,9 @@ additionally, a single bare nvm-recognized version-ish must be present (after st
warn_text="non-commented content parsed: warn_text="non-commented content parsed:
${1}" ${1}"
nvm_err "$(nvm_wrap_with_color_code r "${error_text}") nvm_err "$(nvm_wrap_with_color_code 'r' "${error_text}")
$(nvm_wrap_with_color_code y "${warn_text}")" $(nvm_wrap_with_color_code 'y' "${warn_text}")"
} }
nvm_process_nvmrc() { nvm_process_nvmrc() {
@ -2894,6 +2911,23 @@ nvm_is_natural_num() {
esac esac
} }
nvm_write_nvmrc() {
local VERSION_STRING
VERSION_STRING=$(nvm_version "${1-$VERSION_STRING}")
if [ "$VERSION_STRING" = '∞' ] || [ "$VERSION_STRING" = 'N/A' ]; then
return 1
fi
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
return 3
}
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
nvm_echo "Wrote version number ($VERSION_STRING) to .nvmrc"
fi
}
# Check version dir permissions # Check version dir permissions
nvm_check_file_permissions() { nvm_check_file_permissions() {
nvm_is_zsh && setopt local_options nonomatch nvm_is_zsh && setopt local_options nonomatch
@ -2999,6 +3033,7 @@ nvm() {
nvm_echo ' --no-progress Disable the progress bar on any downloads' nvm_echo ' --no-progress Disable the progress bar on any downloads'
nvm_echo ' --alias=<name> After installing, set the alias specified to the version specified. (same as: nvm alias <name> <version>)' nvm_echo ' --alias=<name> After installing, set the alias specified to the version specified. (same as: nvm alias <name> <version>)'
nvm_echo ' --default After installing, set default alias to the version specified. (same as: nvm alias default <version>)' nvm_echo ' --default After installing, set default alias to the version specified. (same as: nvm alias default <version>)'
nvm_echo ' --save After installing, write the specified version to .nvmrc'
nvm_echo ' nvm uninstall <version> Uninstall a version' nvm_echo ' nvm uninstall <version> Uninstall a version'
nvm_echo ' nvm uninstall --lts Uninstall using automatic LTS (long-term support) alias `lts/*`, if available.' nvm_echo ' nvm uninstall --lts Uninstall using automatic LTS (long-term support) alias `lts/*`, if available.'
nvm_echo ' nvm uninstall --lts=<LTS name> Uninstall using automatic alias for provided LTS line, if available.' nvm_echo ' nvm uninstall --lts=<LTS name> Uninstall using automatic alias for provided LTS line, if available.'
@ -3007,6 +3042,7 @@ nvm() {
nvm_echo ' --silent Silences stdout/stderr output' nvm_echo ' --silent Silences stdout/stderr output'
nvm_echo ' --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.' nvm_echo ' --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.'
nvm_echo ' --lts=<LTS name> Uses automatic alias for provided LTS line, if available.' nvm_echo ' --lts=<LTS name> Uses automatic alias for provided LTS line, if available.'
nvm_echo ' --save Writes the specified version to .nvmrc.'
nvm_echo ' nvm exec [<version>] [<command>] Run <command> on <version>. Uses .nvmrc if available and version is omitted.' nvm_echo ' nvm exec [<version>] [<command>] Run <command> on <version>. Uses .nvmrc if available and version is omitted.'
nvm_echo ' The following optional arguments, if provided, must appear directly after `nvm exec`:' nvm_echo ' The following optional arguments, if provided, must appear directly after `nvm exec`:'
nvm_echo ' --silent Silences stdout/stderr output' nvm_echo ' --silent Silences stdout/stderr output'
@ -3044,16 +3080,16 @@ nvm() {
nvm_echo ' nvm cache clear Empty cache directory for nvm' nvm_echo ' nvm cache clear Empty cache directory for nvm'
nvm_echo ' nvm set-colors [<color codes>] Set five text colors using format "yMeBg". Available when supported.' nvm_echo ' nvm set-colors [<color codes>] Set five text colors using format "yMeBg". Available when supported.'
nvm_echo ' Initial colors are:' nvm_echo ' Initial colors are:'
nvm_echo_with_colors " $(nvm_wrap_with_color_code b b)$(nvm_wrap_with_color_code y y)$(nvm_wrap_with_color_code g g)$(nvm_wrap_with_color_code r r)$(nvm_wrap_with_color_code e e)" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'b' 'b')$(nvm_wrap_with_color_code 'y' 'y')$(nvm_wrap_with_color_code 'g' 'g')$(nvm_wrap_with_color_code 'r' 'r')$(nvm_wrap_with_color_code 'e' 'e')"
nvm_echo ' Color codes:' nvm_echo ' Color codes:'
nvm_echo_with_colors " $(nvm_wrap_with_color_code r r)/$(nvm_wrap_with_color_code R R) = $(nvm_wrap_with_color_code r red) / $(nvm_wrap_with_color_code R 'bold red')" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'r' 'r')/$(nvm_wrap_with_color_code 'R' 'R') = $(nvm_wrap_with_color_code 'r' 'red') / $(nvm_wrap_with_color_code 'R' 'bold red')"
nvm_echo_with_colors " $(nvm_wrap_with_color_code g g)/$(nvm_wrap_with_color_code G G) = $(nvm_wrap_with_color_code g green) / $(nvm_wrap_with_color_code G 'bold green')" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'g' 'g')/$(nvm_wrap_with_color_code 'G' 'G') = $(nvm_wrap_with_color_code 'g' 'green') / $(nvm_wrap_with_color_code 'G' 'bold green')"
nvm_echo_with_colors " $(nvm_wrap_with_color_code b b)/$(nvm_wrap_with_color_code B B) = $(nvm_wrap_with_color_code b blue) / $(nvm_wrap_with_color_code B 'bold blue')" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'b' 'b')/$(nvm_wrap_with_color_code 'B' 'B') = $(nvm_wrap_with_color_code 'b' 'blue') / $(nvm_wrap_with_color_code 'B' 'bold blue')"
nvm_echo_with_colors " $(nvm_wrap_with_color_code c c)/$(nvm_wrap_with_color_code C C) = $(nvm_wrap_with_color_code c cyan) / $(nvm_wrap_with_color_code C 'bold cyan')" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'c' 'c')/$(nvm_wrap_with_color_code 'C' 'C') = $(nvm_wrap_with_color_code 'c' 'cyan') / $(nvm_wrap_with_color_code 'C' 'bold cyan')"
nvm_echo_with_colors " $(nvm_wrap_with_color_code m m)/$(nvm_wrap_with_color_code M M) = $(nvm_wrap_with_color_code m magenta) / $(nvm_wrap_with_color_code M 'bold magenta')" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'm' 'm')/$(nvm_wrap_with_color_code 'M' 'M') = $(nvm_wrap_with_color_code 'm' 'magenta') / $(nvm_wrap_with_color_code 'M' 'bold magenta')"
nvm_echo_with_colors " $(nvm_wrap_with_color_code y y)/$(nvm_wrap_with_color_code Y Y) = $(nvm_wrap_with_color_code y yellow) / $(nvm_wrap_with_color_code Y 'bold yellow')" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'y' 'y')/$(nvm_wrap_with_color_code 'Y' 'Y') = $(nvm_wrap_with_color_code 'y' 'yellow') / $(nvm_wrap_with_color_code 'Y' 'bold yellow')"
nvm_echo_with_colors " $(nvm_wrap_with_color_code k k)/$(nvm_wrap_with_color_code K K) = $(nvm_wrap_with_color_code k black) / $(nvm_wrap_with_color_code K 'bold black')" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'k' 'k')/$(nvm_wrap_with_color_code 'K' 'K') = $(nvm_wrap_with_color_code 'k' 'black') / $(nvm_wrap_with_color_code 'K' 'bold black')"
nvm_echo_with_colors " $(nvm_wrap_with_color_code e e)/$(nvm_wrap_with_color_code W W) = $(nvm_wrap_with_color_code e 'light grey') / $(nvm_wrap_with_color_code W white)" nvm_echo_with_colors " $(nvm_wrap_with_color_code 'e' 'e')/$(nvm_wrap_with_color_code 'W' 'W') = $(nvm_wrap_with_color_code 'e' 'light grey') / $(nvm_wrap_with_color_code 'W' 'white')"
nvm_echo 'Example:' nvm_echo 'Example:'
nvm_echo ' nvm install 8.0.0 Install a specific version number' nvm_echo ' nvm install 8.0.0 Install a specific version number'
nvm_echo ' nvm use 8.0 Use the latest available 8.0.x release' nvm_echo ' nvm use 8.0 Use the latest available 8.0.x release'
@ -3219,6 +3255,8 @@ nvm() {
local ALIAS local ALIAS
local NVM_UPGRADE_NPM local NVM_UPGRADE_NPM
NVM_UPGRADE_NPM=0 NVM_UPGRADE_NPM=0
local NVM_WRITE_TO_NVMRC
NVM_WRITE_TO_NVMRC=0
local PROVIDED_REINSTALL_PACKAGES_FROM local PROVIDED_REINSTALL_PACKAGES_FROM
local REINSTALL_PACKAGES_FROM local REINSTALL_PACKAGES_FROM
@ -3317,6 +3355,10 @@ nvm() {
SKIP_DEFAULT_PACKAGES=true SKIP_DEFAULT_PACKAGES=true
shift shift
;; ;;
--save | -w)
NVM_WRITE_TO_NVMRC=1
shift
;;
*) *)
break # stop parsing args break # stop parsing args
;; ;;
@ -3553,6 +3595,7 @@ nvm() {
else else
EXIT_CODE=$? EXIT_CODE=$?
fi fi
return $EXIT_CODE return $EXIT_CODE
;; ;;
"uninstall") "uninstall")
@ -3704,6 +3747,7 @@ nvm() {
--) ;; --) ;;
--lts) NVM_LTS='*' ;; --lts) NVM_LTS='*' ;;
--lts=*) NVM_LTS="${1##--lts=}" ;; --lts=*) NVM_LTS="${1##--lts=}" ;;
--save | -w) NVM_WRITE_TO_NVMRC=1 ;;
--*) ;; --*) ;;
*) *)
if [ -n "${1-}" ]; then if [ -n "${1-}" ]; then
@ -3737,6 +3781,10 @@ nvm() {
return 127 return 127
fi fi
if [ "${NVM_WRITE_TO_NVMRC:-0}" -eq 1 ]; then
nvm_write_nvmrc "$VERSION"
fi
if [ "_${VERSION}" = '_system' ]; then if [ "_${VERSION}" = '_system' ]; then
if nvm_has_system_node && nvm deactivate "${NVM_SILENT_ARG-}" >/dev/null 2>&1; then if nvm_has_system_node && nvm deactivate "${NVM_SILENT_ARG-}" >/dev/null 2>&1; then
if [ "${NVM_SILENT:-0}" -ne 1 ]; then if [ "${NVM_SILENT:-0}" -ne 1 ]; then
@ -4357,11 +4405,12 @@ nvm() {
nvm_sanitize_path nvm_has_colors nvm_process_parameters \ nvm_sanitize_path nvm_has_colors nvm_process_parameters \
nvm_node_version_has_solaris_binary nvm_iojs_version_has_solaris_binary \ nvm_node_version_has_solaris_binary nvm_iojs_version_has_solaris_binary \
nvm_curl_libz_support nvm_command_info nvm_is_zsh nvm_stdout_is_terminal \ nvm_curl_libz_support nvm_command_info nvm_is_zsh nvm_stdout_is_terminal \
nvm_npmrc_bad_news_bears \ nvm_npmrc_bad_news_bears nvm_sanitize_auth_header \
nvm_get_colors nvm_set_colors nvm_print_color_code nvm_wrap_with_color_code nvm_format_help_message_colors \ nvm_get_colors nvm_set_colors nvm_print_color_code nvm_wrap_with_color_code nvm_format_help_message_colors \
nvm_echo_with_colors nvm_err_with_colors \ nvm_echo_with_colors nvm_err_with_colors \
nvm_get_artifact_compression nvm_install_binary_extract nvm_extract_tarball \ nvm_get_artifact_compression nvm_install_binary_extract nvm_extract_tarball \
nvm_process_nvmrc nvm_nvmrc_invalid_msg \ nvm_process_nvmrc nvm_nvmrc_invalid_msg \
nvm_write_nvmrc \
>/dev/null 2>&1 >/dev/null 2>&1
unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \ unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
NVM_CD_FLAGS NVM_BIN NVM_INC NVM_MAKE_JOBS \ NVM_CD_FLAGS NVM_BIN NVM_INC NVM_MAKE_JOBS \
@ -4498,7 +4547,7 @@ nvm_auto() {
local NVM_CURRENT local NVM_CURRENT
if [ "_${NVM_MODE}" = '_install' ]; then if [ "_${NVM_MODE}" = '_install' ]; then
VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)" VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)"
if [ -n "${VERSION}" ]; then if [ -n "${VERSION}" ] && ! [ "_${VERSION}" = '_N/A' ] && nvm_is_valid_version "${VERSION}"; then
nvm install "${VERSION}" >/dev/null nvm install "${VERSION}" >/dev/null
elif nvm_rc_version >/dev/null 2>&1; then elif nvm_rc_version >/dev/null 2>&1; then
nvm install >/dev/null nvm install >/dev/null
@ -4507,7 +4556,7 @@ nvm_auto() {
NVM_CURRENT="$(nvm_ls_current)" NVM_CURRENT="$(nvm_ls_current)"
if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then
VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)" VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)"
if [ -n "${VERSION}" ]; then if [ -n "${VERSION}" ] && ! [ "_${VERSION}" = '_N/A' ] && nvm_is_valid_version "${VERSION}"; then
nvm use --silent "${VERSION}" >/dev/null nvm use --silent "${VERSION}" >/dev/null
elif nvm_rc_version >/dev/null 2>&1; then elif nvm_rc_version >/dev/null 2>&1; then
nvm use --silent >/dev/null nvm use --silent >/dev/null

View File

@ -102,104 +102,146 @@ watch() {
return $EXIT_CODE return $EXIT_CODE
} }
parse_json() {
local json
json="$1"
local key
key=""
local value
value=""
local output
output=""
local in_key
in_key=0
local in_value
in_value=0
local in_string
in_string=0
local escaped
escaped=0
local buffer
buffer=""
local char
local len
len=${#json}
local arr_index
arr_index=0
local in_array
in_array=0
for ((i = 0; i < len; i++)); do # JSON parsing from https://gist.github.com/assaf/ee377a186371e2e269a7
char="${json:i:1}" nvm_json_throw() {
nvm_err "$*"
exit 1
}
if [ "$in_string" -eq 1 ]; then nvm_json_awk_egrep() {
if [ "$escaped" -eq 1 ]; then local pattern_string
buffer="$buffer$char" pattern_string="${1}"
escaped=0
elif [ "$char" = "\\" ]; then
escaped=1
elif [ "$char" = "\"" ]; then
in_string=0
if [ "$in_key" -eq 1 ]; then
key="$buffer"
buffer=""
in_key=0
elif [ "$in_value" -eq 1 ]; then
value="$buffer"
buffer=""
output="$output$key=\"$value\"\n"
in_value=0
elif [ "$in_array" -eq 1 ]; then
value="$buffer"
buffer=""
output="$output$arr_index=\"$value\"\n"
arr_index=$((arr_index + 1))
fi
else
buffer="$buffer$char"
fi
continue
fi
case "$char" in awk '{
"\"") while ($0) {
in_string=1 start=match($0, pattern);
buffer="" token=substr($0, start, RLENGTH);
if [ "$in_value" -eq 0 ] && [ "$in_array" -eq 0 ]; then print token;
in_key=1 $0=substr($0, start+RLENGTH);
fi }
;; }' "pattern=${pattern_string}"
":") }
in_value=1
;; nvm_json_tokenize() {
",") local GREP
if [ "$in_value" -eq 1 ]; then GREP='grep -Eao'
in_value=0
fi local ESCAPE
;; local CHAR
"[")
in_array=1 # if echo "test string" | grep -Eo "test" > /dev/null 2>&1; then
;; # ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
"]") # CHAR='[^[:cntrl:]"\\]'
in_array=0 # else
;; GREP=nvm_json_awk_egrep
"{" | "}") ESCAPE='(\\\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
;; CHAR='[^[:cntrl:]"\\\\]'
# fi
local STRING
STRING="\"${CHAR}*(${ESCAPE}${CHAR}*)*\""
local NUMBER
NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
local KEYWORD
KEYWORD='null|false|true'
local SPACE
SPACE='[[:space:]]+'
$GREP "${STRING}|${NUMBER}|${KEYWORD}|${SPACE}|." | TERM=dumb grep -Ev "^${SPACE}$"
}
_json_parse_array() {
local index=0
local ary=''
read -r token
case "$token" in
']') ;;
*) *)
if [ "$in_value" -eq 1 ] && [ "$char" != " " ] && [ "$char" != "\n" ] && [ "$char" != "\t" ]; then while :; do
buffer="$buffer$char" _json_parse_value "${1}" "${index}"
fi index=$((index+1))
ary="${ary}${value}"
read -r token
case "${token}" in
']') break ;;
',') ary="${ary}," ;;
*) nvm_json_throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
esac
read -r token
done
;; ;;
esac esac
done :
printf "%b" "$output"
} }
extract_value() { _json_parse_object() {
local key local key
key="$1" local obj=''
local parsed read -r token
parsed="$2" case "$token" in
echo "$parsed" | grep "^$key=" | cut -d'=' -f2 | tr -d '"' '}') ;;
*)
while :; do
case "${token}" in
'"'*'"') key="${token}" ;;
*) nvm_json_throw "EXPECTED string GOT ${token:-EOF}" ;;
esac
read -r token
case "${token}" in
':') ;;
*) nvm_json_throw "EXPECTED : GOT ${token:-EOF}" ;;
esac
read -r token
_json_parse_value "${1}" "${key}"
obj="${obj}${key}:${value}"
read -r token
case "${token}" in
'}') break ;;
',') obj="${obj}," ;;
*) nvm_json_throw "EXPECTED , or } GOT ${token:-EOF}" ;;
esac
read -r token
done
;;
esac
:
}
_json_parse_value() {
local jpath="${1:+$1,}$2"
local isleaf=0
local isempty=0
local print=0
case "$token" in
'{') _json_parse_object "${jpath}" ;;
'[') _json_parse_array "${jpath}" ;;
# At this point, the only valid single-character tokens are digits.
''|[!0-9]) nvm_json_throw "EXPECTED value GOT >${token:-EOF}<" ;;
*)
value=$token
isleaf=1
[ "${value}" = '""' ] && isempty=1
;;
esac
[ "${value}" = '' ] && return
[ "${isleaf}" -eq 1 ] && [ $isempty -eq 0 ] && print=1
[ "${print}" -eq 1 ] && printf "[%s]\t%s\n" "${jpath}" "${value}"
:
}
_json_parse() {
read -r token
_json_parse_value
read -r token
case "${token}" in
'') ;;
*) nvm_json_throw "EXPECTED EOF GOT >${token}<" ;;
esac
}
nvm_json_extract() {
nvm_json_tokenize | _json_parse | grep -e "${1}" | awk '{print $2 $3}'
} }

View File

@ -9,7 +9,7 @@ cleanup () { rm -f "${BEFORE}" "${AFTER}"; }
die () { echo "$@" ; cleanup ; exit 1; } die () { echo "$@" ; cleanup ; exit 1; }
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}' > "${BEFORE}" typeset -f | awk '/ \(\) $/ && !/^main / {print $1}' > "${BEFORE}"
env | grep -v PATH= | grep -v IFS= | grep -v NVM_ | sort >> "${BEFORE}" env | grep -v PATH= | grep -v IFS= | grep -v NVM_ | grep -v TRAVIS_ | sort >> "${BEFORE}"
set +e # TODO: fix set +e # TODO: fix
\. ../../nvm.sh \. ../../nvm.sh
@ -20,11 +20,11 @@ type nvm > /dev/null 2>&1 || die "nvm not loaded"
nvm unload nvm unload
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}' > "${AFTER}" typeset -f | awk '/ \(\) $/ && !/^main / {print $1}' > "${AFTER}"
env | grep -v PATH= | grep -v IFS= | sort >> "${AFTER}" env | grep -v PATH= | grep -v IFS= | grep -v TRAVIS_ | sort >> "${AFTER}"
! type nvm > /dev/null 2>&1 || die "nvm not unloaded" ! type nvm > /dev/null 2>&1 || die "nvm not unloaded"
DIFF="$(diff "${BEFORE}" "${AFTER}" ||:)" DIFF="$(diff "${BEFORE}" "${AFTER}" ||:)"
[ -z "${DIFF}" ] || die "function pollution found: ${DIFF}" [ -z "${DIFF}" ] || die "function pollution found: >${DIFF}<"
cleanup cleanup

View File

@ -0,0 +1,43 @@
#!/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}/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
}
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"
nvm install --save "$TEST_VERSION" || die "\`nvm install --save $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}'"
cleanup

View File

@ -0,0 +1,57 @@
#!/bin/sh
\. ../../../nvm.sh
\. ../../common.sh
set -e
TEST_VERSION="v0.2.4"
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
if [ -f ../.nvmrc ]; then mv ../.nvmrc ../.nvmrc.orig; fi
del_nvmrc () {
rm -f .nvmrc ../.nvmrc
}
cleanup () {
del_nvmrc
nvm cache clear
nvm deactivate
nvm unalias default
rm -rf ${NVM_DIR}/v*
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
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() {
cat "$REMOTE"
}
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
nvm_ls_remote_iojs() {
cat "$REMOTE_IOJS"
}
del_nvmrc
make_fake_node "$TEST_VERSION"
(cd ..
nvm use --save "$TEST_VERSION" || die "\`nvm use --save $TEST_VERSION\` failed in the parent dir")
nvm use --save || die "\`nvm use --save\` failed"
[ -f ../.nvmrc ] && [ -f .nvmrc ] || die "expected two .nvmrc files to be generated"
OUTPUT=$(cat .nvmrc)
EXPECTED_OUTPUT="$(cat ../.nvmrc)"
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \
|| die "invalid \`nvm use --save \` output: expected '$EXPECTED_OUTPUT'; got '$OUTPUT'"
cleanup

View File

@ -0,0 +1,43 @@
#!/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}/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
}
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"
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'"
cleanup

View File

@ -0,0 +1,62 @@
#!/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

View File

@ -1,7 +1,8 @@
#!/bin/sh #!/bin/sh
cleanup () { cleanup () {
unset -f die cleanup unset -f die cleanup NVM_AUTH_HEADER
docker stop httpbin && docker rm httpbin
} }
die () { echo "$@" ; cleanup ; exit 1; } die () { echo "$@" ; cleanup ; exit 1; }
@ -15,4 +16,13 @@ nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" >/de
# nvm_download should fail to download wrong_install.sh # nvm_download should fail to download wrong_install.sh
! 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 "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
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
cleanup cleanup

View File

@ -14,7 +14,7 @@ for f in ../../../test/fixtures/nvmrc/test/fixtures/valid/*; do
STDOUT="$(nvm_process_nvmrc $f/.nvmrc 2>/dev/null)" STDOUT="$(nvm_process_nvmrc $f/.nvmrc 2>/dev/null)"
EXIT_CODE="$(nvm_process_nvmrc $f/.nvmrc >/dev/null 2>/dev/null; echo $?)" EXIT_CODE="$(nvm_process_nvmrc $f/.nvmrc >/dev/null 2>/dev/null; echo $?)"
EXPECTED="$(extract_value node "$(parse_json "$(cat "$f/expected.json")")")" EXPECTED="$(nvm_json_extract node < "${f}/expected.json" | tr -d '"')"
[ "${EXIT_CODE}" = "0" ] || die "$(basename "${f}"): expected exit code of 0 but got ${EXIT_CODE}" [ "${EXIT_CODE}" = "0" ] || die "$(basename "${f}"): expected exit code of 0 but got ${EXIT_CODE}"
@ -26,7 +26,7 @@ for f in ../../../test/fixtures/nvmrc/test/fixtures/invalid/*; do
STDERR="$(nvm_process_nvmrc $f/.nvmrc 2>&1 >/dev/null | awk '{if(NR > 8) print $0}' | strip_colors)" STDERR="$(nvm_process_nvmrc $f/.nvmrc 2>&1 >/dev/null | awk '{if(NR > 8) print $0}' | strip_colors)"
EXIT_CODE="$(nvm_process_nvmrc $f/.nvmrc >/dev/null 2>/dev/null; echo $?)" EXIT_CODE="$(nvm_process_nvmrc $f/.nvmrc >/dev/null 2>/dev/null; echo $?)"
EXPECTED="$(parse_json "$(cat "$f/expected.json")" | sed 's/^[0-9]*="//;s/"$//')" EXPECTED="$(nvm_json_extract < "${f}/expected.json" | tr -d '"')"
[ "${EXIT_CODE}" != "0" ] || die "$(basename "${f}"): expected exit code of 'not 0' but got ${EXIT_CODE}" [ "${EXIT_CODE}" != "0" ] || die "$(basename "${f}"): expected exit code of 'not 0' but got ${EXIT_CODE}"

View File

@ -0,0 +1,86 @@
#!/bin/sh
\. ../../../nvm.sh
\. ../../common.sh
set -e
TEST_VERSION="v0.2.4"
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
del_nvmrc () {
rm -f .nvmrc
}
del_alias () {
nvm unalias test >/dev/null 2>&1
}
cleanup () {
del_nvmrc
del_alias
nvm cache clear
nvm deactivate
nvm unalias default
rm -rf ${NVM_DIR}/v*
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() {
cat "$REMOTE"
}
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
nvm_ls_remote_iojs() {
cat "$REMOTE_IOJS"
}
make_fake_node "$TEST_VERSION"
test_version () {
del_nvmrc
VERSION_STRING=${1-}
make_fake_node "$VERSION_STRING"
nvm_write_nvmrc $VERSION_STRING || die "\`nvm_write_nvmrc ${VERSION_STRING}\` failed"
OUTPUT="$(cat .nvmrc)"
nvm_is_valid_version "$(cat .nvmrc)" \
|| die "\`nvm install --save ${VERSION_STRING}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
}
# 1.
test_version "$TEST_VERSION" || die
# 2. with an alias
del_alias
nvm alias test "$TEST_VERSION"
test_version test || die
# 3. fails with invalid permissions
del_nvmrc
touch .nvmrc
chmod 0 .nvmrc
nvm_write_nvmrc $TEST_VERSION 2>/dev/null && die "\`nvm_write_nvmrc $TEST_VERSION\` did not fail with invalid permissions"
del_nvmrc
# 4. respects NVM_SILENT=1
export NVM_SILENT=1
[ "$(nvm_write_nvmrc $TEST_VERSION)" = "" ] || die "\`nvm_write_nvmrc $TEST_VERSION\` was not silenced by NVM_SILENT=1"
unset NVM_SILENT
# 5. fails with an invalid version number
TEST_VERSION="not_a_node_version"
nvm_write_nvmrc $TEST_VERSION 2>/dev/null && die "\`nvm_write_nvmrc $TEST_VERSION\` did not fail"
#
cleanup