diff --git a/nvm.sh b/nvm.sh index 7f11cdd..6ae7c35 100644 --- a/nvm.sh +++ b/nvm.sh @@ -412,6 +412,31 @@ nvm_num_version_groups() { nvm_echo "${#NVM_NUM_GROUPS}" } +nvm_get_upgrade_version() { + if [ $# -lt 1 ]; then + nvm_echo 'N/A' + return 1 + fi + + local VERSION + VERSION="$1" + + local semver_major + semver_major="$(nvm_echo \"$base_version\" | command sed -e 's/v\([0-9]\+\)\.\([0-9]\+\).*/\1/')" + + local semver_minor + semver_minor="$(nvm_echo \"$base_version\" | command sed -e 's/v\([0-9]\+\)\.\([0-9]\+\).*/\2/')" + + local install_version + if [ $semver_major = '0' ]; then + install_version="v0.$semver_minor" + else + install_version="v$semver_major" + fi + + nvm_echo "$(nvm_remote_version \"$install_version\")" +} + nvm_strip_path() { if [ -z "${NVM_DIR-}" ]; then nvm_err '$NVM_DIR not set!' @@ -1753,6 +1778,7 @@ nvm() { nvm_echo ' nvm --version Print out the latest released version of nvm' nvm_echo ' nvm install [-s] Download and install a , [-s] from source. Uses .nvmrc if available' nvm_echo ' --reinstall-packages-from= When installing, reinstall packages installed in ' + nvm_echo ' nvm upgrade [] Upgrade to the latest minor/patch version' nvm_echo ' nvm uninstall Uninstall a version' nvm_echo ' nvm use [--silent] Modify PATH to use . Uses .nvmrc if available' nvm_echo ' nvm exec [--silent] [] Run on . Uses .nvmrc if available' @@ -1967,6 +1993,37 @@ nvm() { fi return $? ;; + "upgrade" ) + local base_version + base_version="$(nvm_ls_current)" + + if [ $# -ge 2 ]; then + base_version="$(nvm_match_version \"$1\")" + fi + + if [ $base_version = 'none' ]; then + nvm_err 'No version currently active, cannot upgrade' + return 1 + fi + + if [ $base_version = 'system' ]; then + nvm_err 'Cannot upgrade the system version of node' + return 1 + fi + + local install_version + install_version="$(nvm_get_upgrade_version \"$base_version\")" + + if [ $install_version = 'N/A' ]; then + nvm_err 'Unable to determine the version to upgrade to' + return 2 + fi + + nvm_echo "Upgrading $base_version to $install_version" + nvm_echo "($base_version will remain installed. Please adjust your aliases as necessary.)" + nvm install "$install_version" --reinstall-packages-from="$base_version" + return $? + ;; "uninstall" ) if [ $# -ne 2 ]; then >&2 nvm --help diff --git "a/test/slow/nvm upgrade/Running \"nvm upgrade\" installs latest v0.12" "b/test/slow/nvm upgrade/Running \"nvm upgrade\" installs latest v0.12" new file mode 100755 index 0000000..92bc682 --- /dev/null +++ "b/test/slow/nvm upgrade/Running \"nvm upgrade\" installs latest v0.12" @@ -0,0 +1,22 @@ +#!/bin/sh + +die () { echo $@ ; exit 1; } + +# Source nvm and activate 0.12.0 +. ../../../nvm.sh +nvm use 0.12.0 + +# Install some global packages +npm install -g npm || die "npm install -g npm failed" +npm install -g object-is@0.0.0 || die "npm install -g object-is failed" +npm list --global | grep object-is > /dev/null || die "object-is isn't installed" + +# Upgrade it +nvm upgrade || die "Failed to run nvm upgrade" + +# Uninstall old version +nvm uninstall 0.12.0 + +# Make sure a newer version of 0.12 is still installed +nvm ls | grep v0.12 +[ "$?" = "0" ] || die "Failed to upgrade node" diff --git a/test/slow/nvm upgrade/setup_dir b/test/slow/nvm upgrade/setup_dir new file mode 100755 index 0000000..15cbc05 --- /dev/null +++ b/test/slow/nvm upgrade/setup_dir @@ -0,0 +1,4 @@ +#!/bin/sh + +. ../../../nvm.sh +nvm install 0.12.0 diff --git a/test/slow/nvm upgrade/teardown_dir b/test/slow/nvm upgrade/teardown_dir new file mode 100755 index 0000000..95f99fa --- /dev/null +++ b/test/slow/nvm upgrade/teardown_dir @@ -0,0 +1,5 @@ +#!/bin/sh + +. ../../../nvm.sh +nvm uninstall 0.12 +nvm deactivate