mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-07-04 03:48:06 +08:00
Compare commits
61 Commits
v0.40.4
...
e2e612e722
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e2e612e722 | ||
|
|
041a57747a | ||
|
|
419ff4efec | ||
|
|
7a7908ffa1 | ||
|
|
ce15734300 | ||
|
|
ee4fa818d2 | ||
|
|
a6ec739430 | ||
|
|
718e880890 | ||
|
|
ed4dbdfdd5 | ||
|
|
a9933f77a6 | ||
|
|
7079a5d61c | ||
|
|
306f04a90a | ||
|
|
77fca77ddd | ||
|
|
1889911f08 | ||
|
|
70fb4ede6b | ||
|
|
90bb88748b | ||
|
|
6d870d182c | ||
|
|
d264b796a3 | ||
|
|
84079dbff3 | ||
|
|
61c9ff7371 | ||
|
|
16f6ddc3d5 | ||
|
|
c4d9239cbb | ||
|
|
dd13968c1e | ||
|
|
53855417eb | ||
|
|
1f70aea0b0 | ||
|
|
f695512c80 | ||
|
|
388912c6a7 | ||
|
|
4a9155979d | ||
|
|
083bb94f25 | ||
|
|
790ffd2682 | ||
|
|
3e4b0f05b7 | ||
|
|
20d52b6419 | ||
|
|
d200a21559 | ||
|
|
001ea8cac1 | ||
|
|
b0f82ac1b2 | ||
|
|
b4e70cdc2a | ||
|
|
e11221d0d9 | ||
|
|
59d4ea8f3e | ||
|
|
6a16398269 | ||
|
|
82e3803e93 | ||
|
|
3e37cfb9c4 | ||
|
|
ae31eceecc | ||
|
|
25f836f81b | ||
|
|
581317d05c | ||
|
|
018958cc47 | ||
|
|
33fda56d2a | ||
|
|
32863e1052 | ||
|
|
53e6244aa6 | ||
|
|
bda39c7c04 | ||
|
|
05d784772c | ||
|
|
39e71eab49 | ||
|
|
a5de7236d6 | ||
|
|
d2fca5f0ec | ||
|
|
3c48015986 | ||
|
|
a937cb595e | ||
|
|
6f428a10bb | ||
|
|
ef1620361a | ||
|
|
a27a8b7da8 | ||
|
|
59bd32be6b | ||
|
|
14d01c6877 | ||
|
|
4c556a19b0 |
168
.github/workflows/nodejs-org.yml
vendored
Normal file
168
.github/workflows/nodejs-org.yml
vendored
Normal file
@@ -0,0 +1,168 @@
|
||||
name: 'Update nodejs.org'
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 'nvm version tag (e.g., v0.40.4). Defaults to the latest version tag.'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
update-nodejs-org:
|
||||
if: github.repository == 'nvm-sh/nvm' && github.actor == 'ljharb'
|
||||
permissions:
|
||||
contents: read # for the "Extract and validate version" step's `gh api .../tags` call via the default github.token
|
||||
name: 'Create PR to nodejs/nodejs.org'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@v2
|
||||
with:
|
||||
allowed-endpoints:
|
||||
github.com:443
|
||||
api.github.com:443
|
||||
|
||||
- name: Extract and validate version
|
||||
id: version
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
INPUT_VERSION="${{ inputs.version }}"
|
||||
|
||||
if [ -n "${INPUT_VERSION}" ]; then
|
||||
TAG="${INPUT_VERSION}"
|
||||
elif [ "${GITHUB_REF_TYPE}" = "tag" ]; then
|
||||
TAG="${GITHUB_REF#refs/tags/}"
|
||||
else
|
||||
TAG="$(gh api --paginate "repos/${GITHUB_REPOSITORY}/tags" --jq '.[].name' \
|
||||
| grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n 1)"
|
||||
fi
|
||||
|
||||
if ! printf '%s\n' "${TAG}" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||||
echo "::notice::Tag '${TAG}' does not match expected format vX.Y.Z, skipping"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
printf 'tag=%s\n' "${TAG}" >> "${GITHUB_OUTPUT}"
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
|
||||
- name: Set up fork and branch
|
||||
if: steps.version.outputs.tag
|
||||
id: fork
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
BRANCH="nvm-${{ steps.version.outputs.tag }}"
|
||||
|
||||
gh repo fork nodejs/nodejs.org --clone=false 2>&1 || true
|
||||
FORK_OWNER="$(gh api user --jq '.login')"
|
||||
|
||||
DEFAULT_BRANCH="$(gh api repos/nodejs/nodejs.org --jq '.default_branch')"
|
||||
|
||||
gh repo sync "${FORK_OWNER}/nodejs.org" --branch "${DEFAULT_BRANCH}" || true
|
||||
|
||||
UPSTREAM_SHA="$(gh api "repos/nodejs/nodejs.org/git/ref/heads/${DEFAULT_BRANCH}" --jq '.object.sha')"
|
||||
|
||||
# Create or reset branch on fork to upstream HEAD
|
||||
if ! gh api "repos/${FORK_OWNER}/nodejs.org/git/refs" \
|
||||
-f "ref=refs/heads/${BRANCH}" \
|
||||
-f "sha=${UPSTREAM_SHA}" > /dev/null; then
|
||||
gh api "repos/${FORK_OWNER}/nodejs.org/git/refs/heads/${BRANCH}" \
|
||||
-X PATCH \
|
||||
-f "sha=${UPSTREAM_SHA}" \
|
||||
-F "force=true" > /dev/null
|
||||
fi
|
||||
|
||||
printf 'fork_owner=%s\n' "${FORK_OWNER}" >> "${GITHUB_OUTPUT}"
|
||||
printf 'branch=%s\n' "${BRANCH}" >> "${GITHUB_OUTPUT}"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.NODEJS_ORG_TOKEN }}
|
||||
|
||||
- name: Update nvm version in English snippet
|
||||
if: steps.version.outputs.tag
|
||||
id: update
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
NEW_VERSION="${{ steps.version.outputs.tag }}"
|
||||
FORK_OWNER="${{ steps.fork.outputs.fork_owner }}"
|
||||
BRANCH="${{ steps.fork.outputs.branch }}"
|
||||
FILE_PATH="apps/site/snippets/en/download/nvm.bash"
|
||||
PATTERN='nvm-sh/nvm/v[0-9]+\.[0-9]+\.[0-9]+/install\.sh'
|
||||
REPLACEMENT="nvm-sh/nvm/${NEW_VERSION}/install.sh"
|
||||
|
||||
# Get file content via API
|
||||
FILE_RESPONSE="$(gh api "repos/${FORK_OWNER}/nodejs.org/contents/${FILE_PATH}?ref=${BRANCH}")"
|
||||
FILE_SHA="$(printf '%s' "${FILE_RESPONSE}" | jq -r '.sha')"
|
||||
printf '%s' "${FILE_RESPONSE}" | jq -r '.content' | base64 -d > "${RUNNER_TEMP}/nvm.bash"
|
||||
|
||||
# Validate exactly 1 match
|
||||
MATCH_COUNT="$(grep -cE "${PATTERN}" "${RUNNER_TEMP}/nvm.bash" || true)"
|
||||
|
||||
if [ "${MATCH_COUNT}" -eq 0 ]; then
|
||||
echo "::error::No nvm version pattern found in ${FILE_PATH}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MATCH_COUNT}" -ne 1 ]; then
|
||||
echo "::error::Expected exactly 1 nvm version match in ${FILE_PATH}, found ${MATCH_COUNT}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Replace and check for changes
|
||||
cp "${RUNNER_TEMP}/nvm.bash" "${RUNNER_TEMP}/nvm.bash.orig"
|
||||
sed -i -E "s|${PATTERN}|${REPLACEMENT}|g" "${RUNNER_TEMP}/nvm.bash"
|
||||
|
||||
if cmp -s "${RUNNER_TEMP}/nvm.bash" "${RUNNER_TEMP}/nvm.bash.orig"; then
|
||||
echo "::notice::English snippet already has version ${NEW_VERSION}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! grep -qF "${REPLACEMENT}" "${RUNNER_TEMP}/nvm.bash"; then
|
||||
echo "::error::Replacement verification failed in ${FILE_PATH}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Update file via GitHub API (avoids git push workflow scope requirement)
|
||||
NEW_CONTENT_B64="$(base64 -w 0 < "${RUNNER_TEMP}/nvm.bash")"
|
||||
gh api "repos/${FORK_OWNER}/nodejs.org/contents/${FILE_PATH}" \
|
||||
-X PUT \
|
||||
-f "message=meta: bump nvm to ${NEW_VERSION}" \
|
||||
-f "content=${NEW_CONTENT_B64}" \
|
||||
-f "sha=${FILE_SHA}" \
|
||||
-f "branch=${BRANCH}" \
|
||||
-f "committer[name]=github-actions[bot]" \
|
||||
-f "committer[email]=41898282+github-actions[bot]@users.noreply.github.com" > /dev/null
|
||||
|
||||
printf 'updated=true\n' >> "${GITHUB_OUTPUT}"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.NODEJS_ORG_TOKEN }}
|
||||
|
||||
- name: Create pull request
|
||||
if: steps.update.outputs.updated
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
NEW_VERSION="${{ steps.version.outputs.tag }}"
|
||||
FORK_OWNER="${{ steps.fork.outputs.fork_owner }}"
|
||||
BRANCH="${{ steps.fork.outputs.branch }}"
|
||||
|
||||
BODY="Updates the English nvm install snippet to [\`${NEW_VERSION}\`](https://github.com/nvm-sh/nvm/releases/tag/${NEW_VERSION}). The translation system handles other locales.
|
||||
|
||||
Ref: https://github.com/nodejs/nodejs.org/issues/8628"
|
||||
|
||||
gh pr create \
|
||||
--repo nodejs/nodejs.org \
|
||||
--head "${FORK_OWNER}:${BRANCH}" \
|
||||
--title "meta: bump nvm to ${NEW_VERSION}" \
|
||||
--body "${BODY}"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.NODEJS_ORG_TOKEN }}
|
||||
6
.github/workflows/nvm-install-test.yml
vendored
6
.github/workflows/nvm-install-test.yml
vendored
@@ -15,6 +15,8 @@ permissions:
|
||||
|
||||
jobs:
|
||||
matrix:
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.matrix.outputs.matrix }}
|
||||
@@ -43,6 +45,8 @@ jobs:
|
||||
fi
|
||||
|
||||
test:
|
||||
permissions:
|
||||
contents: read
|
||||
needs: [matrix]
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: ${{ matrix.ref == 'v0.40.0' }} # https://github.com/nvm-sh/nvm/issues/3405
|
||||
@@ -101,6 +105,8 @@ jobs:
|
||||
fi
|
||||
|
||||
finisher:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest
|
||||
needs: [test]
|
||||
steps:
|
||||
|
||||
16
.github/workflows/rebase.yml
vendored
16
.github/workflows/rebase.yml
vendored
@@ -2,16 +2,12 @@ name: Automatic Rebase
|
||||
|
||||
on: [pull_request_target]
|
||||
|
||||
permissions: read-all
|
||||
permissions:
|
||||
contents: write # for ljharb/rebase to push code to rebase
|
||||
pull-requests: read # for ljharb/rebase to get info about PR
|
||||
|
||||
jobs:
|
||||
_:
|
||||
name: "Automatic Rebase"
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: ljharb/rebase@master
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: ljharb/actions/.github/workflows/rebase.yml@main
|
||||
secrets:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
6
.github/workflows/require-allow-edits.yml
vendored
6
.github/workflows/require-allow-edits.yml
vendored
@@ -2,10 +2,14 @@ name: Require “Allow Edits”
|
||||
|
||||
on: [pull_request_target]
|
||||
|
||||
permissions: read-all
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
_:
|
||||
permissions:
|
||||
pull-requests: read # for ljharb/require-allow-edits to check 'allow edits' on PR
|
||||
|
||||
name: "Require “Allow Edits”"
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
10
.github/workflows/tests-fast.yml
vendored
10
.github/workflows/tests-fast.yml
vendored
@@ -45,9 +45,19 @@ jobs:
|
||||
registry-1.docker.io:443
|
||||
auth.docker.io:443
|
||||
production.cloudflare.docker.com:443
|
||||
production.cloudfront.docker.com:443
|
||||
- uses: actions/checkout@v6
|
||||
id: checkout
|
||||
continue-on-error: true
|
||||
with:
|
||||
submodules: true
|
||||
- name: 'nvmrc submodule fallback (forks without their own nvmrc)'
|
||||
if: steps.checkout.outcome == 'failure'
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule set-url test/fixtures/nvmrc https://github.com/nvm-sh/nvmrc.git
|
||||
git submodule sync --recursive
|
||||
git submodule update --init --recursive
|
||||
- name: Install zsh, additional shells, and awk variant
|
||||
run: |
|
||||
sudo apt-get update
|
||||
|
||||
@@ -39,8 +39,17 @@ jobs:
|
||||
azure.archive.ubuntu.com:80
|
||||
packages.microsoft.com:443
|
||||
- uses: actions/checkout@v6
|
||||
id: checkout
|
||||
continue-on-error: true
|
||||
with:
|
||||
submodules: true
|
||||
- name: 'nvmrc submodule fallback (forks without their own nvmrc)'
|
||||
if: steps.checkout.outcome == 'failure'
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule set-url test/fixtures/nvmrc https://github.com/nvm-sh/nvmrc.git
|
||||
git submodule sync --recursive
|
||||
git submodule update --init --recursive
|
||||
- name: Install zsh and additional shells
|
||||
run: |
|
||||
sudo apt-get update
|
||||
|
||||
16
.github/workflows/tests-installation-node.yml
vendored
16
.github/workflows/tests-installation-node.yml
vendored
@@ -41,11 +41,21 @@ jobs:
|
||||
archive.ubuntu.com:80
|
||||
security.ubuntu.com:80
|
||||
production.cloudflare.docker.com:443
|
||||
production.cloudfront.docker.com:443
|
||||
registry-1.docker.io:443
|
||||
auth.docker.io:443
|
||||
- uses: actions/checkout@v6
|
||||
id: checkout
|
||||
continue-on-error: true
|
||||
with:
|
||||
submodules: true
|
||||
- name: 'nvmrc submodule fallback (forks without their own nvmrc)'
|
||||
if: steps.checkout.outcome == 'failure'
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule set-url test/fixtures/nvmrc https://github.com/nvm-sh/nvmrc.git
|
||||
git submodule sync --recursive
|
||||
git submodule update --init --recursive
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'npm install && version checks'
|
||||
with:
|
||||
@@ -55,6 +65,12 @@ jobs:
|
||||
- run: npx which urchin
|
||||
- name: Run installation_node tests in container
|
||||
run: |
|
||||
# Retry the image pull to tolerate transient Docker registry failures
|
||||
for i in 1 2 3 4 5; do
|
||||
docker pull ubuntu:16.04 && break
|
||||
echo "docker pull failed, attempt $i/5"
|
||||
sleep $((i * 5))
|
||||
done
|
||||
docker run --rm \
|
||||
-v "${{ github.workspace }}:/workspace" \
|
||||
-w /workspace \
|
||||
|
||||
16
.github/workflows/tests-xenial.yml
vendored
16
.github/workflows/tests-xenial.yml
vendored
@@ -38,11 +38,21 @@ jobs:
|
||||
archive.ubuntu.com:80
|
||||
security.ubuntu.com:80
|
||||
production.cloudflare.docker.com:443
|
||||
production.cloudfront.docker.com:443
|
||||
registry-1.docker.io:443
|
||||
auth.docker.io:443
|
||||
- uses: actions/checkout@v6
|
||||
id: checkout
|
||||
continue-on-error: true
|
||||
with:
|
||||
submodules: true
|
||||
- name: 'nvmrc submodule fallback (forks without their own nvmrc)'
|
||||
if: steps.checkout.outcome == 'failure'
|
||||
shell: bash
|
||||
run: |
|
||||
git submodule set-url test/fixtures/nvmrc https://github.com/nvm-sh/nvmrc.git
|
||||
git submodule sync --recursive
|
||||
git submodule update --init --recursive
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'npm install && version checks'
|
||||
with:
|
||||
@@ -52,6 +62,12 @@ jobs:
|
||||
- run: npx which urchin
|
||||
- name: Run xenial tests in container
|
||||
run: |
|
||||
# Retry the image pull to tolerate transient Docker registry failures
|
||||
for i in 1 2 3 4 5; do
|
||||
docker pull ubuntu:16.04 && break
|
||||
echo "docker pull failed, attempt $i/5"
|
||||
sleep $((i * 5))
|
||||
done
|
||||
docker run --rm \
|
||||
-v "${{ github.workspace }}:/workspace" \
|
||||
-w /workspace \
|
||||
|
||||
2
.github/workflows/tests.yml
vendored
2
.github/workflows/tests.yml
vendored
@@ -8,7 +8,7 @@ permissions:
|
||||
jobs:
|
||||
tests:
|
||||
permissions:
|
||||
contents: write
|
||||
contents: read # for actions/checkout@v6
|
||||
|
||||
name: "tests"
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
10
.github/workflows/windows-npm.yml
vendored
10
.github/workflows/windows-npm.yml
vendored
@@ -94,6 +94,8 @@ jobs:
|
||||
bash.exe "%USERPROFILE%\setup.sh"
|
||||
|
||||
wsl_matrix:
|
||||
permissions:
|
||||
contents: none
|
||||
continue-on-error: true
|
||||
name: 'WSL nvm install'
|
||||
defaults:
|
||||
@@ -136,7 +138,7 @@ jobs:
|
||||
steps:
|
||||
# For Ubuntu: install with packages directly
|
||||
- if: matrix.wsl-distrib != 'Debian'
|
||||
uses: Vampire/setup-wsl@v3
|
||||
uses: Vampire/setup-wsl@v6
|
||||
with:
|
||||
distribution: ${{ matrix.wsl-distrib }}
|
||||
additional-packages: bash git curl ca-certificates wget
|
||||
@@ -144,7 +146,7 @@ jobs:
|
||||
# For Debian: install without packages first (apt-get update fails due to stale sources.list)
|
||||
# see https://github.com/Vampire/setup-wsl/issues/76
|
||||
- if: matrix.wsl-distrib == 'Debian'
|
||||
uses: Vampire/setup-wsl@v3
|
||||
uses: Vampire/setup-wsl@v6
|
||||
with:
|
||||
distribution: ${{ matrix.wsl-distrib }}
|
||||
- if: matrix.wsl-distrib == 'Debian'
|
||||
@@ -187,6 +189,8 @@ jobs:
|
||||
node -v
|
||||
|
||||
wsl_matrix_unofficial:
|
||||
permissions:
|
||||
contents: none
|
||||
continue-on-error: true
|
||||
name: 'WSL nvm install'
|
||||
defaults:
|
||||
@@ -214,7 +218,7 @@ jobs:
|
||||
- ''
|
||||
- 'script'
|
||||
steps:
|
||||
- uses: Vampire/setup-wsl@v3
|
||||
- uses: Vampire/setup-wsl@v6
|
||||
with:
|
||||
distribution: ${{ matrix.wsl-distrib }}
|
||||
additional-packages: bash git curl ca-certificates wget
|
||||
|
||||
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,3 +1,3 @@
|
||||
[submodule "test/fixtures/nvmrc"]
|
||||
path = test/fixtures/nvmrc
|
||||
url = git@github.com:nvm-sh/nvmrc.git
|
||||
url = ../nvmrc.git
|
||||
|
||||
26
AGENTS.md
26
AGENTS.md
@@ -186,17 +186,24 @@ npm install # Installs urchin, semver, and replace tools
|
||||
|
||||
#### Run All Tests
|
||||
```bash
|
||||
npm test # Runs tests in current shell (sh, bash, dash, zsh, ksh)
|
||||
make test # Runs tests in all supported shells (sh, bash, dash, zsh, ksh)
|
||||
npm test # Runs tests in the current shell only (sh, bash, dash, zsh)
|
||||
make test # Runs tests in default shells (sh, bash, dash, zsh)
|
||||
make test-sh # Runs tests only in sh
|
||||
make test-bash # Runs tests only in bash
|
||||
make test-dash # Runs tests only in dash
|
||||
make test-zsh # Runs tests only in zsh
|
||||
make test-ksh # Runs tests only in ksh
|
||||
make SHELLS=ksh test # Runs tests only in ksh (experimental, see issue #574)
|
||||
```
|
||||
|
||||
#### Run Specific Test Suites
|
||||
```bash
|
||||
npm run test/fast # Runs fast tests in the current shell
|
||||
npm run test/slow # Runs slow tests in the current shell
|
||||
npm run test/sourcing # Runs sourcing tests in the current shell
|
||||
npm run test/install_script # Runs install script tests in the current shell
|
||||
npm run test/installation # Runs installation tests (node + iojs) in the current shell
|
||||
npm run test/installation/node # Runs Node installation tests in the current shell
|
||||
npm run test/installation/iojs # Runs io.js installation tests in the current shell
|
||||
make TEST_SUITE=fast test # Only fast tests
|
||||
make TEST_SUITE=slow test # Only slow tests
|
||||
make SHELLS=bash test # Only bash shell
|
||||
@@ -209,6 +216,19 @@ make SHELLS=bash test # Only bash shell
|
||||
./node_modules/.bin/urchin 'test/fast/Unit tests/nvm_get_arch' # Run single test safely without shell termination
|
||||
./node_modules/.bin/urchin test/slow/ # Run slow test suite
|
||||
./node_modules/.bin/urchin test/sourcing/ # Run sourcing test suite
|
||||
./node_modules/.bin/urchin test/install_script/ # Run install script test suite
|
||||
./node_modules/.bin/urchin test/installation_node/ # Run Node installation test suite
|
||||
./node_modules/.bin/urchin test/installation_iojs/ # Run io.js installation test suite
|
||||
```
|
||||
|
||||
#### Linting and Docs Checks
|
||||
```bash
|
||||
npm run eclint # Checks EditorConfig compliance
|
||||
npm run doctoc:check # Verifies README table of contents
|
||||
npm run dockerfile_lint # Lints the Dockerfile
|
||||
npm run test:check-exec # Checks test files have executable permission
|
||||
npm run test:check-nonexec # Checks non-test files don't have executable permission
|
||||
npm run markdown-link-check # Validates markdown links (requires markdown-link-check)
|
||||
```
|
||||
|
||||
### Test Writing Guidelines
|
||||
|
||||
@@ -23,10 +23,10 @@ Explain the problem and include additional details to help maintainers reproduce
|
||||
* **Use a clear and descriptive title** for the issue to identify the problem.
|
||||
|
||||
* **Describe the exact steps which reproduce the problem** in as many details as possible. For example, start by explaining which command exactly you used in the terminal. When listing steps, **don't just say what you did, but explain how you did it**. For example, if you moved the cursor to the end of a line, explain if you used the mouse, or a keyboard shortcut or a command, and if so which one?
|
||||
* **Provide specific examples to demonstrate the steps**. Include links to files or Github projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines).
|
||||
* **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines).
|
||||
* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
|
||||
* **Explain which behavior you expected to see instead and why.**
|
||||
* **Provide as much context as possible** in order to help others verify and ultimately fix the issue. This includes giving us as much details as possible about your environment, so we can more easily confirm the problem.
|
||||
* **Provide as much context as possible** in order to help others verify and ultimately fix the issue. This includes giving us as many details as possible about your environment, so we can more easily confirm the problem.
|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||
90
README.md
90
README.md
@@ -6,7 +6,7 @@
|
||||
</a>
|
||||
|
||||
|
||||
# Node Version Manager [][3] [][4] [](https://bestpractices.dev/projects/684)
|
||||
# Node Version Manager [][3] [][4] [](https://bestpractices.dev/projects/684)
|
||||
|
||||
<!-- 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 -->
|
||||
@@ -31,6 +31,8 @@
|
||||
- [Usage](#usage)
|
||||
- [Long-term Support](#long-term-support)
|
||||
- [Migrating Global Packages While Installing](#migrating-global-packages-while-installing)
|
||||
- [Migrating Global Packages Between Installed Versions](#migrating-global-packages-between-installed-versions)
|
||||
- [Offline Install](#offline-install)
|
||||
- [Default Global Packages From File While Installing](#default-global-packages-from-file-while-installing)
|
||||
- [io.js](#iojs)
|
||||
- [System Version of Node](#system-version-of-node)
|
||||
@@ -76,25 +78,25 @@
|
||||
|
||||
**Example:**
|
||||
```sh
|
||||
$ nvm use 16
|
||||
Now using node v16.9.1 (npm v7.21.1)
|
||||
$ nvm install 24
|
||||
Now using node v24.14.0 (npm v11.9.0)
|
||||
$ node -v
|
||||
v16.9.1
|
||||
$ nvm use 14
|
||||
Now using node v14.18.0 (npm v6.14.15)
|
||||
v24.14.0
|
||||
$ nvm use 22
|
||||
Now using node v22.22.1 (npm v10.9.4)
|
||||
$ node -v
|
||||
v14.18.0
|
||||
$ nvm install 12
|
||||
Now using node v12.22.6 (npm v6.14.5)
|
||||
v22.22.1
|
||||
$ nvm use 20
|
||||
Now using node v20.20.1 (npm v10.8.2)
|
||||
$ node -v
|
||||
v12.22.6
|
||||
v20.20.1
|
||||
```
|
||||
|
||||
Simple as that!
|
||||
|
||||
|
||||
## About
|
||||
nvm is a version manager for [node.js](https://nodejs.org/en/), designed to be installed per-user, and invoked per-shell. `nvm` works on any POSIX-compliant shell (sh, dash, ksh, zsh, bash), in particular on these platforms: unix, macOS, and [windows WSL](https://github.com/nvm-sh/nvm#important-notes).
|
||||
nvm is a version manager for [node.js](https://nodejs.org/en/), designed to be installed per-user, and invoked per-shell. `nvm` works on any POSIX-compliant shell (sh, dash, ksh, zsh, bash), in particular on these platforms: unix, macOS, and [Windows WSL](https://github.com/nvm-sh/nvm#important-notes).
|
||||
|
||||
<a id="installation-and-update"></a>
|
||||
<a id="install-script"></a>
|
||||
@@ -104,10 +106,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:
|
||||
```sh
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
|
||||
```
|
||||
```sh
|
||||
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
|
||||
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/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 (`~/.bashrc`, `~/.bash_profile`, `~/.zshrc`, or `~/.profile`). If you find the install script is updating the wrong profile file, set the `$PROFILE` env var to the profile file’s path, and then rerun the installation script.
|
||||
@@ -134,7 +136,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.
|
||||
|
||||
- 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.4/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.5/install.sh | bash'`
|
||||
|
||||
#### Installing in Docker
|
||||
|
||||
@@ -145,12 +147,12 @@ When invoking bash as a non-interactive shell, like in a Docker container, none
|
||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
|
||||
# Create a script file sourced by both interactive and non-interactive bash shells
|
||||
ENV BASH_ENV /home/user/.bash_env
|
||||
ENV BASH_ENV "${HOME}/.bash_env"
|
||||
RUN touch "${BASH_ENV}"
|
||||
RUN echo '. "${BASH_ENV}"' >> ~/.bashrc
|
||||
|
||||
# Download and install nvm
|
||||
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | PROFILE="${BASH_ENV}" bash
|
||||
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | PROFILE="${BASH_ENV}" bash
|
||||
RUN echo node > .nvmrc
|
||||
RUN nvm install
|
||||
```
|
||||
@@ -168,7 +170,7 @@ ARG NODE_VERSION=20
|
||||
RUN apt update && apt install curl -y
|
||||
|
||||
# install nvm
|
||||
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
|
||||
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
|
||||
|
||||
# set env
|
||||
ENV NVM_DIR=/root/.nvm
|
||||
@@ -194,7 +196,7 @@ After creation of the image you can start container interactively and run comman
|
||||
docker run --rm -it nvmimage
|
||||
|
||||
root@0a6b5a237c14:/# nvm -v
|
||||
0.40.4
|
||||
0.40.5
|
||||
|
||||
root@0a6b5a237c14:/# node -v
|
||||
v19.9.0
|
||||
@@ -257,7 +259,7 @@ You can use a task:
|
||||
```yaml
|
||||
- name: Install nvm
|
||||
ansible.builtin.shell: >
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
|
||||
args:
|
||||
creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"
|
||||
```
|
||||
@@ -278,7 +280,7 @@ which should output `nvm` if the installation was successful. Please note that `
|
||||
|
||||
If you're running a system without prepackaged binary available, which means you're going to install node or io.js from its source code, you need to make sure your system has a C++ compiler. For OS X, Xcode will work, for Debian/Ubuntu based GNU/Linux, the `build-essential` and `libssl-dev` packages work.
|
||||
|
||||
**Note:** `nvm` also supports Windows in some cases. It should work through WSL (Windows Subsystem for Linux) depending on the version of WSL. It should also work with [GitBash](https://gitforwindows.org/) (MSYS) or [Cygwin](https://cygwin.com). Otherwise, for Windows, a few alternatives exist, which are neither supported nor developed by us:
|
||||
**Note:** `nvm` also supports Windows in some cases. It should work through WSL (Windows Subsystem for Linux) depending on the version of WSL. It should also work with [Git Bash](https://gitforwindows.org/) (MSYS) or [Cygwin](https://cygwin.com). Otherwise, for Windows, a few alternatives exist, which are neither supported nor developed by us:
|
||||
|
||||
- [nvm-windows](https://github.com/coreybutler/nvm-windows)
|
||||
- [nodist](https://github.com/marcelklehr/nodist)
|
||||
@@ -319,7 +321,7 @@ If you have `git` installed (requires git v1.7.10+):
|
||||
|
||||
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`
|
||||
1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.4`
|
||||
1. `cd ~/.nvm` and check out the latest version with `git checkout v0.40.5`
|
||||
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:
|
||||
@@ -428,6 +430,7 @@ In place of a version pointer like "14.7" or "16.3" or "12.22.1", you can use th
|
||||
- `iojs`: this installs the latest version of [`io.js`](https://iojs.org/en/)
|
||||
- `stable`: this alias is deprecated, and only truly applies to `node` `v0.12` and earlier. Currently, this is an alias for `node`.
|
||||
- `unstable`: this alias points to `node` `v0.11` - the last "unstable" node release, since post-1.0, all node versions are stable. (in SemVer, versions communicate breakage, not stability).
|
||||
- `current`: the version currently active in this shell (i.e. what `node` resolves to via `$PATH`). It is **not** affected by `.nvmrc`. Useful when you want to refer to the active version explicitly — e.g. `nvm which current` always prints the path to the active `node`, regardless of whether an `.nvmrc` file is present.
|
||||
|
||||
### Long-term Support
|
||||
|
||||
@@ -481,6 +484,33 @@ nvm install-latest-npm
|
||||
|
||||
If you've already gotten an error to the effect of "npm does not support Node.js", you'll need to (1) revert to a previous node version (`nvm ls` & `nvm use <your latest _working_ version from the ls>`), (2) delete the newly created node version (`nvm uninstall <your _broken_ version of node from the ls>`), then (3) rerun your `nvm install` with the `--latest-npm` flag.
|
||||
|
||||
### Migrating Global Packages Between Installed Versions
|
||||
|
||||
`--reinstall-packages-from` is tied to `nvm install`. To migrate global npm packages between versions you _already_ have installed, without (re)installing anything, `nvm use` the destination and run `nvm reinstall-packages` as a standalone command, pointing at the version you want to copy _from_:
|
||||
|
||||
```sh
|
||||
nvm use 22.22.2
|
||||
nvm reinstall-packages 22.20.0
|
||||
```
|
||||
|
||||
This reinstalls all global packages from `22.20.0` into the currently-active version (`22.22.2`). As with `--reinstall-packages-from`, the npm version itself is not changed.
|
||||
|
||||
|
||||
### Offline Install
|
||||
|
||||
If you've previously downloaded a node version (or it's still in the cache), you can install it without any network access using the `--offline` flag:
|
||||
|
||||
```sh
|
||||
nvm install --offline 14.7.0
|
||||
```
|
||||
|
||||
This resolves versions using only locally installed versions and cached downloads. It will not attempt to download anything. This is useful in air-gapped environments, on planes, or when you want to avoid network latency.
|
||||
|
||||
You can combine `--offline` with `--lts` to install the latest cached LTS version (as long as LTS aliases have been populated by a prior `nvm ls-remote --lts`):
|
||||
|
||||
```sh
|
||||
nvm install --offline --lts
|
||||
```
|
||||
|
||||
### Default Global Packages From File While Installing
|
||||
|
||||
@@ -628,7 +658,7 @@ NVM_AUTH_HEADER="Bearer secret-token" nvm install node
|
||||
### .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).
|
||||
Afterwards, `nvm use`, `nvm install`, `nvm exec`, `nvm run`, and `nvm which` will use the version specified in the `.nvmrc` file if no version is supplied on the command line.
|
||||
Afterwards, `nvm use`, `nvm install`, and `nvm which` will use the version specified in the `.nvmrc` file if no version is supplied on the command line; if no `.nvmrc` is found either, they exit with status `127`. (`nvm exec` and `nvm run` follow the same `.nvmrc` lookup, but currently fall back to the active node if neither resolves — treat that fallback as undefined behavior; pass an explicit version if you need predictable scripting.) If you want the currently active version, pass `current` explicitly (e.g. `nvm which current`) — `current` is not affected by `.nvmrc`.
|
||||
|
||||
For example, to make nvm default to the latest 5.9 release, the latest LTS version, or the latest node version for the current directory:
|
||||
|
||||
@@ -923,18 +953,18 @@ Alpine Linux, unlike mainstream/traditional Linux distributions, is based on [Bu
|
||||
|
||||
There is a `-s` flag for `nvm install` which requests nvm download Node source and compile it locally.
|
||||
|
||||
If installing nvm on Alpine Linux *is* still what you want or need to do, you should be able to achieve this by running the following from you Alpine Linux shell, depending on which version you are using:
|
||||
If installing nvm on Alpine Linux *is* still what you want or need to do, you should be able to achieve this by running the following from your Alpine Linux shell, depending on which version you are using:
|
||||
|
||||
### Alpine Linux 3.13+
|
||||
```sh
|
||||
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.4/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
|
||||
```
|
||||
|
||||
### Alpine Linux 3.5 - 3.12
|
||||
```sh
|
||||
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.4/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/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._
|
||||
@@ -1037,9 +1067,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)
|
||||
|
||||
[1]: https://github.com/nvm-sh/nvm.git
|
||||
[2]: https://github.com/nvm-sh/nvm/blob/v0.40.4/install.sh
|
||||
[2]: https://github.com/nvm-sh/nvm/blob/v0.40.5/install.sh
|
||||
[3]: https://github.com/nvm-sh/nvm/actions/workflows/tests-fast.yml
|
||||
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.4
|
||||
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.5
|
||||
[Urchin]: https://git.sdf.org/tlevine/urchin
|
||||
[Fish]: https://fishshell.com
|
||||
|
||||
@@ -1097,7 +1127,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.
|
||||
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.
|
||||
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.476)
|
||||
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.576)
|
||||
|
||||
- Exit back to your native shell.
|
||||
|
||||
@@ -1124,7 +1154,7 @@ Now you should be able to use node as usual.
|
||||
If you've encountered this error on WSL-2:
|
||||
|
||||
```sh
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
|
||||
% Total % Received % Xferd Average Speed Time Time Time Current
|
||||
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
|
||||
@@ -1159,7 +1189,7 @@ Currently, the sole maintainer is [@ljharb](https://github.com/ljharb) - more ma
|
||||
|
||||
## Project Support
|
||||
|
||||
Only the latest version (v0.40.4 at this time) is supported.
|
||||
Only the latest version (v0.40.5 at this time) is supported.
|
||||
|
||||
## Enterprise Support
|
||||
|
||||
|
||||
31
install.sh
31
install.sh
@@ -33,7 +33,7 @@ nvm_install_dir() {
|
||||
}
|
||||
|
||||
nvm_latest_version() {
|
||||
nvm_echo "v0.40.4"
|
||||
nvm_echo "v0.40.5"
|
||||
}
|
||||
|
||||
nvm_profile_is_bash_or_zsh() {
|
||||
@@ -67,7 +67,7 @@ nvm_source() {
|
||||
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
|
||||
|
||||
The default repository for this install is \`nvm-sh/nvm\`,
|
||||
but the environment variables \`\$NVM_INSTALL_GITHUB_REPO\` is
|
||||
but the environment variable \`\$NVM_INSTALL_GITHUB_REPO\` is
|
||||
currently set to \`${NVM_GITHUB_REPO}\`.
|
||||
|
||||
If this is not intentional, interrupt this installation and
|
||||
@@ -149,7 +149,10 @@ install_nvm_from_git() {
|
||||
fetch_error="Failed to fetch origin with $NVM_VERSION. Please report this!"
|
||||
nvm_echo "=> Downloading nvm from git to '$INSTALL_DIR'"
|
||||
command printf '\r=> '
|
||||
mkdir -p "${INSTALL_DIR}"
|
||||
mkdir -p "${INSTALL_DIR}" || {
|
||||
nvm_echo >&2 "Failed to create directory '${INSTALL_DIR}'"
|
||||
exit 2
|
||||
}
|
||||
if [ "$(ls -A "${INSTALL_DIR}")" ]; then
|
||||
# Initializing repo
|
||||
command git init "${INSTALL_DIR}" || {
|
||||
@@ -216,7 +219,7 @@ nvm_install_node() {
|
||||
local CURRENT_NVM_NODE
|
||||
|
||||
CURRENT_NVM_NODE="$(nvm_version current)"
|
||||
if [ "$(nvm_version "$NODE_VERSION_LOCAL")" == "$CURRENT_NVM_NODE" ]; then
|
||||
if [ "$(nvm_version "$NODE_VERSION_LOCAL")" = "$CURRENT_NVM_NODE" ]; then
|
||||
nvm_echo "=> Node.js version $NODE_VERSION_LOCAL has been successfully installed"
|
||||
else
|
||||
nvm_echo >&2 "Failed to install Node.js $NODE_VERSION_LOCAL"
|
||||
@@ -234,7 +237,10 @@ install_nvm_as_script() {
|
||||
NVM_BASH_COMPLETION_SOURCE="$(nvm_source script-nvm-bash-completion)"
|
||||
|
||||
# Downloading to $INSTALL_DIR
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
mkdir -p "$INSTALL_DIR" || {
|
||||
nvm_echo >&2 "Failed to create directory '$INSTALL_DIR'"
|
||||
return 1
|
||||
}
|
||||
if [ -f "$INSTALL_DIR/nvm.sh" ]; then
|
||||
nvm_echo "=> nvm is already installed in $INSTALL_DIR, trying to update the script"
|
||||
else
|
||||
@@ -374,7 +380,10 @@ nvm_do_install() {
|
||||
fi
|
||||
|
||||
if [ "${NVM_DIR}" = "$(nvm_default_install_dir)" ]; then
|
||||
mkdir "${NVM_DIR}"
|
||||
mkdir "${NVM_DIR}" || {
|
||||
nvm_echo >&2 "Failed to create directory '${NVM_DIR}'"
|
||||
exit 2
|
||||
}
|
||||
else
|
||||
nvm_echo >&2 "You have \$NVM_DIR set to \"${NVM_DIR}\", but that directory does not exist. Check your profile files and environment."
|
||||
exit 1
|
||||
@@ -434,13 +443,13 @@ nvm_do_install() {
|
||||
elif [ -z "${NVM_PROFILE-}" ] ; then
|
||||
local TRIED_PROFILE
|
||||
if [ -n "${PROFILE}" ]; then
|
||||
TRIED_PROFILE="${NVM_PROFILE} (as defined in \$PROFILE), "
|
||||
TRIED_PROFILE="${PROFILE} (as defined in \$PROFILE), "
|
||||
fi
|
||||
nvm_echo "=> Profile not found. Tried ${TRIED_PROFILE-}~/.bashrc, ~/.bash_profile, ~/.zprofile, ~/.zshrc, and ~/.profile."
|
||||
nvm_echo "=> Create one of them and run this script again"
|
||||
nvm_echo " OR"
|
||||
nvm_echo "=> Append the following lines to the correct file yourself:"
|
||||
command printf "${SOURCE_STR}"
|
||||
command printf '%b' "${SOURCE_STR}"
|
||||
nvm_echo
|
||||
else
|
||||
if nvm_profile_is_bash_or_zsh "${NVM_PROFILE-}"; then
|
||||
@@ -448,14 +457,14 @@ nvm_do_install() {
|
||||
fi
|
||||
if ! command grep -qc '/nvm.sh' "$NVM_PROFILE"; then
|
||||
nvm_echo "=> Appending nvm source string to $NVM_PROFILE"
|
||||
command printf "${SOURCE_STR}" >> "$NVM_PROFILE"
|
||||
command printf '%b' "${SOURCE_STR}" >> "$NVM_PROFILE"
|
||||
else
|
||||
nvm_echo "=> nvm source string already in ${NVM_PROFILE}"
|
||||
fi
|
||||
# shellcheck disable=SC2016
|
||||
if ${BASH_OR_ZSH} && ! command grep -qc '$NVM_DIR/bash_completion' "$NVM_PROFILE"; then
|
||||
nvm_echo "=> Appending bash_completion source string to $NVM_PROFILE"
|
||||
command printf "$COMPLETION_STR" >> "$NVM_PROFILE"
|
||||
command printf '%b' "$COMPLETION_STR" >> "$NVM_PROFILE"
|
||||
else
|
||||
nvm_echo "=> bash_completion source string already in ${NVM_PROFILE}"
|
||||
fi
|
||||
@@ -476,7 +485,7 @@ nvm_do_install() {
|
||||
nvm_reset
|
||||
|
||||
nvm_echo "=> Close and reopen your terminal to start using nvm or run the following to use it now:"
|
||||
command printf "${SOURCE_STR}"
|
||||
command printf '%b' "${SOURCE_STR}"
|
||||
if ${BASH_OR_ZSH} ; then
|
||||
command printf "${COMPLETION_STR}"
|
||||
fi
|
||||
|
||||
2
nvm-exec
2
nvm-exec
@@ -10,7 +10,7 @@ unset NVM_CD_FLAGS
|
||||
if [ -n "$NODE_VERSION" ]; then
|
||||
nvm use "$NODE_VERSION" > /dev/null || exit 127
|
||||
else
|
||||
nvm_rc_version > /dev/null && nvm_ensure_version_installed "$NVM_RC_VERSION";
|
||||
{ NVM_RC_VERSION="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1 && nvm_ensure_version_installed "$NVM_RC_VERSION";
|
||||
if ! nvm use >/dev/null 2>&1; then
|
||||
echo "No NODE_VERSION provided; no .nvmrc file found" >&2
|
||||
exit 127
|
||||
|
||||
447
nvm.sh
447
nvm.sh
@@ -115,46 +115,62 @@ nvm_get_latest() {
|
||||
nvm_echo "${NVM_LATEST_URL##*/}"
|
||||
}
|
||||
|
||||
# Every argument is passed through as a literal argv element so that untrusted,
|
||||
# mirror-supplied version strings in the URLs are never re-parsed by the shell
|
||||
# (which would allow command substitution / OS command injection).
|
||||
nvm_download() {
|
||||
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
|
||||
CURL_COMPRESSED_FLAG="--compressed"
|
||||
fi
|
||||
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
|
||||
# Emulate curl with wget
|
||||
ARGS=$(nvm_echo "$@" | command sed "
|
||||
s/--progress-bar /--progress=bar /
|
||||
s/--compressed //
|
||||
s/--fail //
|
||||
s/-L //
|
||||
s/-I /--server-response /
|
||||
s/-s /-q /
|
||||
s/-sS /-nv /
|
||||
s/-o /-O /
|
||||
s/-C - /-c /
|
||||
")
|
||||
|
||||
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
|
||||
sanitized_header=$(nvm_sanitize_auth_header "${NVM_AUTH_HEADER}")
|
||||
ARGS="${ARGS} --header \"${sanitized_header}\""
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
eval wget $ARGS
|
||||
local sanitized_header
|
||||
sanitized_header=''
|
||||
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
|
||||
sanitized_header="$(nvm_sanitize_auth_header "${NVM_AUTH_HEADER}")"
|
||||
fi
|
||||
|
||||
local NVM_DOWNLOADER
|
||||
NVM_DOWNLOADER=''
|
||||
if nvm_has "curl"; then
|
||||
NVM_DOWNLOADER='curl'
|
||||
set -- -q --fail "$@"
|
||||
if nvm_curl_use_compression; then
|
||||
set -- --compressed "$@"
|
||||
fi
|
||||
elif nvm_has "wget"; then
|
||||
NVM_DOWNLOADER='wget'
|
||||
# Emulate curl with wget
|
||||
local NVM_DOWNLOAD_WGET_COUNT
|
||||
NVM_DOWNLOAD_WGET_COUNT=$#
|
||||
local NVM_DOWNLOAD_WGET_SKIP
|
||||
NVM_DOWNLOAD_WGET_SKIP=0
|
||||
local NVM_DOWNLOAD_WGET_ARG
|
||||
for NVM_DOWNLOAD_WGET_ARG in "$@"; do
|
||||
if [ "${NVM_DOWNLOAD_WGET_SKIP}" = '1' ]; then
|
||||
NVM_DOWNLOAD_WGET_SKIP=0
|
||||
continue
|
||||
fi
|
||||
case "${NVM_DOWNLOAD_WGET_ARG}" in
|
||||
'--progress-bar') set -- "$@" '--progress=bar' ;;
|
||||
'--compressed') : ;;
|
||||
'--fail') : ;;
|
||||
'-L') : ;;
|
||||
'-I') set -- "$@" '--server-response' ;;
|
||||
'-s') set -- "$@" '-q' ;;
|
||||
'-sS') set -- "$@" '-nv' ;;
|
||||
'-o') set -- "$@" '-O' ;;
|
||||
'-C') NVM_DOWNLOAD_WGET_SKIP=1; set -- "$@" '-c' ;;
|
||||
*) set -- "$@" "${NVM_DOWNLOAD_WGET_ARG}" ;;
|
||||
esac
|
||||
done
|
||||
shift "${NVM_DOWNLOAD_WGET_COUNT}"
|
||||
fi
|
||||
|
||||
if [ -z "${NVM_DOWNLOADER}" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
|
||||
set -- "$@" --header "Authorization: ${sanitized_header}"
|
||||
fi
|
||||
|
||||
"${NVM_DOWNLOADER}" "$@"
|
||||
}
|
||||
|
||||
nvm_sanitize_auth_header() {
|
||||
@@ -602,17 +618,16 @@ EOF
|
||||
}
|
||||
|
||||
nvm_rc_version() {
|
||||
export NVM_RC_VERSION=''
|
||||
local NVMRC_PATH
|
||||
NVMRC_PATH="$(nvm_find_nvmrc)"
|
||||
if [ ! -e "${NVMRC_PATH}" ]; then
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
nvm_err "No .nvmrc file found"
|
||||
nvm_err "No version provided and no .nvmrc file found"
|
||||
fi
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
local NVM_RC_VERSION
|
||||
if ! NVM_RC_VERSION="$(nvm_process_nvmrc "${NVMRC_PATH}")"; then
|
||||
return 1
|
||||
fi
|
||||
@@ -626,6 +641,7 @@ nvm_rc_version() {
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
nvm_echo "Found '${NVMRC_PATH}' with version <${NVM_RC_VERSION}>"
|
||||
fi
|
||||
nvm_echo "${NVM_RC_VERSION}" >&3
|
||||
}
|
||||
|
||||
nvm_clang_version() {
|
||||
@@ -878,7 +894,10 @@ ${NVM_LS_REMOTE_POST_MERGED_OUTPUT}" | nvm_grep -v "N/A" | command sed '/^ *$/d'
|
||||
# the `sed` is to remove trailing whitespaces (see "weird behavior" ~25 lines up)
|
||||
nvm_echo "${VERSIONS}" | command sed 's/ *$//g'
|
||||
# shellcheck disable=SC2317
|
||||
return $NVM_LS_REMOTE_EXIT_CODE || $NVM_LS_REMOTE_IOJS_EXIT_CODE
|
||||
if [ "${NVM_LS_REMOTE_EXIT_CODE}" != '0' ]; then
|
||||
return "${NVM_LS_REMOTE_EXIT_CODE}"
|
||||
fi
|
||||
return "${NVM_LS_REMOTE_IOJS_EXIT_CODE}"
|
||||
}
|
||||
|
||||
nvm_is_valid_version() {
|
||||
@@ -932,10 +951,14 @@ nvm_normalize_lts() {
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if [ "${LTS}" != "$(echo "${LTS}" | command tr '[:upper:]' '[:lower:]')" ]; then
|
||||
nvm_err 'LTS names must be lowercase'
|
||||
return 3
|
||||
fi
|
||||
case "${LTS}" in
|
||||
lts/*)
|
||||
if [ "${LTS}" != "$(echo "${LTS}" | command tr '[:upper:]' '[:lower:]')" ]; then
|
||||
nvm_err 'LTS names must be lowercase'
|
||||
return 3
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
nvm_echo "${LTS}"
|
||||
;;
|
||||
esac
|
||||
@@ -1153,7 +1176,7 @@ nvm_print_formatted_alias() {
|
||||
fi
|
||||
local ARROW
|
||||
ARROW='->'
|
||||
if nvm_has_colors; then
|
||||
if [ "${NVM_HAS_COLORS-}" = 1 ] || nvm_has_colors; then
|
||||
ARROW='\033[0;90m->\033[0m'
|
||||
if [ "_${DEFAULT}" = '_true' ]; then
|
||||
NEWLINE=" \033[${DEFAULT_COLOR}(default)\033[0m\n"
|
||||
@@ -1254,11 +1277,17 @@ nvm_list_aliases() {
|
||||
return $?
|
||||
fi
|
||||
|
||||
local NVM_HAS_COLORS
|
||||
NVM_HAS_COLORS=0
|
||||
if nvm_has_colors; then
|
||||
NVM_HAS_COLORS=1
|
||||
fi
|
||||
|
||||
nvm_is_zsh && unsetopt local_options nomatch
|
||||
(
|
||||
local ALIAS_PATH
|
||||
for ALIAS_PATH in "${NVM_ALIAS_DIR}/${ALIAS}"*; do
|
||||
NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}" &
|
||||
NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_HAS_COLORS="${NVM_HAS_COLORS}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}" &
|
||||
done
|
||||
wait
|
||||
) | command sort
|
||||
@@ -1269,7 +1298,7 @@ nvm_list_aliases() {
|
||||
{
|
||||
# shellcheck disable=SC2030,SC2031 # (https://github.com/koalaman/shellcheck/issues/2217)
|
||||
if [ ! -f "${NVM_ALIAS_DIR}/${ALIAS_NAME}" ] && { [ -z "${ALIAS}" ] || [ "${ALIAS_NAME}" = "${ALIAS}" ]; }; then
|
||||
NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_default_alias "${ALIAS_NAME}"
|
||||
NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_HAS_COLORS="${NVM_HAS_COLORS}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_default_alias "${ALIAS_NAME}"
|
||||
fi
|
||||
} &
|
||||
done
|
||||
@@ -1281,7 +1310,7 @@ nvm_list_aliases() {
|
||||
# shellcheck disable=SC2030,SC2031 # (https://github.com/koalaman/shellcheck/issues/2217)
|
||||
for ALIAS_PATH in "${NVM_ALIAS_DIR}/lts/${ALIAS}"*; do
|
||||
{
|
||||
LTS_ALIAS="$(NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_LTS=true nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}")"
|
||||
LTS_ALIAS="$(NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_HAS_COLORS="${NVM_HAS_COLORS}" NVM_LTS=true nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}")"
|
||||
if [ -n "${LTS_ALIAS}" ]; then
|
||||
nvm_echo "${LTS_ALIAS}"
|
||||
fi
|
||||
@@ -1359,7 +1388,7 @@ nvm_resolve_alias() {
|
||||
break
|
||||
fi
|
||||
|
||||
if command printf "${SEEN_ALIASES}" | nvm_grep -q -e "^${ALIAS_TEMP}$"; then
|
||||
if command printf '%b' "${SEEN_ALIASES}" | nvm_grep -q -e "^${ALIAS_TEMP}$"; then
|
||||
ALIAS="∞"
|
||||
break
|
||||
fi
|
||||
@@ -1898,7 +1927,7 @@ nvm_get_checksum() {
|
||||
SHASUMS_URL="${MIRROR}/${3}/SHASUMS.txt"
|
||||
fi
|
||||
|
||||
nvm_download -L -s "${SHASUMS_URL}" -o - | command awk "{ if (\"${4}.${5}\" == \$2) print \$1}"
|
||||
nvm_download -L -s "${SHASUMS_URL}" -o - | command awk -v tarball="${4}.${5}" '{ if (tarball == $2) print $1 }'
|
||||
}
|
||||
|
||||
nvm_print_versions() {
|
||||
@@ -2153,7 +2182,7 @@ nvm_get_arch() {
|
||||
|
||||
# If running a 64bit ARM kernel but a 32bit ARM userland,
|
||||
# change ARCH to 32bit ARM (armv7l) if /sbin/init is 32bit executable
|
||||
if [ "$(uname)" = "Linux" ] \
|
||||
if [ "$(command uname)" = "Linux" ] \
|
||||
&& [ "${NVM_ARCH}" = arm64 ] \
|
||||
&& [ "$(command od -An -t x1 -j 4 -N 1 "/sbin/init" 2>/dev/null)" = ' 01' ]\
|
||||
; then
|
||||
@@ -2162,7 +2191,10 @@ nvm_get_arch() {
|
||||
fi
|
||||
|
||||
if [ -f "/etc/alpine-release" ]; then
|
||||
NVM_ARCH=x64-musl
|
||||
# Alpine Linux uses musl libc; only x64-musl binaries are available
|
||||
case "${NVM_ARCH}" in
|
||||
x64) NVM_ARCH=x64-musl ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
nvm_echo "${NVM_ARCH}"
|
||||
@@ -2238,7 +2270,7 @@ nvm_get_mirror() {
|
||||
esac
|
||||
|
||||
|
||||
if ! nvm_echo "${NVM_MIRROR}" | command awk '{ $0 ~ "^https?://[a-zA-Z0-9./_-]+$" }'; then
|
||||
if ! nvm_echo "${NVM_MIRROR}" | command awk '{ if ($0 !~ /^https?:\/\/[a-zA-Z0-9.\/_-]+$/) exit 1 }'; then
|
||||
nvm_err '$NVM_NODEJS_ORG_MIRROR and $NVM_IOJS_ORG_MIRROR may only contain a URL'
|
||||
return 2
|
||||
fi
|
||||
@@ -2270,7 +2302,7 @@ nvm_install_binary_extract() {
|
||||
command mkdir -p "${TMPDIR}" && \
|
||||
VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" || return 1
|
||||
|
||||
# For Windows system (GitBash with MSYS, Cygwin)
|
||||
# For Windows system (Git Bash with MSYS, Cygwin)
|
||||
if [ "${NVM_OS}" = 'win' ]; then
|
||||
VERSION_PATH="${VERSION_PATH}/bin"
|
||||
command unzip -q "${TARBALL}" -d "${TMPDIR}" || return 1
|
||||
@@ -2362,7 +2394,7 @@ nvm_install_binary() {
|
||||
# Read nosource from arguments
|
||||
if [ "${nosource-}" = '1' ]; then
|
||||
nvm_err 'Binary download failed. Download from source aborted.'
|
||||
return 0
|
||||
return 2
|
||||
fi
|
||||
|
||||
nvm_err 'Binary download failed, trying source.'
|
||||
@@ -2474,10 +2506,16 @@ nvm_download_artifact() {
|
||||
local VERSION
|
||||
VERSION="${4}"
|
||||
|
||||
if [ -z "${VERSION}" ]; then
|
||||
nvm_err 'A version number is required.'
|
||||
return 3
|
||||
fi
|
||||
case "${VERSION}" in
|
||||
'')
|
||||
nvm_err 'A version number is required.'
|
||||
return 3
|
||||
;;
|
||||
*[!0-9A-Za-z._+-]*)
|
||||
nvm_err 'Invalid version: contains disallowed characters'
|
||||
return 3
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "${KIND}" = 'binary' ] && ! nvm_binary_available "${VERSION}"; then
|
||||
nvm_err "No precompiled binary available for ${VERSION}."
|
||||
@@ -2490,22 +2528,35 @@ nvm_download_artifact() {
|
||||
local COMPRESSION
|
||||
COMPRESSION="$(nvm_get_artifact_compression "${VERSION}")"
|
||||
|
||||
local CHECKSUM
|
||||
CHECKSUM="$(nvm_get_checksum "${FLAVOR}" "${TYPE}" "${VERSION}" "${SLUG}" "${COMPRESSION}")"
|
||||
|
||||
local tmpdir
|
||||
if [ "${KIND}" = 'binary' ]; then
|
||||
tmpdir="$(nvm_cache_dir)/bin/${SLUG}"
|
||||
else
|
||||
tmpdir="$(nvm_cache_dir)/src/${SLUG}"
|
||||
fi
|
||||
command mkdir -p "${tmpdir}/files" || (
|
||||
nvm_err "creating directory ${tmpdir}/files failed"
|
||||
return 3
|
||||
)
|
||||
|
||||
local TARBALL
|
||||
TARBALL="${tmpdir}/${SLUG}.${COMPRESSION}"
|
||||
|
||||
if [ "${NVM_OFFLINE-}" = 1 ]; then
|
||||
# In offline mode, use cached tarball without checksum or download
|
||||
if [ -r "${TARBALL}" ]; then
|
||||
nvm_err "Offline: using cached archive $(nvm_sanitize_path "${TARBALL}")"
|
||||
nvm_echo "${TARBALL}"
|
||||
return 0
|
||||
fi
|
||||
nvm_err "Offline: no cached archive found for ${SLUG}"
|
||||
return 4
|
||||
fi
|
||||
|
||||
local CHECKSUM
|
||||
CHECKSUM="$(nvm_get_checksum "${FLAVOR}" "${TYPE}" "${VERSION}" "${SLUG}" "${COMPRESSION}")"
|
||||
|
||||
command mkdir -p "${tmpdir}/files" || {
|
||||
nvm_err "creating directory ${tmpdir}/files failed"
|
||||
return 3
|
||||
}
|
||||
|
||||
local TARBALL_URL
|
||||
if nvm_version_greater_than_or_equal_to "${VERSION}" 0.1.14; then
|
||||
TARBALL_URL="${MIRROR}/${VERSION}/${SLUG}.${COMPRESSION}"
|
||||
@@ -2527,11 +2578,11 @@ nvm_download_artifact() {
|
||||
command rm -rf "${TARBALL}"
|
||||
fi
|
||||
nvm_err "Downloading ${TARBALL_URL}..."
|
||||
nvm_download -L -C - "${PROGRESS_BAR}" "${TARBALL_URL}" -o "${TARBALL}" || (
|
||||
nvm_download -L -C - "${PROGRESS_BAR}" "${TARBALL_URL}" -o "${TARBALL}" || {
|
||||
command rm -rf "${TARBALL}" "${tmpdir}"
|
||||
nvm_err "download from ${TARBALL_URL} failed"
|
||||
return 4
|
||||
)
|
||||
}
|
||||
|
||||
if nvm_grep '404 Not Found' "${TARBALL}" >/dev/null; then
|
||||
command rm -rf "${TARBALL}" "${tmpdir}"
|
||||
@@ -2539,10 +2590,10 @@ nvm_download_artifact() {
|
||||
return 5
|
||||
fi
|
||||
|
||||
nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" || (
|
||||
nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" || {
|
||||
command rm -rf "${tmpdir}/files"
|
||||
return 6
|
||||
)
|
||||
}
|
||||
|
||||
nvm_echo "${TARBALL}"
|
||||
}
|
||||
@@ -2585,7 +2636,7 @@ nvm_extract_tarball() {
|
||||
command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" -s '/[^\/]*\///' || return 1
|
||||
fi
|
||||
else
|
||||
command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 || return 1
|
||||
command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 --no-same-owner || return 1
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -2942,7 +2993,7 @@ nvm_iojs_version_has_solaris_binary() {
|
||||
IOJS_VERSION="$1"
|
||||
local STRIPPED_IOJS_VERSION
|
||||
STRIPPED_IOJS_VERSION="$(nvm_strip_iojs_prefix "${IOJS_VERSION}")"
|
||||
if [ "_${STRIPPED_IOJS_VERSION}" = "${IOJS_VERSION}" ]; then
|
||||
if [ "_${STRIPPED_IOJS_VERSION}" = "_${IOJS_VERSION}" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
@@ -3050,6 +3101,57 @@ nvm_cache_dir() {
|
||||
nvm_echo "${NVM_DIR}/.cache"
|
||||
}
|
||||
|
||||
# args: pattern
|
||||
# Lists versions available in the local cache (not yet installed).
|
||||
# Returns version numbers like "v18.20.4", one per line, sorted.
|
||||
nvm_ls_cached() {
|
||||
local PATTERN
|
||||
PATTERN="${1-}"
|
||||
local CACHE_BIN_DIR
|
||||
CACHE_BIN_DIR="$(nvm_cache_dir)/bin"
|
||||
if [ ! -d "${CACHE_BIN_DIR}" ]; then
|
||||
return
|
||||
fi
|
||||
local NVM_OS
|
||||
NVM_OS="$(nvm_get_os)"
|
||||
local NVM_ARCH
|
||||
NVM_ARCH="$(nvm_get_arch)"
|
||||
local SUFFIX
|
||||
SUFFIX="${NVM_OS}-${NVM_ARCH}"
|
||||
# shellcheck disable=SC2010
|
||||
command ls -1 "${CACHE_BIN_DIR}" \
|
||||
| nvm_grep "^node-v.*-${SUFFIX}\$" \
|
||||
| command sed "s/^node-\\(v[0-9][0-9.]*\\)-${SUFFIX}\$/\\1/" \
|
||||
| nvm_grep "$(nvm_ensure_version_prefix "${PATTERN}")" \
|
||||
| command sort -t. -u -k 1.2,1n -k 2,2n -k 3,3n
|
||||
}
|
||||
|
||||
# args: pattern
|
||||
# Resolves a version pattern to a single version using only locally
|
||||
# installed versions and cached downloads. No network access.
|
||||
nvm_offline_version() {
|
||||
local PATTERN
|
||||
PATTERN="${1-}"
|
||||
|
||||
# First try locally installed versions
|
||||
local VERSION
|
||||
VERSION="$(nvm_version "${PATTERN}")"
|
||||
if [ "_${VERSION}" != '_N/A' ]; then
|
||||
nvm_echo "${VERSION}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Then try cached downloads
|
||||
VERSION="$(nvm_ls_cached "${PATTERN}" | command tail -1)"
|
||||
if [ -n "${VERSION}" ]; then
|
||||
nvm_echo "${VERSION}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
nvm_echo 'N/A'
|
||||
return 3
|
||||
}
|
||||
|
||||
nvm() {
|
||||
if [ "$#" -lt 1 ]; then
|
||||
nvm --help
|
||||
@@ -3120,7 +3222,7 @@ nvm() {
|
||||
nvm_echo ' nvm --help Show this message'
|
||||
nvm_echo ' --no-colors Suppress colored output'
|
||||
nvm_echo ' nvm --version Print out the installed version of nvm'
|
||||
nvm_echo ' nvm install [<version>] Download and install a <version>. Uses .nvmrc if available and version is omitted.'
|
||||
nvm_echo ' nvm install [<version>] Download and install a <version>. Uses .nvmrc if version is omitted; otherwise errors.'
|
||||
nvm_echo ' The following optional arguments, if provided, must appear directly after `nvm install`:'
|
||||
nvm_echo ' -s Skip binary download, install from source only.'
|
||||
nvm_echo ' -b Skip source download, install from binary only.'
|
||||
@@ -3130,29 +3232,30 @@ nvm() {
|
||||
nvm_echo ' --skip-default-packages When installing, skip the default-packages file if it exists'
|
||||
nvm_echo ' --latest-npm After installing, attempt to upgrade to the latest working npm on the given node version'
|
||||
nvm_echo ' --no-progress Disable the progress bar on any downloads'
|
||||
nvm_echo ' --offline Install from cache only, without downloading anything'
|
||||
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 ' --save After installing, write the specified version to .nvmrc'
|
||||
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=<LTS name> Uninstall using automatic alias for provided LTS line, if available.'
|
||||
nvm_echo ' nvm use [<version>] Modify PATH to use <version>. Uses .nvmrc if available and version is omitted.'
|
||||
nvm_echo ' nvm use [current | <version>] Modify PATH to use <version>. Uses .nvmrc if version is omitted; otherwise errors.'
|
||||
nvm_echo ' The following optional arguments, if provided, must appear directly after `nvm use`:'
|
||||
nvm_echo ' --silent Silences stdout/stderr output'
|
||||
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 ' --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 [current | <version>] [<command>] Run <command> on <version>. Uses .nvmrc if version is omitted; otherwise errors.'
|
||||
nvm_echo ' The following optional arguments, if provided, must appear directly after `nvm exec`:'
|
||||
nvm_echo ' --silent Silences stdout/stderr output'
|
||||
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 ' nvm run [<version>] [<args>] Run `node` on <version> with <args> as arguments. Uses .nvmrc if available and version is omitted.'
|
||||
nvm_echo ' nvm run [current | <version>] [<args>] Run `node` on <version> with <args> as arguments. Uses .nvmrc if version is omitted; otherwise errors.'
|
||||
nvm_echo ' The following optional arguments, if provided, must appear directly after `nvm run`:'
|
||||
nvm_echo ' --silent Silences stdout/stderr output'
|
||||
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 ' nvm current Display currently activated version of Node'
|
||||
nvm_echo ' nvm current Display the active node version (resolved via $PATH; not affected by .nvmrc).'
|
||||
nvm_echo ' nvm ls [<version>] List installed versions, matching a given <version> if provided'
|
||||
nvm_echo ' --no-colors Suppress colored output'
|
||||
nvm_echo ' --no-alias Suppress `nvm alias` output'
|
||||
@@ -3173,7 +3276,7 @@ nvm() {
|
||||
nvm_echo ' nvm install-latest-npm Attempt to upgrade to the latest working `npm` on the current node version'
|
||||
nvm_echo ' nvm reinstall-packages <version> Reinstall global `npm` packages contained in <version> to current version'
|
||||
nvm_echo ' nvm unload Unload `nvm` from shell'
|
||||
nvm_echo ' nvm which [current | <version>] Display path to installed node version. Uses .nvmrc if available and version is omitted.'
|
||||
nvm_echo ' nvm which [current | <version>] Display path to installed node version. Uses .nvmrc if version is omitted; otherwise errors.'
|
||||
nvm_echo ' --silent Silences stdout/stderr output when a version is omitted'
|
||||
nvm_echo ' nvm cache dir Display path to the cache directory for nvm'
|
||||
nvm_echo ' nvm cache clear Empty cache directory for nvm'
|
||||
@@ -3235,7 +3338,9 @@ nvm() {
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
>&2 nvm --help
|
||||
nvm_err 'Usage: nvm cache dir'
|
||||
nvm_err ' nvm cache clear'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
;;
|
||||
esac
|
||||
@@ -3255,10 +3360,10 @@ nvm() {
|
||||
nvm_err "\${HOME}: ${HOME}"
|
||||
nvm_err "\${NVM_DIR}: '$(nvm_sanitize_path "${NVM_DIR}")'"
|
||||
nvm_err "\${PATH}: $(nvm_sanitize_path "${PATH}")"
|
||||
nvm_err "\$PREFIX: '$(nvm_sanitize_path "${PREFIX}")'"
|
||||
nvm_err "\${NPM_CONFIG_PREFIX}: '$(nvm_sanitize_path "${NPM_CONFIG_PREFIX}")'"
|
||||
nvm_err "\$NVM_NODEJS_ORG_MIRROR: '${NVM_NODEJS_ORG_MIRROR}'"
|
||||
nvm_err "\$NVM_IOJS_ORG_MIRROR: '${NVM_IOJS_ORG_MIRROR}'"
|
||||
nvm_err "\$PREFIX: '$(nvm_sanitize_path "${PREFIX-}")'"
|
||||
nvm_err "\${NPM_CONFIG_PREFIX}: '$(nvm_sanitize_path "${NPM_CONFIG_PREFIX-}")'"
|
||||
nvm_err "\$NVM_NODEJS_ORG_MIRROR: '${NVM_NODEJS_ORG_MIRROR-}'"
|
||||
nvm_err "\$NVM_IOJS_ORG_MIRROR: '${NVM_IOJS_ORG_MIRROR-}'"
|
||||
nvm_err "shell version: '$(${SHELL} --version | command head -n 1)'"
|
||||
nvm_err "uname -a: '$(command uname -a | command awk '{$2=""; print}' | command xargs)'"
|
||||
nvm_err "checksum binary: '$(nvm_get_checksum_binary 2>/dev/null)'"
|
||||
@@ -3335,11 +3440,6 @@ nvm() {
|
||||
local NVM_OS
|
||||
NVM_OS="$(nvm_get_os)"
|
||||
|
||||
if ! nvm_has "curl" && ! nvm_has "wget"; then
|
||||
nvm_err 'nvm needs curl or wget to proceed.'
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
version_not_provided=1
|
||||
fi
|
||||
@@ -3347,9 +3447,11 @@ nvm() {
|
||||
local nobinary
|
||||
local nosource
|
||||
local noprogress
|
||||
local NVM_OFFLINE
|
||||
nobinary=0
|
||||
noprogress=0
|
||||
nosource=0
|
||||
NVM_OFFLINE=0
|
||||
local LTS
|
||||
local ALIAS
|
||||
local NVM_UPGRADE_NPM
|
||||
@@ -3371,7 +3473,7 @@ nvm() {
|
||||
shift # consume "-s"
|
||||
nobinary=1
|
||||
if [ $nosource -eq 1 ]; then
|
||||
nvm err '-s and -b cannot be set together since they would skip install from both binary and source'
|
||||
nvm_err '-s and -b cannot be set together since they would skip install from both binary and source'
|
||||
return 6
|
||||
fi
|
||||
;;
|
||||
@@ -3379,7 +3481,7 @@ nvm() {
|
||||
shift # consume "-b"
|
||||
nosource=1
|
||||
if [ $nobinary -eq 1 ]; then
|
||||
nvm err '-s and -b cannot be set together since they would skip install from both binary and source'
|
||||
nvm_err '-s and -b cannot be set together since they would skip install from both binary and source'
|
||||
return 6
|
||||
fi
|
||||
;;
|
||||
@@ -3392,6 +3494,10 @@ nvm() {
|
||||
noprogress=1
|
||||
shift
|
||||
;;
|
||||
--offline)
|
||||
NVM_OFFLINE=1
|
||||
shift
|
||||
;;
|
||||
--lts)
|
||||
LTS='*'
|
||||
shift
|
||||
@@ -3468,6 +3574,11 @@ nvm() {
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "${NVM_OFFLINE}" != 1 ] && ! nvm_has "curl" && ! nvm_has "wget"; then
|
||||
nvm_err 'nvm needs curl or wget to proceed.'
|
||||
return 1
|
||||
fi
|
||||
|
||||
local provided_version
|
||||
provided_version="${1-}"
|
||||
|
||||
@@ -3483,14 +3594,13 @@ nvm() {
|
||||
shift
|
||||
fi
|
||||
else
|
||||
nvm_rc_version
|
||||
if [ $version_not_provided -eq 1 ] && [ -z "${NVM_RC_VERSION}" ]; then
|
||||
unset NVM_RC_VERSION
|
||||
>&2 nvm --help
|
||||
{ provided_version="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
if [ $version_not_provided -eq 1 ] && [ -z "${provided_version}" ]; then
|
||||
nvm_err 'Usage: nvm install [<version>]'
|
||||
nvm_err ' Provide a <version>, or run from a directory containing an .nvmrc file.'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
provided_version="${NVM_RC_VERSION}"
|
||||
unset NVM_RC_VERSION
|
||||
fi
|
||||
elif [ $# -gt 0 ]; then
|
||||
shift
|
||||
@@ -3508,8 +3618,27 @@ nvm() {
|
||||
esac
|
||||
|
||||
local EXIT_CODE
|
||||
VERSION="$(NVM_VERSION_ONLY=true NVM_LTS="${LTS-}" nvm_remote_version "${provided_version}")"
|
||||
EXIT_CODE="$?"
|
||||
|
||||
if [ "${NVM_OFFLINE}" = 1 ]; then
|
||||
local OFFLINE_PATTERN
|
||||
OFFLINE_PATTERN="${provided_version}"
|
||||
if [ -n "${LTS-}" ]; then
|
||||
if [ "${LTS}" = '*' ]; then
|
||||
OFFLINE_PATTERN="$(nvm_resolve_alias 'lts/*' 2>/dev/null || nvm_echo)"
|
||||
else
|
||||
OFFLINE_PATTERN="$(nvm_resolve_alias "lts/${LTS}" 2>/dev/null || nvm_echo)"
|
||||
fi
|
||||
if [ -z "${OFFLINE_PATTERN}" ]; then
|
||||
nvm_err "LTS alias '${LTS}' not found locally. Run \`nvm ls-remote --lts\` first to populate LTS aliases."
|
||||
return 3
|
||||
fi
|
||||
fi
|
||||
VERSION="$(nvm_offline_version "${OFFLINE_PATTERN}")"
|
||||
EXIT_CODE="$?"
|
||||
else
|
||||
VERSION="$(NVM_VERSION_ONLY=true NVM_LTS="${LTS-}" nvm_remote_version "${provided_version}")"
|
||||
EXIT_CODE="$?"
|
||||
fi
|
||||
|
||||
if [ "${VERSION}" = 'N/A' ] || [ $EXIT_CODE -ne 0 ]; then
|
||||
local LTS_MSG
|
||||
@@ -3525,9 +3654,17 @@ nvm() {
|
||||
return 3
|
||||
fi
|
||||
else
|
||||
REMOTE_CMD='nvm ls-remote'
|
||||
if [ "${NVM_OFFLINE}" = 1 ]; then
|
||||
REMOTE_CMD='nvm ls'
|
||||
else
|
||||
REMOTE_CMD='nvm ls-remote'
|
||||
fi
|
||||
fi
|
||||
if [ "${NVM_OFFLINE}" = 1 ]; then
|
||||
nvm_err "Version '${provided_version}' ${LTS_MSG-}not found locally or in cache - try \`${REMOTE_CMD}\` to browse available versions."
|
||||
else
|
||||
nvm_err "Version '${provided_version}' ${LTS_MSG-}not found - try \`${REMOTE_CMD}\` to browse available versions."
|
||||
fi
|
||||
nvm_err "Version '${provided_version}' ${LTS_MSG-}not found - try \`${REMOTE_CMD}\` to browse available versions."
|
||||
return 3
|
||||
fi
|
||||
|
||||
@@ -3599,10 +3736,10 @@ nvm() {
|
||||
nvm install-latest-npm
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
if [ $EXIT_CODE -ne 0 ] && [ -z "${SKIP_DEFAULT_PACKAGES-}" ]; then
|
||||
if [ $EXIT_CODE -eq 0 ] && [ -z "${SKIP_DEFAULT_PACKAGES-}" ]; then
|
||||
nvm_install_default_packages
|
||||
fi
|
||||
if [ $EXIT_CODE -ne 0 ] && [ -n "${REINSTALL_PACKAGES_FROM-}" ] && [ "_${REINSTALL_PACKAGES_FROM}" != "_N/A" ]; then
|
||||
if [ $EXIT_CODE -eq 0 ] && [ -n "${REINSTALL_PACKAGES_FROM-}" ] && [ "_${REINSTALL_PACKAGES_FROM}" != "_N/A" ]; then
|
||||
nvm reinstall-packages "${REINSTALL_PACKAGES_FROM}"
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
@@ -3620,7 +3757,7 @@ nvm() {
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
|
||||
if [ $EXIT_CODE -ne 0 ] && [ -n "${ALIAS-}" ]; then
|
||||
if [ $EXIT_CODE -eq 0 ] && [ -n "${ALIAS-}" ]; then
|
||||
nvm alias "${ALIAS}" "${provided_version}"
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
@@ -3667,7 +3804,7 @@ nvm() {
|
||||
|
||||
# skip binary install if "nobinary" option specified.
|
||||
if [ $nobinary -ne 1 ] && nvm_binary_available "${VERSION}"; then
|
||||
NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" nvm_install_binary "${FLAVOR}" std "${VERSION}" "${nosource}"
|
||||
NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" NVM_OFFLINE="${NVM_OFFLINE}" nvm_install_binary "${FLAVOR}" std "${VERSION}" "${nosource}"
|
||||
EXIT_CODE=$?
|
||||
else
|
||||
EXIT_CODE=-1
|
||||
@@ -3686,7 +3823,7 @@ nvm() {
|
||||
nvm_err 'Installing from source on non-WSL Windows is not supported'
|
||||
EXIT_CODE=87
|
||||
else
|
||||
NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" nvm_install_source "${FLAVOR}" std "${VERSION}" "${NVM_MAKE_JOBS}" "${ADDITIONAL_PARAMETERS}"
|
||||
NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" NVM_OFFLINE="${NVM_OFFLINE}" nvm_install_source "${FLAVOR}" std "${VERSION}" "${NVM_MAKE_JOBS}" "${ADDITIONAL_PARAMETERS}"
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
fi
|
||||
@@ -3719,7 +3856,10 @@ nvm() {
|
||||
;;
|
||||
"uninstall")
|
||||
if [ $# -ne 1 ]; then
|
||||
>&2 nvm --help
|
||||
nvm_err 'Usage: nvm uninstall <version>'
|
||||
nvm_err ' nvm uninstall --lts'
|
||||
nvm_err ' nvm uninstall --lts=<LTS name>'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
|
||||
@@ -3799,7 +3939,7 @@ nvm() {
|
||||
nvm_echo "${NVM_SUCCESS_MSG}"
|
||||
|
||||
# rm any aliases that point to uninstalled version.
|
||||
for ALIAS in $(nvm_grep -l "${VERSION}" "$(nvm_alias_path)/*" 2>/dev/null); do
|
||||
for ALIAS in $(nvm_grep -l "${VERSION}" "$(nvm_alias_path)"/* 2>/dev/null); do
|
||||
nvm unalias "$(command basename "${ALIAS}")"
|
||||
done
|
||||
;;
|
||||
@@ -3894,13 +4034,11 @@ nvm() {
|
||||
if [ -n "${NVM_LTS-}" ]; then
|
||||
VERSION="$(nvm_match_version "lts/${NVM_LTS:-*}")"
|
||||
elif [ -z "${PROVIDED_VERSION-}" ]; then
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version
|
||||
if [ -n "${NVM_RC_VERSION-}" ]; then
|
||||
PROVIDED_VERSION="${NVM_RC_VERSION}"
|
||||
{ PROVIDED_VERSION="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
if [ -n "${PROVIDED_VERSION}" ]; then
|
||||
IS_VERSION_FROM_NVMRC=1
|
||||
VERSION="$(nvm_version "${PROVIDED_VERSION}")"
|
||||
fi
|
||||
unset NVM_RC_VERSION
|
||||
if [ -z "${VERSION}" ]; then
|
||||
nvm_err 'Please see `nvm --help` or https://github.com/nvm-sh/nvm#nvmrc for more information.'
|
||||
return 127
|
||||
@@ -3910,7 +4048,9 @@ nvm() {
|
||||
fi
|
||||
|
||||
if [ -z "${VERSION}" ]; then
|
||||
>&2 nvm --help
|
||||
nvm_err 'Usage: nvm use [<version>]'
|
||||
nvm_err ' Provide a <version>, or run from a directory containing an .nvmrc file.'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
|
||||
@@ -4028,13 +4168,15 @@ nvm() {
|
||||
done
|
||||
|
||||
if [ $# -lt 1 ] && [ -z "${NVM_LTS-}" ]; then
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version && has_checked_nvmrc=1
|
||||
if [ -n "${NVM_RC_VERSION-}" ]; then
|
||||
VERSION="$(nvm_version "${NVM_RC_VERSION-}")" ||:
|
||||
local NVM_RC_VERSION
|
||||
{ NVM_RC_VERSION="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1 && has_checked_nvmrc=1
|
||||
if [ -n "${NVM_RC_VERSION}" ]; then
|
||||
VERSION="$(nvm_version "${NVM_RC_VERSION}")" ||:
|
||||
fi
|
||||
unset NVM_RC_VERSION
|
||||
if [ "${VERSION:-N/A}" = 'N/A' ]; then
|
||||
>&2 nvm --help
|
||||
nvm_err 'Usage: nvm run [<version>] [<args>]'
|
||||
nvm_err ' Provide a <version>, or run from a directory containing an .nvmrc file.'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
fi
|
||||
@@ -4046,12 +4188,19 @@ nvm() {
|
||||
if [ "_${VERSION:-N/A}" = '_N/A' ] && ! nvm_is_valid_version "${provided_version}"; then
|
||||
provided_version=''
|
||||
if [ $has_checked_nvmrc -ne 1 ]; then
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version && has_checked_nvmrc=1
|
||||
{ NVM_RC_VERSION="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1 && has_checked_nvmrc=1
|
||||
fi
|
||||
if [ -z "${NVM_RC_VERSION-}" ]; then
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
nvm_err 'WARNING: `nvm run` was invoked without a version argument and without an .nvmrc file.'
|
||||
nvm_err ' Falling back to the active node version; this will become an error in a future release.'
|
||||
nvm_err ' Pass `current` explicitly (e.g. `nvm run current ...`) to silence this warning.'
|
||||
fi
|
||||
NVM_RC_VERSION="$(nvm_version current)" ||:
|
||||
fi
|
||||
provided_version="${NVM_RC_VERSION}"
|
||||
IS_VERSION_FROM_NVMRC=1
|
||||
VERSION="$(nvm_version "${NVM_RC_VERSION}")" ||:
|
||||
unset NVM_RC_VERSION
|
||||
else
|
||||
shift
|
||||
fi
|
||||
@@ -4106,21 +4255,36 @@ nvm() {
|
||||
|
||||
local provided_version
|
||||
provided_version="$1"
|
||||
local VERSION_SOURCE
|
||||
VERSION_SOURCE=''
|
||||
if [ "${NVM_LTS-}" != '' ]; then
|
||||
provided_version="lts/${NVM_LTS:-*}"
|
||||
VERSION="${provided_version}"
|
||||
VERSION_SOURCE='lts'
|
||||
elif [ -n "${provided_version}" ]; then
|
||||
VERSION="$(nvm_version "${provided_version}")" ||:
|
||||
if [ "_${VERSION}" = '_N/A' ] && ! nvm_is_valid_version "${provided_version}"; then
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version && has_checked_nvmrc=1
|
||||
provided_version="${NVM_RC_VERSION}"
|
||||
unset NVM_RC_VERSION
|
||||
{ provided_version="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1 && has_checked_nvmrc=1
|
||||
VERSION="$(nvm_version "${provided_version}")" ||:
|
||||
if [ -n "${provided_version}" ]; then
|
||||
VERSION_SOURCE='nvmrc'
|
||||
fi
|
||||
else
|
||||
VERSION_SOURCE='arg'
|
||||
shift
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "${VERSION_SOURCE}" ]; then
|
||||
if [ "${NVM_SILENT:-0}" -ne 1 ]; then
|
||||
nvm_err 'WARNING: `nvm exec` was invoked without a version argument and without an .nvmrc file.'
|
||||
nvm_err ' Falling back to the active node version; this will become an error in a future release.'
|
||||
nvm_err ' Pass `current` explicitly (e.g. `nvm exec current ...`) to silence this warning.'
|
||||
fi
|
||||
provided_version='current'
|
||||
VERSION="$(nvm_version current)" ||:
|
||||
fi
|
||||
|
||||
nvm_ensure_version_installed "${provided_version}"
|
||||
EXIT_CODE=$?
|
||||
if [ "${EXIT_CODE}" != "0" ]; then
|
||||
@@ -4221,7 +4385,7 @@ nvm() {
|
||||
|
||||
local NVM_OUTPUT
|
||||
local EXIT_CODE
|
||||
NVM_OUTPUT="$(NVM_LTS="${NVM_LTS-}" nvm_remote_versions "${PATTERN}" &&:)"
|
||||
NVM_OUTPUT="$(NVM_LTS="${NVM_LTS-}" nvm_remote_versions "${PATTERN-}" &&:)"
|
||||
EXIT_CODE=$?
|
||||
if [ -n "${NVM_OUTPUT}" ]; then
|
||||
NVM_NO_COLORS="${NVM_NO_COLORS-}" nvm_print_versions "${NVM_OUTPUT}"
|
||||
@@ -4245,19 +4409,19 @@ nvm() {
|
||||
shift
|
||||
done
|
||||
if [ -z "${provided_version-}" ]; then
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version
|
||||
if [ -n "${NVM_RC_VERSION}" ]; then
|
||||
provided_version="${NVM_RC_VERSION}"
|
||||
VERSION=$(nvm_version "${NVM_RC_VERSION}") ||:
|
||||
{ provided_version="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
if [ -n "${provided_version}" ]; then
|
||||
VERSION=$(nvm_version "${provided_version}") ||:
|
||||
fi
|
||||
unset NVM_RC_VERSION
|
||||
elif [ "${provided_version}" != 'system' ]; then
|
||||
VERSION="$(nvm_version "${provided_version}")" ||:
|
||||
else
|
||||
VERSION="${provided_version-}"
|
||||
fi
|
||||
if [ -z "${VERSION}" ]; then
|
||||
>&2 nvm --help
|
||||
nvm_err 'Usage: nvm which [current | <version>]'
|
||||
nvm_err ' Provide a <version>, or run from a directory containing an .nvmrc file.'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
|
||||
@@ -4274,7 +4438,7 @@ nvm() {
|
||||
nvm_err 'System version of node not found.'
|
||||
return 127
|
||||
elif [ "${VERSION}" = '∞' ]; then
|
||||
nvm_err "The alias \"${2}\" leads to an infinite loop. Aborting."
|
||||
nvm_err "The alias \"${provided_version}\" leads to an infinite loop. Aborting."
|
||||
return 8
|
||||
fi
|
||||
|
||||
@@ -4354,7 +4518,8 @@ nvm() {
|
||||
NVM_ALIAS_DIR="$(nvm_alias_path)"
|
||||
command mkdir -p "${NVM_ALIAS_DIR}"
|
||||
if [ $# -ne 1 ]; then
|
||||
>&2 nvm --help
|
||||
nvm_err 'Usage: nvm unalias <name>'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
if [ "${1#*\/}" != "${1-}" ]; then
|
||||
@@ -4391,7 +4556,8 @@ nvm() {
|
||||
;;
|
||||
"install-latest-npm")
|
||||
if [ $# -ne 0 ]; then
|
||||
>&2 nvm --help
|
||||
nvm_err 'Usage: nvm install-latest-npm'
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
|
||||
@@ -4399,7 +4565,8 @@ nvm() {
|
||||
;;
|
||||
"reinstall-packages" | "copy-packages")
|
||||
if [ $# -ne 1 ]; then
|
||||
>&2 nvm --help
|
||||
nvm_err "Usage: nvm ${COMMAND} <version>"
|
||||
nvm_err ' Run `nvm --help` for full help.'
|
||||
return 127
|
||||
fi
|
||||
|
||||
@@ -4497,7 +4664,7 @@ nvm() {
|
||||
NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}"
|
||||
;;
|
||||
"--version" | "-v")
|
||||
nvm_echo '0.40.4'
|
||||
nvm_echo '0.40.5'
|
||||
;;
|
||||
"unload")
|
||||
nvm deactivate >/dev/null 2>&1
|
||||
@@ -4520,7 +4687,7 @@ nvm() {
|
||||
nvm_binary_available nvm_change_path nvm_strip_path \
|
||||
nvm_num_version_groups nvm_format_version nvm_ensure_version_prefix \
|
||||
nvm_normalize_version nvm_is_valid_version nvm_normalize_lts \
|
||||
nvm_ensure_version_installed nvm_cache_dir \
|
||||
nvm_ensure_version_installed nvm_cache_dir nvm_ls_cached nvm_offline_version \
|
||||
nvm_version_path nvm_alias_path nvm_version_dir \
|
||||
nvm_find_nvmrc nvm_find_up nvm_find_project_dir nvm_tree_contains_path \
|
||||
nvm_version_greater nvm_version_greater_than_or_equal_to \
|
||||
@@ -4545,7 +4712,7 @@ nvm() {
|
||||
nvm_process_nvmrc nvm_nvmrc_invalid_msg \
|
||||
nvm_write_nvmrc \
|
||||
>/dev/null 2>&1
|
||||
unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
|
||||
unset NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
|
||||
NVM_CD_FLAGS NVM_BIN NVM_INC NVM_MAKE_JOBS \
|
||||
NVM_COLORS INSTALLED_COLOR SYSTEM_COLOR \
|
||||
CURRENT_COLOR NOT_INSTALLED_COLOR DEFAULT_COLOR LTS_COLOR \
|
||||
@@ -4677,7 +4844,7 @@ nvm_auto() {
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
elif nvm_rc_version >/dev/null 2>&1; then
|
||||
elif nvm_rc_version 3>/dev/null >/dev/null 2>&1; then
|
||||
nvm use --silent >/dev/null
|
||||
fi
|
||||
else
|
||||
@@ -4689,7 +4856,7 @@ nvm_auto() {
|
||||
VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)"
|
||||
if [ -n "${VERSION}" ] && [ "_${VERSION}" != '_N/A' ] && nvm_is_valid_version "${VERSION}"; then
|
||||
nvm install "${VERSION}" >/dev/null
|
||||
elif nvm_rc_version >/dev/null 2>&1; then
|
||||
elif nvm_rc_version 3>/dev/null >/dev/null 2>&1; then
|
||||
nvm install >/dev/null
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "nvm",
|
||||
"version": "0.40.4",
|
||||
"version": "0.40.5",
|
||||
"description": "Node Version Manager - Simple bash script to manage multiple active node.js versions",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
@@ -43,11 +43,11 @@
|
||||
"homepage": "https://github.com/nvm-sh/nvm",
|
||||
"devDependencies": {
|
||||
"dockerfile_lint": "^0.3.4",
|
||||
"doctoc": "^2.2.1",
|
||||
"doctoc": "^2.5.0",
|
||||
"eclint": "^2.8.1",
|
||||
"markdown-link-check": "^3.14.2",
|
||||
"replace": "^1.2.2",
|
||||
"semver": "^7.7.3",
|
||||
"semver": "^7.8.5",
|
||||
"urchin": "^0.0.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,41 @@
|
||||
# Runs a command once and captures stdout and exit code.
|
||||
# Suppresses xtrace in the subshell. Discards stderr.
|
||||
#
|
||||
# Sets: CAPTURED_STDOUT, CAPTURED_EXIT_CODE
|
||||
#
|
||||
# Usage:
|
||||
# try nvm_version current
|
||||
# [ "$CAPTURED_STDOUT" = "v20.0.0" ] || die "wrong output"
|
||||
# [ "$CAPTURED_EXIT_CODE" = 0 ] || die "wrong exit code"
|
||||
try() {
|
||||
CAPTURED_STDOUT="$(set +x; "$@" 2>/dev/null)" && CAPTURED_EXIT_CODE=0 || CAPTURED_EXIT_CODE=$?
|
||||
}
|
||||
|
||||
# Runs a command once and captures stderr and exit code.
|
||||
# Suppresses xtrace in the subshell. Discards stdout.
|
||||
#
|
||||
# Sets: CAPTURED_STDERR, CAPTURED_EXIT_CODE
|
||||
#
|
||||
# Usage:
|
||||
# try_err nvm_alias
|
||||
# [ "$CAPTURED_STDERR" = "An alias is required." ] || die "wrong error"
|
||||
# [ "$CAPTURED_EXIT_CODE" = 1 ] || die "wrong exit code"
|
||||
try_err() {
|
||||
CAPTURED_STDERR="$(set +x; "$@" 2>&1 >/dev/null)" && CAPTURED_EXIT_CODE=0 || CAPTURED_EXIT_CODE=$?
|
||||
}
|
||||
|
||||
assert_ok() {
|
||||
local FUNCTION=$1
|
||||
shift
|
||||
|
||||
$($FUNCTION $@) || die '"'"$FUNCTION $@"'" should have succeeded, but failed'
|
||||
"$FUNCTION" "$@" || die '"'"$FUNCTION $@"'" should have succeeded, but failed'
|
||||
}
|
||||
|
||||
assert_not_ok() {
|
||||
local FUNCTION=$1
|
||||
shift
|
||||
|
||||
! $($FUNCTION $@) || die '"'"$FUNCTION $@"'" should have failed, but succeeded'
|
||||
! "$FUNCTION" "$@" || die '"'"$FUNCTION $@"'" should have failed, but succeeded'
|
||||
}
|
||||
|
||||
strip_colors() {
|
||||
@@ -20,7 +46,7 @@ strip_colors() {
|
||||
|
||||
make_echo() {
|
||||
echo "#!/bin/sh" > "$1"
|
||||
echo "echo \"${2}\"" > "$1"
|
||||
echo "echo \"${2}\"" >> "$1"
|
||||
chmod a+x "$1"
|
||||
}
|
||||
|
||||
|
||||
@@ -3,25 +3,21 @@
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
OUTPUT="$(nvm alias foo#bar baz 2>&1)"
|
||||
try_err nvm alias foo#bar baz
|
||||
EXPECTED_OUTPUT="Aliases with a comment delimiter (#) are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias with a hash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias with a hash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to create an alias with a hash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
EXIT_CODE="$(nvm alias foo#bar baz >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to create an alias with a hash should fail with code 1, got '$EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(nvm alias foo# baz 2>&1)"
|
||||
try_err nvm alias foo# baz
|
||||
EXPECTED_OUTPUT="Aliases with a comment delimiter (#) are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias ending with a hash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias ending with a hash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to create an alias ending with a hash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
EXIT_CODE="$(nvm alias foo# baz >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to create an alias ending with a hash should fail with code 1, got '$EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(nvm alias \#bar baz 2>&1)"
|
||||
try_err nvm alias \#bar baz
|
||||
EXPECTED_OUTPUT="Aliases with a comment delimiter (#) are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias starting with a hash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
EXIT_CODE="$(nvm alias \#bar baz >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to create an alias starting with a hash should fail with code 1, got '$EXIT_CODE'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias starting with a hash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to create an alias starting with a hash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
@@ -3,25 +3,21 @@
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
OUTPUT="$(nvm alias foo/bar baz 2>&1)"
|
||||
try_err nvm alias foo/bar baz
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias with a slash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to create an alias with a slash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
EXIT_CODE="$(nvm alias foo/bar baz >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to create an alias with a slash should fail with code 1, got '$EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(nvm alias foo/ baz 2>&1)"
|
||||
try_err nvm alias foo/ baz
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias ending with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias ending with a slash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to create an alias ending with a slash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
EXIT_CODE="$(nvm alias foo/ baz >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to create an alias ending with a slash should fail with code 1, got '$EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(nvm alias /bar baz 2>&1)"
|
||||
try_err nvm alias /bar baz
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias starting with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
EXIT_CODE="$(nvm alias /bar baz >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to create an alias starting with a slash should fail with code 1, got '$EXIT_CODE'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias starting with a slash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to create an alias starting with a slash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
@@ -3,25 +3,21 @@
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
OUTPUT="$(nvm unalias foo/bar 2>&1)"
|
||||
try_err nvm unalias foo/bar
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias with a slash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to remove an alias with a slash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
EXIT_CODE="$(nvm unalias foo/bar >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to remove an alias with a slash should fail with code 1, got '$EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(nvm unalias foo/ 2>&1)"
|
||||
try_err nvm unalias foo/
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias ending with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias ending with a slash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to remove an alias ending with a slash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
EXIT_CODE="$(nvm unalias foo/ >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to remove an alias ending with a slash should fail with code 1, got '$EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(nvm unalias /bar 2>&1)"
|
||||
try_err nvm unalias /bar
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias starting with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
EXIT_CODE="$(nvm unalias /bar >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = "1" ] || die "trying to remove an alias starting with a slash should fail with code 1, got '$EXIT_CODE'"
|
||||
[ "$CAPTURED_STDERR" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias starting with a slash should fail with '$EXPECTED_OUTPUT', got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" = "1" ] || die "trying to remove an alias starting with a slash should fail with code 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
set -e
|
||||
|
||||
# Force nvm_has_colors to return true so nvm_list_aliases sets NVM_HAS_COLORS=1
|
||||
nvm_has_colors() { return 0; }
|
||||
|
||||
nvm_alias_path() {
|
||||
nvm_echo "../../../alias"
|
||||
}
|
||||
|
||||
# nvm_list_aliases pipes through `sort`, which makes [ -t 1 ] false.
|
||||
# Before the fix in 2eb8bbd0, colors were lost inside the pipeline.
|
||||
# With the fix, NVM_HAS_COLORS is evaluated before the pipe and propagated.
|
||||
OUTPUT=$(nvm_list_aliases test-stable-1)
|
||||
COLORED_ARROW="$(command printf %b '\033[0;90m->\033[0m')"
|
||||
|
||||
case "${OUTPUT}" in
|
||||
*"${COLORED_ARROW}"*) : ;; # pass - colored arrow survived the pipeline
|
||||
*) die "Expected colored arrow in nvm_list_aliases output through pipeline, got >${OUTPUT}<" ;;
|
||||
esac
|
||||
@@ -0,0 +1,32 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () {
|
||||
echo "$@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
set -e
|
||||
|
||||
# Override nvm_has_colors to always return false, simulating a pipeline context
|
||||
# where [ -t 1 ] is false (the bug condition from 2eb8bbd0)
|
||||
nvm_has_colors() { return 1; }
|
||||
|
||||
# Without NVM_HAS_COLORS, output should have no color codes (plain arrow)
|
||||
OUTPUT="$(nvm_print_formatted_alias fakealias fakedest)"
|
||||
case "${OUTPUT}" in
|
||||
*'\033['*) die "Expected no color codes without NVM_HAS_COLORS, got >${OUTPUT}<" ;;
|
||||
esac
|
||||
|
||||
# With NVM_HAS_COLORS=1, output should contain color codes even though
|
||||
# nvm_has_colors returns false (regression test for the pipeline fix)
|
||||
NVM_HAS_COLORS=1
|
||||
export NVM_HAS_COLORS
|
||||
OUTPUT="$(nvm_print_formatted_alias fakealias fakedest)"
|
||||
ARROW="$(command printf %b '\033[0;90m->\033[0m')"
|
||||
case "${OUTPUT}" in
|
||||
*"${ARROW}"*) : ;; # pass - colored arrow present
|
||||
*) die "Expected colored arrow with NVM_HAS_COLORS=1, got >${OUTPUT}<" ;;
|
||||
esac
|
||||
17
test/fast/Aliases/percent in alias name/nvm_resolve_alias
Executable file
17
test/fast/Aliases/percent in alias name/nvm_resolve_alias
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
\. ../../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../../nvm.sh
|
||||
|
||||
# An alias whose name contains % should resolve directly
|
||||
try nvm_resolve_alias 'test-%s-alias'
|
||||
[ "$CAPTURED_EXIT_CODE" = "0" ] || die "nvm_resolve_alias test-%s-alias failed with exit code $CAPTURED_EXIT_CODE"
|
||||
[ "$CAPTURED_STDOUT" = "v0.0.1" ] || die "nvm_resolve_alias test-%s-alias was not v0.0.1; got $CAPTURED_STDOUT"
|
||||
|
||||
# An alias chain that passes through a %-containing alias name should resolve
|
||||
try nvm_resolve_alias test-pct-chain
|
||||
[ "$CAPTURED_EXIT_CODE" = "0" ] || die "nvm_resolve_alias test-pct-chain failed with exit code $CAPTURED_EXIT_CODE"
|
||||
[ "$CAPTURED_STDOUT" = "v0.0.1" ] || die "nvm_resolve_alias test-pct-chain was not v0.0.1; got $CAPTURED_STDOUT"
|
||||
17
test/fast/Aliases/percent in alias name/nvm_resolve_local_alias
Executable file
17
test/fast/Aliases/percent in alias name/nvm_resolve_local_alias
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
\. ../../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../../nvm.sh
|
||||
|
||||
# An alias whose name contains % should resolve directly
|
||||
try nvm_resolve_local_alias 'test-%s-alias'
|
||||
[ "$CAPTURED_EXIT_CODE" = "0" ] || die "nvm_resolve_local_alias test-%s-alias failed with exit code $CAPTURED_EXIT_CODE"
|
||||
[ "$CAPTURED_STDOUT" = "v0.0.1" ] || die "nvm_resolve_local_alias test-%s-alias was not v0.0.1; got $CAPTURED_STDOUT"
|
||||
|
||||
# An alias chain that passes through a %-containing alias name should resolve
|
||||
try nvm_resolve_local_alias test-pct-chain
|
||||
[ "$CAPTURED_EXIT_CODE" = "0" ] || die "nvm_resolve_local_alias test-pct-chain failed with exit code $CAPTURED_EXIT_CODE"
|
||||
[ "$CAPTURED_STDOUT" = "v0.0.1" ] || die "nvm_resolve_local_alias test-pct-chain was not v0.0.1; got $CAPTURED_STDOUT"
|
||||
4
test/fast/Aliases/percent in alias name/setup
Executable file
4
test/fast/Aliases/percent in alias name/setup
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo v0.0.1 > ../../../../alias/test-%s-alias
|
||||
echo test-%s-alias > ../../../../alias/test-pct-chain
|
||||
4
test/fast/Aliases/percent in alias name/teardown
Executable file
4
test/fast/Aliases/percent in alias name/teardown
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
rm -f ../../../../alias/test-%s-alias
|
||||
rm -f ../../../../alias/test-pct-chain
|
||||
37
test/fast/Aliases/uppercase alias names should work
Executable file
37
test/fast/Aliases/uppercase alias names should work
Executable file
@@ -0,0 +1,37 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
rm -f "$(nvm_alias_path)/UPPER_ALIAS"
|
||||
rm -f "$(nvm_alias_path)/MixedCase"
|
||||
}
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
make_fake_node v0.0.1
|
||||
|
||||
# Uppercase alias should be created and readable
|
||||
nvm alias UPPER_ALIAS v0.0.1
|
||||
[ -f "$(nvm_alias_path)/UPPER_ALIAS" ] || die "uppercase alias file should exist"
|
||||
|
||||
try nvm_alias UPPER_ALIAS
|
||||
[ "${CAPTURED_EXIT_CODE}" = "0" ] || die "nvm_alias should succeed for uppercase alias, got exit code ${CAPTURED_EXIT_CODE}"
|
||||
[ "${CAPTURED_STDOUT}" = "v0.0.1" ] || die "nvm_alias UPPER_ALIAS should return v0.0.1, got ${CAPTURED_STDOUT}"
|
||||
|
||||
# Mixed case should also work
|
||||
nvm alias MixedCase v0.0.1
|
||||
[ -f "$(nvm_alias_path)/MixedCase" ] || die "mixed case alias file should exist"
|
||||
|
||||
try nvm_alias MixedCase
|
||||
[ "${CAPTURED_EXIT_CODE}" = "0" ] || die "nvm_alias should succeed for mixed case alias, got exit code ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
# LTS names with uppercase should still be rejected
|
||||
try_err nvm_normalize_lts "lts/ARGON"
|
||||
[ "${CAPTURED_EXIT_CODE}" = "3" ] || die "uppercase LTS name should fail with exit code 3, got ${CAPTURED_EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "LTS names must be lowercase" ] || die "expected lowercase error, got ${CAPTURED_STDERR}"
|
||||
|
||||
cleanup
|
||||
44
test/fast/Running 'nvm --help' documents current and the .nvmrc fallback
Executable file
44
test/fast/Running 'nvm --help' documents current and the .nvmrc fallback
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
\. ../common.sh
|
||||
|
||||
HELP="$(nvm --help 2>&1)"
|
||||
|
||||
# Signatures for use/exec/run advertise `current` (mirroring `nvm which`).
|
||||
for EXPECTED in \
|
||||
'nvm use [current | <version>]' \
|
||||
'nvm exec [current | <version>] [<command>]' \
|
||||
'nvm run [current | <version>] [<args>]' \
|
||||
'nvm which [current | <version>]' \
|
||||
; do
|
||||
case "${HELP}" in
|
||||
*"${EXPECTED}"*) ;;
|
||||
*) die "nvm --help did not contain signature >${EXPECTED}<" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# The .nvmrc fallback is documented as conditional, not free.
|
||||
case "${HELP}" in
|
||||
*'Uses .nvmrc if version is omitted; otherwise errors.'*) ;;
|
||||
*) die "nvm --help did not document the .nvmrc fallback caveat" ;;
|
||||
esac
|
||||
|
||||
# The stale, looser phrasing must be gone.
|
||||
case "${HELP}" in
|
||||
*'if available and version is omitted'*) die "nvm --help still contains the old .nvmrc phrasing" ;;
|
||||
esac
|
||||
|
||||
# `nvm current` is documented as resolving via \$PATH, not .nvmrc.
|
||||
case "${HELP}" in
|
||||
*'Display the active node version (resolved via $PATH; not affected by .nvmrc).'*) ;;
|
||||
*) die "nvm --help did not document that 'nvm current' resolves via \$PATH" ;;
|
||||
esac
|
||||
@@ -0,0 +1,63 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
cd "${ORIG_PWD}" 2>/dev/null || true
|
||||
[ -n "${TMP_DIR-}" ] && rm -rf "${TMP_DIR}"
|
||||
}
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
\. ../common.sh
|
||||
|
||||
ORIG_PWD="$(pwd)"
|
||||
|
||||
# Run from a fresh, empty directory so no ambient .nvmrc above the test dir
|
||||
# can satisfy the lookup and mask the warning.
|
||||
TMP_DIR="$(mktemp -d)"
|
||||
cd "${TMP_DIR}" || die "could not cd to temp dir"
|
||||
|
||||
EXEC_WARNING='WARNING: `nvm exec` was invoked without a version argument and without an .nvmrc file.'
|
||||
RUN_WARNING='WARNING: `nvm run` was invoked without a version argument and without an .nvmrc file.'
|
||||
|
||||
# `nvm exec` with no version and no .nvmrc should warn on stderr (and fall back).
|
||||
set +ex # needed for stderr
|
||||
EXEC_STDERR="$(nvm exec </dev/null 2>&1 1>/dev/null)"
|
||||
set -ex
|
||||
case "${EXEC_STDERR}" in
|
||||
*"${EXEC_WARNING}"*) ;;
|
||||
*) die "'nvm exec' with no version did not warn; got >${EXEC_STDERR}<" ;;
|
||||
esac
|
||||
|
||||
# `--silent` should suppress the warning.
|
||||
set +ex # needed for stderr
|
||||
EXEC_SILENT_STDERR="$(nvm exec --silent </dev/null 2>&1 1>/dev/null)"
|
||||
set -ex
|
||||
case "${EXEC_SILENT_STDERR}" in
|
||||
*WARNING*) die "'nvm exec --silent' should not warn; got >${EXEC_SILENT_STDERR}<" ;;
|
||||
esac
|
||||
|
||||
# `nvm run` with an unresolvable version and no .nvmrc should warn (and fall back).
|
||||
set +ex # needed for stderr
|
||||
RUN_STDERR="$(nvm run bogusversion </dev/null 2>&1 1>/dev/null)"
|
||||
set -ex
|
||||
case "${RUN_STDERR}" in
|
||||
*"${RUN_WARNING}"*) ;;
|
||||
*) die "'nvm run' with no resolvable version did not warn; got >${RUN_STDERR}<" ;;
|
||||
esac
|
||||
|
||||
# `--silent` should suppress the warning.
|
||||
set +ex # needed for stderr
|
||||
RUN_SILENT_STDERR="$(nvm run --silent bogusversion </dev/null 2>&1 1>/dev/null)"
|
||||
set -ex
|
||||
case "${RUN_SILENT_STDERR}" in
|
||||
*WARNING*) die "'nvm run --silent' should not warn; got >${RUN_SILENT_STDERR}<" ;;
|
||||
esac
|
||||
|
||||
cleanup
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
|
||||
die() { echo "$@" >&2; exit 1; }
|
||||
|
||||
set -ex
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
make_fake_node v0.0.1
|
||||
|
||||
nvm alias test_alias v0.0.1
|
||||
|
||||
# Verify alias was created
|
||||
[ -f "$(nvm_alias_path)/test_alias" ] || die "alias file should exist before uninstall"
|
||||
|
||||
nvm uninstall v0.0.1
|
||||
|
||||
# Verify the version directory was removed
|
||||
[ ! -d "$(nvm_version_path v0.0.1)" ] || die "version directory should be removed"
|
||||
|
||||
# Verify the alias was cleaned up
|
||||
[ ! -f "$(nvm_alias_path)/test_alias" ] || die "alias file should be removed after uninstalling the version it points to"
|
||||
@@ -11,30 +11,20 @@ cleanup() {
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
\. ../common.sh
|
||||
|
||||
nvm_make_alias foo foo
|
||||
|
||||
set +ex # needed for stderr
|
||||
OUTPUT="$(nvm use foo 2>&1)"
|
||||
set -ex
|
||||
try_err nvm use foo
|
||||
EXPECTED_OUTPUT='The alias "foo" leads to an infinite loop. Aborting.'
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "'nvm use foo' did not output >${EXPECTED_OUTPUT}<; got >${OUTPUT}<"
|
||||
[ "_${CAPTURED_STDERR}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "'nvm use foo' did not output >${EXPECTED_OUTPUT}<; got >${CAPTURED_STDERR}<"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_8" ] || die "Expected exit code 8; got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
set +ex # needed for stderr
|
||||
EXIT_CODE="$(nvm use foo 2>/dev/null ; echo $?)"
|
||||
set -ex
|
||||
[ "_$EXIT_CODE" = "_8" ] || die "Expected exit code 8; got ${EXIT_CODE}"
|
||||
|
||||
set +ex # needed for stderr
|
||||
OUTPUT="$(nvm use --silent foo 2>&1)"
|
||||
set -ex
|
||||
try_err nvm use --silent foo
|
||||
EXPECTED_OUTPUT=''
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "'nvm use --silent foo' did not output >${EXPECTED_OUTPUT}<; got >${OUTPUT}<"
|
||||
|
||||
set +ex # needed for stderr
|
||||
EXIT_CODE="$(nvm use --silent foo 2>/dev/null ; echo $?)"
|
||||
set -ex
|
||||
[ $EXIT_CODE -eq 8 ] || die "Expected exit code 8 from 'nvm use --silent foo'; got ${EXIT_CODE}"
|
||||
[ "_${CAPTURED_STDERR}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "'nvm use --silent foo' did not output >${EXPECTED_OUTPUT}<; got >${CAPTURED_STDERR}<"
|
||||
[ $CAPTURED_EXIT_CODE -eq 8 ] || die "Expected exit code 8 from 'nvm use --silent foo'; got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -14,20 +14,17 @@ cleanup() {
|
||||
|
||||
# normal .nvmrc
|
||||
printf '0.999.0\n' > .nvmrc
|
||||
nvm_rc_version
|
||||
VERSION1="${NVM_RC_VERSION}"
|
||||
{ VERSION1="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
|
||||
# .nvmrc with CR char
|
||||
printf '0.999.0\r\n' > .nvmrc
|
||||
nvm_rc_version
|
||||
VERSION2="${NVM_RC_VERSION}"
|
||||
{ VERSION2="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
|
||||
[ "${VERSION1}" = "${VERSION2}" ]
|
||||
|
||||
# .nvmrc without any newline char
|
||||
printf '0.999.0' > .nvmrc
|
||||
nvm_rc_version
|
||||
VERSION3="${NVM_RC_VERSION}"
|
||||
{ VERSION3="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
|
||||
[ "${VERSION1}" = "${VERSION3}" ]
|
||||
|
||||
|
||||
24
test/fast/Running 'nvm which' with circular alias shows alias name
Executable file
24
test/fast/Running 'nvm which' with circular alias shows alias name
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$(nvm_alias_path)/circular_test"
|
||||
}
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
\. ../common.sh
|
||||
|
||||
nvm_make_alias circular_test circular_test
|
||||
|
||||
try_err nvm which circular_test
|
||||
EXPECTED_OUTPUT='The alias "circular_test" leads to an infinite loop. Aborting.'
|
||||
[ "_${CAPTURED_STDERR}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "'nvm which circular_test' did not output >${EXPECTED_OUTPUT}<; got >${CAPTURED_STDERR}<"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_8" ] || die "Expected exit code 8; got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
cleanup
|
||||
@@ -13,7 +13,8 @@ NVM_TEST_VERSION=v0.42
|
||||
echo "$NVM_TEST_VERSION" > .nvmrc
|
||||
|
||||
OUTPUT="$(../../nvm-exec 2>&1)";
|
||||
EXPECTED="N/A: version \"${NVM_TEST_VERSION}\" is not yet installed.
|
||||
EXPECTED="Found '$(pwd)/.nvmrc' with version <${NVM_TEST_VERSION}>
|
||||
N/A: version \"${NVM_TEST_VERSION}\" is not yet installed.
|
||||
|
||||
You need to run \`nvm install ${NVM_TEST_VERSION}\` to install and use it.
|
||||
No NODE_VERSION provided; no .nvmrc file found";
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
cd "${ORIG_PWD}" 2>/dev/null || true
|
||||
[ -n "${TMP_DIR-}" ] && rm -rf "${TMP_DIR}"
|
||||
}
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
\. ../common.sh
|
||||
|
||||
ORIG_PWD="$(pwd)"
|
||||
|
||||
# Run from a fresh, empty directory so the "no version + no .nvmrc" cases
|
||||
# (install/run/which) are not masked by an ambient .nvmrc above the test dir.
|
||||
TMP_DIR="$(mktemp -d)"
|
||||
cd "${TMP_DIR}" || die "could not cd to temp dir"
|
||||
|
||||
# Asserts a subcommand emits the given focused usage line (not the full help
|
||||
# dump) on stderr, and exits 127.
|
||||
assert_usage() {
|
||||
local EXPECTED_LINE
|
||||
EXPECTED_LINE="$1"
|
||||
shift
|
||||
|
||||
try_err "$@"
|
||||
|
||||
case "${CAPTURED_STDERR}" in
|
||||
*"${EXPECTED_LINE}"*) ;;
|
||||
*) die "\`$*\` did not show focused usage >${EXPECTED_LINE}<; got >${CAPTURED_STDERR}<" ;;
|
||||
esac
|
||||
# the focused usage should NOT be the full help dump
|
||||
case "${CAPTURED_STDERR}" in
|
||||
*'Show this message'*) die "\`$*\` dumped full help instead of a focused usage" ;;
|
||||
esac
|
||||
[ "_${CAPTURED_EXIT_CODE}" = "_127" ] \
|
||||
|| die "\`$*\` expected exit code 127; got ${CAPTURED_EXIT_CODE}"
|
||||
}
|
||||
|
||||
assert_usage 'Usage: nvm cache dir' nvm cache bogus
|
||||
assert_usage 'Usage: nvm install [<version>]' nvm install
|
||||
assert_usage 'Usage: nvm run [<version>] [<args>]' nvm run
|
||||
assert_usage 'Usage: nvm which [current | <version>]' nvm which
|
||||
assert_usage 'Usage: nvm uninstall <version>' nvm uninstall
|
||||
assert_usage 'Usage: nvm uninstall <version>' nvm uninstall a b
|
||||
assert_usage 'Usage: nvm unalias <name>' nvm unalias
|
||||
assert_usage 'Usage: nvm unalias <name>' nvm unalias a b
|
||||
assert_usage 'Usage: nvm install-latest-npm' nvm install-latest-npm extra
|
||||
assert_usage 'Usage: nvm reinstall-packages <version>' nvm reinstall-packages
|
||||
assert_usage 'Usage: nvm copy-packages <version>' nvm copy-packages a b
|
||||
|
||||
# `nvm use` reaches its focused-usage guard only when version resolution returns
|
||||
# an empty string. From the CLI that cannot happen: an omitted version is caught
|
||||
# earlier (the `Please see ... nvmrc` branch), and an unresolvable non-empty
|
||||
# version yields the "N/A" sentinel, never "". The branch is a defensive guard,
|
||||
# so drive it directly by stubbing the resolver to return empty. Keep this last:
|
||||
# the stub stays in effect for the rest of the shell.
|
||||
nvm_match_version() { nvm_echo ''; }
|
||||
assert_usage 'Usage: nvm use [<version>]' nvm use foo
|
||||
|
||||
cleanup
|
||||
17
test/fast/Unit tests/assert_not_ok
Executable file
17
test/fast/Unit tests/assert_not_ok
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
_returns_zero() { return 0; }
|
||||
_returns_nonzero() { return 1; }
|
||||
|
||||
# assert_not_ok should pass for a non-zero-exit function
|
||||
assert_not_ok _returns_nonzero \
|
||||
|| die 'assert_not_ok failed on a function that returns 1'
|
||||
|
||||
# assert_not_ok should fail for a zero-exit function
|
||||
if (assert_not_ok _returns_zero 2>/dev/null); then
|
||||
die 'assert_not_ok incorrectly passed for a function that returns 0'
|
||||
fi
|
||||
17
test/fast/Unit tests/assert_ok
Executable file
17
test/fast/Unit tests/assert_ok
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
_returns_zero() { return 0; }
|
||||
_returns_nonzero() { return 1; }
|
||||
|
||||
# assert_ok should pass for a zero-exit function
|
||||
assert_ok _returns_zero \
|
||||
|| die 'assert_ok failed on a function that returns 0'
|
||||
|
||||
# assert_ok should fail for a non-zero-exit function
|
||||
if (assert_ok _returns_nonzero 2>/dev/null); then
|
||||
die 'assert_ok incorrectly passed for a function that returns 1'
|
||||
fi
|
||||
22
test/fast/Unit tests/make_echo
Executable file
22
test/fast/Unit tests/make_echo
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
TMPFILE="$(mktemp)"
|
||||
trap 'rm -f "${TMPFILE}"' EXIT
|
||||
|
||||
make_echo "${TMPFILE}" "hello_nvm" || die 'make_echo returned non-zero'
|
||||
|
||||
# shebang must still be on line 1
|
||||
[ "$(head -n 1 "${TMPFILE}")" = '#!/bin/sh' ] \
|
||||
|| die 'make_echo overwrote the shebang'
|
||||
|
||||
# script body must be present
|
||||
grep -q 'hello_nvm' "${TMPFILE}" \
|
||||
|| die 'make_echo did not write the echo body'
|
||||
|
||||
# file must be executable
|
||||
[ -x "${TMPFILE}" ] \
|
||||
|| die 'make_echo did not chmod the file'
|
||||
38
test/fast/Unit tests/nvm install --offline
Normal file
38
test/fast/Unit tests/nvm install --offline
Normal file
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
# Mock nvm_download to ensure no network access
|
||||
nvm_download() {
|
||||
die "nvm_download should not be called in offline mode"
|
||||
}
|
||||
|
||||
# --offline with an already-installed version should succeed
|
||||
INSTALLED_VERSION="$(nvm ls | command tail -1 | command awk '{print $1}' | command sed 's/\x1b\[[0-9;]*m//g')"
|
||||
if [ -n "${INSTALLED_VERSION}" ] && [ "_${INSTALLED_VERSION}" != '_N/A' ] && [ "_${INSTALLED_VERSION}" != '_system' ]; then
|
||||
try nvm install --offline "${INSTALLED_VERSION}"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] \
|
||||
|| die "nvm install --offline with installed version '${INSTALLED_VERSION}' should succeed, got exit code $CAPTURED_EXIT_CODE"
|
||||
fi
|
||||
|
||||
# --offline with a nonexistent version should fail
|
||||
try_err nvm install --offline 999.999.999
|
||||
[ "_$CAPTURED_EXIT_CODE" != "_0" ] \
|
||||
|| die "nvm install --offline with nonexistent version should fail"
|
||||
|
||||
EXPECTED_ERR="not found locally or in cache"
|
||||
nvm_echo "$CAPTURED_STDERR" | nvm_grep -q "${EXPECTED_ERR}" \
|
||||
|| die "nvm install --offline error should mention 'not found locally or in cache'; got '$CAPTURED_STDERR'"
|
||||
|
||||
# --offline should not require curl or wget
|
||||
nvm_has() { return 1; }
|
||||
try_err nvm install --offline 999.999.999
|
||||
# Should fail with "not found" not "nvm needs curl or wget"
|
||||
nvm_echo "$CAPTURED_STDERR" | nvm_grep -q "curl or wget" \
|
||||
&& die "nvm install --offline should not require curl or wget"
|
||||
alias nvm_has='\nvm_has'
|
||||
unset -f nvm_has
|
||||
18
test/fast/Unit tests/nvm install -s and -b conflict
Executable file
18
test/fast/Unit tests/nvm install -s and -b conflict
Executable file
@@ -0,0 +1,18 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
EXPECTED_ERR='-s and -b cannot be set together since they would skip install from both binary and source'
|
||||
|
||||
try_err nvm install -s -b 0.10.0
|
||||
[ "${CAPTURED_EXIT_CODE}" = "6" ] || die "Expected exit code 6 for -s -b, got ${CAPTURED_EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_ERR}" ] || die "Expected >${EXPECTED_ERR}<, got >${CAPTURED_STDERR}<"
|
||||
|
||||
try_err nvm install -b -s 0.10.0
|
||||
[ "${CAPTURED_EXIT_CODE}" = "6" ] || die "Expected exit code 6 for -b -s, got ${CAPTURED_EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_ERR}" ] || die "Expected >${EXPECTED_ERR}<, got >${CAPTURED_STDERR}<"
|
||||
30
test/fast/Unit tests/nvm ls-remote with nounset should not fail
Executable file
30
test/fast/Unit tests/nvm ls-remote with nounset should not fail
Executable file
@@ -0,0 +1,30 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
unset -f nvm_download nvm_ls_remote nvm_ls_remote_iojs
|
||||
}
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../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}"
|
||||
}
|
||||
|
||||
# Enable no unset variable; regression test for https://github.com/nvm-sh/nvm/issues/3820
|
||||
set -u
|
||||
|
||||
# Bare `nvm ls-remote` (no pattern argument) must not error on unset PATTERN
|
||||
output=$(nvm ls-remote 2>&1 1>/dev/null) || die "nvm ls-remote with nounset failed: ${output}"
|
||||
test -z "${output}" || die "expected empty stderr; got >${output}<"
|
||||
|
||||
cleanup
|
||||
@@ -9,21 +9,19 @@ cleanup () {
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
OUTPUT="$(nvm_alias 2>&1)"
|
||||
EXPECTED_OUTPUT='An alias is required.'
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_alias' produced wrong output; got $OUTPUT"
|
||||
\. ../../common.sh
|
||||
|
||||
EXIT_CODE="$(nvm_alias >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$EXIT_CODE" = "_1" ] || die "'nvm_alias' exited with $EXIT_CODE, expected 1"
|
||||
try_err nvm_alias
|
||||
EXPECTED_OUTPUT='An alias is required.'
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_alias' produced wrong output; got $CAPTURED_STDERR"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] || die "'nvm_alias' exited with $CAPTURED_EXIT_CODE, expected 1"
|
||||
|
||||
rm -rf ../../../alias/nonexistent
|
||||
|
||||
OUTPUT="$(nvm_alias nonexistent 2>&1)"
|
||||
try_err nvm_alias nonexistent
|
||||
EXPECTED_OUTPUT='Alias does not exist.'
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_alias nonexistent' produced wrong output; got $OUTPUT"
|
||||
|
||||
EXIT_CODE="$(nvm_alias nonexistent >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$EXIT_CODE" = "_2" ] || die "'nvm_alias nonexistent' exited with $EXIT_CODE, expected 2"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_alias nonexistent' produced wrong output; got $CAPTURED_STDERR"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_2" ] || die "'nvm_alias nonexistent' exited with $CAPTURED_EXIT_CODE, expected 2"
|
||||
|
||||
EXPECTED_OUTPUT="0.10"
|
||||
nvm alias test "$EXPECTED_OUTPUT" || die "'nvm alias test $EXPECTED_OUTPUT' failed"
|
||||
|
||||
@@ -8,66 +8,50 @@ die () { echo "$@" ; cleanup ; exit 1; }
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
set -ex
|
||||
|
||||
nvm_compute_checksum() {
|
||||
echo
|
||||
}
|
||||
|
||||
set +x
|
||||
OUTPUT="$(nvm_compare_checksum 2>&1 >/dev/null || echo)"
|
||||
EXIT_CODE="$(nvm_compare_checksum >/dev/null 2>&1 || echo $?)"
|
||||
set -x
|
||||
try_err nvm_compare_checksum
|
||||
EXPECTED_OUTPUT='Provided file to checksum is empty.'
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 4 ] || die "expected to exit with code 4, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 4 ] || die "expected to exit with code 4, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
set +x
|
||||
OUTPUT="$(nvm_compare_checksum foo 2>&1 >/dev/null || echo)"
|
||||
EXIT_CODE="$(nvm_compare_checksum foo >/dev/null 2>&1 || echo $?)"
|
||||
set -x
|
||||
try_err nvm_compare_checksum foo
|
||||
EXPECTED_OUTPUT='Provided file to checksum does not exist.'
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 3 ] || die "expected to exit with code 3, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 3 ] || die "expected to exit with code 3, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
set +x
|
||||
OUTPUT="$(nvm_compare_checksum ../../../nvm.sh 2>&1 >/dev/null || echo)"
|
||||
EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh >/dev/null 2>&1 || echo $?)"
|
||||
set -x
|
||||
try_err nvm_compare_checksum ../../../nvm.sh
|
||||
EXPECTED_OUTPUT='Provided checksum to compare to is empty.'
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 2 ] || die "expected to exit with code 2, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 2 ] || die "expected to exit with code 2, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
set +x
|
||||
OUTPUT="$(nvm_compare_checksum ../../../nvm.sh checksum 2>&1 >/dev/null)"
|
||||
EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh checksum >/dev/null 2>&1 ; echo $?)"
|
||||
set -x
|
||||
try_err nvm_compare_checksum ../../../nvm.sh checksum
|
||||
EXPECTED_OUTPUT="Computed checksum of '../../../nvm.sh' is empty.
|
||||
WARNING: Continuing *without checksum verification*"
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 0 ] || die "expected to exit with code 0, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 0 ] || die "expected to exit with code 0, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
nvm_compute_checksum() {
|
||||
echo "not checksum: ${1}"
|
||||
}
|
||||
|
||||
set +x
|
||||
OUTPUT="$(nvm_compare_checksum ../../../nvm.sh checksum 2>&1 >/dev/null || echo)"
|
||||
EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh checksum >/dev/null 2>&1 || echo $?)"
|
||||
set -x
|
||||
try_err nvm_compare_checksum ../../../nvm.sh checksum
|
||||
EXPECTED_OUTPUT="Checksums do not match: 'not checksum: ../../../nvm.sh' found, 'checksum' expected."
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 1 ] || die "expected to exit with code 1, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 1 ] || die "expected to exit with code 1, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
nvm_compute_checksum() {
|
||||
echo checksum
|
||||
}
|
||||
set +x
|
||||
OUTPUT="$(nvm_compare_checksum ../../../nvm.sh checksum 2>&1 >/dev/null)"
|
||||
EXIT_CODE="$(nvm_compare_checksum ../../../nvm.sh checksum >/dev/null 2>&1; echo $?)"
|
||||
set -x
|
||||
try_err nvm_compare_checksum ../../../nvm.sh checksum
|
||||
EXPECTED_OUTPUT='Checksums matched!'
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 0 ] || die "expected to exit with code 0, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 0 ] || die "expected to exit with code 0, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -7,18 +7,14 @@ die () { echo "$@" ; exit 1; }
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
set +x
|
||||
OUTPUT="$(nvm_compute_checksum 2>&1 >/dev/null || echo)"
|
||||
EXIT_CODE="$(nvm_compute_checksum >/dev/null 2>&1 || echo $?)"
|
||||
set -x
|
||||
EXPECTED_OUTPUT='Provided file to checksum is empty.'
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 2 ] || die "expected to exit with code 2, got ${EXIT_CODE}"
|
||||
\. ../../common.sh
|
||||
|
||||
set +x
|
||||
OUTPUT="$(nvm_compute_checksum foo 2>&1 >/dev/null || echo)"
|
||||
EXIT_CODE="$(nvm_compute_checksum foo >/dev/null 2>&1 || echo $?)"
|
||||
set -x
|
||||
try_err nvm_compute_checksum
|
||||
EXPECTED_OUTPUT='Provided file to checksum is empty.'
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 2 ] || die "expected to exit with code 2, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
try_err nvm_compute_checksum foo
|
||||
EXPECTED_OUTPUT='Provided file to checksum does not exist.'
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 1 ] || die "expected to exit with code 1, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 1 ] || die "expected to exit with code 1, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
@@ -6,6 +6,8 @@ TEST_DIR="$TEST_PWD/nvm_die_on_prefix_tmp"
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
TEST_VERSION_DIR="${TEST_DIR}/version"
|
||||
|
||||
cleanup () {
|
||||
@@ -23,23 +25,20 @@ die () {
|
||||
|
||||
[ ! -e "$TEST_DIR" ] && mkdir "$TEST_DIR"
|
||||
|
||||
OUTPUT="$(nvm_die_on_prefix 2>&1)"
|
||||
try_err nvm_die_on_prefix
|
||||
EXPECTED_OUTPUT="First argument \"delete the prefix\" must be zero or one"
|
||||
EXIT_CODE="$(nvm_die_on_prefix >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_1" ] || die "'nvm_die_on_prefix' did not exit with 1; got "$EXIT_CODE""
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix' did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] || die "'nvm_die_on_prefix' did not exit with 1; got "$CAPTURED_EXIT_CODE""
|
||||
|
||||
OUTPUT="$(nvm_die_on_prefix 2 2>&1)"
|
||||
try_err nvm_die_on_prefix 2
|
||||
EXPECTED_OUTPUT="First argument \"delete the prefix\" must be zero or one"
|
||||
EXIT_CODE="$(nvm_die_on_prefix 2 >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 2' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_1" ] || die "'nvm_die_on_prefix' did not exit with 1; got "$EXIT_CODE""
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 2' did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] || die "'nvm_die_on_prefix' did not exit with 1; got "$CAPTURED_EXIT_CODE""
|
||||
|
||||
OUTPUT="$(nvm_die_on_prefix 0 2>&1)"
|
||||
try_err nvm_die_on_prefix 0
|
||||
EXPECTED_OUTPUT='Second argument "nvm command", and third argument "nvm version dir", must both be nonempty'
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_2" ] || die "'nvm_die_on_prefix 0' did not exit with 2; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0' did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_2" ] || die "'nvm_die_on_prefix 0' did not exit with 2; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
nvm_has() { return 1; } # ie, npm is not installed
|
||||
OUTPUT="$(nvm_die_on_prefix 0 version_dir foo 2>&1)"
|
||||
@@ -70,26 +69,26 @@ node() {
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)"
|
||||
[ -z "$OUTPUT" ] || die "'nvm_die_on_prefix' was not a noop when directory is equivalent; got '$OUTPUT'"
|
||||
|
||||
OUTPUT="$(PREFIX=bar nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)"
|
||||
PREFIX=bar try_err nvm_die_on_prefix 0 foo "$(nvm_version_dir new)"
|
||||
unset PREFIX
|
||||
EXPECTED_OUTPUT='nvm is not compatible with the "PREFIX" environment variable: currently set to "bar"
|
||||
Run `unset PREFIX` to unset it.'
|
||||
EXIT_CODE="$(export PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 3; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 3; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(export NPM_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)"
|
||||
NPM_CONFIG_PREFIX=bar try_err nvm_die_on_prefix 0 foo "$(nvm_version_dir new)"
|
||||
unset NPM_CONFIG_PREFIX
|
||||
EXPECTED_OUTPUT='nvm is not compatible with the "NPM_CONFIG_PREFIX" environment variable: currently set to "bar"
|
||||
Run `unset NPM_CONFIG_PREFIX` to unset it.'
|
||||
EXIT_CODE="$(export NPM_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'NPM_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_4" ] || die "'NPM_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 4; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'NPM_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_4" ] || die "'NPM_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 4; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(export npm_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)"
|
||||
npm_CONFIG_PREFIX=bar try_err nvm_die_on_prefix 0 foo "$(nvm_version_dir new)"
|
||||
unset npm_CONFIG_PREFIX
|
||||
EXPECTED_OUTPUT='nvm is not compatible with the "npm_CONFIG_PREFIX" environment variable: currently set to "bar"
|
||||
Run `unset npm_CONFIG_PREFIX` to unset it.'
|
||||
EXIT_CODE="$(export npm_CONFIG_PREFIX=bar ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'npm_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_4" ] || die "'npm_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 4; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'npm_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_4" ] || die "'npm_CONFIG_PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 4; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(export FOO='This contains NPM_CONFIG_PREFIX' ; nvm_die_on_prefix 0 foo "$(nvm_version_dir new)" 2>&1)"
|
||||
[ -z "$OUTPUT" ] || die "'nvm_die_on_prefix' was not a noop; got '$OUTPUT'"
|
||||
@@ -101,23 +100,21 @@ OUTPUT="$(export FOO='This contains NPM_CONFIG_PREFIX' ; nvm_die_on_prefix 0 foo
|
||||
|
||||
# project: prefix
|
||||
echo 'prefix=garbage' > .npmrc
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your project npmrc file ($(nvm_sanitize_path "${TEST_DIR}")/.npmrc)
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has prefix did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has prefix did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
# project: globalconfig
|
||||
echo 'globalconfig=garbage' > .npmrc
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your project npmrc file ($(nvm_sanitize_path "${TEST_DIR}")/.npmrc)
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has globalconfig did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with project .npmrc that has globalconfig did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
rm "${TEST_DIR}/.npmrc" || die '.npmrc could not be removed'
|
||||
|
||||
@@ -133,67 +130,61 @@ Run \`foo\` to unset it."
|
||||
|
||||
# global: prefix
|
||||
echo 'prefix=garbage' > "${GLOBAL_NPMRC}"
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your global npmrc file ($(nvm_sanitize_path "${GLOBAL_NPMRC}"))
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has prefix did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has prefix did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
# global: globalconfig
|
||||
echo 'globalconfig=garbage' > "${GLOBAL_NPMRC}"
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your global npmrc file ($(nvm_sanitize_path "${GLOBAL_NPMRC}"))
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has globalconfig did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with global npmrc that has globalconfig did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
rm "${GLOBAL_NPMRC}" || die "${GLOBAL_NPMRC} could not be removed"
|
||||
|
||||
# builtin: prefix
|
||||
echo 'prefix=garbage' > "${BUILTIN_NPMRC}"
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your builtin npmrc file ($(nvm_sanitize_path "${BUILTIN_NPMRC}"))
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has prefix did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has prefix did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
# builtin: globalconfig
|
||||
echo 'globalconfig=garbage' > "${BUILTIN_NPMRC}"
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your builtin npmrc file ($(nvm_sanitize_path "${BUILTIN_NPMRC}"))
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has globalconfig did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with builtin npmrc that has globalconfig did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
rm "${BUILTIN_NPMRC}" || die "${BUILTIN_NPMRC} could not be removed"
|
||||
|
||||
# user: prefix
|
||||
echo 'prefix=garbage' > "${USER_NPMRC}"
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your user’s .npmrc file ($(nvm_sanitize_path "${USER_NPMRC}"))
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has prefix did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has prefix did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has prefix did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
# user: globalconfig
|
||||
echo 'globalconfig=garbage' > "${USER_NPMRC}"
|
||||
OUTPUT="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" 2>&1)"
|
||||
try_err nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}"
|
||||
EXPECTED_OUTPUT="Your user’s .npmrc file ($(nvm_sanitize_path "${USER_NPMRC}"))
|
||||
has a \`globalconfig\` and/or a \`prefix\` setting, which are incompatible with nvm.
|
||||
Run \`foo\` to unset it."
|
||||
EXIT_CODE="$(nvm_die_on_prefix 0 foo "${TEST_VERSION_DIR}" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has globalconfig did not exit with 10; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has globalconfig did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has globalconfig did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
)
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
cleanup () {
|
||||
unset -f die cleanup
|
||||
docker stop httpbin && docker rm httpbin
|
||||
docker rm -f httpbin >/dev/null 2>&1 || true
|
||||
}
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
@@ -17,13 +17,24 @@ nvm_download "https://raw.githubusercontent.com/nvm-sh/nvm/HEAD/install.sh" >/de
|
||||
# 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 should pass when calling with auth header
|
||||
docker pull kennethreitz/httpbin && SHELL=bash docker run -d --name httpbin -p 80:80 kennethreitz/httpbin
|
||||
sleep 1 # wait for httpbin to start
|
||||
NVM_AUTH_HEADER="Bearer test-token" nvm_download "http://127.0.0.1/bearer" > /dev/null || die 'nvm_download with auth header should send correctly'
|
||||
|
||||
# nvm_download should fail when calling without auth header
|
||||
nvm_download "http://127.0.0.1/bearer" > /dev/null && die 'nvm_download with no auth header should not send the header and should fail'
|
||||
# the auth header checks need a local httpbin container; retry the pull, and
|
||||
# skip (rather than fail) if the image cannot be pulled or run, so a transient
|
||||
# Docker registry outage does not fail the suite
|
||||
httpbin_pulled=0
|
||||
for i in 1 2 3 4 5; do
|
||||
if docker pull kennethreitz/httpbin; then httpbin_pulled=1; break; fi
|
||||
echo "docker pull httpbin failed, attempt $i/5"
|
||||
sleep $((i * 5))
|
||||
done
|
||||
if [ "${httpbin_pulled}" = 1 ] && SHELL=bash docker run -d --name httpbin -p 80:80 kennethreitz/httpbin; then
|
||||
sleep 1 # wait for httpbin to start
|
||||
# nvm_download should pass when calling with auth header
|
||||
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'
|
||||
else
|
||||
echo 'skipping auth header checks: unable to pull or run httpbin'
|
||||
fi
|
||||
|
||||
# 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'
|
||||
|
||||
86
test/fast/Unit tests/nvm_download no eval injection
Executable file
86
test/fast/Unit tests/nvm_download no eval injection
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/bin/sh
|
||||
|
||||
OLDPATH="$PATH"
|
||||
WORK="$PWD/nvm_download-noeval-work.$$"
|
||||
TEST_BIN="$WORK/bin"
|
||||
ARGV_LOG="$WORK/argv.log"
|
||||
PROOF="$WORK/nvm_injection_proof"
|
||||
|
||||
cleanup() {
|
||||
unset -f die cleanup
|
||||
rm -rf "$WORK"
|
||||
export PATH="$OLDPATH"
|
||||
}
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
OLDPATH="$PATH"
|
||||
|
||||
mkdir -p "$TEST_BIN"
|
||||
|
||||
# fake curl/wget: record each received argument verbatim, then succeed
|
||||
{
|
||||
echo '#!/bin/sh'
|
||||
echo ': > "$ARGV_LOG"'
|
||||
echo 'for a in "$@"; do printf "%s\n" "$a" >> "$ARGV_LOG"; done'
|
||||
echo 'exit 0'
|
||||
} > "$TEST_BIN/curl"
|
||||
chmod +x "$TEST_BIN/curl"
|
||||
cp "$TEST_BIN/curl" "$TEST_BIN/wget"
|
||||
|
||||
export ARGV_LOG
|
||||
export PATH="$TEST_BIN:$OLDPATH"
|
||||
|
||||
# given a url containing command-substitution syntax (mirror-supplied)
|
||||
INJECT_URL="http://example.test/v1\$(touch ${PROOF})/x.tar.gz"
|
||||
|
||||
# when nvm_download is invoked (curl path)
|
||||
rm -f "$PROOF"
|
||||
nvm_download "$INJECT_URL" -o - || die 'nvm_download (curl) returned nonzero on injection url'
|
||||
# then the substitution must not have executed
|
||||
[ ! -e "$PROOF" ] || die "command injection fired via curl path: proof file was created"
|
||||
# and curl must have received the url as one literal argument
|
||||
grep -Fxq "$INJECT_URL" "$ARGV_LOG" || die "curl did not receive the url as a single literal argument; got: $(cat "$ARGV_LOG")"
|
||||
|
||||
# given a normal download (curl path)
|
||||
URL="https://nodejs.org/dist/index.tab"
|
||||
FILE="$WORK/target"
|
||||
# when invoked with -L -s URL -o FILE
|
||||
nvm_download -L -s "$URL" -o "$FILE" || die 'nvm_download (curl) returned nonzero on normal url'
|
||||
# then the url, -o, and output file are passed through verbatim
|
||||
grep -Fxq "$URL" "$ARGV_LOG" || die "curl did not receive the url; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxqe "-o" "$ARGV_LOG" || die "curl did not receive -o; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxq "$FILE" "$ARGV_LOG" || die "curl did not receive the output file; got: $(cat "$ARGV_LOG")"
|
||||
# and curl-style flags are passed through verbatim (curl keeps -s; it is not translated to wget's -q)
|
||||
grep -Fxqe "-s" "$ARGV_LOG" || die "curl did not receive -s verbatim; got: $(cat "$ARGV_LOG")"
|
||||
rm -f "$FILE"
|
||||
|
||||
# given curl is unavailable (the wget-path calls run with PATH limited to our
|
||||
# fake wget, so neither the fake nor the system curl is found)
|
||||
rm -f "$TEST_BIN/curl"
|
||||
|
||||
# when nvm_download is invoked with the injection url (wget path)
|
||||
rm -f "$PROOF"
|
||||
( PATH="$TEST_BIN"; export PATH; nvm_download "$INJECT_URL" -o - ) || die 'nvm_download (wget) returned nonzero on injection url'
|
||||
# then the substitution must not have executed
|
||||
[ ! -e "$PROOF" ] || die "command injection fired via wget path: proof file was created"
|
||||
grep -Fxq "$INJECT_URL" "$ARGV_LOG" || die "wget did not receive the url as a single literal argument; got: $(cat "$ARGV_LOG")"
|
||||
|
||||
# when invoked with -L -C - --progress-bar URL -o FILE (wget path)
|
||||
( PATH="$TEST_BIN"; export PATH; nvm_download -L -C - --progress-bar "$URL" -o "$FILE" ) || die 'nvm_download (wget) returned nonzero on normal url'
|
||||
# then flags are translated to wget equivalents
|
||||
grep -Fxqe "-c" "$ARGV_LOG" || die "wget did not translate -C - to -c; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxqe "--progress=bar" "$ARGV_LOG" || die "wget did not translate --progress-bar; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxqe "-O" "$ARGV_LOG" || die "wget did not translate -o to -O; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxqe "-L" "$ARGV_LOG" && die "wget should drop -L; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxqe "-C" "$ARGV_LOG" && die "wget should not pass -C through; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxqe "-" "$ARGV_LOG" && die "wget should drop the lone - after -C; got: $(cat "$ARGV_LOG")"
|
||||
|
||||
# when invoked with -s (wget path)
|
||||
( PATH="$TEST_BIN"; export PATH; nvm_download -L -s "$URL" -o "$FILE" ) || die 'nvm_download (wget) returned nonzero on -s url'
|
||||
# then -s becomes -q
|
||||
grep -Fxqe "-q" "$ARGV_LOG" || die "wget did not translate -s to -q; got: $(cat "$ARGV_LOG")"
|
||||
|
||||
cleanup
|
||||
echo "nvm_download no eval injection: passed"
|
||||
43
test/fast/Unit tests/nvm_download wget Authorization header
Executable file
43
test/fast/Unit tests/nvm_download wget Authorization header
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/bin/sh
|
||||
|
||||
OLDPATH="$PATH"
|
||||
WORK="$PWD/nvm_download-wgetauth-work.$$"
|
||||
TEST_BIN="$WORK/bin"
|
||||
ARGV_LOG="$WORK/argv.log"
|
||||
|
||||
cleanup() {
|
||||
unset -f die cleanup nvm_has
|
||||
rm -rf "$WORK"
|
||||
export PATH="$OLDPATH"
|
||||
}
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
OLDPATH="$PATH"
|
||||
|
||||
mkdir -p "$TEST_BIN"
|
||||
|
||||
# fake wget: record each received argument verbatim, then succeed
|
||||
{
|
||||
echo '#!/bin/sh'
|
||||
echo ': > "$ARGV_LOG"'
|
||||
echo 'for a in "$@"; do printf "%s\n" "$a" >> "$ARGV_LOG"; done'
|
||||
echo 'exit 0'
|
||||
} > "$TEST_BIN/wget"
|
||||
chmod +x "$TEST_BIN/wget"
|
||||
|
||||
export ARGV_LOG
|
||||
export PATH="$TEST_BIN:$OLDPATH"
|
||||
# force the wget path while keeping system tools (sed) available for sanitization
|
||||
nvm_has() { [ "$1" != curl ] && command -v "$1" >/dev/null 2>&1; }
|
||||
|
||||
# given an Authorization credential in NVM_AUTH_HEADER
|
||||
# when nvm_download uses the wget path
|
||||
NVM_AUTH_HEADER='Bearer test-token' nvm_download "https://nodejs.org/dist/x" -o - || die 'nvm_download (wget) returned nonzero'
|
||||
# then wget receives a well-formed Authorization header (with the header name, like the curl path)
|
||||
grep -Fxqe '--header' "$ARGV_LOG" || die "wget did not receive --header; got: $(cat "$ARGV_LOG")"
|
||||
grep -Fxq 'Authorization: Bearer test-token' "$ARGV_LOG" || die "wget did not receive a well-formed Authorization header; got: $(cat "$ARGV_LOG")"
|
||||
|
||||
cleanup
|
||||
echo "nvm_download wget Authorization header: passed"
|
||||
55
test/fast/Unit tests/nvm_download_artifact error propagation
Executable file
55
test/fast/Unit tests/nvm_download_artifact error propagation
Executable file
@@ -0,0 +1,55 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
# Test that mkdir failure propagates from brace group (not subshell)
|
||||
nvm_download_artifact_mkdir_test() {
|
||||
local tmpdir
|
||||
tmpdir="/nonexistent/path/that/cannot/exist"
|
||||
command mkdir -p "${tmpdir}/files" || {
|
||||
return 3
|
||||
}
|
||||
}
|
||||
nvm_download_artifact_mkdir_test 2>/dev/null
|
||||
EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = "3" ] || die "Expected mkdir failure to propagate with exit code 3, got ${EXIT_CODE}"
|
||||
|
||||
# Test that download failure propagates with exit code 4
|
||||
nvm_get_mirror() { echo "http://example.com"; }
|
||||
nvm_binary_available() { return 0; }
|
||||
nvm_get_download_slug() { echo "node-v20.0.0-linux-x64"; }
|
||||
nvm_get_artifact_compression() { echo "tar.gz"; }
|
||||
nvm_cache_dir() { echo "${TMPDIR:-/tmp}/nvm_test_cache_$$"; }
|
||||
nvm_get_checksum() { echo "fake_checksum"; }
|
||||
nvm_version_greater_than_or_equal_to() { return 0; }
|
||||
nvm_download() { return 1; }
|
||||
nvm_grep() { return 1; }
|
||||
|
||||
nvm_download_artifact node binary std v20.0.0 2>/dev/null
|
||||
EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = "4" ] || die "Expected download failure to propagate with exit code 4, got ${EXIT_CODE}"
|
||||
|
||||
# clean up any dirs created by the download failure test
|
||||
command rm -rf "$(nvm_cache_dir)"
|
||||
|
||||
# Test that checksum failure propagates with exit code 6
|
||||
nvm_download() {
|
||||
while [ "$#" -gt 0 ]; do
|
||||
if [ "$1" = "-o" ]; then command touch "$2"; return 0; fi
|
||||
shift
|
||||
done
|
||||
return 0
|
||||
}
|
||||
nvm_compare_checksum() { return 1; }
|
||||
|
||||
nvm_download_artifact node binary std v20.0.0 2>/dev/null
|
||||
EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = "6" ] || die "Expected checksum failure to propagate with exit code 6, got ${EXIT_CODE}"
|
||||
|
||||
# clean up
|
||||
command rm -rf "$(nvm_cache_dir)"
|
||||
46
test/fast/Unit tests/nvm_download_artifact version injection
Executable file
46
test/fast/Unit tests/nvm_download_artifact version injection
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
|
||||
WORK="${TMPDIR:-/tmp}/nvm_version_injection.$$"
|
||||
PROOF="${WORK}/PWNED"
|
||||
|
||||
cleanup () {
|
||||
unset -f die cleanup nvm_download
|
||||
rm -rf "${WORK}"
|
||||
}
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
mkdir -p "${WORK}"
|
||||
export NVM_DIR="${WORK}"
|
||||
|
||||
# GHSA-3c52-35h2-gfmm: a mirror-supplied version with shell/awk metacharacters
|
||||
# must be rejected before it is used in URLs, paths, or awk. Neutralize network.
|
||||
nvm_download () { return 0; }
|
||||
|
||||
# given a version containing command-substitution syntax
|
||||
# when nvm_download_artifact is asked to download it
|
||||
# then it is rejected for disallowed characters and nothing is executed
|
||||
rm -f "${PROOF}"
|
||||
out="$(nvm_download_artifact node source std 'v1$(touch '"${PROOF}"')' 2>&1 </dev/null)"
|
||||
case "${out}" in
|
||||
*'disallowed characters'*) : ;;
|
||||
*) die "command-substitution version was not rejected; got: ${out}" ;;
|
||||
esac
|
||||
[ ! -e "${PROOF}" ] || die 'command-substitution payload executed via nvm_download_artifact'
|
||||
|
||||
# and an awk-breakout version is likewise rejected
|
||||
out="$(nvm_download_artifact node source std 'v1"==$2){system("x")}#' 2>&1 </dev/null)"
|
||||
case "${out}" in
|
||||
*'disallowed characters'*) : ;;
|
||||
*) die "awk-style version was not rejected; got: ${out}" ;;
|
||||
esac
|
||||
|
||||
# and a legitimate nightly version must NOT be rejected by the character guard
|
||||
out="$(nvm_download_artifact node source std 'v22.0.0-nightly20240101abcdef' 2>&1 </dev/null)"
|
||||
case "${out}" in
|
||||
*'disallowed characters'*) die 'a legitimate nightly version was wrongly rejected by the guard' ;;
|
||||
esac
|
||||
|
||||
cleanup
|
||||
echo 'nvm_download_artifact version injection: passed'
|
||||
48
test/fast/Unit tests/nvm_get_arch alpine
Executable file
48
test/fast/Unit tests/nvm_get_arch alpine
Executable file
@@ -0,0 +1,48 @@
|
||||
#!/bin/sh
|
||||
|
||||
ORIG_PATH="${PATH}"
|
||||
|
||||
cleanup() {
|
||||
rm -f ./uname
|
||||
export PATH="${ORIG_PATH}"
|
||||
}
|
||||
|
||||
die () { cleanup; echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
MOCKS_DIR="$(pwd)/../../mocks"
|
||||
export PATH=".:${PATH}"
|
||||
|
||||
# On Alpine (where /etc/alpine-release exists), x64 should get -musl suffix
|
||||
# and arm64 should NOT get -musl suffix.
|
||||
# On non-Alpine, neither should get -musl.
|
||||
|
||||
if [ -f "/etc/alpine-release" ]; then
|
||||
# x64 on Alpine should produce x64-musl
|
||||
ln -sf "${MOCKS_DIR}/uname_linux_x86_64" ./uname
|
||||
OUTPUT="$(nvm_get_arch)"
|
||||
rm -f ./uname
|
||||
[ "_${OUTPUT}" = "_x64-musl" ] || die "x64 on Alpine should be x64-musl, got ${OUTPUT}"
|
||||
|
||||
# aarch64 on Alpine should produce arm64, NOT arm64-musl
|
||||
ln -sf "${MOCKS_DIR}/uname_linux_aarch64" ./uname
|
||||
OUTPUT="$(nvm_get_arch)"
|
||||
rm -f ./uname
|
||||
[ "_${OUTPUT}" = "_arm64" ] || die "aarch64 on Alpine should be arm64 (no musl suffix), got ${OUTPUT}"
|
||||
else
|
||||
# x64 on non-Alpine should produce x64 (no musl suffix)
|
||||
ln -sf "${MOCKS_DIR}/uname_linux_x86_64" ./uname
|
||||
OUTPUT="$(nvm_get_arch)"
|
||||
rm -f ./uname
|
||||
[ "_${OUTPUT}" = "_x64" ] || die "x64 on non-Alpine should be x64, got ${OUTPUT}"
|
||||
|
||||
# aarch64 on non-Alpine should produce arm64
|
||||
ln -sf "${MOCKS_DIR}/uname_linux_aarch64" ./uname
|
||||
OUTPUT="$(nvm_get_arch)"
|
||||
rm -f ./uname
|
||||
[ "_${OUTPUT}" = "_arm64" ] || die "aarch64 on non-Alpine should be arm64, got ${OUTPUT}"
|
||||
fi
|
||||
|
||||
cleanup
|
||||
@@ -37,11 +37,12 @@ setup_chroot() {
|
||||
|
||||
# Files and binaries
|
||||
cp ../../../nvm.sh "${chroot_dir}/"
|
||||
cp /bin/sh /usr/bin/dirname "${chroot_dir}/bin/"
|
||||
cp /bin/sh /usr/bin/dirname /usr/bin/uname "${chroot_dir}/usr/bin/"
|
||||
ln -sf ../usr/bin/sh "${chroot_dir}/bin/sh"
|
||||
[ "${chroot_dir}" = "${CHROOT_WITH_ALPINE}" ] && touch "${chroot_dir}/etc/alpine-release"
|
||||
|
||||
# Libraries
|
||||
for binary in /bin/sh /usr/bin/dirname; do
|
||||
for binary in /bin/sh /usr/bin/dirname /usr/bin/uname; do
|
||||
for lib in $(ldd $binary | awk '{print $3}' | grep "^/"); do
|
||||
dir=$(dirname "${lib}")
|
||||
mkdir -p "${chroot_dir}${dir}"
|
||||
|
||||
@@ -12,17 +12,16 @@ set +e # TODO: fix
|
||||
\. ../../../nvm.sh
|
||||
set -e
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
nvm_get_mirror() {
|
||||
echo "mirror-${1}-${2}"
|
||||
}
|
||||
|
||||
set +ex # needed to capture error output
|
||||
OUTPUT="$(nvm_get_checksum 2>&1 >/dev/null)"
|
||||
try_err nvm_get_checksum
|
||||
EXPECTED_OUTPUT='supported flavors: node, iojs'
|
||||
EXIT_CODE="$(nvm_get_checksum >/dev/null 2>&1 ; echo $?)"
|
||||
set -ex
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "expected error output >${EXPECTED_OUTPUT}<, got >${OUTPUT}<"
|
||||
[ "${EXIT_CODE}" = 2 ] || die "expected exit code 2, got ${EXIT_CODE}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED_OUTPUT}" ] || die "expected error output >${EXPECTED_OUTPUT}<, got >${CAPTURED_STDERR}<"
|
||||
[ "${CAPTURED_EXIT_CODE}" = 2 ] || die "expected exit code 2, got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
nvm_download() {
|
||||
echo "ERROR_FAILED_MATCH no_match more fields"
|
||||
|
||||
28
test/fast/Unit tests/nvm_get_checksum awk injection
Executable file
28
test/fast/Unit tests/nvm_get_checksum awk injection
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/bin/sh
|
||||
|
||||
WORK="${TMPDIR:-/tmp}/nvm_get_checksum_awk.$$"
|
||||
PROOF="${WORK}/PWNED"
|
||||
|
||||
cleanup () {
|
||||
unset -f die cleanup nvm_download
|
||||
rm -rf "${WORK}"
|
||||
}
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
mkdir -p "${WORK}"
|
||||
|
||||
# GHSA-3c52-35h2-gfmm: nvm_get_checksum must treat the (untrusted, version-derived)
|
||||
# slug as awk data, never as awk program text.
|
||||
# given a crafted slug carrying an unconditional awk system() action
|
||||
# and a mock that supplies one SHASUMS record (so such an action would fire)
|
||||
nvm_download () { printf 'deadbeef sometarball\n'; }
|
||||
# when nvm_get_checksum runs with that slug as its 4th argument
|
||||
rm -f "${PROOF}"
|
||||
nvm_get_checksum node std v1 'x" == $2) print $1} {system("touch${IFS}'"$PROOF"'")} #' tar.gz >/dev/null 2>&1
|
||||
# then the injected awk code must not execute
|
||||
[ ! -e "${PROOF}" ] || die 'awk injection fires in nvm_get_checksum (slug interpolated into awk program text)'
|
||||
|
||||
cleanup
|
||||
echo 'nvm_get_checksum awk injection: passed'
|
||||
@@ -9,13 +9,14 @@ cleanup() {
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
nvm_has() { return 1 ; }
|
||||
|
||||
OUTPUT="$(nvm_get_latest 2>&1)"
|
||||
EXIT_CODE="$(nvm_get_latest >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_nvm needs curl or wget to proceed." ] \
|
||||
|| die "no curl/wget did not report correct error message, got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_1" ] \
|
||||
|| die "no curl/wget did not exit with code 1, got $EXIT_CODE"
|
||||
try_err nvm_get_latest
|
||||
[ "_$CAPTURED_STDERR" = "_nvm needs curl or wget to proceed." ] \
|
||||
|| die "no curl/wget did not report correct error message, got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] \
|
||||
|| die "no curl/wget did not exit with code 1, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -5,6 +5,8 @@ die () { echo "$@" ; exit 1; }
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
expect () {
|
||||
INPUT="$1"
|
||||
EXPECTED_OUTPUT="$2"
|
||||
@@ -20,8 +22,8 @@ fail_with () {
|
||||
INPUT="$1"
|
||||
EXPECTED_CODE="$2"
|
||||
|
||||
EXIT_CODE="$(nvm_get_minor_version "$INPUT" >/dev/null 2>&1; echo $?)"
|
||||
[ "_$EXIT_CODE" = "_$EXPECTED_CODE" ] || die "nvm_get_minor_version "$INPUT" did not fail with code "$EXPECTED_CODE"; got $EXIT_CODE"
|
||||
try nvm_get_minor_version "$INPUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_$EXPECTED_CODE" ] || die "nvm_get_minor_version "$INPUT" did not fail with code "$EXPECTED_CODE"; got $CAPTURED_EXIT_CODE"
|
||||
}
|
||||
|
||||
expect 1 1.0
|
||||
|
||||
@@ -46,3 +46,9 @@ testMirrors '`do something bad`'
|
||||
testMirrors 'https://nodejs.org/dist; xdg-open http://www.google.com;'
|
||||
testMirrors 'https://nodejs.org/dist&&xdg-open http://www.google.com;'
|
||||
testMirrors 'https://nodejs.org/dist|xdg-open http://www.google.com;'
|
||||
|
||||
# Test that awk URL validation rejects non-URL values
|
||||
testMirrors 'not a url'
|
||||
testMirrors 'ftp://wrong-scheme'
|
||||
testMirrors 'http://'
|
||||
testMirrors 'javascript:alert(1)'
|
||||
|
||||
@@ -23,6 +23,9 @@ if [ "${OUTPUT#*$EXPECTED_OUTPUT}" = "${OUTPUT}" ]; then
|
||||
die "No source binary flag is active and should have returned >${EXPECTED_OUTPUT}<. Instead it returned >${OUTPUT}<"
|
||||
fi
|
||||
|
||||
nvm_install_binary node std 8.0.0 1 >/dev/null 2>&1; EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = "2" ] || die "Expected exit code 2 when nosource=1 and binary fails, got ${EXIT_CODE}"
|
||||
|
||||
# Unit test to check if the function errors out when the flag is set
|
||||
OUTPUT="$(nvm_install_binary node std 8.0.0 0 2>&1)"
|
||||
EXPECTED_OUTPUT='Binary download failed. Download from source aborted.'
|
||||
|
||||
@@ -22,11 +22,10 @@ npm() {
|
||||
echo '1.2.3'
|
||||
}
|
||||
|
||||
OUTPUT="$(nvm_install_latest_npm 2>&1 >/dev/null)"
|
||||
EXIT_CODE="$(nvm_install_latest_npm >/dev/null 2>&1 ; echo $?)"
|
||||
try_err nvm_install_latest_npm
|
||||
|
||||
EXPECTED="Unable to obtain node version."
|
||||
[ "${OUTPUT}" = "${EXPECTED}" ] || die "When node is unavailable, expected >${EXPECTED}<; got >${OUTPUT}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED}" ] || die "When node is unavailable, expected >${EXPECTED}<; got >${CAPTURED_STDERR}"
|
||||
|
||||
node() {
|
||||
echo 'v4.5.6'
|
||||
@@ -37,11 +36,10 @@ nvm_ls_current() {
|
||||
npm() {
|
||||
return 1
|
||||
}
|
||||
OUTPUT="$(nvm_install_latest_npm 2>&1 >/dev/null)"
|
||||
EXIT_CODE="$(nvm_install_latest_npm >/dev/null 2>&1 ; echo $?)"
|
||||
try_err nvm_install_latest_npm
|
||||
|
||||
EXPECTED="Unable to obtain npm version."
|
||||
[ "${OUTPUT}" = "${EXPECTED}" ] || die "When node is available and npm is unavailable, expected >${EXPECTED}<; got >${OUTPUT}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED}" ] || die "When node is available and npm is unavailable, expected >${EXPECTED}<; got >${CAPTURED_STDERR}"
|
||||
|
||||
node() {
|
||||
echo 'v4.5.6'
|
||||
@@ -52,8 +50,7 @@ nvm_ls_current() {
|
||||
npm() {
|
||||
return 1
|
||||
}
|
||||
OUTPUT="$(nvm_install_latest_npm 2>&1 >/dev/null)"
|
||||
EXIT_CODE="$(nvm_install_latest_npm >/dev/null 2>&1 ; echo $?)"
|
||||
try_err nvm_install_latest_npm
|
||||
|
||||
EXPECTED="Unable to obtain npm version."
|
||||
[ "${OUTPUT}" = "${EXPECTED}" ] || die "When node is system and npm is unavailable, expected >${EXPECTED}<; got >${OUTPUT}"
|
||||
[ "${CAPTURED_STDERR}" = "${EXPECTED}" ] || die "When node is system and npm is unavailable, expected >${EXPECTED}<; got >${CAPTURED_STDERR}"
|
||||
|
||||
@@ -10,9 +10,15 @@ assert_not_ok nvm_iojs_version_has_solaris_binary ""
|
||||
assert_not_ok nvm_iojs_version_has_solaris_binary "foo"
|
||||
assert_not_ok nvm_iojs_version_has_solaris_binary "v1.1.0"
|
||||
|
||||
assert_ok nvm_iojs_version_has_solaris_binary "v3.3.1"
|
||||
# Non-iojs versions should fail (version is unchanged after stripping iojs prefix)
|
||||
assert_not_ok nvm_iojs_version_has_solaris_binary "v4.0.0"
|
||||
assert_not_ok nvm_iojs_version_has_solaris_binary "v8.0.0"
|
||||
|
||||
# Bare versions without iojs- prefix are node versions, not iojs
|
||||
assert_not_ok nvm_iojs_version_has_solaris_binary "v3.3.1"
|
||||
assert_not_ok nvm_iojs_version_has_solaris_binary "v3.3.2"
|
||||
assert_not_ok nvm_iojs_version_has_solaris_binary "v3.4.1"
|
||||
|
||||
assert_ok nvm_iojs_version_has_solaris_binary "iojs-v3.3.1"
|
||||
assert_ok nvm_iojs_version_has_solaris_binary "v3.3.2"
|
||||
assert_ok nvm_iojs_version_has_solaris_binary "iojs-v3.3.2"
|
||||
assert_ok nvm_iojs_version_has_solaris_binary "v3.4.1"
|
||||
assert_ok nvm_iojs_version_has_solaris_binary "iojs-v3.4.1"
|
||||
|
||||
@@ -19,10 +19,11 @@ nvm_download() {
|
||||
|
||||
EXPECTED_OUTPUT_PATH="$MOCKS_DIR/nvm_ls_remote.txt"
|
||||
|
||||
OUTPUT="$(nvm_ls_remote foo)"
|
||||
EXIT_CODE="$(nvm_ls_remote foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
|
||||
\. ../../common.sh
|
||||
|
||||
try nvm_ls_remote foo
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_ls_remote)"
|
||||
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH")"
|
||||
|
||||
@@ -19,10 +19,11 @@ nvm_download() {
|
||||
|
||||
EXPECTED_OUTPUT_PATH="$MOCKS_DIR/nvm_ls_remote nightly.txt"
|
||||
|
||||
OUTPUT="$(nvm_ls_remote foo)"
|
||||
EXIT_CODE="$(nvm_ls_remote foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
|
||||
\. ../../common.sh
|
||||
|
||||
try nvm_ls_remote foo
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_ls_remote)"
|
||||
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH")"
|
||||
|
||||
@@ -17,10 +17,11 @@ nvm_download() {
|
||||
|
||||
EXPECTED_OUTPUT_PATH="$PWD/mocks/nvm_ls_remote_iojs.txt"
|
||||
|
||||
OUTPUT="$(nvm_ls_remote_iojs foo)"
|
||||
EXIT_CODE="$(nvm_ls_remote_iojs foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
|
||||
\. ../../common.sh
|
||||
|
||||
try nvm_ls_remote_iojs foo
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_ls_remote_iojs)"
|
||||
EXPECTED_OUTPUT="$(cat "$EXPECTED_OUTPUT_PATH")"
|
||||
|
||||
@@ -5,16 +5,16 @@ die () { echo "$@" ; exit 1; }
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
OUTPUT="$(nvm_make_alias 2>&1)"
|
||||
EXIT_CODE="$(nvm_make_alias >/dev/null 2>&1 ; echo $?)"
|
||||
\. ../../common.sh
|
||||
|
||||
try_err nvm_make_alias
|
||||
EXPECTED_OUTPUT='an alias name is required'
|
||||
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "\`nvm_make_alias\` did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "$EXIT_CODE" -eq 1 ] || die "\`nvm_make_alias\` did not exit with 1, got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "\`nvm_make_alias\` did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" -eq 1 ] || die "\`nvm_make_alias\` did not exit with 1, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
OUTPUT="$(nvm_make_alias foo 2>&1)"
|
||||
EXIT_CODE="$(nvm_make_alias foo >/dev/null 2>&1 ; echo $?)"
|
||||
try_err nvm_make_alias foo
|
||||
EXPECTED_OUTPUT='an alias target version is required'
|
||||
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "\`nvm_make_alias foo\` did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "$EXIT_CODE" -eq 2 ] || die "\`nvm_make_alias foo\` did not exit with 2, got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "\`nvm_make_alias foo\` did not error with '$EXPECTED_OUTPUT'; got '$CAPTURED_STDERR'"
|
||||
[ "$CAPTURED_EXIT_CODE" -eq 2 ] || die "\`nvm_make_alias foo\` did not exit with 2, got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
39
test/fast/Unit tests/nvm_offline_version
Normal file
39
test/fast/Unit tests/nvm_offline_version
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
TEST_DIR="$(pwd)/nvm_offline_version_tmp"
|
||||
|
||||
cleanup() {
|
||||
rm -rf "${TEST_DIR}"
|
||||
}
|
||||
|
||||
[ ! -e "${TEST_DIR}" ] && mkdir -p "${TEST_DIR}"
|
||||
|
||||
# nvm_offline_version should find installed versions
|
||||
INSTALLED_VERSION="$(nvm_version node)"
|
||||
if [ "_${INSTALLED_VERSION}" != '_N/A' ] && [ "_${INSTALLED_VERSION}" != '_system' ]; then
|
||||
try nvm_offline_version "${INSTALLED_VERSION}"
|
||||
[ "_$CAPTURED_STDOUT" = "_${INSTALLED_VERSION}" ] \
|
||||
|| die "nvm_offline_version '${INSTALLED_VERSION}' should return '${INSTALLED_VERSION}'; got '$CAPTURED_STDOUT'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] \
|
||||
|| die "nvm_offline_version '${INSTALLED_VERSION}' should exit 0; got '$CAPTURED_EXIT_CODE'"
|
||||
fi
|
||||
|
||||
# nvm_offline_version with nonexistent version should return N/A
|
||||
try nvm_offline_version "999.999.999"
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] \
|
||||
|| die "nvm_offline_version '999.999.999' should return 'N/A'; got '$CAPTURED_STDOUT'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] \
|
||||
|| die "nvm_offline_version '999.999.999' should exit 3; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
# nvm_ls_cached with nonexistent pattern should return nothing
|
||||
try nvm_ls_cached "999.999"
|
||||
[ -z "$CAPTURED_STDOUT" ] \
|
||||
|| die "nvm_ls_cached '999.999' should return empty; got '$CAPTURED_STDOUT'"
|
||||
|
||||
cleanup
|
||||
@@ -24,12 +24,11 @@ nvm_alias() {
|
||||
echo ''
|
||||
}
|
||||
|
||||
OUTPUT="$(nvm_print_alias_path "$NVM_ALIAS_DIR" foo | strip_colors)"
|
||||
try nvm_print_alias_path "$NVM_ALIAS_DIR" foo
|
||||
OUTPUT="$(echo "$CAPTURED_STDOUT" | strip_colors)"
|
||||
EXPECTED_OUTPUT=''
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_print_alias_path \"\$NVM_ALIAS_DIR\" foo' should produce no output when nvm_alias does not; got '$OUTPUT'"
|
||||
|
||||
EXIT_CODE="$(nvm_print_alias_path "$NVM_ALIAS_DIR" foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = '0' ] || die "'nvm_print_alias_path \"\$NVM_ALIAS_DIR\" foo' should exit zero when nvm_alias produces no output; got $EXIT_CODE"
|
||||
[ "$CAPTURED_EXIT_CODE" = '0' ] || die "'nvm_print_alias_path \"\$NVM_ALIAS_DIR\" foo' should exit zero when nvm_alias produces no output; got $CAPTURED_EXIT_CODE"
|
||||
|
||||
nvm_alias() {
|
||||
echo "\"$1\""
|
||||
|
||||
@@ -18,12 +18,11 @@ OUTPUT="$(nvm_print_default_alias 2>&1)"
|
||||
EXPECTED_OUTPUT='A default alias is required.'
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "'nvm_print_default_alias' produced wrong output; got '$OUTPUT', expected '$EXPECTED_OUTPUT'"
|
||||
|
||||
OUTPUT="$(nvm_print_default_alias foo | strip_colors)"
|
||||
try nvm_print_default_alias foo
|
||||
OUTPUT="$(echo "$CAPTURED_STDOUT" | strip_colors)"
|
||||
EXPECTED_OUTPUT=''
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_print_default_alias foo' should produce no output when nvm_print_implicit_alias does not; got '$OUTPUT'"
|
||||
|
||||
EXIT_CODE="$(nvm_print_default_alias foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "$EXIT_CODE" = '0' ] || die "'nvm_print_default_alias foo' should exit zero when nvm_print_implicit_alias produces no output; got $EXIT_CODE"
|
||||
[ "$CAPTURED_EXIT_CODE" = '0' ] || die "'nvm_print_default_alias foo' should exit zero when nvm_print_implicit_alias produces no output; got $CAPTURED_EXIT_CODE"
|
||||
|
||||
nvm_print_implicit_alias() {
|
||||
echo "\"$1-$2\""
|
||||
|
||||
@@ -5,15 +5,17 @@ die () { echo "$@" ; exit 1; }
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
EXPECTED_FIRST_MSG="nvm_print_implicit_alias must be specified with local or remote as the first argument."
|
||||
[ "_$(nvm_print_implicit_alias 2>&1)" = "_$EXPECTED_FIRST_MSG" ] \
|
||||
|| die "nvm_print_implicit_alias did not require local|remote as first argument"
|
||||
[ "_$(nvm_print_implicit_alias foo 2>&1)" = "_$EXPECTED_FIRST_MSG" ] \
|
||||
|| die "nvm_print_implicit_alias did not require local|remote as first argument"
|
||||
|
||||
FIRST_EXIT_CODE="$(nvm_print_implicit_alias > /dev/null 2>&1 ; echo $?)"
|
||||
[ "_$FIRST_EXIT_CODE" = "_1" ] \
|
||||
|| die "nvm_print_implicit_alias without local|remote had wrong exit code: expected 1, got $FIRST_EXIT_CODE"
|
||||
try_err nvm_print_implicit_alias
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] \
|
||||
|| die "nvm_print_implicit_alias without local|remote had wrong exit code: expected 1, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
EXPECTED_SECOND_MSG="Only implicit aliases 'stable', 'unstable', 'iojs', and 'node' are supported."
|
||||
[ "_$(nvm_print_implicit_alias local 2>&1)" = "_$EXPECTED_SECOND_MSG" ] \
|
||||
@@ -21,6 +23,6 @@ EXPECTED_SECOND_MSG="Only implicit aliases 'stable', 'unstable', 'iojs', and 'no
|
||||
[ "_$(nvm_print_implicit_alias local foo 2>&1)" = "_$EXPECTED_SECOND_MSG" ] \
|
||||
|| die "nvm_print_implicit_alias did not require stable|unstable|iojs|node as second argument"
|
||||
|
||||
SECOND_EXIT_CODE="$(nvm_print_implicit_alias local > /dev/null 2>&1 ; echo $?)"
|
||||
[ "_$SECOND_EXIT_CODE" = "_2" ] \
|
||||
|| die "nvm_print_implicit_alias without stable|unstable|iojs|node had wrong exit code: expected 2, got $SECOND_EXIT_CODE"
|
||||
try_err nvm_print_implicit_alias local
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_2" ] \
|
||||
|| die "nvm_print_implicit_alias without stable|unstable|iojs|node had wrong exit code: expected 2, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
@@ -12,24 +12,23 @@ cleanup() {
|
||||
\. ../../common.sh
|
||||
|
||||
for f in ../../../test/fixtures/nvmrc/test/fixtures/valid/*; do
|
||||
STDOUT="$(nvm_process_nvmrc $f/.nvmrc 2>/dev/null)"
|
||||
EXIT_CODE="$(nvm_process_nvmrc $f/.nvmrc >/dev/null 2>/dev/null; echo $?)"
|
||||
try nvm_process_nvmrc $f/.nvmrc
|
||||
|
||||
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}"
|
||||
[ "${CAPTURED_EXIT_CODE}" = "0" ] || die "$(basename "${f}"): expected exit code of 0 but got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
[ "${STDOUT}" = "${EXPECTED}" ] || die "$(basename "${f}"): expected STDOUT of \`${EXPECTED}\` but got \`${STDOUT}\`"
|
||||
[ "${CAPTURED_STDOUT}" = "${EXPECTED}" ] || die "$(basename "${f}"): expected STDOUT of \`${EXPECTED}\` but got \`${CAPTURED_STDOUT}\`"
|
||||
done
|
||||
|
||||
for f in ../../../test/fixtures/nvmrc/test/fixtures/invalid/*; do
|
||||
STDOUT="$(nvm_process_nvmrc $f/.nvmrc 2>/dev/null)"
|
||||
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 $?)"
|
||||
try nvm_process_nvmrc $f/.nvmrc
|
||||
try_err nvm_process_nvmrc $f/.nvmrc
|
||||
STDERR="$(echo "$CAPTURED_STDERR" | awk '{if(NR > 8) print $0}' | strip_colors)"
|
||||
|
||||
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}"
|
||||
[ "${CAPTURED_EXIT_CODE}" != "0" ] || die "$(basename "${f}"): expected exit code of 'not 0' but got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
[ "${STDERR}" = "${EXPECTED}" ] || die "$(basename "${f}"): expected STDERR of \`${EXPECTED}\` but got \`${STDERR}\`"
|
||||
done
|
||||
|
||||
39
test/fast/Unit tests/nvm_rc_version errors when no version and no .nvmrc
Executable file
39
test/fast/Unit tests/nvm_rc_version errors when no version and no .nvmrc
Executable file
@@ -0,0 +1,39 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
cd "${ORIG_PWD}" 2>/dev/null || true
|
||||
[ -n "${TMP_DIR-}" ] && rm -rf "${TMP_DIR}"
|
||||
}
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
ORIG_PWD="$(pwd)"
|
||||
|
||||
# Run from a fresh, empty directory so no ambient .nvmrc above the test dir
|
||||
# is found by the upward lookup.
|
||||
TMP_DIR="$(mktemp -d)"
|
||||
cd "${TMP_DIR}" || die "could not cd to temp dir"
|
||||
|
||||
# The message must name both halves of the problem: no argument AND no .nvmrc.
|
||||
try_err nvm_rc_version
|
||||
EXPECTED='No version provided and no .nvmrc file found'
|
||||
[ "_${CAPTURED_STDERR}" = "_${EXPECTED}" ] \
|
||||
|| die "nvm_rc_version did not print >${EXPECTED}<; got >${CAPTURED_STDERR}<"
|
||||
[ "_${CAPTURED_EXIT_CODE}" = "_1" ] \
|
||||
|| die "nvm_rc_version expected exit code 1; got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
# NVM_SILENT suppresses the message but the call still fails.
|
||||
export NVM_SILENT=1
|
||||
try_err nvm_rc_version
|
||||
unset NVM_SILENT
|
||||
[ -z "${CAPTURED_STDERR}" ] \
|
||||
|| die "NVM_SILENT nvm_rc_version should be silent; got >${CAPTURED_STDERR}<"
|
||||
[ "_${CAPTURED_EXIT_CODE}" = "_1" ] \
|
||||
|| die "NVM_SILENT nvm_rc_version expected exit code 1; got ${CAPTURED_EXIT_CODE}"
|
||||
|
||||
cleanup
|
||||
@@ -9,21 +9,21 @@ cleanup() {
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
nvm_ls_remote() {
|
||||
echo "N/A"
|
||||
}
|
||||
OUTPUT="$(nvm_remote_version foo)"
|
||||
EXIT_CODE="$(nvm_remote_version foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
|
||||
try nvm_remote_version foo
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
nvm_ls_remote_iojs() {
|
||||
echo "N/A"
|
||||
}
|
||||
OUTPUT="$(nvm_remote_version iojs-foo)"
|
||||
EXIT_CODE="$(nvm_remote_version iojs-foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
|
||||
try nvm_remote_version iojs-foo
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
|
||||
nvm_ls_remote() {
|
||||
@@ -40,41 +40,35 @@ nvm_ls_remote_iojs() {
|
||||
echo "iojs_pattern_received:_$1_"
|
||||
fi
|
||||
}
|
||||
OUTPUT="$(nvm_remote_version foo)"
|
||||
EXIT_CODE="$(nvm_remote_version foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_pattern_received:_foo_" ] \
|
||||
|| die "nvm_remote_version foo did not return last line only of nvm_ls_remote foo; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version foo did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_version foo
|
||||
[ "_$CAPTURED_STDOUT" = "_pattern_received:_foo_" ] \
|
||||
|| die "nvm_remote_version foo did not return last line only of nvm_ls_remote foo; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_version foo did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_version iojs-foo)"
|
||||
EXIT_CODE="$(nvm_remote_version iojs-foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_iojs_pattern_received:_iojs-foo_" ] \
|
||||
|| die "nvm_remote_version iojs-foo did not return last line only of nvm_ls_remote_iojs foo; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version iojs-foo did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_version iojs-foo
|
||||
[ "_$CAPTURED_STDOUT" = "_iojs_pattern_received:_iojs-foo_" ] \
|
||||
|| die "nvm_remote_version iojs-foo did not return last line only of nvm_ls_remote_iojs foo; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_version iojs-foo did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_version iojs)"
|
||||
EXIT_CODE="$(nvm_remote_version iojs >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_iojs_pattern_received:__" ] \
|
||||
|| die "nvm_remote_version iojs did not return last line only of nvm_ls_remote_iojs; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version iojs did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_version iojs
|
||||
[ "_$CAPTURED_STDOUT" = "_iojs_pattern_received:__" ] \
|
||||
|| die "nvm_remote_version iojs did not return last line only of nvm_ls_remote_iojs; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_version iojs did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_version stable)"
|
||||
EXIT_CODE="$(nvm_remote_version stable >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$(nvm_ls_remote stable)" ] \
|
||||
|| die "nvm_remote_version stable did not return contents of nvm_ls_remote stable; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version stable did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_version stable
|
||||
[ "_$CAPTURED_STDOUT" = "_$(nvm_ls_remote stable)" ] \
|
||||
|| die "nvm_remote_version stable did not return contents of nvm_ls_remote stable; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_version stable did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_version unstable)"
|
||||
EXIT_CODE="$(nvm_remote_version unstable >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$(nvm_ls_remote unstable)" ] \
|
||||
|| die "nvm_remote_version unstable did not return contents of nvm_ls_remote unstable; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version unstable did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_version unstable
|
||||
[ "_$CAPTURED_STDOUT" = "_$(nvm_ls_remote unstable)" ] \
|
||||
|| die "nvm_remote_version unstable did not return contents of nvm_ls_remote unstable; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_version unstable did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_version node)"
|
||||
EXIT_CODE="$(nvm_remote_version node >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$(nvm_ls_remote node)" ] \
|
||||
|| die "nvm_remote_version node did not return contents of nvm_ls_remote node; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version node did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_version node
|
||||
[ "_$CAPTURED_STDOUT" = "_$(nvm_ls_remote node)" ] \
|
||||
|| die "nvm_remote_version node did not return contents of nvm_ls_remote node; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_version node did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
# Test LTS name rejection (Issue #3474)
|
||||
# When nvm_remote_versions returns a line with LTS name in description,
|
||||
@@ -83,17 +77,15 @@ EXIT_CODE="$(nvm_remote_version node >/dev/null 2>&1 ; echo $?)"
|
||||
nvm_remote_versions() {
|
||||
echo "v4.9.1 Argon *"
|
||||
}
|
||||
OUTPUT="$(nvm_remote_version Argon)"
|
||||
EXIT_CODE="$(nvm_remote_version Argon >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nvm_remote_version Argon should return N/A (LTS name not in version), got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nvm_remote_version Argon should exit with code 3, got $EXIT_CODE"
|
||||
try nvm_remote_version Argon
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nvm_remote_version Argon should return N/A (LTS name not in version), got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nvm_remote_version Argon should exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
nvm_remote_versions() {
|
||||
echo "v4.9.1"
|
||||
}
|
||||
OUTPUT="$(nvm_remote_version 4)"
|
||||
EXIT_CODE="$(nvm_remote_version 4 >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_v4.9.1" ] || die "nvm_remote_version 4 should return v4.9.1, got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version 4 should exit with code 0, got $EXIT_CODE"
|
||||
try nvm_remote_version 4
|
||||
[ "_$CAPTURED_STDOUT" = "_v4.9.1" ] || die "nvm_remote_version 4 should return v4.9.1, got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_version 4 should exit with code 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -9,33 +9,31 @@ cleanup() {
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
OUTPUT="$(nvm_remote_versions stable 2>&1)"
|
||||
EXPECTED_OUTPUT="Implicit aliases are not supported in nvm_remote_versions."
|
||||
EXIT_CODE="$(nvm_remote_versions stable >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "implicit alias 'stable' did not error out with correct message, got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_1" ] || die "implicit alias 'stable' did not exit with code 1, got $EXIT_CODE"
|
||||
\. ../../common.sh
|
||||
|
||||
OUTPUT="$(nvm_remote_versions unstable 2>&1)"
|
||||
try_err nvm_remote_versions stable
|
||||
EXPECTED_OUTPUT="Implicit aliases are not supported in nvm_remote_versions."
|
||||
EXIT_CODE="$(nvm_remote_versions unstable >/dev/null 2>&1; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "implicit alias 'unstable' did not error out with correct message, got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_1" ] || die "implicit alias 'unstable' did not exit with code 1, got $EXIT_CODE"
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "implicit alias 'stable' did not error out with correct message, got $CAPTURED_STDERR"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] || die "implicit alias 'stable' did not exit with code 1, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
try_err nvm_remote_versions unstable
|
||||
EXPECTED_OUTPUT="Implicit aliases are not supported in nvm_remote_versions."
|
||||
[ "_$CAPTURED_STDERR" = "_$EXPECTED_OUTPUT" ] || die "implicit alias 'unstable' did not error out with correct message, got $CAPTURED_STDERR"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] || die "implicit alias 'unstable' did not exit with code 1, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
nvm_ls_remote() {
|
||||
echo "N/A"
|
||||
}
|
||||
OUTPUT="$(nvm_remote_versions foo)"
|
||||
EXIT_CODE="$(nvm_remote_versions foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
|
||||
try nvm_remote_versions foo
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
nvm_ls_remote_iojs() {
|
||||
echo "N/A"
|
||||
}
|
||||
OUTPUT="$(nvm_remote_versions iojs-foo)"
|
||||
EXIT_CODE="$(nvm_remote_versions iojs-foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
|
||||
try nvm_remote_versions iojs-foo
|
||||
[ "_$CAPTURED_STDOUT" = "_N/A" ] || die "nonexistent version did not report N/A"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
|
||||
nvm_ls_remote() {
|
||||
@@ -49,30 +47,26 @@ nvm_ls_remote_iojs() {
|
||||
echo "iojs pattern received: _$1_"
|
||||
}
|
||||
|
||||
OUTPUT="$(nvm_remote_versions foo)"
|
||||
EXIT_CODE="$(nvm_remote_versions foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$(nvm_ls_remote foo)
|
||||
try nvm_remote_versions foo
|
||||
[ "_$CAPTURED_STDOUT" = "_$(nvm_ls_remote foo)
|
||||
$(nvm_ls_remote_iojs foo)" ] \
|
||||
|| die "nvm_remote_versions foo did not return contents of nvm_ls_remote foo combined with nvm_ls_remote_iojs foo; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_versions foo did not exit with 0, got $EXIT_CODE"
|
||||
|| die "nvm_remote_versions foo did not return contents of nvm_ls_remote foo combined with nvm_ls_remote_iojs foo; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_versions foo did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_versions node)"
|
||||
EXIT_CODE="$(nvm_remote_versions node >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$(nvm_ls_remote)" ] \
|
||||
|| die "nvm_remote_versions node did not return contents of nvm_ls_remote; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_versions node did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_versions node
|
||||
[ "_$CAPTURED_STDOUT" = "_$(nvm_ls_remote)" ] \
|
||||
|| die "nvm_remote_versions node did not return contents of nvm_ls_remote; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_versions node did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_versions iojs-foo)"
|
||||
EXIT_CODE="$(nvm_remote_versions iojs-foo >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$(nvm_ls_remote iojs-foo)
|
||||
try nvm_remote_versions iojs-foo
|
||||
[ "_$CAPTURED_STDOUT" = "_$(nvm_ls_remote iojs-foo)
|
||||
$(nvm_ls_remote_iojs iojs-foo)" ] \
|
||||
|| die "nvm_remote_versions iojs-foo did not return contents of nvm_ls_remote iojs-foo combined with nvm_ls_remote_iojs iojs-foo; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_versions iojs-foo did not exit with 0, got $EXIT_CODE"
|
||||
|| die "nvm_remote_versions iojs-foo did not return contents of nvm_ls_remote iojs-foo combined with nvm_ls_remote_iojs iojs-foo; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_versions iojs-foo did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
OUTPUT="$(nvm_remote_versions iojs)"
|
||||
EXIT_CODE="$(nvm_remote_versions iojs >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$(nvm_ls_remote_iojs)" ] \
|
||||
|| die "nvm_remote_versions iojs did not return contents of nvm_ls_remote_iojs; got $OUTPUT"
|
||||
[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_versions iojs did not exit with 0, got $EXIT_CODE"
|
||||
try nvm_remote_versions iojs
|
||||
[ "_$CAPTURED_STDOUT" = "_$(nvm_ls_remote_iojs)" ] \
|
||||
|| die "nvm_remote_versions iojs did not return contents of nvm_ls_remote_iojs; got $CAPTURED_STDOUT"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "nvm_remote_versions iojs did not exit with 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
cleanup
|
||||
|
||||
68
test/fast/Unit tests/nvm_remote_versions propagates iojs failure
Executable file
68
test/fast/Unit tests/nvm_remote_versions propagates iojs failure
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
unset -f nvm_ls_remote nvm_ls_remote_iojs
|
||||
}
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
# When nvm_ls_remote succeeds but nvm_ls_remote_iojs fails,
|
||||
# nvm_remote_versions should propagate the iojs failure exit code.
|
||||
nvm_ls_remote() {
|
||||
echo "v0.10.0"
|
||||
return 0
|
||||
}
|
||||
nvm_ls_remote_iojs() {
|
||||
echo "N/A"
|
||||
return 5
|
||||
}
|
||||
|
||||
try nvm_remote_versions
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_5" ] || die "expected iojs failure exit code 5 to propagate, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
# When nvm_ls_remote fails and nvm_ls_remote_iojs succeeds,
|
||||
# nvm_remote_versions should propagate the node failure exit code.
|
||||
nvm_ls_remote() {
|
||||
echo "v0.10.0"
|
||||
return 7
|
||||
}
|
||||
nvm_ls_remote_iojs() {
|
||||
echo "iojs-v1.0.0"
|
||||
return 0
|
||||
}
|
||||
|
||||
try nvm_remote_versions
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_7" ] || die "expected node failure exit code 7 to propagate, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
# When both fail, nvm_remote_versions should propagate the node failure exit code
|
||||
# (since it is checked first).
|
||||
nvm_ls_remote() {
|
||||
echo "v0.10.0"
|
||||
return 3
|
||||
}
|
||||
nvm_ls_remote_iojs() {
|
||||
echo "iojs-v1.0.0"
|
||||
return 4
|
||||
}
|
||||
|
||||
try nvm_remote_versions
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die "expected node failure exit code 3 to take priority, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
# When both succeed, exit code should be 0.
|
||||
nvm_ls_remote() {
|
||||
echo "v0.10.0"
|
||||
return 0
|
||||
}
|
||||
nvm_ls_remote_iojs() {
|
||||
echo "iojs-v1.0.0"
|
||||
return 0
|
||||
}
|
||||
|
||||
try nvm_remote_versions
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] || die "expected exit code 0 when both succeed, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
cleanup
|
||||
@@ -5,15 +5,17 @@ die () { echo "$@" ; exit 1; }
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
EXPECTED_MSG="Only implicit aliases 'stable', 'unstable', 'iojs', and 'node' are supported."
|
||||
[ "_$(nvm_validate_implicit_alias 2>&1)" = "_$EXPECTED_MSG" ] \
|
||||
|| die "nvm_validate_implicit_alias did not require stable|unstable|iojs|node"
|
||||
[ "_$(nvm_validate_implicit_alias foo 2>&1)" = "_$EXPECTED_MSG" ] \
|
||||
|| die "nvm_validate_implicit_alias did not require stable|unstable|iojs|node"
|
||||
|
||||
EXIT_CODE="$(nvm_validate_implicit_alias >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$EXIT_CODE" = "_1" ] \
|
||||
|| die "nvm_validate_implicit_alias without stable|unstable|iojs|node had wrong exit code: expected 1, got $EXIT_CODE"
|
||||
try_err nvm_validate_implicit_alias
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_1" ] \
|
||||
|| die "nvm_validate_implicit_alias without stable|unstable|iojs|node had wrong exit code: expected 1, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
nvm_validate_implicit_alias stable || die "nvm_validate_implicit_alias stable did not exit 0"
|
||||
nvm_validate_implicit_alias unstable || die "nvm_validate_implicit_alias unstable did not exit 0"
|
||||
|
||||
@@ -8,22 +8,22 @@ cleanup () {
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
nvm_ls_current() {
|
||||
echo "CURRENT!"
|
||||
return 7
|
||||
}
|
||||
|
||||
OUTPUT="$(nvm_version current)"
|
||||
try nvm_version current
|
||||
EXPECTED_OUTPUT="CURRENT!"
|
||||
EXIT_CODE="$(nvm_version current 2>&1 >/dev/null ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version current" did not return nvm_ls_current output'
|
||||
[ "_$EXIT_CODE" = "_7" ] || die '"nvm_version current" did not return nvm_ls_current exit code'
|
||||
[ "_$CAPTURED_STDOUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version current" did not return nvm_ls_current output'
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_7" ] || die '"nvm_version current" did not return nvm_ls_current exit code'
|
||||
|
||||
OUTPUT="$(nvm_version)"
|
||||
try nvm_version
|
||||
EXPECTED_OUTPUT="CURRENT!"
|
||||
EXIT_CODE="$(nvm_version 2>&1 >/dev/null ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return nvm_ls_current output'
|
||||
[ "_$EXIT_CODE" = "_7" ] || die '"nvm_version" did not return nvm_ls_current exit code'
|
||||
[ "_$CAPTURED_STDOUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return nvm_ls_current output'
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_7" ] || die '"nvm_version" did not return nvm_ls_current exit code'
|
||||
|
||||
nvm_ls() {
|
||||
echo "line 1"
|
||||
@@ -38,15 +38,13 @@ nvm_ls() { echo "system v20.0.0"; }
|
||||
[ "_$(nvm_version system)" = "_system" ] || die '"nvm_version system" did not return "system" when "nvm_ls" returns extra columns'
|
||||
|
||||
nvm_ls() { echo "N/A"; }
|
||||
OUTPUT="$(nvm_version foo)"
|
||||
try nvm_version foo
|
||||
EXPECTED_OUTPUT="N/A"
|
||||
EXIT_CODE="$(nvm_version foo 2>&1 >/dev/null ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return N/A when nvm_ls returns N/A'
|
||||
[ "_$EXIT_CODE" = "_3" ] || die '"nvm_version" returning N/A did not exit code with code 3'
|
||||
[ "_$CAPTURED_STDOUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return N/A when nvm_ls returns N/A'
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die '"nvm_version" returning N/A did not exit code with code 3'
|
||||
|
||||
nvm_ls() { echo; }
|
||||
OUTPUT="$(nvm_version foo)"
|
||||
try nvm_version foo
|
||||
EXPECTED_OUTPUT="N/A"
|
||||
EXIT_CODE="$(nvm_version foo 2>&1 >/dev/null ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return N/A when nvm_ls returns nothing'
|
||||
[ "_$EXIT_CODE" = "_3" ] || die '"nvm_version" returning N/A did not exit code with code 3'
|
||||
[ "_$CAPTURED_STDOUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return N/A when nvm_ls returns nothing'
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_3" ] || die '"nvm_version" returning N/A did not exit code with code 3'
|
||||
|
||||
@@ -17,6 +17,9 @@ NVM_ENV=testing \. ../../install.sh
|
||||
|
||||
set -ex
|
||||
|
||||
git config --global gc.autoDetach false
|
||||
git config --global maintenance.auto false
|
||||
|
||||
# nvm_do_install is available
|
||||
type install_nvm_from_git > /dev/null 2>&1 || die 'install_nvm_from_git is not available'
|
||||
|
||||
@@ -61,7 +64,7 @@ test_install_data() {
|
||||
fi
|
||||
|
||||
local head_ref="$(git for-each-ref --points-at HEAD --format='%(refname:short)' 'refs/tags/')"
|
||||
if [ -n "${avoid_ref}" ] && [ "${head_ref}" != "${avoid_ref}"]; then
|
||||
if [ -n "${avoid_ref}" ] && [ "${head_ref}" != "${avoid_ref}" ]; then
|
||||
echo "${current_ref}" | grep -q "$avoid_ref" && die "install_nvm_from_git ${message} did clone with unwanted ref ${avoid_ref}"
|
||||
fi
|
||||
|
||||
@@ -94,14 +97,14 @@ test_install() {
|
||||
test_step "Clones repo $message"
|
||||
install_nvm_from_git
|
||||
test_install_data "$(get_head_ref)" "$(get_head_changeset)" "$message" "$ref" "$changeset" "$avoid_ref"
|
||||
rm -rf "$NVM_DIR"
|
||||
rm -rf "$NVM_DIR" || { sleep 1; rm -rf "$NVM_DIR"; }
|
||||
|
||||
# Ensure it initializes the repository for an empty existing repository
|
||||
mkdir -p "$NVM_DIR" || die 'Unable to create directory'
|
||||
test_step "Initialize repo $message"
|
||||
install_nvm_from_git
|
||||
test_install_data "$(get_head_ref)" "$(get_head_changeset)" "$message" "$ref" "$changeset" "$avoid_ref"
|
||||
rm -rf "$NVM_DIR"
|
||||
rm -rf "$NVM_DIR" || { sleep 1; rm -rf "$NVM_DIR"; }
|
||||
|
||||
# Ensure it updates the repository for an existing git repository
|
||||
git clone "$(nvm_source "git")" -b "v0.36.0" --depth=2 "$NVM_DIR" || die 'Unable to clone repository'
|
||||
@@ -109,7 +112,7 @@ test_install() {
|
||||
test_step "Updates repo $message"
|
||||
install_nvm_from_git
|
||||
test_install_data "$(get_head_ref)" "$(get_head_changeset)" "$message" "$ref" "$changeset" "$avoid_ref"
|
||||
rm -rf "$NVM_DIR"
|
||||
rm -rf "$NVM_DIR" || { sleep 1; rm -rf "$NVM_DIR"; }
|
||||
}
|
||||
|
||||
# Handle latest version
|
||||
|
||||
70
test/install_script/nvm_do_install_printf_format
Executable file
70
test/install_script/nvm_do_install_printf_format
Executable file
@@ -0,0 +1,70 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
unset -f install_nvm_from_git install_nvm_as_script nvm_detect_profile nvm_has nvm_install_dir
|
||||
unset -f nvm_check_global_modules nvm_install_node
|
||||
unset -f setup cleanup die
|
||||
unset NVM_ENV METHOD PROFILE
|
||||
rm -rf "${TMPDIR_FOR_TEST-}" 2>/dev/null
|
||||
}
|
||||
|
||||
setup() {
|
||||
NVM_ENV=testing \. ../../install.sh
|
||||
|
||||
# Mock installation functions to do nothing
|
||||
install_nvm_from_git() { :; }
|
||||
install_nvm_as_script() { :; }
|
||||
nvm_check_global_modules() { :; }
|
||||
nvm_install_node() { :; }
|
||||
|
||||
# Mock nvm_has to return true for git
|
||||
nvm_has() {
|
||||
case "$1" in
|
||||
git) return 0 ;;
|
||||
xcode-select) return 1 ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
}
|
||||
|
||||
setup
|
||||
|
||||
#
|
||||
# Test: printf calls in nvm_do_install should not interpret % in paths
|
||||
# When NVM_DIR contains printf format specifiers like %s or %d,
|
||||
# the output should contain them literally, not interpret them.
|
||||
#
|
||||
|
||||
TMPDIR_FOR_TEST="$(mktemp -d)"
|
||||
PERCENT_DIR="${TMPDIR_FOR_TEST}/nvm_%s_test"
|
||||
mkdir -p "${PERCENT_DIR}"
|
||||
|
||||
# Copy nvm.sh to the temp dir so sourcing succeeds
|
||||
cp ../../nvm.sh "${PERCENT_DIR}/nvm.sh"
|
||||
|
||||
# Mock nvm_install_dir to return our percent-containing path
|
||||
nvm_install_dir() {
|
||||
nvm_echo "${PERCENT_DIR}"
|
||||
}
|
||||
|
||||
# Mock nvm_detect_profile to return empty so we hit the "Profile not found" branch
|
||||
# which calls: command printf '%b' "${SOURCE_STR}"
|
||||
nvm_detect_profile() {
|
||||
echo ""
|
||||
}
|
||||
|
||||
OUTPUT="$(PROFILE='' METHOD='' NVM_DIR="${PERCENT_DIR}" nvm_do_install 2>&1)"
|
||||
|
||||
# The SOURCE_STR should contain the %s from the path literally
|
||||
if ! echo "${OUTPUT}" | grep -q '%s'; then
|
||||
die "printf should not have consumed the %s in the path. Output: ${OUTPUT}"
|
||||
fi
|
||||
|
||||
# Also verify via the "Profile not found" branch that SOURCE_STR was printed correctly
|
||||
if ! echo "${OUTPUT}" | grep -q 'nvm_%s_test'; then
|
||||
die "Expected nvm_%s_test in output but got: ${OUTPUT}"
|
||||
fi
|
||||
|
||||
cleanup
|
||||
68
test/install_script/nvm_do_install_tried_profile
Executable file
68
test/install_script/nvm_do_install_tried_profile
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
unset -f install_nvm_from_git install_nvm_as_script nvm_detect_profile nvm_has
|
||||
unset -f nvm_check_global_modules nvm_install_node
|
||||
unset -f setup cleanup die
|
||||
unset NVM_ENV METHOD PROFILE
|
||||
}
|
||||
|
||||
setup() {
|
||||
NVM_ENV=testing \. ../../install.sh
|
||||
|
||||
# Mock installation functions to do nothing
|
||||
install_nvm_from_git() { :; }
|
||||
install_nvm_as_script() { :; }
|
||||
nvm_check_global_modules() { :; }
|
||||
nvm_install_node() { :; }
|
||||
|
||||
# Mock nvm_has to return true for git
|
||||
nvm_has() {
|
||||
case "$1" in
|
||||
git) return 0 ;;
|
||||
xcode-select) return 1 ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Mock nvm_detect_profile to return empty (profile not found)
|
||||
nvm_detect_profile() {
|
||||
echo ""
|
||||
}
|
||||
}
|
||||
|
||||
setup
|
||||
|
||||
#
|
||||
# Test: When PROFILE is set to a non-/dev/null value but nvm_detect_profile
|
||||
# returns empty, the "Profile not found" message should include the PROFILE
|
||||
# value in the TRIED_PROFILE string.
|
||||
#
|
||||
# Before the fix, TRIED_PROFILE was set to "${NVM_PROFILE} (as defined in $PROFILE)"
|
||||
# but NVM_PROFILE is known to be empty at that point, so the message would say
|
||||
# " (as defined in $PROFILE)" instead of "/some/path (as defined in $PROFILE)".
|
||||
#
|
||||
|
||||
OUTPUT="$(PROFILE='/my/custom/profile' METHOD='' NVM_DIR="$(mktemp -d)" nvm_do_install 2>&1)"
|
||||
|
||||
# The output should mention /my/custom/profile in the "Tried" line
|
||||
if ! echo "${OUTPUT}" | grep -q '/my/custom/profile (as defined in \$PROFILE)'; then
|
||||
# Check without the escaped dollar sign too
|
||||
if ! echo "${OUTPUT}" | grep -q '/my/custom/profile'; then
|
||||
die "Expected TRIED_PROFILE to contain '/my/custom/profile', got: ${OUTPUT}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Verify the "Profile not found" message appears
|
||||
if ! echo "${OUTPUT}" | grep -q 'Profile not found'; then
|
||||
die "Expected 'Profile not found' message, got: ${OUTPUT}"
|
||||
fi
|
||||
|
||||
# The message should NOT start with " (as defined" (which would indicate empty TRIED_PROFILE prefix)
|
||||
if echo "${OUTPUT}" | grep -q 'Tried (as defined'; then
|
||||
die "TRIED_PROFILE appears to have an empty prefix (NVM_PROFILE instead of PROFILE), got: ${OUTPUT}"
|
||||
fi
|
||||
|
||||
cleanup
|
||||
49
test/install_script/nvm_mkdir_error_handling
Executable file
49
test/install_script/nvm_mkdir_error_handling
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
|
||||
cleanup () {
|
||||
if [ -n "${SAVE_NVM_DIR-}" ]; then
|
||||
NVM_DIR="$SAVE_NVM_DIR"
|
||||
fi
|
||||
unset -f die cleanup
|
||||
unset SAVE_NVM_DIR
|
||||
}
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
SAVE_NVM_DIR="$NVM_DIR"
|
||||
|
||||
NVM_ENV=testing \. ../../install.sh
|
||||
|
||||
# install_nvm_from_git is available
|
||||
type install_nvm_from_git > /dev/null 2>&1 || die 'install_nvm_from_git is not available'
|
||||
|
||||
# install_nvm_as_script is available
|
||||
type install_nvm_as_script > /dev/null 2>&1 || die 'install_nvm_as_script is not available'
|
||||
|
||||
# nvm_do_install is available
|
||||
type nvm_do_install > /dev/null 2>&1 || die 'nvm_do_install is not available'
|
||||
|
||||
IMPOSSIBLE_DIR="/dev/null/impossible_path"
|
||||
|
||||
## install_nvm_from_git: mkdir failure should exit with code 2 and print error
|
||||
OUTPUT="$(NVM_DIR="${IMPOSSIBLE_DIR}" install_nvm_from_git 2>&1)"
|
||||
EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = '2' ] || die "install_nvm_from_git should exit 2 on mkdir failure, got ${EXIT_CODE}"
|
||||
echo "${OUTPUT}" | grep -q "Failed to create directory" || die "install_nvm_from_git should print mkdir error message, got: ${OUTPUT}"
|
||||
|
||||
## install_nvm_as_script: mkdir failure should return 1 and print error
|
||||
OUTPUT="$(NVM_DIR="${IMPOSSIBLE_DIR}" install_nvm_as_script 2>&1)"
|
||||
EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = '1' ] || die "install_nvm_as_script should return 1 on mkdir failure, got ${EXIT_CODE}"
|
||||
echo "${OUTPUT}" | grep -q "Failed to create directory" || die "install_nvm_as_script should print mkdir error message, got: ${OUTPUT}"
|
||||
|
||||
## nvm_do_install: mkdir failure for default dir should exit with code 2 and print error
|
||||
# Override nvm_default_install_dir to return the impossible path so the mkdir branch is taken
|
||||
nvm_default_install_dir() {
|
||||
printf %s "${IMPOSSIBLE_DIR}"
|
||||
}
|
||||
OUTPUT="$(NVM_DIR="${IMPOSSIBLE_DIR}" nvm_do_install 2>&1)"
|
||||
EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = '2' ] || die "nvm_do_install should exit 2 on mkdir failure, got ${EXIT_CODE}"
|
||||
echo "${OUTPUT}" | grep -q "Failed to create directory" || die "nvm_do_install should print mkdir error message, got: ${OUTPUT}"
|
||||
|
||||
cleanup
|
||||
@@ -17,6 +17,8 @@ nvm install $NVM_TEST_VERSION || die "install $NVM_TEST_VERSION failed"
|
||||
# Check
|
||||
[ -d ../../$NVM_TEST_VERSION ]
|
||||
nvm run $NVM_TEST_VERSION --version | grep $NVM_TEST_VERSION || die "'nvm run $NVM_TEST_VERSION --version | grep $NVM_TEST_VERSION' failed"
|
||||
[ -O "${NVM_DIR}/${NVM_TEST_VERSION}/bin/node" ] || die "Extracted file is not owned by effective user"
|
||||
[ -G "${NVM_DIR}/${NVM_TEST_VERSION}/bin/node" ] || die "Extracted file is not owned by effective group"
|
||||
|
||||
# ensure default is set
|
||||
NVM_CURRENT_DEFAULT="$(nvm_alias default)"
|
||||
|
||||
@@ -1,6 +1,27 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
# State touched by the regression section below; cleanup restores it even on failure.
|
||||
DEFAULT_PACKAGES_FILE="${NVM_DIR}/default-packages"
|
||||
DEFAULT_PACKAGES_BACKUP=""
|
||||
DEFAULT_PACKAGES_WROTE=""
|
||||
TEST_ALIAS=""
|
||||
|
||||
cleanup () {
|
||||
if [ -n "${DEFAULT_PACKAGES_WROTE}" ]; then
|
||||
rm -f "${DEFAULT_PACKAGES_FILE}"
|
||||
DEFAULT_PACKAGES_WROTE=""
|
||||
fi
|
||||
if [ -n "${DEFAULT_PACKAGES_BACKUP}" ] && [ -f "${DEFAULT_PACKAGES_BACKUP}" ]; then
|
||||
mv "${DEFAULT_PACKAGES_BACKUP}" "${DEFAULT_PACKAGES_FILE}"
|
||||
DEFAULT_PACKAGES_BACKUP=""
|
||||
fi
|
||||
if [ -n "${TEST_ALIAS}" ]; then
|
||||
nvm unalias "${TEST_ALIAS}" > /dev/null 2>&1 || true
|
||||
TEST_ALIAS=""
|
||||
fi
|
||||
}
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
\. ../../nvm.sh
|
||||
|
||||
@@ -44,3 +65,54 @@ nvm use --lts=argon
|
||||
node --version | grep v4.9.1 > /dev/null || die "nvm ls --lts=argon didn't use v4.9.1"
|
||||
|
||||
npm list --global | grep object-is > /dev/null || die "object-is isn't installed"
|
||||
|
||||
|
||||
# Regression: `--reinstall-packages-from` must still migrate packages when the
|
||||
# target version is *already installed*. See https://github.com/nvm-sh/nvm/issues/3858
|
||||
|
||||
# install a fresh global package on the source (v9.7.0) only
|
||||
nvm use 9.7.0
|
||||
npm install -g is-nan@1.0.1 || die "npm install -g is-nan failed"
|
||||
npm list --global --depth=0 | grep is-nan > /dev/null || die "is-nan isn't installed on v9.7.0"
|
||||
|
||||
# precondition: the already-installed target (v9.10.0) must not have it yet
|
||||
nvm use 9.10.0
|
||||
npm list --global --depth=0 | grep is-nan > /dev/null && die "is-nan should not be installed on v9.10.0 before reinstall"
|
||||
|
||||
# target is already installed, so this should report so AND still migrate packages
|
||||
OUTPUT="$(nvm install --reinstall-packages-from=9.7.0 9.10.0 2>&1)" || die "nvm install --reinstall-packages-from=9.7.0 9.10.0 failed: ${OUTPUT}"
|
||||
nvm_echo "${OUTPUT}" | grep "is already installed" > /dev/null || die "expected 'already installed' message, got: ${OUTPUT}"
|
||||
|
||||
nvm use 9.10.0
|
||||
npm list --global --depth=0 | grep is-nan > /dev/null || die "is-nan was not migrated to already-installed v9.10.0"
|
||||
|
||||
|
||||
# ...the same is true for default packages: they must install on the already-installed path too.
|
||||
|
||||
# back up any real default-packages file, then point it at a package the target lacks
|
||||
if [ -f "${DEFAULT_PACKAGES_FILE}" ]; then
|
||||
DEFAULT_PACKAGES_BACKUP="${DEFAULT_PACKAGES_FILE}.3858.bak"
|
||||
mv "${DEFAULT_PACKAGES_FILE}" "${DEFAULT_PACKAGES_BACKUP}" || die "could not back up ${DEFAULT_PACKAGES_FILE}"
|
||||
fi
|
||||
DEFAULT_PACKAGES_WROTE=1
|
||||
nvm_echo 'object-inspect@1.0.2' > "${DEFAULT_PACKAGES_FILE}"
|
||||
|
||||
# precondition: the already-installed target must not have the default package yet
|
||||
nvm use 9.10.0
|
||||
npm list --global --depth=0 | grep object-inspect > /dev/null && die "object-inspect should not be installed on v9.10.0 before default-packages test"
|
||||
|
||||
nvm install 9.10.0 > /dev/null 2>&1 || die "nvm install 9.10.0 (already installed, default-packages) failed"
|
||||
nvm use 9.10.0
|
||||
npm list --global --depth=0 | grep object-inspect > /dev/null || die "default packages were not installed on already-installed v9.10.0"
|
||||
|
||||
# restore the default-packages file before the next assertion
|
||||
cleanup
|
||||
|
||||
|
||||
# ...and `--alias` must be set on the already-installed path too.
|
||||
TEST_ALIAS='nvm-3858-already-installed'
|
||||
nvm unalias "${TEST_ALIAS}" > /dev/null 2>&1 || true # ensure a clean precondition
|
||||
nvm install --alias="${TEST_ALIAS}" 9.10.0 > /dev/null 2>&1 || die "nvm install --alias=${TEST_ALIAS} 9.10.0 (already installed) failed"
|
||||
TERM=dumb nvm alias "${TEST_ALIAS}" | grep 'v9.10.0' > /dev/null || die "--alias was not set on already-installed v9.10.0"
|
||||
|
||||
cleanup
|
||||
|
||||
5
test/mocks/uname_linux_aarch64
Executable file
5
test/mocks/uname_linux_aarch64
Executable file
@@ -0,0 +1,5 @@
|
||||
if [ "_$1" = "_-m" ]; then
|
||||
echo "aarch64"
|
||||
else
|
||||
echo "Linux hostname 5.15.0-1 #1 SMP aarch64 aarch64 aarch64 GNU/Linux"
|
||||
fi
|
||||
5
test/mocks/uname_linux_x86_64
Executable file
5
test/mocks/uname_linux_x86_64
Executable file
@@ -0,0 +1,5 @@
|
||||
if [ "_$1" = "_-m" ]; then
|
||||
echo "x86_64"
|
||||
else
|
||||
echo "Linux hostname 5.15.0-1 #1 SMP x86_64 x86_64 x86_64 GNU/Linux"
|
||||
fi
|
||||
@@ -4,6 +4,8 @@ die () { echo "$@" ; exit 1; }
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
nvm deactivate >/dev/null 2>&1 || die 'deactivate failed'
|
||||
|
||||
nvm_die_on_prefix() {
|
||||
@@ -11,12 +13,12 @@ nvm_die_on_prefix() {
|
||||
return 3
|
||||
}
|
||||
|
||||
OUTPUT="$(nvm use --silent node)"
|
||||
try nvm use --silent node
|
||||
EXPECTED_OUTPUT=""
|
||||
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \
|
||||
|| die "'nvm use --silent node' did not call through to 'nvm_die_on_prefix' and give output '$EXPECTED_OUTPUT'; got '$OUTPUT'"
|
||||
[ "_$CAPTURED_STDOUT" = "_$EXPECTED_OUTPUT" ] \
|
||||
|| die "'nvm use --silent node' did not call through to 'nvm_die_on_prefix' and give output '$EXPECTED_OUTPUT'; got '$CAPTURED_STDOUT'"
|
||||
|
||||
EXIT_CODE="$(nvm use --silent node >/dev/null 2>&1; echo $?)"
|
||||
try_err nvm use --silent node
|
||||
EXPECTED_CODE="11"
|
||||
[ "_$EXIT_CODE" = "_$EXPECTED_CODE" ] \
|
||||
|| die "'nvm use --silent node' when 'nvm_die_on_prefix' fails did not return '$EXPECTED_CODE'; got '$EXIT_CODE'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_$EXPECTED_CODE" ] \
|
||||
|| die "'nvm use --silent node' when 'nvm_die_on_prefix' fails did not return '$EXPECTED_CODE'; got '$CAPTURED_EXIT_CODE'"
|
||||
|
||||
@@ -90,12 +90,13 @@ wget() {
|
||||
fi
|
||||
}
|
||||
|
||||
OUTPUT="$(nvm_get_latest)"
|
||||
EXIT_CODE="$(nvm_get_latest >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_$EXPECTED_VERSION" ] \
|
||||
|| die "success path did not return version '$EXPECTED_VERSION', got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_0" ] \
|
||||
|| die "success path did not exit with code 0, got $EXIT_CODE"
|
||||
\. ../../common.sh
|
||||
|
||||
try nvm_get_latest
|
||||
[ "_$CAPTURED_STDOUT" = "_$EXPECTED_VERSION" ] \
|
||||
|| die "success path did not return version '$EXPECTED_VERSION', got '$CAPTURED_STDOUT'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_0" ] \
|
||||
|| die "success path did not exit with code 0, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -8,6 +8,8 @@ cleanup() {
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
curl() {
|
||||
return 1
|
||||
}
|
||||
@@ -15,11 +17,10 @@ wget() {
|
||||
return 1
|
||||
}
|
||||
|
||||
OUTPUT="$(nvm_get_latest 2>&1)"
|
||||
EXIT_CODE="$(nvm_get_latest >/dev/null 2>&1 ; echo $?)"
|
||||
[ "_$OUTPUT" = "_https://latest.nvm.sh did not redirect to the latest release on GitHub" ] \
|
||||
|| die "failed redirect did not report correct error message, got '$OUTPUT'"
|
||||
[ "_$EXIT_CODE" = "_2" ] \
|
||||
|| die "failed redirect did not exit with code 2, got $EXIT_CODE"
|
||||
try_err nvm_get_latest
|
||||
[ "_$CAPTURED_STDERR" = "_https://latest.nvm.sh did not redirect to the latest release on GitHub" ] \
|
||||
|| die "failed redirect did not report correct error message, got '$CAPTURED_STDERR'"
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_2" ] \
|
||||
|| die "failed redirect did not exit with code 2, got $CAPTURED_EXIT_CODE"
|
||||
|
||||
cleanup
|
||||
|
||||
Reference in New Issue
Block a user