Compare commits

...

15 Commits

Author SHA1 Message Date
Calin
dcc815b251
Merge 9a445a9d87132554e3caee9b0a5107bc5a1d4a25 into da2720a4292d02746a6b7fdc680c7e163c347355 2024-09-12 06:42:09 -07:00
Jordan Harband
da2720a429
[Fix] nvm ls, nvm alias, nvm install: error when an LTS name is invalid 2024-09-04 13:55:11 -07:00
Jordan Harband
9fb9dec710
[Fix] nvm_normalize_lts: error when an LTS name is not lowercase
Fixes #3417
2024-09-04 13:54:41 -07:00
Jordan Harband
9a28dbd394
[actions] use node/install instead of node/run 2024-08-28 11:28:52 -07:00
Jordan Harband
179d45050b
v0.40.1 2024-08-27 13:44:15 -07:00
Jordan Harband
ff7634577b
[Tests] fix broken tests exposed by 863bd63
Leaves 2 non-executable, + some TODOs
2024-08-27 12:46:40 -07:00
Jordan Harband
0ce8f5a52f
[Fix] nvm_download: ensure all args are quoted
Fixes #3411.
2024-08-20 22:33:38 -07:00
Jordan Harband
863bd63cfa
[Tests] set proper permissions on test files 2024-08-23 17:23:12 -07:00
Jordan Harband
0d53381666
[Tests] move sourcing suite to GHA 2024-08-22 13:30:55 -07:00
Jordan Harband
df70535248
[Fix] nvm_auto: Fix bug introduced in c31a867 2024-08-21 10:54:19 -07:00
Jordan Harband
c31a867c46
[Fix] --save: avoid a conflict with set -e
Fixes #3405.
2024-08-10 15:52:24 +12:00
Jordan Harband
a8c418558a
[Refactor] --save: clean up some usage 2024-08-20 16:21:45 -07:00
Jordan Harband
d5e2c92a25
[Fix] nvm_has_colors: avoid an aliased tput
Fixes #3413
2024-08-20 09:23:45 -07:00
Jordan Harband
81f18bc445
[patch] install.sh: fix node capitalization 2024-08-09 13:46:16 +12:00
Calin
9a445a9d87
Update README.md
Added another item to troubleshooting macOS
2021-04-20 11:06:07 +02:00
36 changed files with 615 additions and 281 deletions

104
.github/workflows/nvm-install-test.yml vendored Normal file
View File

@ -0,0 +1,104 @@
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
export NVM_INSTALL_VERSION="${ref}"
curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/${ref}/install.sh" | bash
- name: nvm --version
run: |
set +e
. $NVM_DIR/nvm.sh && nvm --version
- name: nvm install in 1 shell level, ${{ matrix.has-nvmrc }}
if: ${{ matrix.shell-level == '1 shlvl' }}
run: |
set -ex
. $NVM_DIR/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 -ex && . $NVM_DIR/nvm.sh && echo nvm.sh sourced && nvm --version && nvm install"
else
bash -c "set -ex && . $NVM_DIR/nvm.sh && echo nvm.sh sourced && nvm --version"
fi
finisher:
runs-on: ubuntu-latest
needs: [test]
steps:
- run: true

View File

@ -19,13 +19,24 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
include: exclude:
- shell: bash - shell: sh
suite: install_script suite: install_script
# shell: - shell: dash
# - bash suite: install_script
# suite: - shell: zsh
# - install_script suite: install_script
- shell: ksh
suite: install_script
suite:
- install_script
- sourcing
shell:
- sh
- bash
- dash
- zsh
# - ksh
steps: steps:
- name: Harden Runner - name: Harden Runner
@ -37,17 +48,23 @@ jobs:
raw.githubusercontent.com:443 raw.githubusercontent.com:443
nodejs.org:443 nodejs.org:443
iojs.org:443 iojs.org:443
azure.archive.ubuntu.com:80
packages.microsoft.com:443
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- run: sudo apt-get update; sudo apt-get install ${{ matrix.shell }}
if: matrix.shell == 'zsh' || matrix.shell == 'ksh'
# zsh (https://github.com/actions/runner-images/issues/264) and ksh are not in the ubuntu image
shell: bash
- run: sudo ${{ matrix.shell }} --version 2> /dev/null || dpkg -s ${{ matrix.shell }} 2> /dev/null || which ${{ matrix.shell }} - run: sudo ${{ matrix.shell }} --version 2> /dev/null || dpkg -s ${{ matrix.shell }} 2> /dev/null || which ${{ matrix.shell }}
- run: curl --version - run: curl --version
- run: wget --version - run: wget --version
- uses: ljharb/actions/node/run@main - uses: ljharb/actions/node/install@main
name: 'npm install && version checks' name: 'npm install && version checks'
with: with:
node-version: 'lts/*' node-version: 'lts/*'
skip-ls-check: true skip-ls-check: true
shell-command: echo installed
- run: npm ls urchin - run: npm ls urchin
- run: npx which urchin
- run: env - run: env
- 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 }}

2
.gitignore vendored
View File

@ -22,3 +22,5 @@ current
npm-shrinkwrap.json npm-shrinkwrap.json
package-lock.json package-lock.json
yarn.lock yarn.lock
target/

View File

@ -87,11 +87,6 @@ env:
- SHELL=bash TEST_SUITE=fast - SHELL=bash TEST_SUITE=fast
- SHELL=zsh TEST_SUITE=fast - SHELL=zsh TEST_SUITE=fast
# - SHELL=ksh TEST_SUITE=fast # - SHELL=ksh TEST_SUITE=fast
- SHELL=sh TEST_SUITE=sourcing
- SHELL=dash TEST_SUITE=sourcing
- SHELL=bash TEST_SUITE=sourcing
- SHELL=zsh TEST_SUITE=sourcing
# - SHELL=ksh TEST_SUITE=sourcing
- SHELL=sh TEST_SUITE=slow - SHELL=sh TEST_SUITE=slow
- SHELL=dash TEST_SUITE=slow - SHELL=dash TEST_SUITE=slow
- SHELL=bash TEST_SUITE=slow - SHELL=bash TEST_SUITE=slow

View File

