mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-04-04 03:54:51 +08:00
Compare commits
17 Commits
master
...
1bbc13d453
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1bbc13d453 | ||
|
|
d48dffa000 | ||
|
|
a8874db9d6 | ||
|
|
30c5e810bc | ||
|
|
fe6fc5b04b | ||
|
|
8ef76acdee | ||
|
|
b4ba55b30c | ||
|
|
301cfa12d6 | ||
|
|
c5a62d4228 | ||
|
|
797abf0b44 | ||
|
|
227bcdf5ac | ||
|
|
87049f38e4 | ||
|
|
9d0735dc7f | ||
|
|
03aea1ad61 | ||
|
|
cabc668e48 | ||
|
|
90dadd0960 | ||
|
|
94a67893b3 |
117
.github/INCIDENT_RESPONSE_PLAN.md
vendored
117
.github/INCIDENT_RESPONSE_PLAN.md
vendored
@@ -1,117 +0,0 @@
|
||||
# Incident Response Process for **nvm**
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
We take the security of **nvm** very seriously. If you believe you’ve found a security vulnerability, please inform us responsibly through coordinated disclosure.
|
||||
|
||||
### How to Report
|
||||
|
||||
> **Do not** report security vulnerabilities through public GitHub issues, discussions, or social media.
|
||||
|
||||
Instead, please use one of these secure channels:
|
||||
|
||||
1. **GitHub Security Advisories**
|
||||
Use the **Report a vulnerability** button in the Security tab of the [nvm-sh/nvm repository](https://github.com/nvm-sh/nvm).
|
||||
|
||||
2. **Email**
|
||||
Follow the posted [Security Policy](https://github.com/nvm-sh/nvm/security/policy).
|
||||
|
||||
### What to Include
|
||||
|
||||
**Required Information:**
|
||||
- Brief description of the vulnerability type
|
||||
- Affected version(s) and components
|
||||
- Steps to reproduce the issue
|
||||
- Impact assessment (what an attacker could achieve)
|
||||
|
||||
**Helpful Additional Details:**
|
||||
- Full paths of affected scripts or files
|
||||
- Specific commit or branch where the issue exists
|
||||
- Required configuration to reproduce
|
||||
- Proof-of-concept code (if available)
|
||||
- Suggested mitigation or fix
|
||||
|
||||
## Our Response Process
|
||||
|
||||
**Timeline Commitments:**
|
||||
- **Initial acknowledgment**: Within 24 hours
|
||||
- **Detailed response**: Within 3 business days
|
||||
- **Status updates**: Every 7 days until resolved
|
||||
- **Resolution target**: 90 days for most issues
|
||||
|
||||
**What We’ll Do:**
|
||||
1. Acknowledge your report and assign a tracking ID
|
||||
2. Assess the vulnerability and determine severity
|
||||
3. Develop and test a fix
|
||||
4. Coordinate disclosure timeline with you
|
||||
5. Release a security update and publish an advisory and CVE
|
||||
6. Credit you in our security advisory (if desired)
|
||||
|
||||
## Disclosure Policy
|
||||
|
||||
- **Coordinated disclosure**: We’ll work with you on timing
|
||||
- **Typical timeline**: 90 days from report to public disclosure
|
||||
- **Early disclosure**: If actively exploited
|
||||
- **Delayed disclosure**: For complex issues
|
||||
|
||||
## Scope
|
||||
|
||||
**In Scope:**
|
||||
- **nvm** project (all supported versions)
|
||||
- Installation and update scripts (`install.sh`, `nvm.sh`)
|
||||
- Official documentation and CI/CD integrations
|
||||
- Dependencies with direct security implications
|
||||
|
||||
**Out of Scope:**
|
||||
- Third-party forks or mirrors
|
||||
- Platform-specific installs outside core scripts
|
||||
- Social engineering or physical attacks
|
||||
- Theoretical vulnerabilities without practical exploitation
|
||||
|
||||
## Security Measures
|
||||
|
||||
**Our Commitments:**
|
||||
- Regular vulnerability scanning via GitHub Actions
|
||||
- Automated security checks in CI/CD pipelines
|
||||
- Secure scripting practices and mandatory code review
|
||||
- Prompt patch releases for critical issues
|
||||
|
||||
**User Responsibilities:**
|
||||
- Keep **nvm** updated
|
||||
- Verify script downloads via PGP signatures
|
||||
- Follow secure configuration guidelines for shell environments
|
||||
|
||||
## Legal Safe Harbor
|
||||
|
||||
**We will NOT:**
|
||||
- Initiate legal action
|
||||
- Contact law enforcement
|
||||
- Suspend or terminate your access
|
||||
|
||||
**You must:**
|
||||
- Only test against your own installations
|
||||
- Not access, modify, or delete user data
|
||||
- Not degrade service availability
|
||||
- Not publicly disclose before coordinated disclosure
|
||||
- Act in good faith
|
||||
|
||||
## Recognition
|
||||
|
||||
- **Advisory Credits**: Credit in GitHub Security Advisories (unless anonymous)
|
||||
|
||||
## Security Updates
|
||||
|
||||
**Stay Informed:**
|
||||
- Subscribe to GitHub releases for **nvm**
|
||||
- Enable GitHub Security Advisory notifications
|
||||
|
||||
**Update Process:**
|
||||
- Patch releases (e.g., v0.40.3 → v0.40.4)
|
||||
- Out-of-band releases for critical issues
|
||||
- Advisories via GitHub Security Advisories
|
||||
|
||||
## Contact Information
|
||||
|
||||
- **Security reports**: Security tab of [nvm-sh/nvm](https://github.com/nvm-sh/nvm/security)
|
||||
- **General inquiries**: GitHub Discussions or Issues
|
||||
|
||||
24
.github/SECURITY.md
vendored
24
.github/SECURITY.md
vendored
@@ -1,13 +1,6 @@
|
||||
# Security
|
||||
|
||||
Please file a private vulnerability report via GitHub, email [@ljharb](https://github.com/ljharb), or see https://tidelift.com/security if you have a potential security vulnerability to report.
|
||||
|
||||
## Escalation
|
||||
|
||||
If you do not receive an acknowledgement of your report within 6 business days, or if you cannot find a private security contact for the project, you may escalate to the OpenJS Foundation CNA at `security@lists.openjsf.org`.
|
||||
|
||||
If the project acknowledges your report but does not provide any further response or engagement within 14 days, escalation is also appropriate.
|
||||
|
||||
Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.
|
||||
|
||||
## OpenSSF CII Best Practices
|
||||
|
||||
@@ -19,17 +12,16 @@ There are three “tiers”: passing, silver, and gold.
|
||||
We meet 100% of the “passing” criteria.
|
||||
|
||||
### Silver
|
||||
We meet 100% of the “silver” criteria.
|
||||
We meet 95% of the “silver” criteria. The gaps are as follows:
|
||||
- we do not have a DCO or a CLA process for contributions.
|
||||
- because we only have one maintainer, the project has no way to continue if that maintainer stops being active.
|
||||
- we do not currently document “what the user can and cannot expect in terms of security” for our project. This is planned to be completed in 2023.
|
||||
|
||||
### Gold
|
||||
We meet 78% of the “gold” criteria. The gaps are as follows:
|
||||
- because we only have one maintainer, the project has no way to continue if that maintainer stops being active.
|
||||
We meet 65% of the “gold” criteria. The gaps are as follows:
|
||||
- we do not yet have the “silver” badge; see all the gaps above.
|
||||
- We do not include a copyright or license statement in each source file. Efforts are underway to change this archaic practice into a suggestion instead of a hard requirement.
|
||||
|
||||
## Threat Model
|
||||
|
||||
See [THREAT_MODEL.md](.github/THREAT_MODEL.md).
|
||||
|
||||
## Incident Response Plan
|
||||
|
||||
Please see our [Incident Response Plan](.github/INCIDENT_RESPONSE_PLAN.md).
|
||||
See [THREAT_MODEL.md](./THREAT_MODEL.md).
|
||||
|
||||
52
.github/workflows/codeql-analysis.yml
vendored
52
.github/workflows/codeql-analysis.yml
vendored
@@ -1,52 +0,0 @@
|
||||
name: "Code scanning - action"
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
schedule:
|
||||
- cron: '0 17 * * 4'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
CodeQL-Build:
|
||||
|
||||
# CodeQL runs on ubuntu-latest and windows-latest
|
||||
permissions:
|
||||
actions: read # for github/codeql-action/init to get workflow details
|
||||
contents: read # for actions/checkout to fetch code
|
||||
security-events: write # for github/codeql-action/autobuild to send a status report
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v4
|
||||
# Override language selection by uncommenting this and choosing your languages
|
||||
# with:
|
||||
# languages: go, javascript, csharp, python, cpp, java
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v4
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v4
|
||||
2
.github/workflows/latest-npm.yml
vendored
2
.github/workflows/latest-npm.yml
vendored
@@ -63,7 +63,7 @@ jobs:
|
||||
iojs.org:443
|
||||
nodejs.org:443
|
||||
registry.npmjs.org:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'install node'
|
||||
with:
|
||||
|
||||
17
.github/workflows/lint.yml
vendored
17
.github/workflows/lint.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
raw.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
registry.npmjs.org:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'nvm install ${{ matrix.node-version }} && npm install'
|
||||
with:
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
pkg-containers.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
registry.npmjs.org:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'nvm install ${{ matrix.node-version }} && npm install'
|
||||
with:
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
raw.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
registry.npmjs.org:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'nvm install ${{ matrix.node-version }} && npm install'
|
||||
with:
|
||||
@@ -67,15 +67,6 @@ jobs:
|
||||
allowed-endpoints:
|
||||
github.com:443
|
||||
raw.githubusercontent.com:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- name: check tests filenames
|
||||
run: ./rename_test.sh --check
|
||||
|
||||
all:
|
||||
permissions:
|
||||
contents: none
|
||||
name: 'all linting'
|
||||
needs: [eclint, dockerfile_lint, doctoc, test_naming]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: true
|
||||
|
||||
164
.github/workflows/nodejs-org.yml
vendored
164
.github/workflows/nodejs-org.yml
vendored
@@ -1,164 +0,0 @@
|
||||
name: 'Update nodejs.org'
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 'nvm version tag (e.g., v0.40.4). Defaults to latest release.'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
update-nodejs-org:
|
||||
if: github.repository == 'nvm-sh/nvm' && github.actor == 'ljharb'
|
||||
permissions:
|
||||
contents: none
|
||||
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 "repos/${GITHUB_REPOSITORY}/releases/latest" --jq '.tag_name')"
|
||||
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')"
|
||||
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 2>&1; 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 }}
|
||||
7
.github/workflows/nvm-install-test.yml
vendored
7
.github/workflows/nvm-install-test.yml
vendored
@@ -10,16 +10,13 @@ on:
|
||||
required: false
|
||||
default: 'HEAD'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
matrix:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
matrix: ${{ steps.matrix.outputs.matrix }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- id: matrix
|
||||
@@ -58,7 +55,7 @@ jobs:
|
||||
- 2 shlvls
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- name: resolve HEAD to sha
|
||||
run: |
|
||||
if [ '${{ matrix.ref }}' = 'HEAD' ]; then
|
||||
|
||||
19
.github/workflows/rebase.yml
vendored
19
.github/workflows/rebase.yml
vendored
@@ -2,16 +2,25 @@ name: Automatic Rebase
|
||||
|
||||
on: [pull_request_target]
|
||||
|
||||
permissions: read-all
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
_:
|
||||
permissions:
|
||||
contents: write
|
||||
name: "Automatic Rebase"
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: ljharb/rebase@master
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@v2
|
||||
with:
|
||||
allowed-endpoints:
|
||||
api.github.com:443
|
||||
github.com:443
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ljharb/rebase@master
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
5
.github/workflows/release.yml
vendored
5
.github/workflows/release.yml
vendored
@@ -17,12 +17,11 @@ jobs:
|
||||
api.github.com:443
|
||||
objects.githubusercontent.com:443
|
||||
raw.githubusercontent.com:443
|
||||
release-assets.githubusercontent.com:443
|
||||
registry.npmjs.org:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-tags: true
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "14"
|
||||
- run: npm install
|
||||
|
||||
14
.github/workflows/require-allow-edits.yml
vendored
14
.github/workflows/require-allow-edits.yml
vendored
@@ -2,13 +2,23 @@ name: Require “Allow Edits”
|
||||
|
||||
on: [pull_request_target]
|
||||
|
||||
permissions: read-all
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
_:
|
||||
permissions:
|
||||
pull-requests: read
|
||||
name: "Require “Allow Edits”"
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: ljharb/require-allow-edits@main
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@v2
|
||||
with:
|
||||
allowed-endpoints:
|
||||
api.github.com:443
|
||||
- uses: ljharb/require-allow-edits@main
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
2
.github/workflows/shellcheck.yml
vendored
2
.github/workflows/shellcheck.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
||||
github.com:443
|
||||
pkg-containers.githubusercontent.com:443
|
||||
formulae.brew.sh:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Homebrew
|
||||
uses: Homebrew/actions/setup-homebrew@master
|
||||
- name: Install latest shellcheck
|
||||
|
||||
101
.github/workflows/tests-fast.yml
vendored
101
.github/workflows/tests-fast.yml
vendored
@@ -1,101 +0,0 @@
|
||||
name: 'Tests: fast'
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
fast:
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
name: 'fast (${{ matrix.shell }}, ${{ matrix.awk }})'
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: 'script -q -e -c "${{ matrix.shell }} {0}"'
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
shell:
|
||||
- sh
|
||||
- bash
|
||||
- dash
|
||||
- zsh
|
||||
# - ksh
|
||||
awk:
|
||||
- gawk
|
||||
- mawk
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@v2
|
||||
with:
|
||||
allowed-endpoints:
|
||||
github.com:443
|
||||
registry.npmjs.org:443
|
||||
raw.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
iojs.org:443
|
||||
unofficial-builds.nodejs.org:443
|
||||
azure.archive.ubuntu.com:80
|
||||
packages.microsoft.com:443
|
||||
registry-1.docker.io:443
|
||||
auth.docker.io:443
|
||||
production.cloudflare.docker.com:443
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install zsh, additional shells, and awk variant
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y zsh ${{ matrix.awk }}
|
||||
if [ "${{ matrix.shell }}" != "sh" ] && [ "${{ matrix.shell }}" != "bash" ] && [ "${{ matrix.shell }}" != "zsh" ]; then
|
||||
sudo apt-get install -y ${{ matrix.shell }}
|
||||
fi
|
||||
# Set the selected awk as the default
|
||||
sudo update-alternatives --set awk /usr/bin/${{ matrix.awk }}
|
||||
shell: bash
|
||||
- run: sudo ${{ matrix.shell }} --version 2> /dev/null || dpkg -s ${{ matrix.shell }} 2> /dev/null || which ${{ matrix.shell }}
|
||||
- run: awk --version 2>&1 | head -1 || awk -W version 2>&1 | head -1
|
||||
- run: curl --version
|
||||
- run: wget --version
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'npm install && version checks'
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
skip-ls-check: true
|
||||
- run: npm ls urchin
|
||||
- run: npx which urchin
|
||||
- run: env
|
||||
- name: Hide system node
|
||||
run: |
|
||||
if [ -f /usr/local/bin/node ]; then sudo mv /usr/local/bin/node /usr/local/bin/node.bak; fi
|
||||
if [ -f /usr/local/bin/npm ]; then sudo mv /usr/local/bin/npm /usr/local/bin/npm.bak; fi
|
||||
if [ -f /usr/local/bin/npx ]; then sudo mv /usr/local/bin/npx /usr/local/bin/npx.bak; fi
|
||||
shell: bash
|
||||
- name: Run fast tests
|
||||
run: |
|
||||
URCHIN_PATH="$(npx which urchin)"
|
||||
unset NVM_CD_FLAGS NVM_BIN NVM_INC
|
||||
export NVM_DIR="${{ github.workspace }}"
|
||||
export PATH="$(echo "$PATH" | tr ':' '\n' | grep -v '\.nvm' | grep -v 'toolcache' | tr '\n' ':')"
|
||||
make TERM=xterm-256color TEST_SUITE="fast" SHELL="${{ matrix.shell }}" URCHIN="$URCHIN_PATH" test-${{ matrix.shell }}
|
||||
- name: Restore system node
|
||||
if: always()
|
||||
run: |
|
||||
if [ -f /usr/local/bin/node.bak ]; then sudo mv /usr/local/bin/node.bak /usr/local/bin/node; fi
|
||||
if [ -f /usr/local/bin/npm.bak ]; then sudo mv /usr/local/bin/npm.bak /usr/local/bin/npm; fi
|
||||
if [ -f /usr/local/bin/npx.bak ]; then sudo mv /usr/local/bin/npx.bak /usr/local/bin/npx; fi
|
||||
shell: bash
|
||||
|
||||
all:
|
||||
permissions:
|
||||
contents: none
|
||||
name: 'all fast tests'
|
||||
needs: [fast]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: true
|
||||
99
.github/workflows/tests-installation-iojs.yml
vendored
99
.github/workflows/tests-installation-iojs.yml
vendored
@@ -1,99 +0,0 @@
|
||||
name: 'Tests: installation_iojs'
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
installation_iojs_without_curl:
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
name: 'installation_iojs without curl (${{ matrix.shell }})'
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: 'script -q -e -c "${{ matrix.shell }} {0}"'
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
shell:
|
||||
- sh
|
||||
- bash
|
||||
- dash
|
||||
- zsh
|
||||
# - ksh
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@v2
|
||||
with:
|
||||
allowed-endpoints:
|
||||
github.com:443
|
||||
registry.npmjs.org:443
|
||||
raw.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
iojs.org:443
|
||||
azure.archive.ubuntu.com:80
|
||||
packages.microsoft.com:443
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install zsh and additional shells
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y zsh
|
||||
if [ "${{ matrix.shell }}" != "sh" ] && [ "${{ matrix.shell }}" != "bash" ] && [ "${{ matrix.shell }}" != "zsh" ]; then
|
||||
sudo apt-get install -y ${{ matrix.shell }}
|
||||
fi
|
||||
shell: bash
|
||||
- run: sudo ${{ matrix.shell }} --version 2> /dev/null || dpkg -s ${{ matrix.shell }} 2> /dev/null || which ${{ matrix.shell }}
|
||||
- run: wget --version
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'npm install && version checks'
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
skip-ls-check: true
|
||||
- run: npm ls urchin
|
||||
- run: npx which urchin
|
||||
- name: Remove curl
|
||||
run: sudo apt-get remove curl -y
|
||||
shell: bash
|
||||
- run: '! command -v curl'
|
||||
shell: bash
|
||||
- run: env
|
||||
- name: Hide system node
|
||||
run: |
|
||||
if [ -f /usr/local/bin/node ]; then sudo mv /usr/local/bin/node /usr/local/bin/node.bak; fi
|
||||
if [ -f /usr/local/bin/npm ]; then sudo mv /usr/local/bin/npm /usr/local/bin/npm.bak; fi
|
||||
if [ -f /usr/local/bin/npx ]; then sudo mv /usr/local/bin/npx /usr/local/bin/npx.bak; fi
|
||||
shell: bash
|
||||
- name: Run installation_iojs tests
|
||||
run: |
|
||||
URCHIN_PATH="$(npx which urchin)"
|
||||
unset NVM_CD_FLAGS NVM_BIN NVM_INC
|
||||
export NVM_DIR="${{ github.workspace }}"
|
||||
export PATH="$(echo "$PATH" | tr ':' '\n' | grep -v '\.nvm' | grep -v 'toolcache' | tr '\n' ':')"
|
||||
make TERM=xterm-256color TEST_SUITE="installation_iojs" SHELL="${{ matrix.shell }}" URCHIN="$URCHIN_PATH" test-${{ matrix.shell }}
|
||||
- name: Restore system node
|
||||
if: always()
|
||||
run: |
|
||||
if [ -f /usr/local/bin/node.bak ]; then sudo mv /usr/local/bin/node.bak /usr/local/bin/node; fi
|
||||
if [ -f /usr/local/bin/npm.bak ]; then sudo mv /usr/local/bin/npm.bak /usr/local/bin/npm; fi
|
||||
if [ -f /usr/local/bin/npx.bak ]; then sudo mv /usr/local/bin/npx.bak /usr/local/bin/npx; fi
|
||||
shell: bash
|
||||
- name: Restore curl
|
||||
if: always()
|
||||
run: sudo apt-get install curl -y
|
||||
shell: bash
|
||||
|
||||
all:
|
||||
permissions:
|
||||
contents: none
|
||||
name: 'all installation_iojs tests'
|
||||
needs: [installation_iojs_without_curl]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: true
|
||||
122
.github/workflows/tests-installation-node.yml
vendored
122
.github/workflows/tests-installation-node.yml
vendored
@@ -1,122 +0,0 @@
|
||||
name: 'Tests: installation_node'
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
installation_node:
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
name: "installation_node (${{ matrix.shell }}${{ matrix.without_curl && ', without curl' || '' }})"
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
shell:
|
||||
- sh
|
||||
- bash
|
||||
- dash
|
||||
- zsh
|
||||
# - ksh
|
||||
without_curl:
|
||||
- false
|
||||
- true
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@v2
|
||||
with:
|
||||
allowed-endpoints:
|
||||
github.com:443
|
||||
registry.npmjs.org:443
|
||||
raw.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
iojs.org:443
|
||||
azure.archive.ubuntu.com:80
|
||||
packages.microsoft.com:443
|
||||
archive.ubuntu.com:80
|
||||
security.ubuntu.com:80
|
||||
production.cloudflare.docker.com:443
|
||||
registry-1.docker.io:443
|
||||
auth.docker.io:443
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: true
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'npm install && version checks'
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
skip-ls-check: true
|
||||
- run: npm ls urchin
|
||||
- run: npx which urchin
|
||||
- name: Run installation_node tests in container
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v "${{ github.workspace }}:/workspace" \
|
||||
-w /workspace \
|
||||
-e "TEST_SHELL=${{ matrix.shell }}" \
|
||||
-e "TERM=xterm-256color" \
|
||||
-e "DEBIAN_FRONTEND=noninteractive" \
|
||||
-e "GITHUB_ACTIONS=true" \
|
||||
-e "WITHOUT_CURL=${{ matrix.without_curl }}" \
|
||||
ubuntu:16.04 \
|
||||
bash -c '
|
||||
set -ex
|
||||
|
||||
# Retry apt-get update up to 5 times due to flaky Ubuntu mirrors
|
||||
# apt-get update can return 0 even with partial failures, so check for warnings
|
||||
for i in 1 2 3 4 5; do
|
||||
if apt-get update 2>&1 | tee /tmp/apt-update.log | grep -qE "^(W:|E:|Err:)"; then
|
||||
echo "apt-get update had warnings/errors, attempt $i/5"
|
||||
cat /tmp/apt-update.log
|
||||
sleep $((i * 5))
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
apt-get install -y git curl wget make build-essential python zsh libssl-dev
|
||||
if [ "$TEST_SHELL" != "sh" ] && [ "$TEST_SHELL" != "bash" ]; then
|
||||
apt-get install -y $TEST_SHELL || true
|
||||
fi
|
||||
|
||||
# Use nvm to install Node.js for running urchin
|
||||
# Node 16 is the last version supporting GLIBC 2.23 (Ubuntu 16.04)
|
||||
export NVM_DIR="/workspace"
|
||||
. /workspace/nvm.sh
|
||||
nvm install 16
|
||||
nvm use 16
|
||||
|
||||
npm ls urchin
|
||||
URCHIN_PATH="$(npx which urchin)"
|
||||
|
||||
# Remove curl if testing without it
|
||||
if [ "$WITHOUT_CURL" = "true" ]; then
|
||||
apt-get remove curl -y
|
||||
! command -v curl
|
||||
fi
|
||||
|
||||
# Now clean up nvm state for the actual tests, but keep NVM_DIR set
|
||||
nvm deactivate || true
|
||||
nvm unalias default || true
|
||||
unset NVM_CD_FLAGS NVM_BIN NVM_INC
|
||||
export PATH="$(echo "$PATH" | tr ":" "\n" | grep -v "\.nvm" | grep -v "toolcache" | tr "\n" ":")"
|
||||
|
||||
# Clean any cached files from the nvm install above
|
||||
rm -rf "$NVM_DIR/.cache" "$NVM_DIR/versions" "$NVM_DIR/alias"
|
||||
|
||||
make TEST_SUITE="installation_node" SHELL="$TEST_SHELL" URCHIN="$URCHIN_PATH" test-$TEST_SHELL
|
||||
'
|
||||
|
||||
all:
|
||||
permissions:
|
||||
contents: none
|
||||
name: 'all installation_node tests'
|
||||
needs: [installation_node]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: true
|
||||
112
.github/workflows/tests-xenial.yml
vendored
112
.github/workflows/tests-xenial.yml
vendored
@@ -1,112 +0,0 @@
|
||||
name: 'Tests: xenial'
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
xenial:
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
name: 'xenial (${{ matrix.shell }})'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
shell:
|
||||
- sh
|
||||
- bash
|
||||
- dash
|
||||
- zsh
|
||||
# - ksh
|
||||
|
||||
steps:
|
||||
- name: Harden Runner
|
||||
uses: step-security/harden-runner@v2
|
||||
with:
|
||||
allowed-endpoints:
|
||||
github.com:443
|
||||
registry.npmjs.org:443
|
||||
raw.githubusercontent.com:443
|
||||
nodejs.org:443
|
||||
iojs.org:443
|
||||
azure.archive.ubuntu.com:80
|
||||
packages.microsoft.com:443
|
||||
archive.ubuntu.com:80
|
||||
security.ubuntu.com:80
|
||||
production.cloudflare.docker.com:443
|
||||
registry-1.docker.io:443
|
||||
auth.docker.io:443
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: true
|
||||
- uses: ljharb/actions/node/install@main
|
||||
name: 'npm install && version checks'
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
skip-ls-check: true
|
||||
- run: npm ls urchin
|
||||
- run: npx which urchin
|
||||
- name: Run xenial tests in container
|
||||
run: |
|
||||
docker run --rm \
|
||||
-v "${{ github.workspace }}:/workspace" \
|
||||
-w /workspace \
|
||||
-e "TEST_SHELL=${{ matrix.shell }}" \
|
||||
-e "TERM=xterm-256color" \
|
||||
-e "DEBIAN_FRONTEND=noninteractive" \
|
||||
-e "GITHUB_ACTIONS=true" \
|
||||
ubuntu:16.04 \
|
||||
bash -c '
|
||||
set -ex
|
||||
|
||||
# Retry apt-get update up to 5 times due to flaky Ubuntu mirrors
|
||||
# apt-get update can return 0 even with partial failures, so check for warnings
|
||||
for i in 1 2 3 4 5; do
|
||||
if apt-get update 2>&1 | tee /tmp/apt-update.log | grep -qE "^(W:|E:|Err:)"; then
|
||||
echo "apt-get update had warnings/errors, attempt $i/5"
|
||||
cat /tmp/apt-update.log
|
||||
sleep $((i * 5))
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
apt-get install -y git curl wget make build-essential python zsh libssl-dev
|
||||
if [ "$TEST_SHELL" != "sh" ] && [ "$TEST_SHELL" != "bash" ]; then
|
||||
apt-get install -y $TEST_SHELL || true
|
||||
fi
|
||||
|
||||
# Use nvm to install Node.js for running urchin
|
||||
# Node 16 is the last version supporting GLIBC 2.23 (Ubuntu 16.04)
|
||||
export NVM_DIR="/workspace"
|
||||
. /workspace/nvm.sh
|
||||
nvm install 16
|
||||
nvm use 16
|
||||
|
||||
npm ls urchin
|
||||
URCHIN_PATH="$(npx which urchin)"
|
||||
|
||||
# Now clean up nvm state for the actual tests, but keep NVM_DIR set
|
||||
nvm deactivate || true
|
||||
nvm unalias default || true
|
||||
unset NVM_CD_FLAGS NVM_BIN NVM_INC
|
||||
export PATH="$(echo "$PATH" | tr ":" "\n" | grep -v "\.nvm" | grep -v "toolcache" | tr "\n" ":")"
|
||||
|
||||
# Clean any cached files from the nvm install above
|
||||
rm -rf "$NVM_DIR/.cache" "$NVM_DIR/versions" "$NVM_DIR/alias"
|
||||
|
||||
make TEST_SUITE="xenial" SHELL="$TEST_SHELL" URCHIN="$URCHIN_PATH" test-$TEST_SHELL
|
||||
'
|
||||
|
||||
all:
|
||||
permissions:
|
||||
contents: none
|
||||
name: 'all xenial tests'
|
||||
needs: [xenial]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: true
|
||||
17
.github/workflows/tests.yml
vendored
17
.github/workflows/tests.yml
vendored
@@ -12,7 +12,6 @@ jobs:
|
||||
|
||||
name: "tests"
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
defaults:
|
||||
run:
|
||||
shell: 'script -q -e -c "${{ matrix.shell }} {0}"'
|
||||
@@ -53,7 +52,7 @@ jobs:
|
||||
iojs.org:443
|
||||
azure.archive.ubuntu.com:80
|
||||
packages.microsoft.com:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
- run: sudo apt-get update; sudo apt-get install ${{ matrix.shell }}
|
||||
if: matrix.shell == 'zsh' || matrix.shell == 'ksh'
|
||||
# zsh (https://github.com/actions/runner-images/issues/264) and ksh are not in the ubuntu image
|
||||
@@ -69,19 +68,7 @@ jobs:
|
||||
- run: npm ls urchin
|
||||
- run: npx which urchin
|
||||
- run: env
|
||||
- name: Run tests
|
||||
shell: bash
|
||||
run: |
|
||||
for attempt in 1 2 3; do
|
||||
timeout 600 make TERM=xterm-256color TEST_SUITE="${{ matrix.suite }}" SHELL="${{ matrix.shell }}" URCHIN="$(npx which urchin)" test-${{ matrix.shell }} && exit 0
|
||||
EXIT_CODE=$?
|
||||
if [ $EXIT_CODE -ne 124 ]; then
|
||||
exit $EXIT_CODE
|
||||
fi
|
||||
echo "Attempt ${attempt} timed out; retrying..."
|
||||
done
|
||||
echo "All 3 attempts timed out."
|
||||
exit 1
|
||||
- run: make TERM=xterm-256color TEST_SUITE="${{ matrix.suite }}" SHELL="${{ matrix.shell }}" URCHIN="$(npx which urchin)" test-${{ matrix.shell }}
|
||||
|
||||
nvm:
|
||||
permissions:
|
||||
|
||||
4
.github/workflows/toc.yml
vendored
4
.github/workflows/toc.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
github.com:443
|
||||
registry.npmjs.org:443
|
||||
api.github.com:443
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
# https://github.com/actions/checkout/issues/217#issue-599945005
|
||||
# pulls all commits (needed for lerna / semantic release to correctly version)
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
|
||||
# pulls all tags (needed for lerna / semantic release to correctly version)
|
||||
- run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
- run: npm install
|
||||
|
||||
50
.github/workflows/windows-npm.yml
vendored
50
.github/workflows/windows-npm.yml
vendored
@@ -72,11 +72,8 @@ jobs:
|
||||
unset npm_config_prefix
|
||||
export NVM_INSTALL_GITHUB_REPO="$NVM_INSTALL_GITHUB_REPO"
|
||||
export NVM_INSTALL_VERSION="$NVM_INSTALL_VERSION"
|
||||
export HOME="$(cygpath -u "$USERPROFILE")"
|
||||
|
||||
echo "HOME is $HOME"
|
||||
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | bash
|
||||
ls -l $HOME/.nvm
|
||||
. "$HOME/.nvm/nvm.sh"
|
||||
nvm install --lts
|
||||
|
||||
@@ -125,56 +122,14 @@ jobs:
|
||||
npm-node-version: '21'
|
||||
- wsl-distrib: Ubuntu-18.04
|
||||
npm-node-version: '18'
|
||||
# node v24+ doesn't work on WSL1 (exec format error)
|
||||
- wsl-distrib: Debian
|
||||
npm-node-version: '--lts'
|
||||
- wsl-distrib: Ubuntu-20.04
|
||||
npm-node-version: '--lts'
|
||||
method:
|
||||
- ''
|
||||
- 'script'
|
||||
steps:
|
||||
# For Ubuntu: install with packages directly
|
||||
- if: matrix.wsl-distrib != 'Debian'
|
||||
uses: Vampire/setup-wsl@v6
|
||||
- uses: Vampire/setup-wsl@v3
|
||||
with:
|
||||
distribution: ${{ matrix.wsl-distrib }}
|
||||
additional-packages: bash git curl ca-certificates wget
|
||||
|
||||
# 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@v6
|
||||
with:
|
||||
distribution: ${{ matrix.wsl-distrib }}
|
||||
- if: matrix.wsl-distrib == 'Debian'
|
||||
shell: 'wsl-bash {0}'
|
||||
run: 'sed -i s/ftp.debian.org/archive.debian.org/ /etc/apt/sources.list'
|
||||
- if: matrix.wsl-distrib == 'Debian'
|
||||
name: 'Install packages with retries'
|
||||
shell: 'wsl-bash {0}'
|
||||
run: |
|
||||
retry() {
|
||||
local n=0
|
||||
local max=3
|
||||
local delay=5
|
||||
while true; do
|
||||
"$@" && break || {
|
||||
n=$((n+1))
|
||||
if [ $n -lt $max ]; then
|
||||
echo "Command failed. Attempt $n/$max. Retrying in $delay seconds..."
|
||||
sleep $delay
|
||||
else
|
||||
echo "Command failed after $max attempts."
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
done
|
||||
}
|
||||
retry apt-get update
|
||||
retry apt-get upgrade --yes
|
||||
retry apt-get install --yes bash git curl ca-certificates wget
|
||||
|
||||
- name: Retrieve nvm on WSL
|
||||
run: |
|
||||
if [ -z "${{ matrix.method }}" ]; then
|
||||
@@ -214,11 +169,10 @@ jobs:
|
||||
- ''
|
||||
- 'script'
|
||||
steps:
|
||||
- uses: Vampire/setup-wsl@v6
|
||||
- uses: Vampire/setup-wsl@v3
|
||||
with:
|
||||
distribution: ${{ matrix.wsl-distrib }}
|
||||
additional-packages: bash git curl ca-certificates wget
|
||||
|
||||
- name: Retrieve nvm on WSL
|
||||
run: |
|
||||
if [ -z "${{ matrix.method }}" ]; then
|
||||
|
||||
94
.travis.yml
Normal file
94
.travis.yml
Normal file
@@ -0,0 +1,94 @@
|
||||
language: generic
|
||||
dist: focal
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- zsh
|
||||
# - ksh
|
||||
# - gcc-4.8
|
||||
# - g++-4.8
|
||||
|
||||
# https://gist.github.com/iedemam/9830045
|
||||
git:
|
||||
submodules: false
|
||||
|
||||
cache:
|
||||
ccache: true
|
||||
directories:
|
||||
- $TRAVIS_BUILD_DIR/.cache
|
||||
- $TRAVIS_BUILD_DIR/node_modules
|
||||
before_install:
|
||||
- sudo sed -i 's/mozilla\/DST_Root_CA_X3.crt/!mozilla\/DST_Root_CA_X3.crt/g' /etc/ca-certificates.conf
|
||||
- sudo update-ca-certificates -f
|
||||
|
||||
# https://gist.github.com/iedemam/9830045
|
||||
- sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
|
||||
- git submodule update --init --recursive
|
||||
|
||||
- $SHELL --version 2> /dev/null || dpkg -s $SHELL 2> /dev/null || which $SHELL
|
||||
- curl --version
|
||||
- wget --version
|
||||
- bash --version | head
|
||||
- zsh --version
|
||||
- dpkg -s dash | grep ^Version | awk '{print $2}'
|
||||
# install python
|
||||
- pyenv local 2.7.18 || pyenv install 2.7.18
|
||||
- pyenv local 2.7.18 || echo 'pyenv failed'
|
||||
- python -V
|
||||
install:
|
||||
- if [ -z "${SHELLCHECK-}" ]; then nvm install 16 && nvm unalias default && npm install && npm prune && npm ls urchin doctoc eclint dockerfile_lint; fi
|
||||
- '[ -z "$WITHOUT_CURL" ] || sudo apt-get remove curl -y'
|
||||
script:
|
||||
- if [ -n "${SHELL-}" ] && [ -n "${TEST_SUITE}" ]; then if [ "${TEST_SUITE}" = 'installation_iojs' ] || [ "${TEST_SUITE}" = 'xenial' ]; then travis_retry make TEST_SUITE=$TEST_SUITE URCHIN="$(npm bin)/urchin" test-$SHELL ; else make TEST_SUITE=$TEST_SUITE URCHIN="$(npm bin)/urchin" test-$SHELL; fi; fi
|
||||
before_cache:
|
||||
- if [ -n "$WITHOUT_CURL" ]; then sudo apt-get install curl -y ; fi
|
||||
jobs:
|
||||
include:
|
||||
- env: SHELL=bash TEST_SUITE=installation_node
|
||||
dist: xenial
|
||||
- env: SHELL=bash TEST_SUITE=installation_node WITHOUT_CURL=1
|
||||
dist: xenial
|
||||
- env: SHELL=sh TEST_SUITE=installation_node
|
||||
dist: xenial
|
||||
- env: SHELL=sh TEST_SUITE=installation_node WITHOUT_CURL=1
|
||||
dist: xenial
|
||||
- env: SHELL=dash TEST_SUITE=installation_node
|
||||
dist: xenial
|
||||
- env: SHELL=dash TEST_SUITE=installation_node WITHOUT_CURL=1
|
||||
dist: xenial
|
||||
- env: SHELL=zsh TEST_SUITE=installation_node
|
||||
dist: xenial
|
||||
- env: SHELL=zsh TEST_SUITE=installation_node WITHOUT_CURL=1
|
||||
dist: xenial
|
||||
#- env: SHELL=ksh TEST_SUITE=installation_node
|
||||
# dist: xenial
|
||||
#- env: SHELL=ksh TEST_SUITE=installation_node WITHOUT_CURL=1
|
||||
# dist: xenial
|
||||
- env: SHELL=bash TEST_SUITE=xenial
|
||||
dist: xenial
|
||||
- env: SHELL=sh TEST_SUITE=xenial
|
||||
dist: xenial
|
||||
- env: SHELL=dash TEST_SUITE=xenial
|
||||
dist: xenial
|
||||
- env: SHELL=zsh TEST_SUITE=xenial
|
||||
dist: xenial
|
||||
#- env: SHELL=ksh TEST_SUITE=xenial
|
||||
# dist: xenial
|
||||
env:
|
||||
global:
|
||||
- CXX=g++
|
||||
- CC=gcc
|
||||
- PATH="$(echo $PATH | sed 's/::/:/')"
|
||||
- PATH="/usr/lib/ccache/:$PATH"
|
||||
- NVM_DIR="${TRAVIS_BUILD_DIR}"
|
||||
matrix:
|
||||
- SHELL=sh TEST_SUITE=fast
|
||||
- SHELL=dash TEST_SUITE=fast
|
||||
- SHELL=bash TEST_SUITE=fast
|
||||
- SHELL=zsh TEST_SUITE=fast
|
||||
# - SHELL=ksh TEST_SUITE=fast
|
||||
- SHELL=sh TEST_SUITE=installation_iojs WITHOUT_CURL=1
|
||||
- SHELL=dash TEST_SUITE=installation_iojs WITHOUT_CURL=1
|
||||
- SHELL=bash TEST_SUITE=installation_iojs WITHOUT_CURL=1
|
||||
- SHELL=zsh TEST_SUITE=installation_iojs WITHOUT_CURL=1
|
||||
# - SHELL=ksh TEST_SUITE=installation_iojs WITHOUT_CURL=1
|
||||
447
AGENTS.md
447
AGENTS.md
@@ -1,447 +0,0 @@
|
||||
# nvm Coding Agent Instructions
|
||||
|
||||
This document provides guidance for AI coding agents when working with the Node Version Manager (nvm) codebase.
|
||||
|
||||
## Overview
|
||||
|
||||
nvm is a version manager for Node.js, implemented as a POSIX-compliant function that works across multiple shells (sh, dash, bash, ksh, zsh). The codebase is primarily written in shell script and emphasizes portability and compatibility.
|
||||
|
||||
### Core Architecture
|
||||
|
||||
- **Main script**: `nvm.sh` - Contains all core functionality and the main `nvm()` function
|
||||
- **Installation script**: `install.sh` - Handles downloading and installing nvm itself
|
||||
- **Execution wrapper**: `nvm-exec` - Allows running commands with specific Node.js versions
|
||||
- **Bash completion**: `bash_completion` - Provides tab completion for bash users
|
||||
- **Tests**: Comprehensive test suite in `test/` directory using the [urchin](https://www.npmjs.com/package/urchin) test framework
|
||||
|
||||
## Key Files and Their Purposes
|
||||
|
||||
### `nvm.sh`
|
||||
The core functionality file containing:
|
||||
- Main `nvm()` function (starts around line 3000)
|
||||
- All internal helper functions (prefixed with `nvm_`)
|
||||
- Command implementations for install, use, ls, etc.
|
||||
- Shell compatibility logic
|
||||
- POSIX compliance utilities
|
||||
|
||||
### `install.sh`
|
||||
Handles nvm installation via curl/wget/git:
|
||||
- Downloads nvm from GitHub
|
||||
- Sets up directory structure
|
||||
- Configures shell integration
|
||||
- Supports both git clone and script download methods
|
||||
|
||||
### `nvm-exec`
|
||||
Simple wrapper script that:
|
||||
- Sources nvm.sh with `--no-use` flag
|
||||
- Switches to specified Node version via `NODE_VERSION` env var or `.nvmrc`
|
||||
- Executes the provided command with that Node version
|
||||
|
||||
## Top-Level nvm Commands and Internal Functions
|
||||
|
||||
### Core Commands
|
||||
|
||||
#### `nvm install [version]`
|
||||
- **Internal functions**: `nvm_install_binary()`, `nvm_install_source()`, `nvm_download_artifact()`
|
||||
- Downloads and installs specified Node.js version
|
||||
- Automatically `nvm use`s that version after installation
|
||||
- Supports LTS versions, version ranges, and built-in aliases (like `node`, `stable`) and user-defined aliases
|
||||
- Can install from binary or compile from source
|
||||
- When compiling from source, accepts additional arguments that are passed to the compilation task
|
||||
|
||||
#### `nvm use [version]`
|
||||
- **Internal functions**: `nvm_resolve_alias()`, `nvm_version_path()`, `nvm_change_path()`
|
||||
- Switches current shell to use specified Node.js version
|
||||
- Updates PATH environment variable
|
||||
- Supports `.nvmrc` file integration
|
||||
|
||||
#### `nvm ls [pattern]`
|
||||
- **Internal functions**: `nvm_ls()`, `nvm_tree_contains_path()`
|
||||
- Lists installed Node.js versions
|
||||
- Supports pattern matching and filtering
|
||||
- Shows current version and aliases
|
||||
|
||||
#### `nvm ls-remote [pattern]`
|
||||
- **Internal functions**: `nvm_ls_remote()`, `nvm_download()`, `nvm_ls_remote_index_tab()`
|
||||
- Lists available Node.js versions from nodejs.org and iojs.org, or the env-var-configured mirrors
|
||||
- Supports LTS filtering and pattern matching
|
||||
- Downloads version index on-demand
|
||||
|
||||
#### `nvm alias [name] [version]`
|
||||
- **Internal functions**: `nvm_alias()`, `nvm_alias_path()`
|
||||
- Creates text files containing the mapped version, named as the alias name
|
||||
- Special aliases: `default`, `node`, `iojs`, `stable`, `unstable` (note: `stable` and `unstable` are deprecated, from node's pre-v1 release plan)
|
||||
- Stored in `$NVM_DIR/alias/` directory
|
||||
|
||||
#### `nvm current`
|
||||
- **Internal functions**: `nvm_ls_current()`
|
||||
- Shows currently active Node.js version
|
||||
- Returns "system" if using system Node.js
|
||||
|
||||
#### `nvm which [version]`
|
||||
- **Internal functions**: `nvm_version_path()`, `nvm_resolve_alias()`
|
||||
- Shows path to specified Node.js version
|
||||
- Resolves aliases and version strings
|
||||
|
||||
### Utility Commands
|
||||
|
||||
#### `nvm cache clear|dir`
|
||||
- Cache management for downloaded binaries and source code
|
||||
- Clears or shows cache directory path
|
||||
|
||||
#### `nvm debug`
|
||||
- Diagnostic information for troubleshooting
|
||||
- Shows environment, tool versions, and paths
|
||||
|
||||
#### `nvm deactivate`
|
||||
- Removes nvm modifications from current shell
|
||||
- Restores original PATH
|
||||
|
||||
#### `nvm unload`
|
||||
- Completely removes nvm from shell environment
|
||||
- Unsets all nvm functions and variables
|
||||
|
||||
### Internal Function Categories
|
||||
|
||||
#### Version Resolution
|
||||
- `nvm_resolve_alias()` - Resolves aliases to version numbers
|
||||
- `nvm_version()` - Finds best matching local version
|
||||
- `nvm_remote_version()` - Finds best matching remote version
|
||||
- `nvm_normalize_version()` - Standardizes version strings
|
||||
- `nvm_version_greater()` - Compares version numbers
|
||||
- `nvm_version_greater_than_or_equal_to()` - Version comparison with equality
|
||||
- `nvm_get_latest()` - Gets latest version from a list
|
||||
|
||||
#### Installation Helpers
|
||||
- `nvm_install_binary()` - Downloads and installs precompiled binaries
|
||||
- `nvm_install_source()` - Compiles Node.js from source
|
||||
- `nvm_download_artifact()` - Downloads tarballs or binaries
|
||||
- `nvm_compute_checksum()` - Verifies download integrity
|
||||
- `nvm_checksum()` - Checksum verification wrapper
|
||||
- `nvm_get_mirror()` - Gets appropriate download mirror
|
||||
- `nvm_get_arch()` - Determines system architecture
|
||||
|
||||
#### Path Management
|
||||
- `nvm_change_path()` - Updates PATH for version switching
|
||||
- `nvm_strip_path()` - Removes nvm paths from PATH
|
||||
- `nvm_version_path()` - Gets installation path for version
|
||||
- `nvm_version_dir()` - Gets version directory name
|
||||
- `nvm_prepend_path()` - Safely prepends to PATH
|
||||
|
||||
#### Shell Detection and Compatibility
|
||||
- `nvm_is_zsh()` - Shell detection for zsh
|
||||
- `nvm_is_iojs_version()` - Checks if version is io.js
|
||||
- `nvm_get_os()` - Operating system detection
|
||||
- `nvm_supports_source_options()` - Checks if shell supports source options
|
||||
|
||||
#### Network and Remote Operations
|
||||
- `nvm_download()` - Generic download function
|
||||
- `nvm_ls_remote()` - Lists remote versions
|
||||
- `nvm_ls_remote_iojs()` - Lists remote io.js versions
|
||||
- `nvm_ls_remote_index_tab()` - Parses remote version index
|
||||
|
||||
#### Utility Functions
|
||||
- `nvm_echo()`, `nvm_err()` - Output functions
|
||||
- `nvm_has()` - Checks if command exists
|
||||
- `nvm_sanitize_path()` - Cleans sensitive data from paths
|
||||
- `nvm_die_on_prefix()` - Validates npm prefix settings
|
||||
- `nvm_ensure_default_set()` - Ensures default alias is set
|
||||
- `nvm_auto()` - Automatic version switching from .nvmrc
|
||||
|
||||
#### Alias Management
|
||||
- `nvm_alias()` - Creates or lists aliases
|
||||
- `nvm_alias_path()` - Gets path to alias file
|
||||
- `nvm_unalias()` - Removes aliases
|
||||
- `nvm_resolve_local_alias()` - Resolves local aliases
|
||||
|
||||
#### Listing and Display
|
||||
- `nvm_ls()` - Lists local versions
|
||||
- `nvm_ls_current()` - Shows current version
|
||||
- `nvm_tree_contains_path()` - Checks if path is in nvm tree
|
||||
- `nvm_format_version()` - Formats version display
|
||||
|
||||
## Running Tests
|
||||
|
||||
### Test Framework
|
||||
nvm uses the [urchin](https://www.npmjs.com/package/urchin) test framework for shell script testing.
|
||||
|
||||
### Test Structure
|
||||
```
|
||||
test/
|
||||
├── fast/ # Quick unit tests
|
||||
├── slow/ # Integration tests
|
||||
├── sourcing/ # Shell sourcing tests
|
||||
├── install_script/ # Installation script tests
|
||||
├── installation_node/ # Node installation tests
|
||||
├── installation_iojs/ # io.js installation tests
|
||||
└── common.sh # Shared test utilities
|
||||
```
|
||||
|
||||
### Running Tests
|
||||
|
||||
#### Install Dependencies
|
||||
```bash
|
||||
npm install # Installs urchin, semver, and replace tools
|
||||
```
|
||||
|
||||
#### Run All Tests
|
||||
```bash
|
||||
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 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
|
||||
```
|
||||
|
||||
#### Individual Test Execution
|
||||
```bash
|
||||
./test/fast/Unit\ tests/nvm_get_arch # Run single test (WARNING: This will exit/terminate your current shell session)
|
||||
./node_modules/.bin/urchin test/fast/ # Run fast test suite
|
||||
./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
|
||||
- Tests should work across all supported shells (sh, bash, dash, zsh, ksh)
|
||||
- Define and use a `die()` function for test failures
|
||||
- Clean up after tests in cleanup functions
|
||||
- Mock external dependencies when needed
|
||||
- Place mocks in `test/mocks/` directory
|
||||
- Mock files should only be updated by the existing `update_test_mocks.sh` script, and any new mocks must be added to this script
|
||||
|
||||
## Shell Environment Setup
|
||||
|
||||
### Supported Shells
|
||||
- **bash** - Full feature support
|
||||
- **zsh** - Full feature support
|
||||
- **dash** - Basic POSIX support
|
||||
- **sh** - Basic POSIX support
|
||||
- **ksh** - Limited support (experimental)
|
||||
|
||||
### Installing Shell Environments
|
||||
|
||||
#### Ubuntu/Debian
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install bash zsh dash ksh
|
||||
# sh is typically provided by dash or bash and is available by default
|
||||
```
|
||||
|
||||
#### macOS
|
||||
```bash
|
||||
# bash and zsh are available by default, bash is not the default shell for new user accounts
|
||||
# Install other shells via Homebrew
|
||||
brew install dash ksh
|
||||
# For actual POSIX sh (not bash), install mksh which provides a true POSIX sh
|
||||
brew install mksh
|
||||
```
|
||||
|
||||
#### Manual Shell Testing
|
||||
```bash
|
||||
# Test in specific shell
|
||||
bash -c "source nvm.sh && nvm --version"
|
||||
zsh -c "source nvm.sh && nvm --version"
|
||||
dash -c ". nvm.sh && nvm --version"
|
||||
sh -c ". nvm.sh && nvm --version" # On macOS: mksh -c ". nvm.sh && nvm --version"
|
||||
ksh -c ". nvm.sh && nvm --version"
|
||||
```
|
||||
|
||||
### Shell-Specific Considerations
|
||||
- **zsh**: Requires basically any non-default zsh option to be temporarily unset to restore POSIX compliance
|
||||
- **dash**: Limited feature set, avoid bash-specific syntax
|
||||
- **ksh**: Some features may not work, primarily for compatibility testing
|
||||
|
||||
## CI Environment Details
|
||||
|
||||
### GitHub Actions Workflows
|
||||
|
||||
#### `.github/workflows/tests.yml`
|
||||
- Runs test suite across multiple shells and test suites
|
||||
- Uses `script` command for proper TTY simulation
|
||||
- Matrix strategy covers shell × test suite combinations
|
||||
- Excludes install_script tests from non-bash shells
|
||||
|
||||
#### `.github/workflows/shellcheck.yml`
|
||||
- Lints all shell scripts using shellcheck
|
||||
- Tests against multiple shell targets (bash, sh, dash, ksh)
|
||||
- Note: zsh is not included due to [shellcheck limitations](https://github.com/koalaman/shellcheck/issues/809)
|
||||
- Uses Homebrew to install latest shellcheck version
|
||||
|
||||
#### `.github/workflows/lint.yml`
|
||||
- Runs additional linting and formatting checks
|
||||
- Validates documentation and code style
|
||||
|
||||
### Travis CI (Legacy)
|
||||
- Configured in `.travis.yml`
|
||||
- Tests on multiple Ubuntu versions
|
||||
- Installs shell environments via apt packages
|
||||
|
||||
### CI Test Execution
|
||||
```bash
|
||||
# Simulate CI environment locally
|
||||
unset TRAVIS_BUILD_DIR # Disable Travis-specific logic
|
||||
unset GITHUB_ACTIONS # Disable GitHub Actions logic
|
||||
make test
|
||||
```
|
||||
|
||||
## Setting Up shellcheck Locally
|
||||
|
||||
### Installation
|
||||
|
||||
#### macOS (Homebrew)
|
||||
```bash
|
||||
brew install shellcheck
|
||||
```
|
||||
|
||||
#### Ubuntu/Debian
|
||||
```bash
|
||||
sudo apt-get install shellcheck
|
||||
```
|
||||
|
||||
#### From Source
|
||||
```bash
|
||||
# Download from https://github.com/koalaman/shellcheck/releases
|
||||
wget https://github.com/koalaman/shellcheck/releases/download/latest/shellcheck-latest.linux.x86_64.tar.xz
|
||||
tar -xf shellcheck-latest.linux.x86_64.tar.xz
|
||||
sudo cp shellcheck-latest/shellcheck /usr/local/bin/
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
#### Lint Main Files
|
||||
```bash
|
||||
shellcheck -s bash nvm.sh
|
||||
shellcheck -s bash install.sh
|
||||
shellcheck -s bash nvm-exec
|
||||
shellcheck -s bash bash_completion
|
||||
```
|
||||
|
||||
#### Lint Across Shell Types
|
||||
```bash
|
||||
shellcheck -s sh nvm.sh # POSIX sh
|
||||
shellcheck -s bash nvm.sh # Bash extensions
|
||||
shellcheck -s dash nvm.sh # Dash compatibility
|
||||
shellcheck -s ksh nvm.sh # Ksh compatibility
|
||||
```
|
||||
|
||||
#### Common shellcheck Directives in nvm
|
||||
- `# shellcheck disable=SC2039` - Allow bash extensions in POSIX mode
|
||||
- `# shellcheck disable=SC2016` - Allow literal `$` in single quotes
|
||||
- `# shellcheck disable=SC2001` - Allow sed usage instead of parameter expansion
|
||||
- `# shellcheck disable=SC3043` - Allow `local` keyword (bash extension)
|
||||
|
||||
### Fixing shellcheck Issues
|
||||
1. **Quoting**: Always quote variables: `"${VAR}"` instead of `$VAR`
|
||||
2. **POSIX compliance**: Avoid bash-specific features in portable sections
|
||||
3. **Array usage**: Use `set --` for positional parameters instead of arrays, which are not supported in POSIX
|
||||
4. **Local variables**: Declared with `local FOO` and then initialized on the next line (the latter is for ksh support)
|
||||
|
||||
## Development Best Practices
|
||||
|
||||
### Code Style
|
||||
- Use 2-space indentation
|
||||
- Follow POSIX shell guidelines for portability
|
||||
- Prefix internal functions with `nvm_`
|
||||
- Use `nvm_echo` instead of `echo` for output
|
||||
- Use `nvm_err` for error messages
|
||||
|
||||
### Compatibility
|
||||
- Test changes across all supported shells
|
||||
- Avoid bash-specific features in core functionality
|
||||
- Use `nvm_is_zsh` to check when zsh-specific behavior is needed
|
||||
- Mock external dependencies in tests
|
||||
|
||||
### Performance
|
||||
- Cache expensive operations (like remote version lists)
|
||||
- Use local variables to avoid scope pollution
|
||||
- Minimize subprocess calls where possible
|
||||
- Implement lazy loading for optional features
|
||||
|
||||
### Debugging
|
||||
- Use `nvm debug` command for environment information
|
||||
- Enable verbose output with `set -x` during development
|
||||
- Test with `NVM_DEBUG=1` environment variable
|
||||
- Check `$NVM_DIR/.cache` for cached data issues
|
||||
|
||||
## Common Gotchas
|
||||
|
||||
1. **PATH modification**: nvm modifies PATH extensively; be careful with restoration
|
||||
2. **Shell sourcing**: nvm must be sourced, not executed as a script
|
||||
3. **Version resolution**: Aliases, partial versions, and special keywords interact complexly
|
||||
4. **Platform differences**: Handle differences between Linux, macOS, and other Unix systems
|
||||
5. **Network dependencies**: Many operations require internet access for version lists
|
||||
6. **Concurrent access**: Multiple shells can conflict when installing versions simultaneously
|
||||
|
||||
## Windows Support
|
||||
|
||||
nvm works on Windows via several compatibility layers:
|
||||
|
||||
### WSL2 (Windows Subsystem for Linux)
|
||||
- Full nvm functionality available
|
||||
- **Important**: Ensure you're using WSL2, not WSL1 - see [Microsoft's WSL2 installation guide](https://docs.microsoft.com/en-us/windows/wsl/install) for up-to-date instructions
|
||||
- Install Ubuntu or other Linux distribution from Microsoft Store
|
||||
- Follow Linux installation instructions within WSL2
|
||||
|
||||
### Cygwin
|
||||
- POSIX-compatible environment for Windows
|
||||
- Download Cygwin from [cygwin.com](https://www.cygwin.com/install.html) and run the installer
|
||||
- During installation, include these packages: bash, curl, git, tar, and wget
|
||||
- May require additional PATH configuration
|
||||
|
||||
### Git Bash (MSYS2)
|
||||
- Comes with Git for Windows
|
||||
- Limited functionality compared to full Linux environment
|
||||
- Some features may not work due to path translation issues, including:
|
||||
- Binary extraction paths may be incorrectly translated
|
||||
- Symlink creation may fail
|
||||
- Some shell-specific features may behave differently
|
||||
- File permissions handling differs from Unix systems
|
||||
|
||||
### Setup Instructions for Windows
|
||||
|
||||
#### WSL2 (recommended)
|
||||
1. Install WSL2 using the official Microsoft guide: https://docs.microsoft.com/en-us/windows/wsl/install
|
||||
2. Install Ubuntu or preferred Linux distribution from Microsoft Store
|
||||
3. Follow standard Linux installation within WSL2
|
||||
|
||||
#### Git Bash
|
||||
1. Install Git for Windows (includes Git Bash) from https://git-scm.com/download/win
|
||||
2. Open Git Bash terminal
|
||||
3. Run nvm installation script
|
||||
|
||||
#### Cygwin
|
||||
1. Download and install Cygwin from https://www.cygwin.com/install.html
|
||||
2. Include bash, curl, git, tar, and wget packages during installation
|
||||
3. Run nvm installation in Cygwin terminal
|
||||
|
||||
This guide should help AI coding agents understand the nvm codebase structure, testing procedures, and development environment setup requirements.
|
||||
@@ -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 many 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 much details as possible about your environment, so we can more easily confirm the problem.
|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||
86
README.md
86
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,7 +31,6 @@
|
||||
- [Usage](#usage)
|
||||
- [Long-term Support](#long-term-support)
|
||||
- [Migrating Global Packages While Installing](#migrating-global-packages-while-installing)
|
||||
- [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)
|
||||
@@ -77,25 +76,25 @@
|
||||
|
||||
**Example:**
|
||||
```sh
|
||||
$ nvm install 24
|
||||
Now using node v24.14.0 (npm v11.9.0)
|
||||
$ nvm use 16
|
||||
Now using node v16.9.1 (npm v7.21.1)
|
||||
$ node -v
|
||||
v24.14.0
|
||||
$ nvm use 22
|
||||
Now using node v22.22.1 (npm v10.9.4)
|
||||
v16.9.1
|
||||
$ nvm use 14
|
||||
Now using node v14.18.0 (npm v6.14.15)
|
||||
$ node -v
|
||||
v22.22.1
|
||||
$ nvm use 20
|
||||
Now using node v20.20.1 (npm v10.8.2)
|
||||
v14.18.0
|
||||
$ nvm install 12
|
||||
Now using node v12.22.6 (npm v6.14.5)
|
||||
$ node -v
|
||||
v20.20.1
|
||||
v12.22.6
|
||||
```
|
||||
|
||||
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>
|
||||
@@ -105,10 +104,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.2/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.2/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.
|
||||
@@ -135,7 +134,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.2/install.sh | bash'`
|
||||
|
||||
#### Installing in Docker
|
||||
|
||||
@@ -146,12 +145,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 ~/.bash_env
|
||||
ENV BASH_ENV /home/user/.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.39.2/install.sh | PROFILE="${BASH_ENV}" bash
|
||||
RUN echo node > .nvmrc
|
||||
RUN nvm install
|
||||
```
|
||||
@@ -169,7 +168,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.2/install.sh | bash
|
||||
|
||||
# set env
|
||||
ENV NVM_DIR=/root/.nvm
|
||||
@@ -195,7 +194,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.2
|
||||
|
||||
root@0a6b5a237c14:/# node -v
|
||||
v19.9.0
|
||||
@@ -258,7 +257,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.2/install.sh | bash
|
||||
args:
|
||||
creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"
|
||||
```
|
||||
@@ -279,7 +278,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 [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:
|
||||
**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:
|
||||
|
||||
- [nvm-windows](https://github.com/coreybutler/nvm-windows)
|
||||
- [nodist](https://github.com/marcelklehr/nodist)
|
||||
@@ -320,7 +319,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.2`
|
||||
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:
|
||||
@@ -444,7 +443,7 @@ Node has a [schedule](https://github.com/nodejs/Release#release-schedule) for lo
|
||||
|
||||
Any time your local copy of `nvm` connects to https://nodejs.org, it will re-create the appropriate local aliases for all available LTS lines. These aliases (stored under `$NVM_DIR/alias/lts`), are managed by `nvm`, and you should not modify, remove, or create these files - expect your changes to be undone, and expect meddling with these files to cause bugs that will likely not be supported.
|
||||
|
||||
To get the latest LTS version of node and migrate your existing installed packages, use:
|
||||
To get the latest LTS version of node and migrate your existing installed packages, use
|
||||
|
||||
```sh
|
||||
nvm install --reinstall-packages-from=current 'lts/*'
|
||||
@@ -483,22 +482,6 @@ 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.
|
||||
|
||||
|
||||
### 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
|
||||
|
||||
If you have a list of default packages you want installed every time you install a new version, we support that too -- just add the package names, one per line, to the file `$NVM_DIR/default-packages`. You can add anything npm would accept as a package argument on the command line.
|
||||
@@ -513,10 +496,7 @@ stevemao/left-pad
|
||||
|
||||
### io.js
|
||||
|
||||
> [!WARNING]
|
||||
> io.js was a [fork of Node.js](https://en.wikipedia.org/wiki/Node.js#History), created in 2014 and merged back in 2015. io.js shipped v1, v2, and v3 release lines; post-merge, node.js began releasing with v4.
|
||||
|
||||
If you want to install io.js:
|
||||
If you want to install [io.js](https://github.com/iojs/io.js/):
|
||||
|
||||
```sh
|
||||
nvm install iojs
|
||||
@@ -940,18 +920,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 your 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 you 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.2/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.2/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._
|
||||
@@ -1054,13 +1034,13 @@ 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
|
||||
[3]: https://github.com/nvm-sh/nvm/actions/workflows/tests-fast.yml
|
||||
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.4
|
||||
[2]: https://github.com/nvm-sh/nvm/blob/v0.40.2/install.sh
|
||||
[3]: https://app.travis-ci.com/nvm-sh/nvm
|
||||
[4]: https://github.com/nvm-sh/nvm/releases/tag/v0.40.2
|
||||
[Urchin]: https://git.sdf.org/tlevine/urchin
|
||||
[Fish]: https://fishshell.com
|
||||
|
||||
**Homebrew makes zsh directories insecure**
|
||||
**Homebrew makes zsh directories unsecure**
|
||||
|
||||
```shell
|
||||
zsh compinit: insecure directories, run compaudit for list.
|
||||
@@ -1114,7 +1094,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.276)
|
||||
|
||||
- Exit back to your native shell.
|
||||
|
||||
@@ -1141,7 +1121,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.2/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
|
||||
@@ -1176,7 +1156,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.2 at this time) is supported.
|
||||
|
||||
## Enterprise Support
|
||||
|
||||
|
||||
38
install.sh
38
install.sh
@@ -33,7 +33,7 @@ nvm_install_dir() {
|
||||
}
|
||||
|
||||
nvm_latest_version() {
|
||||
nvm_echo "v0.40.4"
|
||||
nvm_echo "v0.40.2"
|
||||
}
|
||||
|
||||
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 variable \`\$NVM_INSTALL_GITHUB_REPO\` is
|
||||
but the environment variables \`\$NVM_INSTALL_GITHUB_REPO\` is
|
||||
currently set to \`${NVM_GITHUB_REPO}\`.
|
||||
|
||||
If this is not intentional, interrupt this installation and
|
||||
@@ -149,10 +149,7 @@ 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}" || {
|
||||
nvm_echo >&2 "Failed to create directory '${INSTALL_DIR}'"
|
||||
exit 2
|
||||
}
|
||||
mkdir -p "${INSTALL_DIR}"
|
||||
if [ "$(ls -A "${INSTALL_DIR}")" ]; then
|
||||
# Initializing repo
|
||||
command git init "${INSTALL_DIR}" || {
|
||||
@@ -166,7 +163,7 @@ install_nvm_from_git() {
|
||||
}
|
||||
else
|
||||
# Cloning repo
|
||||
command git clone -o origin "$(nvm_source)" --depth=1 "${INSTALL_DIR}" || {
|
||||
command git clone "$(nvm_source)" --depth=1 "${INSTALL_DIR}" || {
|
||||
nvm_echo >&2 'Failed to clone nvm repo. Please report this!'
|
||||
exit 2
|
||||
}
|
||||
@@ -219,7 +216,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"
|
||||
@@ -237,10 +234,7 @@ install_nvm_as_script() {
|
||||
NVM_BASH_COMPLETION_SOURCE="$(nvm_source script-nvm-bash-completion)"
|
||||
|
||||
# Downloading to $INSTALL_DIR
|
||||
mkdir -p "$INSTALL_DIR" || {
|
||||
nvm_echo >&2 "Failed to create directory '$INSTALL_DIR'"
|
||||
return 1
|
||||
}
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
if [ -f "$INSTALL_DIR/nvm.sh" ]; then
|
||||
nvm_echo "=> nvm is already installed in $INSTALL_DIR, trying to update the script"
|
||||
else
|
||||
@@ -380,10 +374,7 @@ nvm_do_install() {
|
||||
fi
|
||||
|
||||
if [ "${NVM_DIR}" = "$(nvm_default_install_dir)" ]; then
|
||||
mkdir "${NVM_DIR}" || {
|
||||
nvm_echo >&2 "Failed to create directory '${NVM_DIR}'"
|
||||
exit 2
|
||||
}
|
||||
mkdir "${NVM_DIR}"
|
||||
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
|
||||
@@ -437,19 +428,16 @@ nvm_do_install() {
|
||||
COMPLETION_STR='[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion\n'
|
||||
BASH_OR_ZSH=false
|
||||
|
||||
if [ "${PROFILE-}" = '/dev/null' ] ; then
|
||||
# the user has specifically requested NOT to have nvm touch their profile
|
||||
echo
|
||||
elif [ -z "${NVM_PROFILE-}" ] ; then
|
||||
if [ -z "${NVM_PROFILE-}" ] ; then
|
||||
local TRIED_PROFILE
|
||||
if [ -n "${PROFILE}" ]; then
|
||||
TRIED_PROFILE="${PROFILE} (as defined in \$PROFILE), "
|
||||
TRIED_PROFILE="${NVM_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 '%b' "${SOURCE_STR}"
|
||||
command printf "${SOURCE_STR}"
|
||||
nvm_echo
|
||||
else
|
||||
if nvm_profile_is_bash_or_zsh "${NVM_PROFILE-}"; then
|
||||
@@ -457,14 +445,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 '%b' "${SOURCE_STR}" >> "$NVM_PROFILE"
|
||||
command printf "${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 '%b' "$COMPLETION_STR" >> "$NVM_PROFILE"
|
||||
command printf "$COMPLETION_STR" >> "$NVM_PROFILE"
|
||||
else
|
||||
nvm_echo "=> bash_completion source string already in ${NVM_PROFILE}"
|
||||
fi
|
||||
@@ -485,7 +473,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 '%b' "${SOURCE_STR}"
|
||||
command printf "${SOURCE_STR}"
|
||||
if ${BASH_OR_ZSH} ; then
|
||||
command printf "${COMPLETION_STR}"
|
||||
fi
|
||||
|
||||
9
nvm-exec
9
nvm-exec
@@ -9,12 +9,9 @@ unset NVM_CD_FLAGS
|
||||
|
||||
if [ -n "$NODE_VERSION" ]; then
|
||||
nvm use "$NODE_VERSION" > /dev/null || exit 127
|
||||
else
|
||||
{ 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
|
||||
fi
|
||||
elif ! nvm use >/dev/null 2>&1; then
|
||||
echo "No NODE_VERSION provided; no .nvmrc file found" >&2
|
||||
exit 127
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
457
nvm.sh
457
nvm.sh
@@ -83,7 +83,7 @@ nvm_has_colors() {
|
||||
if nvm_has tput; then
|
||||
NVM_NUM_COLORS="$(command tput -T "${TERM:-vt100}" colors)"
|
||||
fi
|
||||
[ -t 1 ] && [ "${NVM_NUM_COLORS:--1}" -ge 8 ] && [ "${NVM_NO_COLORS-}" != '--no-colors' ]
|
||||
[ "${NVM_NUM_COLORS:--1}" -ge 8 ] && [ "${NVM_NO_COLORS-}" != '--no-colors' ]
|
||||
}
|
||||
|
||||
nvm_curl_libz_support() {
|
||||
@@ -149,8 +149,7 @@ nvm_download() {
|
||||
")
|
||||
|
||||
if [ -n "${NVM_AUTH_HEADER:-}" ]; then
|
||||
sanitized_header=$(nvm_sanitize_auth_header "${NVM_AUTH_HEADER}")
|
||||
ARGS="${ARGS} --header \"${sanitized_header}\""
|
||||
ARGS="${ARGS} --header \"${NVM_AUTH_HEADER}\""
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
eval wget $ARGS
|
||||
@@ -602,6 +601,7 @@ EOF
|
||||
}
|
||||
|
||||
nvm_rc_version() {
|
||||
export NVM_RC_VERSION=''
|
||||
local NVMRC_PATH
|
||||
NVMRC_PATH="$(nvm_find_nvmrc)"
|
||||
if [ ! -e "${NVMRC_PATH}" ]; then
|
||||
@@ -611,7 +611,7 @@ nvm_rc_version() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
local NVM_RC_VERSION
|
||||
|
||||
if ! NVM_RC_VERSION="$(nvm_process_nvmrc "${NVMRC_PATH}")"; then
|
||||
return 1
|
||||
fi
|
||||
@@ -625,7 +625,6 @@ 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() {
|
||||
@@ -759,11 +758,6 @@ nvm_version() {
|
||||
;;
|
||||
esac
|
||||
VERSION="$(nvm_ls "${PATTERN}" | command tail -1)"
|
||||
case "${VERSION}" in
|
||||
system[[:blank:]]*)
|
||||
VERSION='system'
|
||||
;;
|
||||
esac
|
||||
if [ -z "${VERSION}" ] || [ "_${VERSION}" = "_N/A" ]; then
|
||||
nvm_echo "N/A"
|
||||
return 3
|
||||
@@ -787,15 +781,6 @@ nvm_remote_version() {
|
||||
else
|
||||
VERSION="$(NVM_LTS="${NVM_LTS-}" nvm_remote_versions "${PATTERN}" | command tail -1)"
|
||||
fi
|
||||
|
||||
if [ -n "${PATTERN}" ] && [ "_${VERSION}" != "_N/A" ] && ! nvm_validate_implicit_alias "${PATTERN}" 2>/dev/null; then
|
||||
local VERSION_NUM
|
||||
VERSION_NUM="$(nvm_echo "${VERSION}" | command awk '{print $1}')"
|
||||
if ! nvm_echo "${VERSION_NUM}" | nvm_grep -q "${PATTERN}"; then
|
||||
VERSION='N/A'
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${NVM_VERSION_ONLY-}" ]; then
|
||||
command awk 'BEGIN {
|
||||
n = split(ARGV[1], a);
|
||||
@@ -878,10 +863,7 @@ ${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
|
||||
if [ "${NVM_LS_REMOTE_EXIT_CODE}" != '0' ]; then
|
||||
return "${NVM_LS_REMOTE_EXIT_CODE}"
|
||||
fi
|
||||
return "${NVM_LS_REMOTE_IOJS_EXIT_CODE}"
|
||||
return $NVM_LS_REMOTE_EXIT_CODE || $NVM_LS_REMOTE_IOJS_EXIT_CODE
|
||||
}
|
||||
|
||||
nvm_is_valid_version() {
|
||||
@@ -987,18 +969,13 @@ nvm_strip_path() {
|
||||
nvm_err '${NVM_DIR} not set!'
|
||||
return 1
|
||||
fi
|
||||
local RESULT
|
||||
RESULT="$(command printf %s "${1-}" | command awk -v NVM_DIR="${NVM_DIR}" -v RS=: '
|
||||
command printf %s "${1-}" | command awk -v NVM_DIR="${NVM_DIR}" -v RS=: '
|
||||
index($0, NVM_DIR) == 1 {
|
||||
path = substr($0, length(NVM_DIR) + 1)
|
||||
if (path ~ "^(/versions/[^/]*)?/[^/]*'"${2-}"'.*$") { next }
|
||||
}
|
||||
{ printf "%s%s", sep, $0; sep=RS }')"
|
||||
# mawk does not support RT, so preserve trailing colon manually
|
||||
case "${1-}" in
|
||||
*:) command printf '%s:' "${RESULT}" ;;
|
||||
*) command printf '%s' "${RESULT}" ;;
|
||||
esac
|
||||
# The final RT will contain a colon if the input has a trailing colon, or a null string otherwise
|
||||
{ printf "%s%s", sep, $0; sep=RS } END { printf "%s", RT }'
|
||||
}
|
||||
|
||||
nvm_change_path() {
|
||||
@@ -1156,7 +1133,7 @@ nvm_print_formatted_alias() {
|
||||
fi
|
||||
local ARROW
|
||||
ARROW='->'
|
||||
if [ "${NVM_HAS_COLORS-}" = 1 ] || nvm_has_colors; then
|
||||
if nvm_has_colors; then
|
||||
ARROW='\033[0;90m->\033[0m'
|
||||
if [ "_${DEFAULT}" = '_true' ]; then
|
||||
NEWLINE=" \033[${DEFAULT_COLOR}(default)\033[0m\n"
|
||||
@@ -1257,17 +1234,11 @@ 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_HAS_COLORS="${NVM_HAS_COLORS}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}" &
|
||||
NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}" &
|
||||
done
|
||||
wait
|
||||
) | command sort
|
||||
@@ -1278,7 +1249,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_HAS_COLORS="${NVM_HAS_COLORS}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_default_alias "${ALIAS_NAME}"
|
||||
NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_default_alias "${ALIAS_NAME}"
|
||||
fi
|
||||
} &
|
||||
done
|
||||
@@ -1290,7 +1261,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_HAS_COLORS="${NVM_HAS_COLORS}" NVM_LTS=true nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}")"
|
||||
LTS_ALIAS="$(NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_LTS=true nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}")"
|
||||
if [ -n "${LTS_ALIAS}" ]; then
|
||||
nvm_echo "${LTS_ALIAS}"
|
||||
fi
|
||||
@@ -1323,7 +1294,7 @@ nvm_alias() {
|
||||
return 2
|
||||
fi
|
||||
|
||||
command sed 's/#.*//; s/[[:space:]]*$//' "${NVM_ALIAS_PATH}" | command awk 'NF'
|
||||
command awk 'NF' "${NVM_ALIAS_PATH}"
|
||||
}
|
||||
|
||||
nvm_ls_current() {
|
||||
@@ -1368,7 +1339,7 @@ nvm_resolve_alias() {
|
||||
break
|
||||
fi
|
||||
|
||||
if command printf '%b' "${SEEN_ALIASES}" | nvm_grep -q -e "^${ALIAS_TEMP}$"; then
|
||||
if command printf "${SEEN_ALIASES}" | nvm_grep -q -e "^${ALIAS_TEMP}$"; then
|
||||
ALIAS="∞"
|
||||
break
|
||||
fi
|
||||
@@ -1477,18 +1448,6 @@ nvm_ls() {
|
||||
PATTERN="${PATTERN}-"
|
||||
;;
|
||||
*)
|
||||
local ALIAS_TARGET
|
||||
ALIAS_TARGET="$(nvm_resolve_alias "${PATTERN}" 2>/dev/null || nvm_echo)"
|
||||
if [ "_${ALIAS_TARGET}" = '_system' ] && (nvm_has_system_iojs || nvm_has_system_node); then
|
||||
local SYSTEM_VERSION
|
||||
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
|
||||
if [ -n "${SYSTEM_VERSION}" ]; then
|
||||
nvm_echo "system ${SYSTEM_VERSION}"
|
||||
else
|
||||
nvm_echo "system"
|
||||
fi
|
||||
return
|
||||
fi
|
||||
if nvm_resolve_local_alias "${PATTERN}"; then
|
||||
return
|
||||
fi
|
||||
@@ -1570,7 +1529,7 @@ nvm_ls() {
|
||||
PATTERN='v'
|
||||
SEARCH_PATTERN='.*'
|
||||
else
|
||||
SEARCH_PATTERN="$(nvm_echo "${PATTERN}" | command sed 's#\.#\\\.#g; s|#|\\#|g')"
|
||||
SEARCH_PATTERN="$(nvm_echo "${PATTERN}" | command sed 's#\.#\\\.#g;')"
|
||||
fi
|
||||
if [ -n "${NVM_DIRS_TO_SEARCH1}${NVM_DIRS_TO_SEARCH2}${NVM_DIRS_TO_SEARCH3}" ]; then
|
||||
VERSIONS="$(command find "${NVM_DIRS_TO_SEARCH1}"/* "${NVM_DIRS_TO_SEARCH2}"/* "${NVM_DIRS_TO_SEARCH3}"/* -name . -o -type d -prune -o -path "${PATTERN}*" \
|
||||
@@ -1592,24 +1551,13 @@ nvm_ls() {
|
||||
fi
|
||||
|
||||
if [ "${NVM_ADD_SYSTEM-}" = true ]; then
|
||||
local SYSTEM_VERSION
|
||||
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
|
||||
case "${PATTERN}" in
|
||||
'' | v)
|
||||
if [ -n "${SYSTEM_VERSION}" ]; then
|
||||
VERSIONS="${VERSIONS}
|
||||
system ${SYSTEM_VERSION}"
|
||||
else
|
||||
VERSIONS="${VERSIONS}
|
||||
VERSIONS="${VERSIONS}
|
||||
system"
|
||||
fi
|
||||
;;
|
||||
system)
|
||||
if [ -n "${SYSTEM_VERSION}" ]; then
|
||||
VERSIONS="system ${SYSTEM_VERSION}"
|
||||
else
|
||||
VERSIONS="system"
|
||||
fi
|
||||
VERSIONS="system"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
@@ -1935,71 +1883,84 @@ nvm_print_versions() {
|
||||
fi
|
||||
|
||||
command awk \
|
||||
-v remote_versions="$(printf '%s' "${1-}" | tr '\n' '|')" \
|
||||
-v remote_versions="$(printf '%s' "${1-}" | tr '\n' '|')" -v min="${NVM_MIN:-v0}" \
|
||||
-v installed_versions="$(nvm_ls | tr '\n' '|')" -v current="$NVM_CURRENT" \
|
||||
-v installed_color="$INSTALLED_COLOR" -v system_color="$SYSTEM_COLOR" \
|
||||
-v current_color="$CURRENT_COLOR" -v default_color="$DEFAULT_COLOR" \
|
||||
-v old_lts_color="$DEFAULT_COLOR" -v has_colors="$NVM_HAS_COLORS" '
|
||||
function alen(arr, i, len) { len=0; for(i in arr) len++; return len; }
|
||||
BEGIN {
|
||||
fmt_installed = has_colors ? (installed_color ? "\033[" installed_color "%15s\033[0m" : "%15s") : "%15s *";
|
||||
fmt_system = has_colors ? (system_color ? "\033[" system_color "%15s\033[0m" : "%15s") : "%15s *";
|
||||
fmt_current = has_colors ? (current_color ? "\033[" current_color "->%13s\033[0m" : "%15s") : "->%13s *";
|
||||
function alen(arr, i, len) { len=0; for(i in arr) len++; return len; }
|
||||
function v2a(v, a) { sub(/^(iojs-)?v/, "", v); split(v, a, "."); }
|
||||
function v2m(v, a) { sub(/^(iojs-)?v/, "", v); split(v, a, "."); return a[1]; }
|
||||
function vcmp(v1,v2,a1,a2,i,d) { v2a(v1,a1); v2a(v2,a2); for(i=1;i<4;i++) { d = a1[i] - a2[i]; if(d!=0) return d; } return 0; }
|
||||
BEGIN {
|
||||
fmt_installed = has_colors ? (installed_color ? "\033[" installed_color "%15s\033[0m" : "%15s") : "%15s *";
|
||||
fmt_system = has_colors ? (system_color ? "\033[" system_color "%15s\033[0m" : "%15s") : "%15s *";
|
||||
fmt_current = has_colors ? (current_color ? "\033[" current_color "->%13s\033[0m" : "%15s") : "->%13s *";
|
||||
|
||||
latest_lts_color = current_color;
|
||||
sub(/0;/, "1;", latest_lts_color);
|
||||
latest_lts_color = current_color;
|
||||
sub(/0;/, "1;", latest_lts_color);
|
||||
|
||||
fmt_latest_lts = has_colors && latest_lts_color ? ("\033[" latest_lts_color " (Latest LTS: %s)\033[0m") : " (Latest LTS: %s)";
|
||||
fmt_old_lts = has_colors && old_lts_color ? ("\033[" old_lts_color " (LTS: %s)\033[0m") : " (LTS: %s)";
|
||||
fmt_system_target = has_colors && system_color ? (" (\033[" system_color "-> %s\033[0m)") : " (-> %s)";
|
||||
fmt_latest_lts = has_colors && latest_lts_color ? ("\033[" latest_lts_color " (Latest LTS: %s)\033[0m") : " (Latest LTS: %s)";
|
||||
fmt_old_lts = has_colors && old_lts_color ? ("\033[" old_lts_color " (LTS: %s)\033[0m") : " (LTS: %s)";
|
||||
|
||||
split(remote_versions, lines, "|");
|
||||
split(installed_versions, installed, "|");
|
||||
rows = alen(lines);
|
||||
|
||||
for (n = 1; n <= rows; n++) {
|
||||
split(lines[n], fields, "[[:blank:]]+");
|
||||
cols = alen(fields);
|
||||
version = fields[1];
|
||||
is_installed = 0;
|
||||
|
||||
for (i in installed) {
|
||||
if (version == installed[i]) {
|
||||
is_installed = 1;
|
||||
break;
|
||||
split(remote_versions, lines, "|");
|
||||
split(installed_versions, installed, "|");
|
||||
rows = alen(lines);
|
||||
filter_on = (vcmp("v0.0.0", min) != 0);
|
||||
current_major = -1;
|
||||
for (m = n = 1; n <= rows; n++) {
|
||||
split(lines[n], fields, "[[:blank:]]+");
|
||||
cols = alen(fields);
|
||||
version = fields[1];
|
||||
is_installed = 0;
|
||||
for (i in installed) {
|
||||
if (version == installed[i]) {
|
||||
is_installed = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (filter_on != 0) {
|
||||
if (is_installed) {
|
||||
current_major = v2m(version);
|
||||
} else if (vcmp(version, min) >= 0) {
|
||||
filter_on = 0;
|
||||
} else if (v2m(version) != current_major) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
fmt_version = "%15s";
|
||||
if (version == current) {
|
||||
fmt_version = fmt_current;
|
||||
} else if (version == "system") {
|
||||
fmt_version = fmt_system;
|
||||
} else if (is_installed) {
|
||||
fmt_version = fmt_installed;
|
||||
}
|
||||
|
||||
padding = (is_installed && !has_colors) ? "" : " ";
|
||||
if (cols == 1) {
|
||||
formatted = sprintf(fmt_version, version);
|
||||
} else if (cols == 2) {
|
||||
formatted = sprintf((fmt_version padding fmt_old_lts), version, fields[2]);
|
||||
} else if (cols == 3 && fields[3] == "*") {
|
||||
formatted = sprintf((fmt_version padding fmt_latest_lts), version, fields[2]);
|
||||
}
|
||||
|
||||
output[m++] = formatted;
|
||||
}
|
||||
|
||||
fmt_version = "%15s";
|
||||
if (version == current) {
|
||||
fmt_version = fmt_current;
|
||||
} else if (version == "system") {
|
||||
fmt_version = fmt_system;
|
||||
} else if (is_installed) {
|
||||
fmt_version = fmt_installed;
|
||||
for (n = 1; n < m; n++) {
|
||||
print output[n]
|
||||
}
|
||||
|
||||
padding = (!has_colors && is_installed) ? "" : " ";
|
||||
|
||||
if (cols == 1) {
|
||||
formatted = sprintf(fmt_version, version);
|
||||
} else if (version == "system" && cols >= 2) {
|
||||
formatted = sprintf((fmt_version fmt_system_target), version, fields[2]);
|
||||
} else if (cols == 2) {
|
||||
formatted = sprintf((fmt_version padding fmt_old_lts), version, fields[2]);
|
||||
} else if (cols == 3 && fields[3] == "*") {
|
||||
formatted = sprintf((fmt_version padding fmt_latest_lts), version, fields[2]);
|
||||
if (rows > --m) {
|
||||
printf("[INFO] showing %d (of %d) versions.\n", m, rows) > "/dev/stderr"
|
||||
}
|
||||
|
||||
output[n] = formatted;
|
||||
}
|
||||
|
||||
for (n = 1; n <= rows; n++) {
|
||||
print output[n]
|
||||
}
|
||||
|
||||
exit
|
||||
}'
|
||||
exit
|
||||
}'
|
||||
}
|
||||
|
||||
nvm_validate_implicit_alias() {
|
||||
@@ -2162,7 +2123,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 [ "$(command uname)" = "Linux" ] \
|
||||
if [ "$(uname)" = "Linux" ] \
|
||||
&& [ "${NVM_ARCH}" = arm64 ] \
|
||||
&& [ "$(command od -An -t x1 -j 4 -N 1 "/sbin/init" 2>/dev/null)" = ' 01' ]\
|
||||
; then
|
||||
@@ -2171,10 +2132,7 @@ nvm_get_arch() {
|
||||
fi
|
||||
|
||||
if [ -f "/etc/alpine-release" ]; then
|
||||
# Alpine Linux uses musl libc; only x64-musl binaries are available
|
||||
case "${NVM_ARCH}" in
|
||||
x64) NVM_ARCH=x64-musl ;;
|
||||
esac
|
||||
NVM_ARCH=x64-musl
|
||||
fi
|
||||
|
||||
nvm_echo "${NVM_ARCH}"
|
||||
@@ -2250,7 +2208,7 @@ nvm_get_mirror() {
|
||||
esac
|
||||
|
||||
|
||||
if ! nvm_echo "${NVM_MIRROR}" | command awk '{ if ($0 !~ /^https?:\/\/[a-zA-Z0-9.\/_-]+$/) exit 1 }'; then
|
||||
if ! nvm_echo "${NVM_MIRROR}" | command awk '{ $0 ~ "^https?://[a-zA-Z0-9./_-]+$" }'; then
|
||||
nvm_err '$NVM_NODEJS_ORG_MIRROR and $NVM_IOJS_ORG_MIRROR may only contain a URL'
|
||||
return 2
|
||||
fi
|
||||
@@ -2282,7 +2240,7 @@ nvm_install_binary_extract() {
|
||||
command mkdir -p "${TMPDIR}" && \
|
||||
VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" || return 1
|
||||
|
||||
# For Windows system (Git Bash with MSYS, Cygwin)
|
||||
# For Windows system (GitBash with MSYS, Cygwin)
|
||||
if [ "${NVM_OS}" = 'win' ]; then
|
||||
VERSION_PATH="${VERSION_PATH}/bin"
|
||||
command unzip -q "${TARBALL}" -d "${TMPDIR}" || return 1
|
||||
@@ -2374,7 +2332,7 @@ nvm_install_binary() {
|
||||
# Read nosource from arguments
|
||||
if [ "${nosource-}" = '1' ]; then
|
||||
nvm_err 'Binary download failed. Download from source aborted.'
|
||||
return 2
|
||||
return 0
|
||||
fi
|
||||
|
||||
nvm_err 'Binary download failed, trying source.'
|
||||
@@ -2502,35 +2460,22 @@ 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}"
|
||||
@@ -2552,11 +2497,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}"
|
||||
@@ -2564,10 +2509,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}"
|
||||
}
|
||||
@@ -2704,24 +2649,18 @@ nvm_install_source() {
|
||||
NVM_OS="$(nvm_get_os)"
|
||||
|
||||
local make
|
||||
make='make'
|
||||
local MAKE_CXX
|
||||
# For old Node.js versions (< 0.12), explicitly set SHELL=/bin/sh to avoid
|
||||
# issues with zsh's strict glob handling in Makefiles with unquoted globs
|
||||
local MAKE_SHELL_OVERRIDE
|
||||
if nvm_version_greater "0.12.0" "${VERSION}"; then
|
||||
MAKE_SHELL_OVERRIDE=' SHELL=/bin/sh'
|
||||
fi
|
||||
make="make${MAKE_SHELL_OVERRIDE-}"
|
||||
case "${NVM_OS}" in
|
||||
'freebsd' | 'openbsd')
|
||||
make="gmake${MAKE_SHELL_OVERRIDE-}"
|
||||
make='gmake'
|
||||
MAKE_CXX="CC=${CC:-cc} CXX=${CXX:-c++}"
|
||||
;;
|
||||
'darwin')
|
||||
MAKE_CXX="CC=${CC:-cc} CXX=${CXX:-c++}"
|
||||
;;
|
||||
'aix')
|
||||
make="gmake${MAKE_SHELL_OVERRIDE-}"
|
||||
make='gmake'
|
||||
;;
|
||||
esac
|
||||
if nvm_has "clang++" && nvm_has "clang" && nvm_version_greater_than_or_equal_to "$(nvm_clang_version)" 3.5; then
|
||||
@@ -2967,7 +2906,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
|
||||
|
||||
@@ -3062,8 +3001,7 @@ nvm_check_file_permissions() {
|
||||
if [ ! -L "${FILE}" ] && ! nvm_check_file_permissions "${FILE}"; then
|
||||
return 2
|
||||
fi
|
||||
elif [ -e "$FILE" ] && [ ! -w "$FILE" ] && [ -z "$(command find "${FILE}" -prune -user "$(command id -u)")" ]; then
|
||||
# ^ file ownership check from https://www.shellcheck.net/wiki/SC3067
|
||||
elif [ -e "$FILE" ] && [ ! -w "$FILE" ] && [ ! -O "$FILE" ]; then
|
||||
nvm_err "file is not writable or self-owned: $(nvm_sanitize_path "$FILE")"
|
||||
return 1
|
||||
fi
|
||||
@@ -3075,57 +3013,6 @@ 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
|
||||
@@ -3206,7 +3093,6 @@ 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'
|
||||
@@ -3236,6 +3122,7 @@ nvm() {
|
||||
nvm_echo ' nvm ls-remote [<version>] List remote versions available for install, matching a given <version> if provided'
|
||||
nvm_echo ' --lts When listing, only show LTS (long-term support) versions'
|
||||
nvm_echo ' --lts=<LTS name> When listing, only show versions for a specific LTS line'
|
||||
nvm_echo ' --min=<version> When listing, only show versions greater than or equal to <version>, including minor/patch updates for installed versions'
|
||||
nvm_echo ' --no-colors Suppress colored output'
|
||||
nvm_echo ' nvm version <version> Resolve the given description to a single local version'
|
||||
nvm_echo ' nvm version-remote <version> Resolve the given description to a single remote version'
|
||||
@@ -3332,10 +3219,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)'"
|
||||
@@ -3412,6 +3299,11 @@ 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
|
||||
@@ -3419,11 +3311,9 @@ 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
|
||||
@@ -3445,7 +3335,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
|
||||
;;
|
||||
@@ -3453,7 +3343,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
|
||||
;;
|
||||
@@ -3466,10 +3356,6 @@ nvm() {
|
||||
noprogress=1
|
||||
shift
|
||||
;;
|
||||
--offline)
|
||||
NVM_OFFLINE=1
|
||||
shift
|
||||
;;
|
||||
--lts)
|
||||
LTS='*'
|
||||
shift
|
||||
@@ -3546,11 +3432,6 @@ 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-}"
|
||||
|
||||
@@ -3566,11 +3447,14 @@ nvm() {
|
||||
shift
|
||||
fi
|
||||
else
|
||||
{ provided_version="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
if [ $version_not_provided -eq 1 ] && [ -z "${provided_version}" ]; then
|
||||
nvm_rc_version
|
||||
if [ $version_not_provided -eq 1 ] && [ -z "${NVM_RC_VERSION}" ]; then
|
||||
unset NVM_RC_VERSION
|
||||
>&2 nvm --help
|
||||
return 127
|
||||
fi
|
||||
provided_version="${NVM_RC_VERSION}"
|
||||
unset NVM_RC_VERSION
|
||||
fi
|
||||
elif [ $# -gt 0 ]; then
|
||||
shift
|
||||
@@ -3588,27 +3472,8 @@ nvm() {
|
||||
esac
|
||||
|
||||
local 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
|
||||
VERSION="$(NVM_VERSION_ONLY=true NVM_LTS="${LTS-}" nvm_remote_version "${provided_version}")"
|
||||
EXIT_CODE="$?"
|
||||
|
||||
if [ "${VERSION}" = 'N/A' ] || [ $EXIT_CODE -ne 0 ]; then
|
||||
local LTS_MSG
|
||||
@@ -3624,17 +3489,9 @@ nvm() {
|
||||
return 3
|
||||
fi
|
||||
else
|
||||
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."
|
||||
REMOTE_CMD='nvm ls-remote'
|
||||
fi
|
||||
nvm_err "Version '${provided_version}' ${LTS_MSG-}not found - try \`${REMOTE_CMD}\` to browse available versions."
|
||||
return 3
|
||||
fi
|
||||
|
||||
@@ -3774,7 +3631,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_OFFLINE="${NVM_OFFLINE}" nvm_install_binary "${FLAVOR}" std "${VERSION}" "${nosource}"
|
||||
NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" nvm_install_binary "${FLAVOR}" std "${VERSION}" "${nosource}"
|
||||
EXIT_CODE=$?
|
||||
else
|
||||
EXIT_CODE=-1
|
||||
@@ -3793,7 +3650,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_OFFLINE="${NVM_OFFLINE}" nvm_install_source "${FLAVOR}" std "${VERSION}" "${NVM_MAKE_JOBS}" "${ADDITIONAL_PARAMETERS}"
|
||||
NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" nvm_install_source "${FLAVOR}" std "${VERSION}" "${NVM_MAKE_JOBS}" "${ADDITIONAL_PARAMETERS}"
|
||||
EXIT_CODE=$?
|
||||
fi
|
||||
fi
|
||||
@@ -3858,13 +3715,7 @@ nvm() {
|
||||
fi
|
||||
|
||||
if ! nvm_is_version_installed "${VERSION}"; then
|
||||
local REQUESTED_VERSION
|
||||
REQUESTED_VERSION="${PATTERN}"
|
||||
if [ "_${VERSION}" != "_N/A" ] && [ "_${VERSION}" != "_${PATTERN}" ]; then
|
||||
nvm_err "Version '${VERSION}' (inferred from ${PATTERN}) is not installed."
|
||||
else
|
||||
nvm_err "Version '${REQUESTED_VERSION}' is not installed."
|
||||
fi
|
||||
nvm_err "${VERSION} version is not installed..."
|
||||
return
|
||||
fi
|
||||
|
||||
@@ -3906,7 +3757,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
|
||||
;;
|
||||
@@ -4001,11 +3852,13 @@ nvm() {
|
||||
if [ -n "${NVM_LTS-}" ]; then
|
||||
VERSION="$(nvm_match_version "lts/${NVM_LTS:-*}")"
|
||||
elif [ -z "${PROVIDED_VERSION-}" ]; then
|
||||
{ PROVIDED_VERSION="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
if [ -n "${PROVIDED_VERSION}" ]; then
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version
|
||||
if [ -n "${NVM_RC_VERSION-}" ]; then
|
||||
PROVIDED_VERSION="${NVM_RC_VERSION}"
|
||||
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
|
||||
@@ -4133,11 +3986,11 @@ nvm() {
|
||||
done
|
||||
|
||||
if [ $# -lt 1 ] && [ -z "${NVM_LTS-}" ]; then
|
||||
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}")" ||:
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version && 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
|
||||
return 127
|
||||
@@ -4151,11 +4004,12 @@ nvm() {
|
||||
if [ "_${VERSION:-N/A}" = '_N/A' ] && ! nvm_is_valid_version "${provided_version}"; then
|
||||
provided_version=''
|
||||
if [ $has_checked_nvmrc -ne 1 ]; then
|
||||
{ NVM_RC_VERSION="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1 && has_checked_nvmrc=1
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version && has_checked_nvmrc=1
|
||||
fi
|
||||
provided_version="${NVM_RC_VERSION}"
|
||||
IS_VERSION_FROM_NVMRC=1
|
||||
VERSION="$(nvm_version "${NVM_RC_VERSION}")" ||:
|
||||
unset NVM_RC_VERSION
|
||||
else
|
||||
shift
|
||||
fi
|
||||
@@ -4216,7 +4070,9 @@ nvm() {
|
||||
elif [ -n "${provided_version}" ]; then
|
||||
VERSION="$(nvm_version "${provided_version}")" ||:
|
||||
if [ "_${VERSION}" = '_N/A' ] && ! nvm_is_valid_version "${provided_version}"; then
|
||||
{ provided_version="$(NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version 3>&1 1>&4)"; } 4>&1 && has_checked_nvmrc=1
|
||||
NVM_SILENT="${NVM_SILENT:-0}" nvm_rc_version && has_checked_nvmrc=1
|
||||
provided_version="${NVM_RC_VERSION}"
|
||||
unset NVM_RC_VERSION
|
||||
VERSION="$(nvm_version "${provided_version}")" ||:
|
||||
else
|
||||
shift
|
||||
@@ -4285,6 +4141,10 @@ nvm() {
|
||||
local NVM_LTS
|
||||
local PATTERN
|
||||
local NVM_NO_COLORS
|
||||
local NVM_MIN_ENV
|
||||
NVM_MIN_ENV="${NVM_MIN-}"
|
||||
local NVM_MIN
|
||||
NVM_MIN="${NVM_MIN_ENV-}"
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "${1-}" in
|
||||
@@ -4295,6 +4155,9 @@ nvm() {
|
||||
--lts=*)
|
||||
NVM_LTS="${1##--lts=}"
|
||||
;;
|
||||
--min=*)
|
||||
NVM_MIN="${1##--min=}"
|
||||
;;
|
||||
--no-colors) NVM_NO_COLORS="${1}" ;;
|
||||
--*)
|
||||
nvm_err "Unsupported option \"${1}\"."
|
||||
@@ -4347,10 +4210,12 @@ nvm() {
|
||||
shift
|
||||
done
|
||||
if [ -z "${provided_version-}" ]; then
|
||||
{ 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}") ||:
|
||||
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}") ||:
|
||||
fi
|
||||
unset NVM_RC_VERSION
|
||||
elif [ "${provided_version}" != 'system' ]; then
|
||||
VERSION="$(nvm_version "${provided_version}")" ||:
|
||||
else
|
||||
@@ -4374,7 +4239,7 @@ nvm() {
|
||||
nvm_err 'System version of node not found.'
|
||||
return 127
|
||||
elif [ "${VERSION}" = '∞' ]; then
|
||||
nvm_err "The alias \"${provided_version}\" leads to an infinite loop. Aborting."
|
||||
nvm_err "The alias \"${2}\" leads to an infinite loop. Aborting."
|
||||
return 8
|
||||
fi
|
||||
|
||||
@@ -4597,7 +4462,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.2'
|
||||
;;
|
||||
"unload")
|
||||
nvm deactivate >/dev/null 2>&1
|
||||
@@ -4620,7 +4485,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_ls_cached nvm_offline_version \
|
||||
nvm_ensure_version_installed nvm_cache_dir \
|
||||
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 \
|
||||
@@ -4645,7 +4510,7 @@ nvm() {
|
||||
nvm_process_nvmrc nvm_nvmrc_invalid_msg \
|
||||
nvm_write_nvmrc \
|
||||
>/dev/null 2>&1
|
||||
unset NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
|
||||
unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
|
||||
NVM_CD_FLAGS NVM_BIN NVM_INC NVM_MAKE_JOBS \
|
||||
NVM_COLORS INSTALLED_COLOR SYSTEM_COLOR \
|
||||
CURRENT_COLOR NOT_INSTALLED_COLOR DEFAULT_COLOR LTS_COLOR \
|
||||
@@ -4673,9 +4538,9 @@ nvm_get_default_packages() {
|
||||
NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages"
|
||||
if [ -f "${NVM_DEFAULT_PACKAGE_FILE}" ]; then
|
||||
command awk -v filename="${NVM_DEFAULT_PACKAGE_FILE}" '
|
||||
/^[ \t]*#/ { next } # Skip lines that begin with #
|
||||
/^[ \t]*$/ { next } # Skip empty lines
|
||||
/[ \t]/ && !/^[ \t]*#/ {
|
||||
/^[[:space:]]*#/ { next } # Skip lines that begin with #
|
||||
/^[[:space:]]*$/ { next } # Skip empty lines
|
||||
/[[:space:]]/ && !/^[[:space:]]*#/ {
|
||||
print "Only one package per line is allowed in `" filename "`. Please remove any lines with multiple space-separated values." > "/dev/stderr"
|
||||
err = 1
|
||||
exit 1
|
||||
@@ -4777,7 +4642,7 @@ nvm_auto() {
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
elif nvm_rc_version 3>/dev/null >/dev/null 2>&1; then
|
||||
elif nvm_rc_version >/dev/null 2>&1; then
|
||||
nvm use --silent >/dev/null
|
||||
fi
|
||||
else
|
||||
@@ -4789,7 +4654,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 3>/dev/null >/dev/null 2>&1; then
|
||||
elif nvm_rc_version >/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.2",
|
||||
"description": "Node Version Manager - Simple bash script to manage multiple active node.js versions",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
@@ -45,9 +45,9 @@
|
||||
"dockerfile_lint": "^0.3.4",
|
||||
"doctoc": "^2.2.1",
|
||||
"eclint": "^2.8.1",
|
||||
"markdown-link-check": "^3.14.2",
|
||||
"markdown-link-check": "^3.13.7",
|
||||
"replace": "^1.2.2",
|
||||
"semver": "^7.7.3",
|
||||
"semver": "^7.7.1",
|
||||
"urchin": "^0.0.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,3 @@
|
||||
# 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
|
||||
|
||||
@@ -4,7 +4,6 @@ die() { echo "$@" ; exit 1; }
|
||||
|
||||
export NVM_DIR="$(cd ../../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. "${NVM_DIR}/nvm.sh"
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
try_err nvm alias foo#bar baz
|
||||
OUTPUT="$(nvm alias foo#bar baz 2>&1)"
|
||||
EXPECTED_OUTPUT="Aliases with a comment delimiter (#) are not supported."
|
||||
[ "$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'"
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias with a hash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
try_err nvm alias foo# baz
|
||||
EXPECTED_OUTPUT="Aliases with a comment delimiter (#) are not supported."
|
||||
[ "$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#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'"
|
||||
|
||||
try_err nvm alias \#bar baz
|
||||
OUTPUT="$(nvm alias foo# baz 2>&1)"
|
||||
EXPECTED_OUTPUT="Aliases with a comment delimiter (#) are not supported."
|
||||
[ "$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'"
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias ending with a hash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
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)"
|
||||
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'"
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
try_err nvm alias foo/bar baz
|
||||
OUTPUT="$(nvm alias foo/bar baz 2>&1)"
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$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'"
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
try_err nvm alias foo/ baz
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$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/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'"
|
||||
|
||||
try_err nvm alias /bar baz
|
||||
OUTPUT="$(nvm alias foo/ baz 2>&1)"
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$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'"
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to create an alias ending with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
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)"
|
||||
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'"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
@@ -1,23 +1,26 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
try_err nvm unalias foo/bar
|
||||
OUTPUT="$(nvm unalias foo/bar 2>&1)"
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$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'"
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
try_err nvm unalias foo/
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$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/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'"
|
||||
|
||||
try_err nvm unalias /bar
|
||||
OUTPUT="$(nvm unalias foo/ 2>&1)"
|
||||
EXPECTED_OUTPUT="Aliases in subdirectories are not supported."
|
||||
[ "$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'"
|
||||
[ "$OUTPUT" = "$EXPECTED_OUTPUT" ] || die "trying to remove an alias ending with a slash should fail with '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
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)"
|
||||
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'"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
@@ -15,11 +14,11 @@ fi
|
||||
nvm alias test-stable-1 0.0.2 || die '`nvm alias test-stable-1 0.0.2` failed'
|
||||
|
||||
OUTPUT="$(nvm alias test-stable-1 | strip_colors)"
|
||||
EXPECTED_OUTPUT='test-stable-1 -> 0.0.2 (-> v0.0.2 *)'
|
||||
EXPECTED_OUTPUT='test-stable-1 -> 0.0.2 (-> v0.0.2)'
|
||||
echo "$OUTPUT" | \grep -F "$EXPECTED_OUTPUT" || die "nvm alias test-stable-1 0.0.2 did not set test-stable-1 to 0.0.2: got '$OUTPUT'"
|
||||
|
||||
nvm alias test-stable-1 0.0.1 || die '`nvm alias test-stable-1 0.0.1` failed'
|
||||
|
||||
OUTPUT="$(nvm alias test-stable-1 | strip_colors)"
|
||||
EXPECTED_OUTPUT='test-stable-1 -> 0.0.1 (-> v0.0.1 *)'
|
||||
EXPECTED_OUTPUT='test-stable-1 -> 0.0.1 (-> v0.0.1)'
|
||||
echo "$OUTPUT" | \grep -F "$EXPECTED_OUTPUT" || die "nvm alias test-stable-1 0.0.1 did not set test-stable-1 to 0.0.1: got '$OUTPUT'"
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
[ $(nvm alias test-stable-1 | wc -l) = '2' ]
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
@@ -10,18 +9,18 @@ NVM_ALIAS_OUTPUT=$(nvm alias | strip_colors)
|
||||
|
||||
EXPECTED_STABLE="$(nvm_print_implicit_alias local stable)"
|
||||
STABLE_VERSION="$(nvm_version "$EXPECTED_STABLE")"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "stable -> $EXPECTED_STABLE (-> $STABLE_VERSION *) (default)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "stable -> $EXPECTED_STABLE (-> $STABLE_VERSION) (default)" \
|
||||
|| die "nvm alias did not contain the default local stable node version; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "node -> stable (-> $STABLE_VERSION *) (default)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "node -> stable (-> $STABLE_VERSION) (default)" \
|
||||
|| die "nvm alias did not contain the default local stable node version under 'node'; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
EXPECTED_UNSTABLE="$(nvm_print_implicit_alias local unstable)"
|
||||
UNSTABLE_VERSION="$(nvm_version "$EXPECTED_UNSTABLE")"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "unstable -> $EXPECTED_UNSTABLE (-> $UNSTABLE_VERSION *) (default)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "unstable -> $EXPECTED_UNSTABLE (-> $UNSTABLE_VERSION) (default)" \
|
||||
|| die "nvm alias did not contain the default local unstable node version; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
EXPECTED_IOJS="$(nvm_print_implicit_alias local iojs)"
|
||||
IOJS_VERSION="$(nvm_version "$EXPECTED_IOJS")"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "iojs -> $EXPECTED_IOJS (-> $IOJS_VERSION *) (default)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F "iojs -> $EXPECTED_IOJS (-> $IOJS_VERSION) (default)" \
|
||||
|| die "nvm alias did not contain the default local iojs version; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
@@ -35,16 +34,16 @@ nvm alias iojs unstable
|
||||
|
||||
NVM_ALIAS_OUTPUT=$(nvm alias | strip_colors)
|
||||
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "stable -> $EXPECTED_UNSTABLE (-> $UNSTABLE_VERSION *)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "stable -> $EXPECTED_UNSTABLE (-> $UNSTABLE_VERSION)" \
|
||||
|| die "nvm alias did not contain the overridden 'stable' alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "unstable -> $EXPECTED_STABLE (-> $STABLE_VERSION *)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "unstable -> $EXPECTED_STABLE (-> $STABLE_VERSION)" \
|
||||
|| die "nvm alias did not contain the overridden 'unstable' alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "node -> stable (-> $UNSTABLE_VERSION *)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "node -> stable (-> $UNSTABLE_VERSION)" \
|
||||
|| die "nvm alias did not contain the overridden 'node' alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "iojs -> unstable (-> $STABLE_VERSION *)" \
|
||||
echo "$NVM_ALIAS_OUTPUT" | command grep -F "iojs -> unstable (-> $STABLE_VERSION)" \
|
||||
|| die "nvm alias did not contain the overridden 'iojs' alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -1,49 +1,48 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
NVM_ALIAS_OUTPUT="$(nvm alias | strip_colors)"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-1 -> 0.0.1 (-> v0.0.1 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-1 -> 0.0.1 (-> v0.0.1)' \
|
||||
|| die "did not find test-stable-1 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-2 -> 0.0.2 (-> v0.0.2 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-2 -> 0.0.2 (-> v0.0.2)' \
|
||||
|| die "did not find test-stable-2 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-3 -> 0.0.3 (-> v0.0.3 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-3 -> 0.0.3 (-> v0.0.3)' \
|
||||
|| die "did not find test-stable-3 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-4 -> 0.0.4 (-> v0.0.4 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-4 -> 0.0.4 (-> v0.0.4)' \
|
||||
|| die "did not find test-stable-4 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-5 -> 0.0.5 (-> v0.0.5 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-5 -> 0.0.5 (-> v0.0.5)' \
|
||||
|| die "did not find test-stable-5 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-6 -> 0.0.6 (-> v0.0.6 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-6 -> 0.0.6 (-> v0.0.6)' \
|
||||
|| die "did not find test-stable-6 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-7 -> 0.0.7 (-> v0.0.7 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-7 -> 0.0.7 (-> v0.0.7)' \
|
||||
|| die "did not find test-stable-7 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-8 -> 0.0.8 (-> v0.0.8 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-8 -> 0.0.8 (-> v0.0.8)' \
|
||||
|| die "did not find test-stable-8 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-9 -> 0.0.9 (-> v0.0.9 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-9 -> 0.0.9 (-> v0.0.9)' \
|
||||
|| die "did not find test-stable-9 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-10 -> 0.0.10 (-> v0.0.10 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-stable-10 -> 0.0.10 (-> v0.0.10)' \
|
||||
|| die "did not find test-stable-10 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-1 -> 0.1.1 (-> v0.1.1 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-1 -> 0.1.1 (-> v0.1.1)' \
|
||||
|| die "did not find test-unstable-1 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-2 -> 0.1.2 (-> v0.1.2 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-2 -> 0.1.2 (-> v0.1.2)' \
|
||||
|| die "did not find test-unstable-2 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-3 -> 0.1.3 (-> v0.1.3 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-3 -> 0.1.3 (-> v0.1.3)' \
|
||||
|| die "did not find test-unstable-3 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-4 -> 0.1.4 (-> v0.1.4 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-4 -> 0.1.4 (-> v0.1.4)' \
|
||||
|| die "did not find test-unstable-4 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-5 -> 0.1.5 (-> v0.1.5 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-5 -> 0.1.5 (-> v0.1.5)' \
|
||||
|| die "did not find test-unstable-5 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-6 -> 0.1.6 (-> v0.1.6 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-6 -> 0.1.6 (-> v0.1.6)' \
|
||||
|| die "did not find test-unstable-6 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-7 -> 0.1.7 (-> v0.1.7 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-7 -> 0.1.7 (-> v0.1.7)' \
|
||||
|| die "did not find test-unstable-7 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-8 -> 0.1.8 (-> v0.1.8 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-8 -> 0.1.8 (-> v0.1.8)' \
|
||||
|| die "did not find test-unstable-8 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-9 -> 0.1.9 (-> v0.1.9 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-9 -> 0.1.9 (-> v0.1.9)' \
|
||||
|| die "did not find test-unstable-9 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-10 -> 0.1.10 (-> v0.1.10 *)' \
|
||||
echo "$NVM_ALIAS_OUTPUT" | \grep -F 'test-unstable-10 -> 0.1.10 (-> v0.1.10)' \
|
||||
|| die "did not find test-unstable-10 alias; got '$NVM_ALIAS_OUTPUT'"
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../../nvm.sh
|
||||
|
||||
ALIAS="$(nvm_resolve_alias loopback | strip_colors)"
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../../nvm.sh
|
||||
|
||||
ALIAS="$(nvm_resolve_local_alias loopback | strip_colors)"
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
set -ex
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../../nvm.sh
|
||||
\. ../../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../../nvm.sh
|
||||
|
||||
LTS_ALIAS_PATH="$(nvm_alias_path)/lts"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../../nvm.sh
|
||||
|
||||
LTS_ALIAS_PATH="$(nvm_alias_path)/lts"
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm alias default 0.1 >/dev/null || die "'nvm alias default 0.1' failed"
|
||||
@@ -14,7 +13,7 @@ nvm_ensure_default_set 0.3 || die "'nvm_ensure_default_set' with an existing def
|
||||
nvm unalias default || die "'nvm unalias default' failed"
|
||||
|
||||
OUTPUT="$(nvm_ensure_default_set 0.2)"
|
||||
EXPECTED_OUTPUT="Creating default alias: default -> 0.2 (-> iojs-v0.2.10 *)"
|
||||
EXPECTED_OUTPUT="Creating default alias: default -> 0.2 (-> iojs-v0.2.10)"
|
||||
EXIT_CODE="$?"
|
||||
|
||||
[ "_$(echo "$OUTPUT" | strip_colors)" = "_$EXPECTED_OUTPUT" ] || die "'nvm_ensure_default_set 0.2' did not output '$EXPECTED_OUTPUT', got '$OUTPUT'"
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
set -e
|
||||
|
||||
nvm_has_colors() { return 0; }
|
||||
|
||||
nvm_get_colors(){
|
||||
echo "0;95m"
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
#!/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
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () {
|
||||
@@ -11,8 +10,6 @@ die () {
|
||||
|
||||
set -e
|
||||
|
||||
nvm_has_colors() { return 0; }
|
||||
|
||||
nvm_get_colors(){
|
||||
echo "0;95m"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
die () {
|
||||
@@ -9,9 +8,6 @@ die () {
|
||||
}
|
||||
|
||||
set -e
|
||||
|
||||
nvm_has_colors() { return 0; }
|
||||
|
||||
# # # expecting in red and two grays:
|
||||
OUTPUT=$(echo $(nvm_print_formatted_alias fakealias fakedest) | awk '{ print substr($0, 1, 21); }')
|
||||
EXPECTED_OUTPUT="$(command printf %b "\033[0;31mfakealias\033[0m ")"
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/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
|
||||
@@ -4,7 +4,6 @@ die () { echo "$@" ; exit 1; }
|
||||
|
||||
export NVM_DIR="$(cd ../../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. "${NVM_DIR}/nvm.sh"
|
||||
|
||||
EXIT_CODE=$(nvm_resolve_alias ; echo $?)
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
EXIT_CODE=$(nvm_resolve_local_alias ; echo $?)
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/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"
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/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"
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo v0.0.1 > ../../../../alias/test-%s-alias
|
||||
echo test-%s-alias > ../../../../alias/test-pct-chain
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
rm -f ../../../../alias/test-%s-alias
|
||||
rm -f ../../../../alias/test-pct-chain
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
export NVM_DIR="$(cd ../../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm which nonexistent_version
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
cleanup() {
|
||||
rm -f "$(nvm_alias_path)/default"
|
||||
if [ -n "${SYSTEM_DIR-}" ]; then
|
||||
rm -rf "${SYSTEM_DIR}"
|
||||
fi
|
||||
if [ -n "${ORIG_PATH-}" ]; then
|
||||
PATH="${ORIG_PATH}"
|
||||
fi
|
||||
}
|
||||
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm_make_alias default system
|
||||
|
||||
ORIG_PATH="${PATH}"
|
||||
SYSTEM_DIR="$(mktemp -d)"
|
||||
cat > "${SYSTEM_DIR}/node" <<'EOF'
|
||||
#!/bin/sh
|
||||
echo v0.0.0
|
||||
EOF
|
||||
chmod +x "${SYSTEM_DIR}/node"
|
||||
PATH="${SYSTEM_DIR}:${PATH}"
|
||||
export PATH
|
||||
|
||||
EXPECTED_OUTPUT="$(command which node)"
|
||||
set +ex # since stderr is needed
|
||||
OUTPUT="$(nvm which default 2>&1)"
|
||||
set -ex
|
||||
[ "${OUTPUT}" = "${EXPECTED_OUTPUT}" ] || die "Could not use system via alias for nvm which. Got >${OUTPUT}<, expected >${EXPECTED_OUTPUT}<"
|
||||
|
||||
cleanup
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
cleanup () {
|
||||
rm -f "$(nvm_alias_path)/default"
|
||||
unset -f nvm_has_system_node node
|
||||
}
|
||||
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
nvm_make_alias default system
|
||||
nvm_has_system_node() { return 0; }
|
||||
node() { command printf 'v0.0.0'; }
|
||||
|
||||
OUTPUT="$(nvm ls default | strip_colors)"
|
||||
echo "${OUTPUT}" | command grep -q 'system' \
|
||||
|| die "Could not list system via alias. Got >${OUTPUT}<"
|
||||
echo "${OUTPUT}" | command grep -q 'v0.0.0' \
|
||||
|| die "Could not list system version via alias. Got >${OUTPUT}<"
|
||||
|
||||
cleanup
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm ls nonexistent_version
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm ls io
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
|
||||
nvm ls node_
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
@@ -39,13 +38,7 @@ iojs-v0.10.2
|
||||
v0.12.9
|
||||
v0.12.87"
|
||||
if nvm_has_system_node || nvm_has_system_iojs; then
|
||||
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
|
||||
if [ -n "${SYSTEM_VERSION}" ]; then
|
||||
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
|
||||
system ${SYSTEM_VERSION}"
|
||||
else
|
||||
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
|
||||
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
|
||||
system"
|
||||
fi
|
||||
fi
|
||||
[ "${OUTPUT-}" = "${EXPECTED_OUTPUT-}" ] || die "expected >${EXPECTED_OUTPUT}<; got >${OUTPUT}<"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
export NVM_DIR="$(cd ../../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
@@ -37,13 +36,7 @@ iojs-v0.10.2
|
||||
v0.12.9
|
||||
v0.12.87"
|
||||
if nvm_has_system_node || nvm_has_system_iojs; then
|
||||
SYSTEM_VERSION="$(nvm deactivate >/dev/null 2>&1 && node -v 2>/dev/null)"
|
||||
if [ -n "${SYSTEM_VERSION}" ]; then
|
||||
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
|
||||
system ${SYSTEM_VERSION}"
|
||||
else
|
||||
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
|
||||
EXPECTED_OUTPUT="${EXPECTED_OUTPUT}
|
||||
system"
|
||||
fi
|
||||
fi
|
||||
[ "${OUTPUT-}" = "${EXPECTED_OUTPUT-}" ] || die "expected >${EXPECTED_OUTPUT}<; got >${OUTPUT}<"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
die () { echo "$@" ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
: nvm.sh
|
||||
\. ../../../nvm.sh
|
||||
\. ../../common.sh
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ set -ex
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
nvm alias test v0.1.2
|
||||
|
||||
@@ -6,7 +6,6 @@ die () { echo "$@" ; exit 1; }
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
nvm deactivate 2>&1
|
||||
|
||||
@@ -6,7 +6,6 @@ die () { echo "$@" ; exit 1; }
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ cleanup () {
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ die () { echo "$@" ; exit 1; }
|
||||
|
||||
export NVM_DIR="$(cd ../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
set +ex # needed for stderr
|
||||
|
||||
@@ -6,7 +6,6 @@ ALIAS_PATH="../../alias"
|
||||
|
||||
echo v0.1.2 > "${ALIAS_PATH}/test"
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
nvm unalias test
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
#!/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"
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
set -ex
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
VERSION='v0.0.1'
|
||||
PATTERN='0.0'
|
||||
|
||||
mkdir -p "${NVM_DIR}/${VERSION}"
|
||||
|
||||
set +ex # needed for stderr
|
||||
RETURN_MESSAGE="$(nvm uninstall "${PATTERN}" 2>&1 || echo)"
|
||||
set -ex
|
||||
EXPECTED_MESSAGE="Version '${VERSION}' (inferred from ${PATTERN}) is not installed."
|
||||
|
||||
[ "${RETURN_MESSAGE}" = "${EXPECTED_MESSAGE}" ]
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
set +ex # needed for stderr
|
||||
RETURN_MESSAGE="$(nvm uninstall 22 2>&1 || echo)"
|
||||
set -ex
|
||||
EXPECTED_MESSAGE="Version '22' is not installed."
|
||||
|
||||
[ "${RETURN_MESSAGE}" = "${EXPECTED_MESSAGE}" ]
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
set -ex
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ typeset -f | awk '/ \(\) $/ && !/^main / {print $1}' > "${BEFORE}"
|
||||
env | grep -v PATH= | grep -v IFS= | grep -v NVM_ | grep -v TRAVIS_ | sort >> "${BEFORE}"
|
||||
|
||||
set +e # TODO: fix
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
set -e
|
||||
|
||||
|
||||
@@ -8,23 +8,32 @@ cleanup() {
|
||||
rm -rf "$(nvm_alias_path)/foo"
|
||||
}
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
\. ../common.sh
|
||||
|
||||
nvm_make_alias foo foo
|
||||
|
||||
try_err nvm use foo
|
||||
set +ex # needed for stderr
|
||||
OUTPUT="$(nvm use foo 2>&1)"
|
||||
set -ex
|
||||
EXPECTED_OUTPUT='The alias "foo" leads to an infinite loop. Aborting.'
|
||||
[ "_${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}"
|
||||
[ "_${OUTPUT}" = "_${EXPECTED_OUTPUT}" ] \
|
||||
|| die "'nvm use foo' did not output >${EXPECTED_OUTPUT}<; got >${OUTPUT}<"
|
||||
|
||||
try_err nvm use --silent foo
|
||||
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
|
||||
EXPECTED_OUTPUT=''
|
||||
[ "_${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}"
|
||||
[ "_${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}"
|
||||
|
||||
cleanup
|
||||
|
||||
@@ -13,7 +13,6 @@ cleanup() {
|
||||
rm -rf "$(nvm_version_path "iojs-${VERSION}")"
|
||||
}
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
nvm deactivate || die "unable to deactivate; current: >$(nvm current)<"
|
||||
|
||||
@@ -7,7 +7,6 @@ cleanup() {
|
||||
}
|
||||
die() { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
nvm_has_system_node() { return 0; }
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
set -ex
|
||||
|
||||
export NVM_SYMLINK_CURRENT=true
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
set -ex
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
\. ../common.sh
|
||||
|
||||
|
||||
@@ -9,22 +9,24 @@ cleanup() {
|
||||
rm .nvmrc
|
||||
}
|
||||
|
||||
: nvm.sh
|
||||
\. ../../nvm.sh
|
||||
|
||||
# normal .nvmrc
|
||||
printf '0.999.0\n' > .nvmrc
|
||||
{ VERSION1="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
nvm_rc_version
|
||||
VERSION1="${NVM_RC_VERSION}"
|
||||
|
||||
# .nvmrc with CR char
|
||||
printf '0.999.0\r\n' > .nvmrc
|
||||
{ VERSION2="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
nvm_rc_version
|
||||
VERSION2="${NVM_RC_VERSION}"
|
||||
|
||||
[ "${VERSION1}" = "${VERSION2}" ]
|
||||
|
||||
# .nvmrc without any newline char
|
||||
printf '0.999.0' > .nvmrc
|
||||
{ VERSION3="$(nvm_rc_version 3>&1 1>&4)"; } 4>&1
|
||||
nvm_rc_version
|
||||
VERSION3="${NVM_RC_VERSION}"
|
||||
|
||||
[ "${VERSION1}" = "${VERSION3}" ]
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user