diff --git a/nvm.sh b/nvm.sh index c6b8f83132..73b71de6f6 100755 --- a/nvm.sh +++ b/nvm.sh @@ -1463,6 +1463,7 @@ nvm() { echo ' nvm --version Print out the latest released version of nvm' echo ' nvm install [-s] Download and install a , [-s] from source. Uses .nvmrc if available' echo ' --reinstall-packages-from= When installing, reinstall packages installed in ' + echo ' --upgrade-npm= When installing, upgrades NPM to the specified version' echo ' nvm uninstall Uninstall a version' echo ' nvm use [--silent] Modify PATH to use . Uses .nvmrc if available' echo ' nvm exec [--silent] [] Run on . Uses .nvmrc if available' @@ -1478,6 +1479,7 @@ nvm() { echo ' nvm alias Set an alias named pointing to ' echo ' nvm unalias Deletes the alias named ' echo ' nvm reinstall-packages Reinstall global `npm` packages contained in to current version' + echo ' nvm upgrade-npm Upgrades NPM to the specified version' echo ' nvm unload Unload `nvm` from shell' echo ' nvm which [] Display path to installed node version. Uses .nvmrc if available' echo @@ -1568,6 +1570,7 @@ nvm() { ADDITIONAL_PARAMETERS='' local PROVIDED_REINSTALL_PACKAGES_FROM local REINSTALL_PACKAGES_FROM + local UPGRADE_NPM_VERSION while [ $# -ne 0 ] do @@ -1580,6 +1583,9 @@ nvm() { PROVIDED_REINSTALL_PACKAGES_FROM="$(echo "$1" | command cut -c 22-)" REINSTALL_PACKAGES_FROM="$(nvm_version "$PROVIDED_REINSTALL_PACKAGES_FROM")" ;; + --upgrade-npm=*) + UPGRADE_NPM_VERSION="$(echo "$1" | command cut -c 15-)" + ;; *) ADDITIONAL_PARAMETERS="$ADDITIONAL_PARAMETERS $1" ;; @@ -1652,6 +1658,10 @@ nvm() { fi if [ "$NVM_INSTALL_SUCCESS" = true ] && nvm use "$VERSION"; then + if [ ! -z "$UPGRADE_NPM_VERSION" ]; then + nvm upgrade-npm "$UPGRADE_NPM_VERSION" + fi + if [ ! -z "$REINSTALL_PACKAGES_FROM" ] \ && [ "_$REINSTALL_PACKAGES_FROM" != "_N/A" ]; then nvm reinstall-packages "$REINSTALL_PACKAGES_FROM" @@ -2166,6 +2176,18 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | command grep -v "N/A" | command sed '/^$/d' command rm -f "$NVM_ALIAS_DIR/$2" echo "Deleted alias $2" ;; + "upgrade-npm" ) + if [ $# -ne 2 ]; then + >&2 nvm help + return 127 + fi + + local NPM_VERSION + NPM_VERSION="$2" + + echo "Upgrading npm version to $NPM_VERSION" + npm install -g "npm@$NPM_VERSION" + ;; "reinstall-packages" | "copy-packages" ) if [ $# -ne 2 ]; then >&2 nvm help @@ -2199,18 +2221,22 @@ $NVM_LS_REMOTE_POST_MERGED_OUTPUT" | command grep -v "N/A" | command sed '/^$/d' LINKS="${NPMLIST##* //// }" echo "Reinstalling global packages from $VERSION..." - echo "$INSTALLS" | command xargs npm install -g --quiet - - echo "Linking global packages from $VERSION..." - set -f; IFS=' -' # necessary to turn off variable expansion except for newlines - for LINK in $LINKS; do - set +f; unset IFS # restore variable expansion - if [ -n "$LINK" ]; then - (cd "$LINK" && npm link) - fi - done - set +f; unset IFS # restore variable expansion in case $LINKS was empty + if [ "$INSTALLS" != '' ]; then + echo "$INSTALLS" | command xargs npm install -g --quiet + fi + + if [ "$LINKS" != '' ]; then + echo "Linking global packages from $VERSION..." + set -f; IFS=' + ' # necessary to turn off variable expansion except for newlines + for LINK in $LINKS; do + set +f; unset IFS # restore variable expansion + if [ -n "$LINK" ]; then + (cd "$LINK" && npm link) + fi + done + set +f; unset IFS # restore variable expansion in case $LINKS was empty + fi ;; "clear-cache" ) command rm -f "$NVM_DIR/v*" "$(nvm_version_dir)" 2>/dev/null diff --git a/test/installation/node/install while upgrading npm b/test/installation/node/install while upgrading npm new file mode 100755 index 0000000000..2c2e55100b --- /dev/null +++ b/test/installation/node/install while upgrading npm @@ -0,0 +1,17 @@ +#!/bin/sh + +die () { echo $@ ; exit 1; } + +. ../../../nvm.sh + +# Remove the stuff we're clobbering. +[ -e ../../../versions/node/v4.2.3 ] && rm -R ../../../versions/node/v4.2.3 + +# Install from binary +nvm install 4.2.3 --upgrade-npm=3.5.1 + +# Check +[ -d ../../../versions/node/v4.2.3 ] || die "nvm install 4.2.3 didn't install" + +npm --version | grep 3.5.1 || die "nvm install did not upgrade NPM" + diff --git a/test/slow/nvm upgrade-npm/setup_dir b/test/slow/nvm upgrade-npm/setup_dir new file mode 100755 index 0000000000..06c818ea0a --- /dev/null +++ b/test/slow/nvm upgrade-npm/setup_dir @@ -0,0 +1,9 @@ +#!/bin/sh + +. ../../../nvm.sh + +# ensure version does not already exist +[ -e ../../../versions/node/v4.2.3 ] && rm -R ../../../versions/node/v4.2.3 + +nvm install 4.2.3 + diff --git a/test/slow/nvm upgrade-npm/should work as expected b/test/slow/nvm upgrade-npm/should work as expected new file mode 100755 index 0000000000..5cda718a29 --- /dev/null +++ b/test/slow/nvm upgrade-npm/should work as expected @@ -0,0 +1,15 @@ +#!/bin/sh + +die () { echo "$@" ; exit 1; } + +. ../../../nvm.sh + +EXPECTED_VERSION="3.5.1" + +OLD_VERSION=$(npm --version) +[ "$EXPECTED_VERSION" != "$OLD_VERSION" ] || die "NPM version already at $EXPECTED_VERSION" + +nvm upgrade-npm $EXPECTED_VERSION +ACTUAL_VERSION=$(npm --version) + +[ "$EXPECTED_VERSION" = "$ACTUAL_VERSION" ] || die "NPM package was not upgraded" diff --git a/test/slow/nvm upgrade-npm/teardown_dir b/test/slow/nvm upgrade-npm/teardown_dir new file mode 100755 index 0000000000..e45cc6ca94 --- /dev/null +++ b/test/slow/nvm upgrade-npm/teardown_dir @@ -0,0 +1,6 @@ +#!/bin/sh + +. ../../../nvm.sh + +#remove installed version +[ -e ../../../versions/node/v4.2.3 ] && rm -R ../../../versions/node/v4.2.3 \ No newline at end of file