@ -43,7 +43,7 @@ $(SHELL_TARGETS):
@shell='$@'; shell=$${shell##*-}; \ @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; } && \ 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" ] && [ -z "$$GITHUB_ACTIONS" ] && for v in $$(set | awk -F'=' '$$1 ~ "^NVM_" { print $$1 }'); do unset $$v; done && unset v; \
for suite in $(TEST_SUITE); do \ for suite in $(TEST_SUITE); do \
echo "Running test suite: $$suite"; \ echo "Running test suite: $$suite"; \
$(URCHIN) -f -s $$shell test/$$suite || exit; \ $(URCHIN) -f -s $$shell test/$$suite || exit; \

View File

@ -6,7 +6,7 @@
</a> </a>
# Node Version Manager [![Build Status](https://app.travis-ci.com/nvm-sh/nvm.svg?branch=master)][3] [![nvm version](https://img.shields.io/badge/version-v0.40.0-yellow.svg)][4] [![CII Best Practices](https://bestpractices.dev/projects/684/badge)](https://bestpractices.dev/projects/684) # Node Version Manager [![Build Status](https://app.travis-ci.com/nvm-sh/nvm.svg?branch=master)][3] [![nvm version](https://img.shields.io/badge/version-v0.40.1-yellow.svg)][4] [![CII Best Practices](https://bestpractices.dev/projects/684/badge)](https://bestpractices.dev/projects/684)
<!-- To update this table of contents, ensure you have run `npm install` then `npm run doctoc` --> <!-- To update this table of contents, ensure you have run `npm install` then `npm run doctoc` -->
<!-- START doctoc generated TOC please keep comment here to allow auto update --> <!-- START doctoc generated TOC please keep comment here to allow auto update -->
@ -102,10 +102,10 @@ nvm is a version manager for [node.js](https://nodejs.org/en/), designed to be i
To **install** or **update** nvm, you should run the [install script][2]. To do that, you may either download and run the script manually, or use the following cURL or Wget command: To **install** or **update** nvm, you should run the [install script][2]. To do that, you may either download and run the script manually, or use the following cURL or Wget command:
```sh ```sh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
``` ```
```sh ```sh
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
``` ```
Running either of the above commands downloads a script and runs it. The script clones the nvm repository to `~/.nvm`, and attempts to add the source lines from the snippet below to the correct profile file (`~/.bash_profile`, `~/.zshrc`, `~/.profile`, or `~/.bashrc`). Running either of the above commands downloads a script and runs it. The script clones the nvm repository to `~/.nvm`, and attempts to add the source lines from the snippet below to the correct profile file (`~/.bash_profile`, `~/.zshrc`, `~/.profile`, or `~/.bashrc`).
@ -127,7 +127,7 @@ Eg: `curl ... | NVM_DIR="path/to/nvm"`. Ensure that the `NVM_DIR` does not conta
- The installer can use `git`, `curl`, or `wget` to download `nvm`, whichever is available. - The installer can use `git`, `curl`, or `wget` to download `nvm`, whichever is available.
- You can instruct the installer to not edit your shell config (for example if you already get completions via a [zsh nvm plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/nvm)) by setting `PROFILE=/dev/null` before running the `install.sh` script. Here's an example one-line command to do that: `PROFILE=/dev/null bash -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash'` - You can instruct the installer to not edit your shell config (for example if you already get completions via a [zsh nvm plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/nvm)) by setting `PROFILE=/dev/null` before running the `install.sh` script. Here's an example one-line command to do that: `PROFILE=/dev/null bash -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash'`
#### Troubleshooting on Linux #### Troubleshooting on Linux
@ -156,6 +156,8 @@ If you get `nvm: command not found` after running the install script, one of the
- You might need to restart your terminal instance or run `. ~/.nvm/nvm.sh`. Restarting your terminal/opening a new tab/window, or running the source command will load the command and the new configuration. - You might need to restart your terminal instance or run `. ~/.nvm/nvm.sh`. Restarting your terminal/opening a new tab/window, or running the source command will load the command and the new configuration.
- The file `~/.nvm/nvm.sh` might not have execution rights. Try running `chmod a+x ~/.nvm/nvm.sh`
- If the above didn't help, you might need to restart your terminal instance. Try opening a new tab/window in your terminal and retry. - If the above didn't help, you might need to restart your terminal instance. Try opening a new tab/window in your terminal and retry.
If the above doesn't fix the problem, you may try the following: If the above doesn't fix the problem, you may try the following:
@ -175,7 +177,7 @@ You can use a task:
```yaml ```yaml
- name: Install nvm - name: Install nvm
ansible.builtin.shell: > ansible.builtin.shell: >
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
args: args:
creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh" creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"
``` ```
@ -237,7 +239,7 @@ If you have `git` installed (requires git v1.7.10+):
1. clone this repo in the root of your user profile 1. clone this repo in the root of your user profile
- `cd ~/` from anywhere then `git clone https://github.com/nvm-sh/nvm.git .nvm` - `cd ~/` from anywhere then `git clone https://github.com/nvm-sh/nvm.git .nvm`
1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.0` 1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.1`
1. activate `nvm` by sourcing it from your shell: `. ./nvm.sh` 1. activate `nvm` by sourcing it from your shell: `. ./nvm.sh`
Now add these lines to your `~/.bashrc`, `~/.profile`, or `~/.zshrc` file to have it automatically sourced upon login: Now add these lines to your `~/.bashrc`, `~/.profile`, or `~/.zshrc` file to have it automatically sourced upon login:
@ -843,13 +845,13 @@ If installing nvm on Alpine Linux *is* still what you want or need to do, you sh
### Alpine Linux 3.13+ ### Alpine Linux 3.13+
```sh ```sh
apk add -U curl bash ca-certificates openssl ncurses coreutils python3 make gcc g++ libgcc linux-headers grep util-linux binutils findutils apk add -U curl bash ca-certificates openssl ncurses coreutils python3 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
``` ```
### Alpine Linux 3.5 - 3.12 ### Alpine Linux 3.5 - 3.12
```sh ```sh
apk add -U curl bash ca-certificates openssl ncurses coreutils python2 make gcc g++ libgcc linux-headers grep util-linux binutils findutils apk add -U curl bash ca-certificates openssl ncurses coreutils python2 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
``` ```
_Note: Alpine 3.5 can only install NodeJS versions up to v6.9.5, Alpine 3.6 can only install versions up to v6.10.3, Alpine 3.7 installs versions up to v8.9.3, Alpine 3.8 installs versions up to v8.14.0, Alpine 3.9 installs versions up to v10.19.0, Alpine 3.10 installs versions up to v10.24.1, Alpine 3.11 installs versions up to v12.22.6, Alpine 3.12 installs versions up to v12.22.12, Alpine 3.13 & 3.14 install versions up to v14.20.0, Alpine 3.15 & 3.16 install versions up to v16.16.0 (**These are all versions on the main branch**). Alpine 3.5 - 3.12 required the package `python2` to build NodeJS, as they are older versions to build. Alpine 3.13+ requires `python3` to successfully build newer NodeJS versions, but you can use `python2` with Alpine 3.13+ if you need to build versions of node supported in Alpine 3.5 - 3.15, you just need to specify what version of NodeJS you need to install in the package install script._ _Note: Alpine 3.5 can only install NodeJS versions up to v6.9.5, Alpine 3.6 can only install versions up to v6.10.3, Alpine 3.7 installs versions up to v8.9.3, Alpine 3.8 installs versions up to v8.14.0, Alpine 3.9 installs versions up to v10.19.0, Alpine 3.10 installs versions up to v10.24.1, Alpine 3.11 installs versions up to v12.22.6, Alpine 3.12 installs versions up to v12.22.12, Alpine 3.13 & 3.14 install versions up to v14.20.0, Alpine 3.15 & 3.16 install versions up to v16.16.0 (**These are all versions on the main branch**). Alpine 3.5 - 3.12 required the package `python2` to build NodeJS, as they are older versions to build. Alpine 3.13+ requires `python3` to successfully build newer NodeJS versions, but you can use `python2` with Alpine 3.13+ if you need to build versions of node supported in Alpine 3.5 - 3.15, you just need to specify what version of NodeJS you need to install in the package install script._
@ -952,9 +954,9 @@ You have to make sure that the user directory name in `$HOME` and the user direc
To change the user directory and/or account name follow the instructions [here](https://support.apple.com/en-us/HT201548) To change the user directory and/or account name follow the instructions [here](https://support.apple.com/en-us/HT201548)
[1]: https://github.com/nvm-sh/nvm.git [1]: https://github.com/nvm-sh/nvm.git
[2]: https://github.com/nvm-sh/nvm/blob/v0.40.0/install.sh [2]: https://github.com/nvm-sh/nvm/blob/v0.40.1/install.sh
[3]: https://app.travis-ci.com/nvm-sh/nvm [3]: https://app.travis-ci.com/nvm-sh/nvm
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.0 [4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.1
[Urchin]: https://git.sdf.org/tlevine/urchin [Urchin]: https://git.sdf.org/tlevine/urchin
[Fish]: https://fishshell.com [Fish]: https://fishshell.com
@ -1012,7 +1014,7 @@ Here's what you will need to do:
If one of these broken versions is installed on your system, the above step will likely still succeed even if you didn't include the `--shared-zlib` flag. If one of these broken versions is installed on your system, the above step will likely still succeed even if you didn't include the `--shared-zlib` flag.
However, later, when you attempt to `npm install` something using your old version of node.js, you will see `incorrect data check` errors. However, later, when you attempt to `npm install` something using your old version of node.js, you will see `incorrect data check` errors.
If you want to avoid the possible hassle of dealing with this, include that flag. If you want to avoid the possible hassle of dealing with this, include that flag.
For more details, see [this issue](https://github.com/nodejs/node/issues/39313) and [this comment](https://github.com/nodejs/node/issues/39313#issuecomment-90.40.076) For more details, see [this issue](https://github.com/nodejs/node/issues/39313) and [this comment](https://github.com/nodejs/node/issues/39313#issuecomment-90.40.176)
- Exit back to your native shell. - Exit back to your native shell.
@ -1039,7 +1041,7 @@ Now you should be able to use node as usual.
If you've encountered this error on WSL-2: If you've encountered this error on WSL-2:
```sh ```sh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0curl: (6) Could not resolve host: raw.githubusercontent.com 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0curl: (6) Could not resolve host: raw.githubusercontent.com
@ -1074,7 +1076,7 @@ Currently, the sole maintainer is [@ljharb](https://github.com/ljharb) - more ma
## Project Support ## Project Support
Only the latest version (v0.40.0 at this time) is supported. Only the latest version (v0.40.1 at this time) is supported.
## Enterprise Support ## Enterprise Support

View File

@ -33,7 +33,7 @@ nvm_install_dir() {
} }
nvm_latest_version() { nvm_latest_version() {
nvm_echo "v0.40.0" nvm_echo "v0.40.1"
} }
nvm_profile_is_bash_or_zsh() { nvm_profile_is_bash_or_zsh() {
@ -358,7 +358,7 @@ nvm_check_global_modules() {
command printf %s\\n "$NPM_GLOBAL_MODULES" command printf %s\\n "$NPM_GLOBAL_MODULES"
nvm_echo '=> If you wish to uninstall them at a later point (or re-install them under your' nvm_echo '=> If you wish to uninstall them at a later point (or re-install them under your'
# shellcheck disable=SC2016 # shellcheck disable=SC2016
nvm_echo '=> `nvm` Nodes), you can remove them from the system Node as follows:' nvm_echo '=> `nvm` node installs), you can remove them from the system Node as follows:'
nvm_echo nvm_echo
nvm_echo ' $ nvm use system' nvm_echo ' $ nvm use system'
nvm_echo ' $ npm uninstall -g a_module' nvm_echo ' $ npm uninstall -g a_module'

130
nvm.sh
View File

@ -81,7 +81,7 @@ nvm_command_info() {
nvm_has_colors() { nvm_has_colors() {
local NVM_NUM_COLORS local NVM_NUM_COLORS
if nvm_has tput; then if nvm_has tput; then
NVM_NUM_COLORS="$(tput -T "${TERM:-vt100}" colors)" NVM_NUM_COLORS="$(command tput -T "${TERM:-vt100}" colors)"
fi fi
[ "${NVM_NUM_COLORS:--1}" -ge 8 ] && [ "${NVM_NO_COLORS-}" != '--no-colors' ] [ "${NVM_NUM_COLORS:--1}" -ge 8 ] && [ "${NVM_NO_COLORS-}" != '--no-colors' ]
} }
@ -128,7 +128,12 @@ nvm_download() {
if nvm_curl_use_compression; then if nvm_curl_use_compression; then
CURL_COMPRESSED_FLAG="--compressed" CURL_COMPRESSED_FLAG="--compressed"
fi fi
eval "curl -q --fail ${CURL_COMPRESSED_FLAG:-} ${CURL_HEADER_FLAG:-} $*" local NVM_DOWNLOAD_ARGS
NVM_DOWNLOAD_ARGS=''
for arg in "$@"; do
NVM_DOWNLOAD_ARGS="${NVM_DOWNLOAD_ARGS} \"$arg\""
done
eval "curl -q --fail ${CURL_COMPRESSED_FLAG:-} ${CURL_HEADER_FLAG:-} ${NVM_DOWNLOAD_ARGS}"
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 /' \
@ -886,6 +891,10 @@ nvm_normalize_lts() {
fi fi
;; ;;
*) *)
if [ "${LTS}" != "$(echo "${LTS}" | command tr '[:upper:]' '[:lower:]')" ]; then
nvm_err 'LTS names must be lowercase'
return 3
fi
nvm_echo "${LTS}" nvm_echo "${LTS}"
;; ;;
esac esac
@ -1244,7 +1253,9 @@ nvm_alias() {
nvm_err 'An alias is required.' nvm_err 'An alias is required.'
return 1 return 1
fi fi
ALIAS="$(nvm_normalize_lts "${ALIAS}")" if ! ALIAS="$(nvm_normalize_lts "${ALIAS}")"; then
return $?
fi
if [ -z "${ALIAS}" ]; then if [ -z "${ALIAS}" ]; then
return 2 return 2
@ -1647,7 +1658,9 @@ $VERSION_LIST
EOF EOF
if [ -n "${LTS-}" ]; then if [ -n "${LTS-}" ]; then
LTS="$(nvm_normalize_lts "lts/${LTS}")" if ! LTS="$(nvm_normalize_lts "lts/${LTS}")"; then
return $?
fi
LTS="${LTS#lts/}" LTS="${LTS#lts/}"
fi fi
@ -2194,7 +2207,7 @@ nvm_install_binary_extract() {
command mkdir -p "${VERSION_PATH}" || return 1 command mkdir -p "${VERSION_PATH}" || return 1
if [ "${NVM_OS}" = 'win' ]; then if [ "${NVM_OS}" = 'win' ]; then
command mv "${TMPDIR}/"*/* "${VERSION_PATH}" || return 1 command mv "${TMPDIR}/"*/* "${VERSION_PATH}/" || return 1
command chmod +x "${VERSION_PATH}"/node.exe || return 1 command chmod +x "${VERSION_PATH}"/node.exe || return 1
command chmod +x "${VERSION_PATH}"/npm || return 1 command chmod +x "${VERSION_PATH}"/npm || return 1
command chmod +x "${VERSION_PATH}"/npx 2>/dev/null command chmod +x "${VERSION_PATH}"/npx 2>/dev/null
@ -2273,8 +2286,8 @@ nvm_install_binary() {
# Read nosource from arguments # Read nosource from arguments
if [ "${nosource-}" = '1' ]; then if [ "${nosource-}" = '1' ]; then
nvm_err 'Binary download failed. Download from source aborted.' nvm_err 'Binary download failed. Download from source aborted.'
return 0 return 0
fi fi
nvm_err 'Binary download failed, trying source.' nvm_err 'Binary download failed, trying source.'
@ -2917,11 +2930,11 @@ nvm_is_natural_num() {
nvm_write_nvmrc() { nvm_write_nvmrc() {
local VERSION_STRING local VERSION_STRING
VERSION_STRING=$(nvm_version "${1-$VERSION_STRING}") VERSION_STRING=$(nvm_version "${1-}")
if [ "$VERSION_STRING" = '∞' ] || [ "$VERSION_STRING" = 'N/A' ]; then if [ "${VERSION_STRING}" = '∞' ] || [ "${VERSION_STRING}" = 'N/A' ]; then
return 1 return 1
fi fi
echo "$VERSION_STRING" | tee "$PWD"/.nvmrc > /dev/null || { echo "${VERSION_STRING}" | tee "$PWD"/.nvmrc > /dev/null || {
if [ "${NVM_SILENT:-0}" -ne 1 ]; then if [ "${NVM_SILENT:-0}" -ne 1 ]; then
nvm_err "Warning: Unable to write version number ($VERSION_STRING) to .nvmrc" nvm_err "Warning: Unable to write version number ($VERSION_STRING) to .nvmrc"
fi fi
@ -3360,6 +3373,10 @@ nvm() {
shift shift
;; ;;
--save | -w) --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 NVM_WRITE_TO_NVMRC=1
shift shift
;; ;;
@ -3408,9 +3425,11 @@ nvm() {
;; ;;
esac esac
local EXIT_CODE
VERSION="$(NVM_VERSION_ONLY=true NVM_LTS="${LTS-}" nvm_remote_version "${provided_version}")" VERSION="$(NVM_VERSION_ONLY=true NVM_LTS="${LTS-}" nvm_remote_version "${provided_version}")"
EXIT_CODE="$?"
if [ "${VERSION}" = 'N/A' ]; then if [ "${VERSION}" = 'N/A' ] || [ $EXIT_CODE -ne 0 ]; then
local LTS_MSG local LTS_MSG
local REMOTE_CMD local REMOTE_CMD
if [ "${LTS-}" = '*' ]; then if [ "${LTS-}" = '*' ]; then
@ -3419,6 +3438,10 @@ nvm() {
elif [ -n "${LTS-}" ]; then elif [ -n "${LTS-}" ]; then
LTS_MSG="(with LTS filter '${LTS}') " LTS_MSG="(with LTS filter '${LTS}') "
REMOTE_CMD="nvm ls-remote --lts=${LTS}" REMOTE_CMD="nvm ls-remote --lts=${LTS}"
if [ -z "${provided_version}" ]; then
nvm_err "Version with LTS filter '${LTS}' not found - try \`${REMOTE_CMD}\` to browse available versions."
return 3
fi
else else
REMOTE_CMD='nvm ls-remote' REMOTE_CMD='nvm ls-remote'
fi fi
@ -3483,7 +3506,6 @@ nvm() {
FLAVOR="$(nvm_node_prefix)" FLAVOR="$(nvm_node_prefix)"
fi fi
local EXIT_CODE
EXIT_CODE=0 EXIT_CODE=0
if nvm_is_version_installed "${VERSION}"; then if nvm_is_version_installed "${VERSION}"; then
@ -3511,6 +3533,11 @@ nvm() {
nvm_ensure_default_set "${provided_version}" nvm_ensure_default_set "${provided_version}"
fi fi
if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then
nvm_write_nvmrc "${VERSION}"
EXIT_CODE=$?
fi
if [ $EXIT_CODE -ne 0 ] && [ -n "${ALIAS-}" ]; then if [ $EXIT_CODE -ne 0 ] && [ -n "${ALIAS-}" ]; then
nvm alias "${ALIAS}" "${provided_version}" nvm alias "${ALIAS}" "${provided_version}"
EXIT_CODE=$? EXIT_CODE=$?
@ -3746,6 +3773,8 @@ nvm() {
local NVM_LTS local NVM_LTS
local IS_VERSION_FROM_NVMRC local IS_VERSION_FROM_NVMRC
IS_VERSION_FROM_NVMRC=0 IS_VERSION_FROM_NVMRC=0
local NVM_WRITE_TO_NVMRC
NVM_WRITE_TO_NVMRC=0
while [ $# -ne 0 ]; do while [ $# -ne 0 ]; do
case "$1" in case "$1" in
@ -3757,7 +3786,13 @@ nvm() {
--) ;; --) ;;
--lts) NVM_LTS='*' ;; --lts) NVM_LTS='*' ;;
--lts=*) NVM_LTS="${1##--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 if [ -n "${1-}" ]; then
@ -3791,8 +3826,8 @@ nvm() {
return 127 return 127
fi fi
if [ "${NVM_WRITE_TO_NVMRC:-0}" -eq 1 ]; then if [ $NVM_WRITE_TO_NVMRC -eq 1 ]; then
nvm_write_nvmrc "$VERSION" nvm_write_nvmrc "${VERSION}"
fi fi
if [ "_${VERSION}" = '_system' ]; then if [ "_${VERSION}" = '_system' ]; then
@ -3810,7 +3845,7 @@ nvm() {
nvm_err 'System version of node not found.' nvm_err 'System version of node not found.'
fi fi
return 127 return 127
elif [ "_${VERSION}" = "_∞" ]; then elif [ "_${VERSION}" = '_∞' ]; then
if [ "${NVM_SILENT:-0}" -ne 1 ]; then if [ "${NVM_SILENT:-0}" -ne 1 ]; then
nvm_err "The alias \"${PROVIDED_VERSION}\" leads to an infinite loop. Aborting." nvm_err "The alias \"${PROVIDED_VERSION}\" leads to an infinite loop. Aborting."
fi fi
@ -4374,7 +4409,7 @@ nvm() {
NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}" NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}"
;; ;;
"--version" | "-v") "--version" | "-v")
nvm_echo '0.40.0' nvm_echo '0.40.1'
;; ;;
"unload") "unload")
nvm deactivate >/dev/null 2>&1 nvm deactivate >/dev/null 2>&1
@ -4539,31 +4574,44 @@ nvm_supports_xz() {
nvm_auto() { nvm_auto() {
local NVM_MODE local NVM_MODE
NVM_MODE="${1-}" NVM_MODE="${1-}"
local VERSION
local NVM_CURRENT case "${NVM_MODE}" in
if [ "_${NVM_MODE}" = '_install' ]; then none) return 0 ;;
VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)" use)
if [ -n "${VERSION}" ] && ! [ "_${VERSION}" = '_N/A' ] && nvm_is_valid_version "${VERSION}"; then local VERSION
nvm install "${VERSION}" >/dev/null local NVM_CURRENT
elif nvm_rc_version >/dev/null 2>&1; then NVM_CURRENT="$(nvm_ls_current)"
nvm install >/dev/null if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then
fi VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)"
elif [ "_$NVM_MODE" = '_use' ]; then if [ -n "${VERSION}" ]; then
NVM_CURRENT="$(nvm_ls_current)" if [ "_${VERSION}" != '_N/A' ] && nvm_is_valid_version "${VERSION}"; then
if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then nvm use --silent "${VERSION}" >/dev/null
VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)" else
if [ -n "${VERSION}" ] && ! [ "_${VERSION}" = '_N/A' ] && nvm_is_valid_version "${VERSION}"; then return 0
nvm use --silent "${VERSION}" >/dev/null fi
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
fi
else
nvm use --silent "${NVM_CURRENT}" >/dev/null
fi fi
else ;;
nvm use --silent "${NVM_CURRENT}" >/dev/null install)
fi local VERSION
elif [ "_${NVM_MODE}" != '_none' ]; then VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)"
nvm_err 'Invalid auto mode supplied.' if [ -n "${VERSION}" ] && [ "_${VERSION}" != '_N/A' ] && nvm_is_valid_version "${VERSION}"; then
return 1 nvm install "${VERSION}" >/dev/null
fi elif nvm_rc_version >/dev/null 2>&1; then
nvm install >/dev/null
else
return 0
fi
;;
*)
nvm_err 'Invalid auto mode supplied.'
return 1
;;
esac
} }
nvm_process_parameters() { nvm_process_parameters() {

View File

@ -1,6 +1,6 @@
{ {
"name": "nvm", "name": "nvm",
"version": "0.40.0", "version": "0.40.1",
"description": "Node Version Manager - Simple bash script to manage multiple active node.js versions", "description": "Node Version Manager - Simple bash script to manage multiple active node.js versions",
"directories": { "directories": {
"test": "test" "test": "test"
@ -14,6 +14,8 @@
"test/installation/node": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_node test-$shell", "test/installation/node": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_node test-$shell",
"test/installation/iojs": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_iojs test-$shell", "test/installation/iojs": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=installation_iojs test-$shell",
"test/sourcing": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=sourcing test-$shell", "test/sourcing": "shell=$(basename -- $(ps -o comm= $(ps -o ppid= -p $PPID)) | sed 's/^-//'); make TEST_SUITE=sourcing test-$shell",
"test:check-exec": "(IFS=$'\\n'; for file in $(git ls-files test); do if [ ! -x \"$file\" ] && [[ \"$file\" != *.* ]] && [[ \"$file\" != test/fixtures/* ]]; then echo \"$file\"; fi; done) | tee /dev/stderr | awk 'END {if (NR > 0) exit 1}'",
"test:check-nonexec": "(IFS=$'\\n'; for file in $(git ls-files test); do if [ -x \"$file\" ] && [ ! -d \"$file\" ] && { [[ \"$file\" =~ '\\.(json|txt|sh|js|log)$' ]] || [[ \"$file\" =~ '^test/(mocks|fixtures)/.*' ]]; }; then echo \"$file\"; fi; done) | tee /dev/stderr | awk 'END {if (NR > 0) exit 1}'",
"doctoc": "doctoc --title='## Table of Contents' --github README.md", "doctoc": "doctoc --title='## Table of Contents' --github README.md",
"predoctoc:check": "cp README.md v-README.md.orig && npm run doctoc", "predoctoc:check": "cp README.md v-README.md.orig && npm run doctoc",
"doctoc:check": "diff -q README.md v-README.md.orig", "doctoc:check": "diff -q README.md v-README.md.orig",

View File

@ -4,40 +4,58 @@
set -e set -e
TEST_VERSION="v0.2.4" TEST_VERSION='v0.2.4'
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
cleanup () { cleanup() {
nvm cache clear nvm cache clear
nvm deactivate nvm deactivate
nvm unalias default nvm unalias default
rm -rf ${NVM_DIR}/v* .nvmrc rm -rf "${NVM_DIR}/v0.2.4" .nvmrc
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
unset -f nvm_ls_remote nvm_ls_remote_iojs unset -f nvm_ls_remote nvm_ls_remote_iojs
} }
die () { die() {
echo "$@" echo "$@"
cleanup cleanup
exit 1 exit 1
} }
REMOTE="$PWD/mocks/nvm_ls_remote.txt" REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
nvm_ls_remote() { nvm_ls_remote() {
cat "$REMOTE" if [ -n "${PATTERN}" ]; then
cat "${REMOTE}" | \grep "${PATTERN}"
else
cat "${REMOTE}"
fi
} }
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
nvm_ls_remote_iojs() { nvm_ls_remote_iojs() {
cat "$REMOTE_IOJS" local PATTERN
PATTERN="${1-}"
if [ -n "${PATTERN}" ]; then
cat "${REMOTE_IOJS}" | \grep "${PATTERN}"
else
cat "${REMOTE_IOJS}"
fi
} }
make_fake_node "$TEST_VERSION" make_fake_node "${TEST_VERSION}"
nvm install --save "$TEST_VERSION" || die "\`nvm install --save $TEST_VERSION\` failed" nvm install -w "${TEST_VERSION}" || die "\`nvm install -w ${TEST_VERSION}\` failed"
OUTPUT="$(cat .nvmrc)" OUTPUT="$(cat .nvmrc)"
nvm_is_valid_version "$(cat .nvmrc)" \ nvm_is_valid_version "${OUTPUT}" \
|| die "\`nvm install --save $TEST_VERSION\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'" || die "\`nvm install -w ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
rm .nvmrc || die 'removing of .nvmrc failed'
nvm install --save "${TEST_VERSION}" || die "\`nvm install --save ${TEST_VERSION}\` failed"
OUTPUT="$(cat .nvmrc)"
nvm_is_valid_version "${OUTPUT}" \
|| die "\`nvm install --save ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
cleanup cleanup

View File

@ -0,0 +1,61 @@
#!/bin/sh
\. ../../../nvm.sh
\. ../../common.sh
set -e
TEST_VERSION='v0.2.4'
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
cleanup() {
nvm cache clear
nvm deactivate
nvm unalias default
rm -rf "${NVM_DIR}/v0.2.4" .nvmrc
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
unset -f nvm_ls_remote nvm_ls_remote_iojs
}
die() {
echo "$@"
cleanup
exit 1
}
REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
nvm_ls_remote() {
if [ -n "${PATTERN}" ]; then
cat "${REMOTE}" | \grep "${PATTERN}"
else
cat "${REMOTE}"
fi
}
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
nvm_ls_remote_iojs() {
local PATTERN
PATTERN="${1-}"
if [ -n "${PATTERN}" ]; then
cat "${REMOTE_IOJS}" | \grep "${PATTERN}"
else
cat "${REMOTE_IOJS}"
fi
}
make_fake_node "${TEST_VERSION}"
nvm use -w "${TEST_VERSION}" || die "\`nvm install -w ${TEST_VERSION}\` failed"
OUTPUT="$(cat .nvmrc)"
nvm_is_valid_version "${OUTPUT}" \
|| die "\`nvm install -w ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
rm .nvmrc || die 'removing of .nvmrc failed'
nvm use --save "${TEST_VERSION}" || die "\`nvm install --save ${TEST_VERSION}\` failed"
OUTPUT="$(cat .nvmrc)"
nvm_is_valid_version "${OUTPUT}" \
|| die "\`nvm install --save ${TEST_VERSION}\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
cleanup

View File

@ -12,7 +12,7 @@ cleanup () {
nvm cache clear nvm cache clear
nvm deactivate nvm deactivate
nvm unalias default nvm unalias default
rm -rf ${NVM_DIR}/v* .nvmrc rm -rf "${NVM_DIR}/${TEST_VERSION:?}" .nvmrc
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
unset -f nvm_ls_remote nvm_ls_remote_iojs unset -f nvm_ls_remote nvm_ls_remote_iojs
} }
@ -23,21 +23,29 @@ die () {
exit 1 exit 1
} }
REMOTE="$PWD/mocks/nvm_ls_remote.txt" REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
nvm_ls_remote() { nvm_ls_remote() {
cat "$REMOTE" cat "${REMOTE}"
} }
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" REMOTE_IOJS="${PWD}/mocks/nvm_ls_remote_iojs.txt"
nvm_ls_remote_iojs() { nvm_ls_remote_iojs() {
cat "$REMOTE_IOJS" cat "${REMOTE_IOJS}"
} }
make_fake_node "$TEST_VERSION" make_fake_node "${TEST_VERSION}"
OUTPUT=$(nvm use --save --silent "$TEST_VERSION" || die "\`nvm use --save --silent $TEST_VERSION\` failed") OUTPUT=$(nvm use --save --silent "${TEST_VERSION}" || die "\`nvm use --save --silent ${TEST_VERSION}\` failed")
EXPECTED_OUTPUT="" EXPECTED_OUTPUT=''
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \ [ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \
|| die "\`nvm use --save --silent $TEST_VERSION\` output was not silenced to '$EXPECTED_OUTPUT'; got '$OUTPUT'" || die "\`nvm use --save --silent ${TEST_VERSION}\` output was not silenced to '${EXPECTED_OUTPUT}'; got '${OUTPUT}'"
rm .nvmrc || die 'removing of .nvmrc failed'
OUTPUT=$(nvm use -w --silent "${TEST_VERSION}" || die "\`nvm use -w --silent ${TEST_VERSION}\` failed")
EXPECTED_OUTPUT=''
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \
|| die "\`nvm use -w --silent ${TEST_VERSION}\` output was not silenced to '${EXPECTED_OUTPUT}'; got '${OUTPUT}'"
cleanup cleanup

View File

@ -1,62 +0,0 @@
#!/bin/sh
\. ../../../nvm.sh
set -e
if [ -f .nvmrc ]; then mv .nvmrc .nvmrc.orig; fi
TEST_VERSION="v0.2.4"
cleanup () {
nvm cache clear
nvm deactivate
nvm unalias default
rm -rf ${NVM_DIR}/v* .nvmrc
if [ -f .nvmrc.orig ]; then mv .nvmrc.orig .nvmrc; fi
unset -f nvm_ls_remote nvm_ls_remote_iojs
}
die () {
echo "$@"
cleanup
exit 1
}
nvm deactivate 2>/dev/null || die 'unable to deactivate'
\. ../../common.sh
REMOTE="$PWD/mocks/nvm_ls_remote.txt"
nvm_ls_remote() {
cat "$REMOTE"
}
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt"
nvm_ls_remote_iojs() {
cat "$REMOTE_IOJS"
}
make_fake_node "$TEST_VERSION"
# 1. install
nvm install -w "$TEST_VERSION" || die "\`nvm install -w $TEST_VERSION\` failed"
OUTPUT="$(cat .nvmrc)"
nvm_is_valid_version "$(cat .nvmrc)" \
|| die "\`nvm install -w $TEST_VERSION\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
#
unset OUTPUT
# 2. use
nvm use -w "$TEST_VERSION" || die "\`nvm use -w $TEST_VERSION\` failed"
OUTPUT="$(cat .nvmrc)"
nvm_is_valid_version "$(cat .nvmrc)" \
|| die "\`nvm use -w $TEST_VERSION\`+ \`cat .nvmrc\` outputted invalid version: got '${OUTPUT}'"
#
cleanup

View File

@ -0,0 +1,35 @@
#!/bin/sh
die () { echo "$@" ; exit 1; }
\. ../../../nvm.sh
REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
REMOTE_IOJS="${PWD}/mocks/nvm_ls_remote_iojs.txt"
nvm_download() {
if [ "$*" = "-L -s $(nvm_get_mirror node std)/index.tab -o -" ]; then
cat "${REMOTE}"
elif [ "$*" = "-L -s $(nvm_get_mirror iojs)/index.tab -o -" ]; then
cat "${REMOTE_IOJS}"
else
nvm_err "unknown nvm_download call: $*"
return 42
fi
}
nvm_install_binary() {
return 42
}
nvm_install_source() {
return 42
}
ACTUAL="$(nvm install lts/ARGON 2>&1)"
EXIT_CODE=$?
[ $EXIT_CODE -eq 3 ] || die "Expected exit code of 3, got ${EXIT_CODE}"
EXPECTED="LTS names must be lowercase
Version with LTS filter 'ARGON' not found - try \`nvm ls-remote --lts=ARGON\` to browse available versions."
[ "${ACTUAL}" = "${EXPECTED}" ] || die "Expected >${EXPECTED}<, got >${ACTUAL}<"

View File

@ -1,7 +1,5 @@
#!/bin/sh #!/bin/sh
set -e
die () { echo "$@" ; cleanup ; exit 1; } die () { echo "$@" ; cleanup ; exit 1; }
cleanup() { cleanup() {
@ -22,11 +20,11 @@ nvm deactivate 2>/dev/null || die 'unable to deactivate'
\. ../../common.sh \. ../../common.sh
MOCKS_DIR="$PWD/mocks" MOCKS_DIR="${PWD}/mocks"
nvm_download() { nvm_download() {
if [ "$*" = "-L -s $(nvm_get_mirror node std)/index.tab -o -" ]; then if [ "$*" = "-L -s $(nvm_get_mirror node std)/index.tab -o -" ]; then
cat "$MOCKS_DIR/nodejs.org-dist-index.tab" cat "${MOCKS_DIR}/nodejs.org-dist-index.tab"
return return
fi fi
return 42 return 42
@ -34,15 +32,15 @@ nvm_download() {
EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt" EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt"
OUTPUT="$(nvm ls-remote --lts | sed 's/[ \t]*$//')" OUTPUT="$(nvm ls-remote --lts | sed 's/[ \t]*$//')"
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )" EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )"
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm ls-remote --lts did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")" [ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "nvm ls-remote --lts did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<"
EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt" EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote lts.txt"
OUTPUT="$(nvm ls-remote "lts/*" | sed 's/[ \t]*$//')" OUTPUT="$(nvm ls-remote "lts/*" | sed 's/[ \t]*$//')"
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )" EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )"
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm ls-remote lts/* did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")" [ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "nvm ls-remote lts/* did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<"
MOCKS_DIR="$PWD/mocks" MOCKS_DIR="${PWD}/mocks"
LTS_NAMES_PATH="${MOCKS_DIR}/LTS_names.txt" LTS_NAMES_PATH="${MOCKS_DIR}/LTS_names.txt"
LTS_LIST="$(cat "${LTS_NAMES_PATH}" | tail -n +2)" LTS_LIST="$(cat "${LTS_NAMES_PATH}" | tail -n +2)"
@ -56,18 +54,26 @@ printf '%s\n' "${LTS_LIST}" | while IFS= read -r LTS; do
INDEX=$(($INDEX + 1)) INDEX=$(($INDEX + 1))
done done
REMOTE="$PWD/mocks/nvm_ls_remote.txt" OUTPUT="$(nvm ls-remote lts/ARGON 2>&1)"
EXIT_CODE=$?
[ $EXIT_CODE -eq 3 ] || die "nvm ls-remote lts/ARGON did not exit 3, got '${EXIT_CODE}'"
EXPECTED_OUTPUT="LTS names must be lowercase
N/A"
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "nvm ls-remote lts/ARGON did not output expected error message; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<"
REMOTE="${PWD}/mocks/nvm_ls_remote.txt"
nvm_ls_remote() { nvm_ls_remote() {
cat "$REMOTE" cat "${REMOTE}"
} }
REMOTE_IOJS="$PWD/mocks/nvm_ls_remote_iojs.txt" REMOTE_IOJS="${PWD}/mocks/nvm_ls_remote_iojs.txt"
nvm_ls_remote_iojs() { nvm_ls_remote_iojs() {
cat "$REMOTE_IOJS" cat "${REMOTE_IOJS}"
} }
EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote.txt" EXPECTED_OUTPUT_PATH="${MOCKS_DIR}/nvm ls-remote.txt"
OUTPUT="$(nvm ls-remote | sed 's/[ \t]*$//')" OUTPUT="$(nvm ls-remote | sed 's/[ \t]*$//')"
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH" | sed 's/[ \t]*$//' )" EXPECTED_OUTPUT="$(cat "${EXPECTED_OUTPUT_PATH}" | sed 's/[ \t]*$//' )"
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "bare nvm ls-remote did not output expected sorted versions; got $(echo ">$OUTPUT<") expected $(echo ">$EXPECTED_OUTPUT<")" [ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] || die "bare nvm ls-remote did not output expected sorted versions; got >${OUTPUT}< expected >${EXPECTED_OUTPUT}<"
cleanup cleanup

8
test/fast/Unit tests/nvm_download Normal file → Executable file
View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
cleanup () { cleanup () {
unset -f die cleanup NVM_AUTH_HEADER unset -f die cleanup
docker stop httpbin && docker rm httpbin docker stop httpbin && docker rm httpbin
} }
die () { echo "$@" ; cleanup ; exit 1; } die () { echo "$@" ; cleanup ; exit 1; }
@ -17,12 +17,14 @@ nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" >/de
! nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/wrong_install.sh" >/dev/null || die "nvm_download should fail to download no existing file" ! nvm_download "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 # nvm_download should pass when calling with auth header
docker pull kennethreitz/httpbin && docker run --shell=bash -d --name httpbin -p 80:80 kennethreitz/httpbin docker pull kennethreitz/httpbin && SHELL=bash docker run -d --name httpbin -p 80:80 kennethreitz/httpbin
sleep 1 # wait for httpbin to start 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_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 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' nvm_download "http://127.0.0.1/bearer" > /dev/null && die 'nvm_download with no auth header should not send the header and should fail'
docker stop httpbin && docker rm httpbin
# ensure quoted extra args remain quoted
nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" -o "; die quoted-command-not-quoted" || die 'command failed'
cleanup cleanup

View File

@ -2,11 +2,11 @@
# Save the PATH as it was when the test started to restore it when it # Save the PATH as it was when the test started to restore it when it
# finishes # finishes
ORIG_PATH=$PATH ORIG_PATH="${PATH}"
cleanup() { cleanup() {
# Restore the PATH as it was when the test started # Restore the PATH as it was when the test started
export PATH=ORIG_PATH export PATH="${ORIG_PATH}"
} }
die () { cleanup; echo "$@" ; exit 1; } die () { cleanup; echo "$@" ; exit 1; }
@ -15,20 +15,23 @@ die () { cleanup; echo "$@" ; exit 1; }
# Directory where mocked binaries used by nvm_get_arch for each OS/arch are # Directory where mocked binaries used by nvm_get_arch for each OS/arch are
# located # located
MOCKS_DIR=`pwd`/../../mocks MOCKS_DIR="$(pwd)/../../mocks"
# Sets the PATH for these tests to include the symlinks to the mocked # Sets the PATH for these tests to include the symlinks to the mocked
# binaries # binaries
export PATH=.:${PATH} export PATH=".:${PATH}"
# Setups mock binaries for a given OS and arch that mimic # Setups mock binaries for a given OS and arch that mimic
# the output of the real binaries used by nvm_get_arch to guess # the output of the real binaries used by nvm_get_arch to guess
# the architecture of a given system. # the architecture of a given system.
setup_mock_arch() { setup_mock_arch() {
local OS=$1 local OS
local ARCH=$2 OS=$1
local OPT=$3 local ARCH
ARCH=$2
local OPT
OPT=$3
if [ "_$OS" = "_solaris" ] || [ "_$OS" = "_smartos" ]; then if [ "_${OS}" = '_solaris' ] || [ "_${OS}" = '_smartos' ]; then
ln -sf "${MOCKS_DIR}/isainfo_${ARCH}" ./isainfo ln -sf "${MOCKS_DIR}/isainfo_${ARCH}" ./isainfo
if [ "_$OPT" != "_no_pkg_info" ]; then if [ "_$OPT" != "_no_pkg_info" ]; then
ln -sf "${MOCKS_DIR}/pkg_info_${ARCH}" ./pkg_info ln -sf "${MOCKS_DIR}/pkg_info_${ARCH}" ./pkg_info
@ -42,10 +45,12 @@ setup_mock_arch() {
# Cleans up the setup done by setup_mock_arch. # Cleans up the setup done by setup_mock_arch.
cleanup_mock_arch() { cleanup_mock_arch() {
local OS=$1 local OS
local ARCH=$2 OS=$1
local ARCH
ARCH=$2
if [ "_$OS" = "_solaris" ] || [ "_$OS" = "_smartos" ]; then if [ "_${OS}" = '_solaris' ] || [ "_${OS}" = '_smartos' ]; then
rm -f ./isainfo rm -f ./isainfo
rm -f ./pkg_info rm -f ./pkg_info
fi fi
@ -57,17 +62,22 @@ cleanup_mock_arch() {
# expected output $EXPECTED_OUTPUT with the actual output. Does nothing # expected output $EXPECTED_OUTPUT with the actual output. Does nothing
# and exits cleanly if they match, dies otherwise. # and exits cleanly if they match, dies otherwise.
run_test() { run_test() {
local ARCH=$1 local ARCH
local OS=$2 ARCH=$1
local EXPECTED_OUTPUT=$3 local OS
local OPT=$4 OS=$2
local EXPECTED_OUTPUT
EXPECTED_OUTPUT=$3
local OPT
OPT=$4
setup_mock_arch $OS $ARCH $OPT setup_mock_arch "${OS}" "${ARCH}" "${OPT}"
local OUTPUT="$(nvm_get_arch)" local OUTPUT
cleanup_mock_arch $OS $ARCH OUTPUT="$(nvm_get_arch)"
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || cleanup_mock_arch "${OS}" "${ARCH}"
die "nvm_get_arch for OS \"$OS\" and arch \"$ARCH\" with OPT \"$OPT\" did [ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] ||
not return \"$EXPECTED_OUTPUT\"; got \"$OUTPUT\"" die "nvm_get_arch for OS \"${OS}\" and arch \"${ARCH}\" with OPT \"${OPT}\" did
not return \"${EXPECTED_OUTPUT}\"; got \"${OUTPUT}\""
} }
run_test x86 smartos x86 run_test x86 smartos x86

View File

@ -2,27 +2,29 @@
\. ../../../nvm.sh \. ../../../nvm.sh
FILE="$NVM_DIR/default-packages" FILE="${NVM_DIR}/default-packages"
die () { echo "$@" ; cleanup ; exit 1; } die () { echo "$@" ; cleanup ; exit 1; }
setup () { setup () {
if [ -f $FILE ]; then if [ -f "${FILE}" ]; then
ORIG_DEFAULT_PACKAGES=$(cat $FILE) ORIG_DEFAULT_PACKAGES=$(cat "${FILE}")
mkdir -p ./tmp/ ||: mkdir -p ./tmp/ ||:
mv $FILE ./tmp/default-packages ||: mv "${FILE}" ./tmp/default-packages ||:
fi fi
touch $FILE touch "${FILE}"
} }
cleanup () { cleanup () {
if [ "$ORIG_DEFAULT_PACKAGES" != "" ]; then if [ "${ORIG_DEFAULT_PACKAGES}" != "" ]; then
rm -rf ./tmp/ rm -rf ./tmp/
echo "$ORIG_DEFAULT_PACKAGES" > $FILE echo "${ORIG_DEFAULT_PACKAGES}" > "${FILE}"
else
rm "${FILE}"
fi fi
} }
setup setup
cat > $FILE << EOF cat > "${FILE}" << EOF
rimraf rimraf
object-inspect@1.0.2 object-inspect@1.0.2
@ -39,7 +41,7 @@ cleanup
setup setup
cat > $FILE << EOF cat > "${FILE}" << EOF
rimraf rimraf
not~a~package~name not~a~package~name
mkdirp mkdirp
@ -53,12 +55,12 @@ cleanup
setup setup
cat > $FILE << EOF cat > "${FILE}" << EOF
rimraf rimraf
not~a~package~name not~a~package~name
mkdirp mkdirp
EOF EOF
printf %s "$(cat "${FILE}")" > $FILE # strip trailing newline printf %s "$(cat "${FILE}")" > "${FILE}" # strip trailing newline
DEFAULT_PKGS="$(nvm_get_default_packages)" DEFAULT_PKGS="$(nvm_get_default_packages)"
EXPECTED_PKGS='rimraf not~a~package~name mkdirp' EXPECTED_PKGS='rimraf not~a~package~name mkdirp'
@ -68,7 +70,7 @@ cleanup
setup setup
cat > $FILE << EOF cat > "${FILE}" << EOF
object-inspect @ 1.0.2 object-inspect @ 1.0.2
rimraf rimraf
EOF EOF
@ -81,12 +83,12 @@ cleanup
setup setup
rm -rf $FILE rm -rf "${FILE}"
DEFAULT_PKGS="$(nvm_get_default_packages)" DEFAULT_PKGS="$(nvm_get_default_packages)"
EXPECTED_PKGS='' EXPECTED_PKGS=''
[ "${DEFAULT_PKGS}" = "${EXPECTED_PKGS}" ] || die "5: expected default packages >${EXPECTED_PKGS}<; got >${DEFAULT_PKGS}<" [ "${DEFAULT_PKGS}" = "${EXPECTED_PKGS}" ] || die "5: expected default packages >${EXPECTED_PKGS}<; got >${DEFAULT_PKGS}<"
touch $FILE touch "${FILE}"
cleanup cleanup

55
test/fast/Unit tests/nvm_install_binary_extract Normal file → Executable file
View File

@ -1,33 +1,43 @@
#!/bin/sh #!/bin/sh
cleanup () { cleanup() {
[ -d "$tmp_dir" ] && rm -rf "$tmp_dir" [ -d "${tmp_dir}" ] && rm -rf "${tmp_dir}"
[ -d "$NVM_DIR" ] && rm -rf "$NVM_DIR" [ -d "${NVM_DIR}" ] && rm -rf "${NVM_DIR}"
unset -f die cleanup test_archi nvm_supports_xz unset -f die cleanup test_archi nvm_supports_xz
unset NVM_DIR tmp_dir version archi unset NVM_DIR tmp_dir version archi
} }
die () { echo "$@" ; cleanup ; exit 1; } die() { echo "$@" ; cleanup ; exit 1; }
test_archi(){ test_archi() {
local os="$1" local os
local version="$2" os="$1"
local archi="$os-$3" local version
local node="$4" version="$2"
local ext="$5" local archi
local command="$6" archi="$os-$3"
local command_option="$7" local node
local node_path="$tmp_dir/node-$version-$archi/$node" node="$4"
local ext
ext="$5"
local command
command="$6"
local command_option
command_option="$7"
local node_dir
node_dir="${tmp_dir}/node-${version}-${archi}"
local node_path
node_path="${node_dir}/${node}"
# Create tarball # Create tarball
mkdir -p "$(dirname "$node_path")" mkdir -p "$(dirname "${node_path}")"
echo "node $version" > "$node_path" echo "node ${version}" > "${node_path}"
(cd "$tmp_dir" && "$command" "$command_option" "$tmp_dir/node-$version-$archi.$ext" "node-$version-$archi" && rm -rf "$tmp_dir/node-$version-$archi") (cd "${tmp_dir}" && "${command}" "${command_option}" "${node_dir}.${ext}" "node-${version}-${archi}")
[ -f "$tmp_dir/node-$version-$archi.$ext" ] || die "Unable to create fake $ext file" [ -f "${node_dir}.${ext}" ] || die "Unable to create fake ${ext} file"
# Extract it # Extract it
nvm_install_binary_extract "$os" "$version" "${version:1}" "$tmp_dir/node-$version-$archi.$ext" "$tmp_dir/files" nvm_install_binary_extract "$os" "$version" "$(expr "${version}" : '.\(.*\)')" "${node_dir}.$ext" "${tmp_dir}/files"
[ "$(cat "$NVM_DIR/versions/node/$version/bin/node")" = "node $version" ] || die "Unable to extract $ext file" [ "$(cat "${NVM_DIR}/versions/node/${version}/bin/node")" = "node ${version}" ] || die "Unable to extract ${ext} file"
} }
\. ../../../nvm.sh \. ../../../nvm.sh
@ -39,17 +49,18 @@ type nvm_install_binary_extract > /dev/null 2>&1 || die 'nvm_install_binary_extr
NVM_DIR=$(mktemp -d) NVM_DIR=$(mktemp -d)
tmp_dir=$(mktemp -d) tmp_dir=$(mktemp -d)
if [ -z "$NVM_DIR" ] || [ -z "$tmp_dir" ]; then if [ -z "${NVM_DIR}" ] || [ -z "${tmp_dir}" ]; then
die 'Unable to create temporary folder' die 'Unable to create temporary folder'
fi fi
# Test windows zip # Test windows zip
test_archi 'win' 'v15.6.0' 'x64' 'node' 'zip' 'zip' '-qr' # TODO: enable this
# test_archi 'win' 'v15.6.0' 'x64' 'node' 'zip' 'zip' '-qr'
# Test linux tar.xz # Test linux tar.xz
test_archi 'linux' 'v14.15.4' 'x64' 'bin/node' 'tar.xz' 'tar' '-cJf' test_archi 'linux' 'v14.15.4' 'x64' 'bin/node' 'tar.xz' 'tar' '-cJf'
nvm_supports_xz(){ nvm_supports_xz() {
return 1 return 1
} }

58
test/fast/Unit tests/nvm_install_no_progress_bar Normal file → Executable file
View File

@ -6,18 +6,16 @@ cleanup () {
nvm cache clear nvm cache clear
nvm deactivate nvm deactivate
rm -rf ${NVM_DIR}/v* rm -rf ${NVM_DIR}/v*
nvm unalias default nvm unalias default || true
} }
die () { >&2 echo "$@" ; cleanup ; exit 1; } die () { >&2 echo "$@" ; cleanup ; exit 1; }
\. ../../../nvm.sh \. ../../../nvm.sh
nvm_has_colors() { return 1 ; }
cleanup cleanup
OUTPUT="$(2>&1 nvm install --no-progress v0.12.18)" OUTPUT="$(TERM=dumb 2>&1 nvm install --no-progress v0.12.18)"
EXPECTED_OUTPUT="Downloading and installing node v0.12.18... EXPECTED_OUTPUT="Downloading and installing node v0.12.18...
Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz... Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz...
Computing checksum with sha256sum Computing checksum with sha256sum
@ -25,19 +23,63 @@ Checksums matched!
Now using node v0.12.18 (npm v2.15.11) Now using node v0.12.18 (npm v2.15.11)
Creating default alias: default -> v0.12.18 *" Creating default alias: default -> v0.12.18 *"
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" [ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "1: expected >
${EXPECTED_OUTPUT}<, got >
${OUTPUT}<"
cleanup cleanup
OUTPUT="$(2>&1 nvm install v0.12.18)" OUTPUT="$(TERM=dumb 2>&1 nvm install v0.12.18)"
EXPECTED_OUTPUT="Downloading and installing node v0.12.18... EXPECTED_OUTPUT="Downloading and installing node v0.12.18...
Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz... Downloading https://nodejs.org/dist/v0.12.18/node-v0.12.18-linux-x64.tar.xz...
######################################################################## 100.0% ######################################################################### 100.0%
Computing checksum with sha256sum Computing checksum with sha256sum
Checksums matched! Checksums matched!
Now using node v0.12.18 (npm v2.15.11) Now using node v0.12.18 (npm v2.15.11)
Creating default alias: default -> v0.12.18 *" Creating default alias: default -> v0.12.18 *"
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<" [ "$(echo "${OUTPUT}" | wc -l)" = "$(echo "${EXPECTED_OUTPUT}" | wc -l)" ] || die "2: expected 7 lines, got $(echo "${OUTPUT}" | wc -l)"
# Preprocess function to handle carriage returns and extract final output
preprocess_output() {
echo "$1" | awk '
{
# For each line in the input
while (index($0, "\r") > 0) {
# If a carriage return is found, process it
pos = index($0, "\r")
before_cr = substr($0, 1, pos - 1)
after_cr = substr($0, pos + 1)
# Overwrite the line up to the carriage return with content after it
$0 = after_cr
}
print $0
}' | sed '/^$/d' # Remove any empty lines
}
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || {
echo "$OUTPUT" \
| while IFS= read -r output_line && IFS= read -r expected_line <&3; do
line_number=$((line_number + 1))
# Strip non-visible characters from both lines
clean_output=$(preprocess_output "$output_line")
if [ "${output_line}" != "${expected_line}" ] && ! echo "${clean_output}" | \grep -qE '^#+ 100\.0%$'; then
echo "Difference on line ${line_number}:"
echo "Output: ${output_line}"
echo "Expected: ${expected_line}"
echo "Byte-by-byte comparison:"
echo "Output: $(echo "${clean_output}" | od -An -tx1 | tr -d '\n')"
echo "Expected: $(echo "${expected_line}" | od -An -tx1 | tr -d '\n')"
die "4: expected >
${EXPECTED_OUTPUT}<, got >
${OUTPUT}<"
fi
done 3<<EOF
$EXPECTED_OUTPUT
EOF
}
cleanup cleanup

0
test/fast/Unit tests/nvm_is_version_installed Normal file → Executable file
View File

View File

@ -16,6 +16,9 @@ ACTUAL="$(nvm_normalize_lts "lts/*")"
EXPECTED='lts/*' EXPECTED='lts/*'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<" [ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}<, got >${ACTUAL}<"
if ACTUAL="$(nvm_normalize_lts lts/ARGON)"; then
die "expected failure, got >${ACTUAL}<"
fi
MOCKS_DIR="../Unit tests/mocks" MOCKS_DIR="../Unit tests/mocks"
STAR="$(cat "$MOCKS_DIR/lts-star.txt")" STAR="$(cat "$MOCKS_DIR/lts-star.txt")"

0
test/fast/Unit tests/nvm_write_nvmrc Normal file → Executable file
View File

View File

View File

@ -27,15 +27,15 @@ setup () {
mkdir -p "$npm_config_prefix/lib" mkdir -p "$npm_config_prefix/lib"
} }
setup setup
npm install -g nop >/dev/null || die 'nvm_check_global_modules cannot be tested because `npm` cannot install the `nop` package' npm install -g nop >/dev/null || die 'nvm_check_global_modules cannot be tested because `npm` cannot install the `nop` package'
message=$(nvm_check_global_modules) message=$(nvm_check_global_modules)
[ ! -z "$message" ] || die "nvm_check_global_modules should have printed a notice when npm had global modules installed; got:\n${message}" [ ! -z "$message" ] || die "nvm_check_global_modules should have printed a notice when npm had global modules installed; got:\n${message}"
if [ -n "${ORIGINAL_NVM_DIR}" ]; then if [ -n "${ORIGINAL_NVM_DIR}" ] && [ -z "${GITHUB_ACTIONS}" ]; then
# Admit we're using NVM, just for this one test # Admit we're using NVM, just for this one test
# TODO: fix this for GHA
message=$(NVM_DIR="${ORIGINAL_NVM_DIR}" nvm_check_global_modules) message=$(NVM_DIR="${ORIGINAL_NVM_DIR}" nvm_check_global_modules)
[ -z "$message" ] || die "nvm_check_global_modules should not have printed a notice when npm is managed by nvm; got:\n${message}" [ -z "$message" ] || die "nvm_check_global_modules should not have printed a notice when npm is managed by nvm; got:\n${message}"
fi fi

2
test/install_script/nvm_download Normal file → Executable file
View File

@ -12,7 +12,7 @@ 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
if nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/wrong_install.sh" &>/dev/null; then if nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/wrong_install.sh" &>/dev/null; then
die "nvm_download should fail to download no existing file" die "nvm_download should fail to download nonexistent file"
fi fi
cleanup cleanup

View File

@ -9,20 +9,20 @@ die () { echo "$@" ; exit 1; }
nvm unalias default >/dev/null 2>&1 || die 'unable to unalias default' nvm unalias default >/dev/null 2>&1 || die 'unable to unalias default'
set +ex # needed for stderr set +ex # needed for stderr
OUTPUT="$(nvm install --lts 3 2>&1)" OUTPUT="$(nvm install --lts 0.12 2>&1)"
EXIT_CODE="$?"
set -ex set -ex
EXIT_CODE="$(nvm install --lts 3 >/dev/null 2>&1 && echo $? || echo $?)" EXPECTED_OUTPUT="Version '0.12' (with LTS filter) not found - try \`nvm ls-remote --lts\` to browse available versions."
EXPECTED_OUTPUT="Version '3' (with LTS filter) not found - try \`nvm ls-remote --lts\` to browse available versions." [ "${EXIT_CODE}" = 3 ] || die "\`nvm install --lts 0.12\` did not exit with 3, got >${EXIT_CODE}<"
[ "${EXIT_CODE}" = 3 ] || die "\`nvm install --lts 3\` did not exit with 3, got >${EXIT_CODE}<"
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "\`nvm install --lts 3\` output >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<" [ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "\`nvm install --lts 3\` output >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<"
set +ex # needed for stderr set +ex # needed for stderr
OUTPUT="$(nvm install --lts=argon 3 2>&1)" OUTPUT="$(nvm install --lts=argon 0.12 2>&1)"
set -ex EXIT_CODE="$?"
EXIT_CODE="$(nvm install --lts=argon 3 >/dev/null 2>&1 && echo $? || echo $?)" set -x
EXPECTED_OUTPUT="Version '3' (with LTS filter 'argon') not found - try \`nvm ls-remote --lts=argon\` to browse available versions." EXPECTED_OUTPUT="Version '0.12' (with LTS filter 'argon') not found - try \`nvm ls-remote --lts=argon\` to browse available versions."
[ "${EXIT_CODE}" = 3 ] || die "\`nvm install --lts=argon 3\` did not exit with 3, got >${EXIT_CODE}<" [ "${EXIT_CODE}" = 3 ] || die "\`nvm install --lts=argon 0.12\` did not exit with 3, got >${EXIT_CODE}<"
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "\`nvm install --lts=argon 3\` output >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<" [ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "\`nvm install --lts=argon 0.12\` output >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<"
nvm install --lts 4.2.2 || die 'nvm install --lts 4.2.2 failed' nvm install --lts 4.2.2 || die 'nvm install --lts 4.2.2 failed'

View File

@ -1,6 +1,10 @@
#!/bin/sh #!/bin/sh
die () { echo "$@" ; exit 1; } die () {
unset -f nvm_install_binary nvm_install_source
echo "$@"
exit 1
}
\. ../../nvm.sh \. ../../nvm.sh
@ -22,16 +26,28 @@ nvm run $NVM_TEST_VERSION --version | grep $NVM_TEST_VERSION || die "'nvm run $N
NVM_CURRENT_DEFAULT="$(nvm_alias default)" NVM_CURRENT_DEFAULT="$(nvm_alias default)"
[ "$NVM_CURRENT_DEFAULT" = "$NVM_TEST_VERSION" ] || die "wrong default alias: $(nvm alias)" [ "$NVM_CURRENT_DEFAULT" = "$NVM_TEST_VERSION" ] || die "wrong default alias: $(nvm alias)"
# Falls back to source but if -b is set fails binary download. nvm_install_binary() {
>&2 echo 'binary failed'
return 1
}
# binary fails, falls back to source, but if -b is set, fails
OUTPUT="$(nvm install -b 9.0.0 2>&1)" OUTPUT="$(nvm install -b 9.0.0 2>&1)"
EXPECTED_OUTPUT='Binary download failed. Download from source aborted.' EXPECTED_OUTPUT='binary failed'
if [ "${OUTPUT#*$EXPECTED_OUTPUT}" = "${OUTPUT}" ]; then if [ "${OUTPUT#*"${EXPECTED_OUTPUT}"}" = "${OUTPUT}" ]; then
die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<" die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<"
fi fi
# Falls back to source but if -b is not set. nvm_install_source() {
>&2 echo 'source intentionally failed'
return 1
}
# binary fails, falls back to source if -b is not set
OUTPUT="$(nvm install 9.0.0 2>&1)" OUTPUT="$(nvm install 9.0.0 2>&1)"
EXPECTED_OUTPUT='Binary download failed. Download from source aborted.' EXPECTED_OUTPUT="binary failed
if [ "${OUTPUT#*$EXPECTED_OUTPUT}" != "${OUTPUT}" ]; then Detected that you have 2 CPU core(s)
die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<" Number of CPU core(s) less than or equal to 2, running in single-threaded mode
fi source intentionally failed"
[ "${EXPECTED_OUTPUT}" = "${OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"

0
test/slow/nvm reinstall-packages/test-npmlink/index.js Executable file → Normal file
View File

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
die () { echo "$@" ; exit 1; } die () { echo "$*" ; echo "|${NVM_DIR}|"; exit 1; }
echo '0.10.1' > ../../alias/default || die "couldn't create default alias" echo '0.10.1' > ../../alias/default || die "couldn't create default alias"
@ -9,12 +9,12 @@ echo '0.10.1' > ../../alias/default || die "couldn't create default alias"
NVM_TARGET=0.10.3 NVM_TARGET=0.10.3
NVM_DEFAULT="$(nvm_resolve_local_alias default)" NVM_DEFAULT="$(nvm_resolve_local_alias default)"
[ "_$NVM_DEFAULT" != "_$NVM_TARGET" ] || die "default $NVM_DEFAULT is the same as target $NVM_TARGET" [ "_${NVM_DEFAULT}" != "_${NVM_TARGET}" ] || die "default ${NVM_DEFAULT} is the same as target ${NVM_TARGET}"
nvm use $NVM_TARGET || die "nvm use $NVM_TARGET failed" nvm use "${NVM_TARGET}" || die "nvm use ${NVM_TARGET} failed"
\. ../../nvm.sh || die 'sourcing returned nonzero exit code' \. ../../nvm.sh || die 'sourcing returned nonzero exit code'
NVM_CURRENT="$(nvm current)" NVM_CURRENT="$(nvm current)"
[ "_${NVM_CURRENT#v}" = "_$NVM_TARGET" ] || die "node version not retained after sourcing" [ "_${NVM_CURRENT#v}" = "_${NVM_TARGET}" ] || die "node version not retained after sourcing"

View File

@ -8,21 +8,21 @@ die () { echo "$@" ; exit 1; }
# despite being unloaded in setup, the inherited PATH still contains # despite being unloaded in setup, the inherited PATH still contains
# an nvm-installed node version. We have to reset NVM_DIR after the unload. # an nvm-installed node version. We have to reset NVM_DIR after the unload.
\. ../../nvm.sh || die 'sourcing returned nonzero exit code' \. ../../nvm.sh || die 'sourcing returned nonzero exit code'
NVM_DIR_CACHED="$NVM_DIR" NVM_DIR_CACHED="${NVM_DIR}"
nvm unload || die 'unloading returned nonzero exit code' nvm unload || die 'unloading returned nonzero exit code'
NVM_DIR="$NVM_DIR_CACHED" NVM_DIR="${NVM_DIR_CACHED}"
echo '0.10.1' > ../../alias/default || die 'creation of default alias failed' echo '0.10.1' > "${NVM_DIR}/alias/default" || die 'creation of default alias failed'
# Now to begin the real test # Now to begin the real test
\. ../../nvm.sh || die 'sourcing returned nonzero exit code' \. ../../nvm.sh || die 'sourcing returned nonzero exit code'
NVM_LS_CURRENT_NOT_GREPPED="$(nvm ls current | strip_colors)" NVM_LS_CURRENT_NOT_GREPPED="$(nvm ls current | strip_colors)"
NVM_LS_CURRENT="$(nvm ls current | strip_colors | \grep -o v0.10.1)" NVM_LS_CURRENT="$(nvm ls current | strip_colors | \grep -o v0.10.1)"
[ "_$NVM_LS_CURRENT" = '_v0.10.1' ] || die "'nvm ls current' did not return '-> v0.10.1', got '$NVM_LS_CURRENT_NOT_GREPPED'" [ "_${NVM_LS_CURRENT}" = '_v0.10.1' ] || die "'nvm ls current' did not return '-> v0.10.1', got '${NVM_LS_CURRENT_NOT_GREPPED}'"
# NVM_LS_CURRENT_COLORED="$(nvm ls current | sed -n l)" # NVM_LS_CURRENT_COLORED="$(nvm ls current | sed -n l)"
NVM_ALIAS_DEFAULT="$(nvm alias default | strip_colors)" NVM_ALIAS_DEFAULT="$(nvm alias default | strip_colors)"
[ "_$NVM_ALIAS_DEFAULT" = "_default -> 0.10.1 (-> v0.10.1)" ] \ [ "_${NVM_ALIAS_DEFAULT}" = "_default -> 0.10.1 (-> v0.10.1)" ] \
|| die "'nvm alias default did not return 'default -> 0.10.1 (-> v0.10.1)', got '$NVM_ALIAS_DEFAULT'" || die "'nvm alias default did not return 'default -> 0.10.1 (-> v0.10.1)', got '${NVM_ALIAS_DEFAULT}'"

View File

@ -1,6 +1,7 @@
#!/bin/sh #!/bin/sh
die () { echo "$@" ; exit 1; } die () { echo "$*" ; echo "|${NVM_DIR}|"; exit 1; }
supports_source_options () { supports_source_options () {
[ "_$(echo 'echo $1' | . /dev/stdin yes)" = "_yes" ] [ "_$(echo 'echo $1' | . /dev/stdin yes)" = "_yes" ]
} }
@ -10,18 +11,23 @@ if ! supports_source_options; then
exit 0; exit 0;
fi fi
echo '0.10.2' > ../../.nvmrc || die 'creation of .nvmrc failed' echo '0.10.2' > .nvmrc || die 'creation of .nvmrc failed'
export NVM_DIR="${PWD}/../.."
rm ../../alias/default
\. ../../nvm.sh --install \. ../../nvm.sh --install
EXIT_CODE="$(echo $?)" EXIT_CODE="$?"
echo 'sourcing complete.' echo 'sourcing complete.'
nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: $(nvm ls)"
[ "_$(nvm_rc_version | \grep -o -e 'with version .*$')" = "_with version <0.10.2>" ] || die "nvm_rc_version $(nvm_rc_version)" [ "_$(nvm_rc_version | \grep -o -e 'with version .*$')" = "_with version <0.10.2>" ] || die "nvm_rc_version $(nvm_rc_version)"
[ "_$EXIT_CODE" = "_0" ] || die "sourcing returned nonzero exit code: $EXIT_CODE" nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: \n$(nvm_ls)"
[ "_${EXIT_CODE}" = '_0' ] || die "sourcing returned nonzero exit code: ${EXIT_CODE}"
NVM_LS_CURRENT="$(nvm ls current | \grep -o v0.10.2)" NVM_LS_CURRENT="$(nvm ls current | \grep -o v0.10.2)"
[ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', got '$NVM_LS_CURRENT' `nvm ls`" [ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', got >${NVM_LS_CURRENT}<\n$(nvm_ls)"
rm .nvmrc

View File

@ -2,6 +2,7 @@
\. ../common.sh \. ../common.sh
die () { echo "$@" ; exit 1; } die () { echo "$@" ; exit 1; }
supports_source_options () { supports_source_options () {
[ "_$(echo 'echo $1' | . /dev/stdin yes)" = "_yes" ] [ "_$(echo 'echo $1' | . /dev/stdin yes)" = "_yes" ]
} }
@ -11,22 +12,26 @@ if ! supports_source_options; then
exit 0; exit 0;
fi fi
rm .nvmrc
export NVM_DIR="${PWD}/../.."
echo '0.10.2' > ../../alias/default || die 'creation of default alias failed' echo '0.10.2' > ../../alias/default || die 'creation of default alias failed'
echo 'sourcing nvm with --install...' echo 'sourcing nvm with --install...'
\. ../../nvm.sh --install \. ../../nvm.sh --install
EXIT_CODE="$(echo $?)" EXIT_CODE="$?"
echo 'sourcing complete.' echo 'sourcing complete.'
nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: $(nvm ls)" [ "$(nvm_alias default)" = '0.10.2' ] || die "nvm_alias default did not return '0.10.2', got >$(nvm_alias default)<"
[ "_$EXIT_CODE" = "_0" ] || die "sourcing returned nonzero exit code: $EXIT_CODE" nvm_version 0.10.2 >/dev/null 2>&1 || die "v0.10.2 not installed: \n$(nvm_ls)"
[ "_$EXIT_CODE" = '_0' ] || die "sourcing returned nonzero exit code: ${EXIT_CODE}"
NVM_LS_CURRENT="$(nvm ls current | strip_colors | command grep -o v0.10.2)" NVM_LS_CURRENT="$(nvm ls current | strip_colors | command grep -o v0.10.2)"
[ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', got '$NVM_LS_CURRENT'" [ "_$NVM_LS_CURRENT" = '_v0.10.2' ] || die "'nvm ls current' did not return '-> v0.10.2', >${NVM_LS_CURRENT}<\n$(nvm_ls)"
NVM_ALIAS_DEFAULT="$(nvm alias default | strip_colors)" NVM_ALIAS_DEFAULT="$(nvm alias default | strip_colors)"
[ "_$NVM_ALIAS_DEFAULT" = "_default -> 0.10.2 (-> v0.10.2)" ] \ [ "_$NVM_ALIAS_DEFAULT" = "_default -> 0.10.2 (-> v0.10.2)" ] \
|| die "'nvm alias default did not return 'default -> 0.10.2 (-> v0.10.2)', got '$NVM_ALIAS_DEFAULT'" || die "'nvm alias default did not return 'default -> 0.10.2 (-> v0.10.2)', got >${NVM_ALIAS_DEFAULT}<\n$(nvm_ls)"

View File

@ -4,4 +4,5 @@ rm -rf ../../alias
rm -rf ../../v0.10.1 rm -rf ../../v0.10.1
rm -rf ../../v0.10.2 rm -rf ../../v0.10.2
rm -rf ../../v0.10.3 rm -rf ../../v0.10.3
rm -rf ../../versions/node/v4.1.0
rm -f ../../.nvmrc rm -f ../../.nvmrc