mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-09-18 00:00:30 +08:00
`man` consults its own configured search path only when MANPATH holds an empty entry; a list without one replaces the default outright. `nvm use` produced exactly that, so activating a version could hide every system man page. Contribute the empty entry as a trailing one, so that nvm's directory keeps precedence over the system's, and only when the list has none already, so that repeated `nvm use` calls are idempotent and an empty entry the user placed stays where they put it. The `$(manpath)` snapshot this replaces went stale the moment man's configuration changed, and cost a subprocess per `nvm use`. It was also dead: `local MANPATH` scoped the assignment to `nvm()`, so `export` did not outlive the call and MANPATH went untouched whenever it started out unset. Only ksh, where `local` is not a builtin, ever ran it. `nvm deactivate` now unsets MANPATH where nvm's was the only real entry, rather than leaving a bare `:` behind. Reported and diagnosed by @al0ksar in #3890, which used a leading empty entry instead. That one accrues one more colon on every `nvm use`, which `nvm deactivate` then leaves behind, and it loses to the system's man pages wherever nvm's bin directory is not first on PATH. Supersedes #2077. Refs #3890 Refs #2077
69 lines
2.8 KiB
Bash
Executable File
69 lines
2.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
die () { echo "$@" ; exit 1; }
|
|
|
|
export NVM_DIR="$(cd ../.. && pwd)"
|
|
|
|
# `--delete-prefix` covers only the npmrc files, so an inherited prefix in the
|
|
# environment would still abort `nvm use`
|
|
unset PREFIX npm_config_prefix NPM_CONFIG_PREFIX
|
|
|
|
: nvm.sh
|
|
\. ../../nvm.sh
|
|
\. ../common.sh
|
|
|
|
# the block under test is gated on `nvm_has manpath`, and the Alpine CI images
|
|
# ship no `manpath`; the output is recognizable so that a reintroduced
|
|
# `$(manpath)` call fails the assertions instead of passing vacuously
|
|
manpath() {
|
|
echo '/usr/share/man'
|
|
}
|
|
|
|
make_fake_node v0.10.2
|
|
make_fake_node v0.10.3
|
|
|
|
MAN_2="$(nvm_version_path v0.10.2)/share/man"
|
|
MAN_3="$(nvm_version_path v0.10.3)/share/man"
|
|
|
|
# nvm has to contribute the empty entry itself when there is nothing to preserve
|
|
unset MANPATH
|
|
nvm use --delete-prefix v0.10.2 --silent || die "Failed to activate v0.10.2"
|
|
[ "${MANPATH}" = "${MAN_2}:" ] || die "MANPATH should be '${MAN_2}:'; got '${MANPATH}'"
|
|
|
|
nvm deactivate --silent || die "Failed to deactivate v0.10.2"
|
|
[ -z "${MANPATH-}" ] || die "MANPATH should be unset again; got '${MANPATH}'"
|
|
|
|
# nvm's entry first, the empty entry last: the reverse of what a leading empty
|
|
# entry produces
|
|
MANPATH='/opt/foo/man'
|
|
nvm use --delete-prefix v0.10.2 --silent || die "Failed to activate v0.10.2"
|
|
[ "${MANPATH}" = "${MAN_2}:/opt/foo/man:" ] || die "MANPATH should be '${MAN_2}:/opt/foo/man:'; got '${MANPATH}'"
|
|
|
|
# switching versions replaces nvm's entry without accruing more empty ones
|
|
nvm use --delete-prefix v0.10.3 --silent || die "Failed to activate v0.10.3"
|
|
[ "${MANPATH}" = "${MAN_3}:/opt/foo/man:" ] || die "MANPATH should be '${MAN_3}:/opt/foo/man:'; got '${MANPATH}'"
|
|
|
|
nvm use --delete-prefix v0.10.2 --silent || die "Failed to reactivate v0.10.2"
|
|
[ "${MANPATH}" = "${MAN_2}:/opt/foo/man:" ] || die "MANPATH should be '${MAN_2}:/opt/foo/man:'; got '${MANPATH}'"
|
|
|
|
nvm deactivate --silent || die "Failed to deactivate v0.10.2"
|
|
[ "${MANPATH}" = '/opt/foo/man:' ] || die "MANPATH should be '/opt/foo/man:'; got '${MANPATH}'"
|
|
|
|
# a value with no empty entry at all still deactivates to nothing
|
|
MANPATH="${MAN_2}"
|
|
nvm deactivate --silent || die "Failed to deactivate v0.10.2"
|
|
[ -z "${MANPATH-}" ] || die "MANPATH should be unset again; got '${MANPATH}'"
|
|
|
|
# an empty entry the user placed themselves stays where they put it
|
|
for TEST_MANPATH in ':/opt/foo/man' '/opt/foo/man:' '/a/man::/b/man'; do
|
|
MANPATH="${TEST_MANPATH}"
|
|
|
|
nvm use --delete-prefix v0.10.2 --silent || die "Failed to activate v0.10.2 with MANPATH '${TEST_MANPATH}'"
|
|
[ "${MANPATH}" = "${MAN_2}:${TEST_MANPATH}" ] || die "MANPATH should be '${MAN_2}:${TEST_MANPATH}'; got '${MANPATH}'"
|
|
|
|
nvm deactivate --silent || die "Failed to deactivate v0.10.2 with MANPATH '${TEST_MANPATH}'"
|
|
[ "${MANPATH}" = "${TEST_MANPATH}" ] || die "MANPATH should be '${TEST_MANPATH}'; got '${MANPATH}'"
|
|
done
|