Skip to content

Commit 1458de7

Browse files
committed
Ensure that if npm config get prefix is set to something outside nvm, that nvm use refuses to work.
Fixes #606.
1 parent a1def71 commit 1458de7

File tree

4 files changed

+57
-3
lines changed

4 files changed

+57
-3
lines changed

nvm.sh

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1267,9 +1267,17 @@ nvm_die_on_prefix() {
12671267
return 2
12681268
fi
12691269

1270+
if [ -n "$PREFIX" ] && ! (nvm_tree_contains_path "$NVM_DIR" "$PREFIX" >/dev/null 2>&1); then
1271+
nvm deactivate >/dev/null 2>&1
1272+
echo >&2 "nvm is not compatible with the \"PREFIX\" environment variable: currently set to \"$PREFIX\""
1273+
echo >&2 "Run \`unset PREFIX\` to unset it."
1274+
return 3
1275+
fi
1276+
12701277
if ! nvm_has 'npm'; then
12711278
return
12721279
fi
1280+
12731281
local NVM_NPM_PREFIX
12741282
NVM_NPM_PREFIX="$(npm config get prefix)"
12751283
if ! (nvm_tree_contains_path "$NVM_DIR" "$NVM_NPM_PREFIX" >/dev/null 2>&1); then
@@ -1283,7 +1291,7 @@ nvm_die_on_prefix() {
12831291
else
12841292
echo >&2 "Run \`$NVM_COMMAND\` to unset it."
12851293
fi
1286-
return 3
1294+
return 4
12871295
fi
12881296
fi
12891297
}
@@ -1596,11 +1604,15 @@ nvm() {
15961604
local PROVIDED_VERSION
15971605
local NVM_USE_SILENT
15981606
NVM_USE_SILENT=0
1607+
local NVM_DELETE_PREFIX
1608+
NVM_DELETE_PREFIX=0
1609+
15991610
shift # remove "use"
16001611
while [ $# -ne 0 ]
16011612
do
16021613
case "$1" in
16031614
--silent) NVM_USE_SILENT=1 ;;
1615+
--delete-prefix) NVM_DELETE_PREFIX=1 ;;
16041616
*)
16051617
if [ -n "$1" ]; then
16061618
PROVIDED_VERSION="$1"
@@ -1690,6 +1702,19 @@ nvm() {
16901702
echo "Now using node $VERSION$(nvm_print_npm_version)"
16911703
fi
16921704
fi
1705+
if [ "_$VERSION" != "_system" ]; then
1706+
local NVM_USE_CMD
1707+
NVM_USE_CMD="nvm use --delete-prefix"
1708+
if [ -n "$PROVIDED_VERSION" ]; then
1709+
NVM_USE_CMD="$NVM_USE_CMD $VERSION"
1710+
fi
1711+
if [ $NVM_USE_SILENT -eq 1 ]; then
1712+
NVM_USE_CMD="$NVM_USE_CMD --silent"
1713+
fi
1714+
if ! nvm_die_on_prefix "$NVM_DELETE_PREFIX" "$NVM_USE_CMD"; then
1715+
return 11
1716+
fi
1717+
fi
16931718
;;
16941719
"run" )
16951720
local provided_version

test/fast/Running "nvm deactivate" should unset the nvm environment variables.

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ die () { echo $@ ; exit 1; }
77
[ `expr $PATH : ".*v0.2.3/.*/bin"` = 0 ] || echo "WARNING: Unexpectedly found v0.2.3 already active" >&2
88

99
. ../../nvm.sh
10-
nvm use v0.2.3 || die "Failed to activate v0.2.3"
10+
nvm use --delete-prefix v0.2.3 || die "Failed to activate v0.2.3"
1111
[ `expr "$PATH" : ".*v0.2.3/.*/bin"` != 0 ] || die "PATH not set up properly"
1212
[ `expr "$NODE_PATH" : ".*v0.2.3/.*/lib/node_modules"` = 0 ] || die "NODE_PATH should not contain (npm root -g)"
1313
# ^ note: NODE_PATH should not contain `npm root -g` since globals should not be requireable

test/fast/Unit tests/nvm_die_on_prefix

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ npm() {
4343
OUTPUT="$(nvm_die_on_prefix 0 foo 2>&1)"
4444
[ -z "$OUTPUT" ] || die "'nvm_die_on_prefix' was not a noop when prefix is good; got '$OUTPUT'"
4545

46+
OUTPUT="$(PREFIX=bar nvm_die_on_prefix 0 foo 2>&1)"
47+
EXPECTED_OUTPUT='nvm is not compatible with the "PREFIX" environment variable: currently set to "bar"
48+
Run `unset PREFIX` to unset it.'
49+
EXIT_CODE="$(PREFIX=bar nvm_die_on_prefix 0 foo >/dev/null 2>&1; echo $?)"
50+
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT'; got '$OUTPUT'"
51+
[ "_$EXIT_CODE" = "_3" ] || die "'PREFIX=bar nvm_die_on_prefix 0 foo' did not exit with 3; got '$EXIT_CODE'"
52+
4653
npm() {
4754
local args
4855
args="$@"
@@ -55,6 +62,6 @@ EXPECTED_OUTPUT="nvm is not compatible with the npm config \"prefix\" option: cu
5562
Run \`npm config delete prefix\` or \`foo\` to unset it."
5663
EXIT_CODE="$(nvm_die_on_prefix 0 foo >/dev/null 2>&1; echo $?)"
5764
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "'nvm_die_on_prefix 0 foo' did not error with '$EXPECTED_OUTPUT' with bad prefix set; got '$OUTPUT'"
58-
[ "_$EXIT_CODE" = "_3" ] || die "'nvm_die_on_prefix 0 foo' did not exit with 3 with bad prefix set; got '$EXIT_CODE'"
65+
[ "_$EXIT_CODE" = "_4" ] || die "'nvm_die_on_prefix 0 foo' did not exit with 4 with bad prefix set; got '$EXIT_CODE'"
5966

6067
cleanup
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/bin/sh
2+
3+
die () { echo $@ ; exit 1; }
4+
5+
. ../../../nvm.sh
6+
7+
nvm deactivate >/dev/null 2>&1 || die 'deactivate failed'
8+
9+
nvm_die_on_prefix() {
10+
echo >&2 "| $1 | $2 |"
11+
return 3
12+
}
13+
14+
OUTPUT="$(nvm use --silent node)"
15+
EXPECTED_OUTPUT=""
16+
[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \
17+
|| die "'nvm use --silent node' did not call through to 'nvm_die_on_prefix' and give output '$EXPECTED_OUTPUT'; got '$OUTPUT'"
18+
19+
EXIT_CODE="$(nvm use --silent node >/dev/null 2>&1; echo $?)"
20+
EXPECTED_CODE="11"
21+
[ "_$EXIT_CODE" = "_$EXPECTED_CODE" ] \
22+
|| die "'nvm use --silent node' when 'nvm_die_on_prefix' fails did not return '$EXPECTED_CODE'; got '$EXIT_CODE'"

0 commit comments

Comments
 (0)