From b2c6be9e089fce973514cb2540e26abc23ba61b9 Mon Sep 17 00:00:00 2001 From: Isaac Wolkerstorfer Date: Sat, 22 Jan 2011 17:48:57 +0100 Subject: [PATCH 1/7] Show all available versions in ls Adds a cache of all versions available on nodejs.org using simple empty files as placeholders. When a new version is installed, it will replace the placeholder with a directory. This makes it easier for users to see what versions are available for install, and what the latest and stable versions are. --- nvm.sh | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/nvm.sh b/nvm.sh index 99eb87a..41526a6 100644 --- a/nvm.sh +++ b/nvm.sh @@ -8,6 +8,41 @@ # Auto detect the NVM_DIR using magic bash 3.x stuff export NVM_DIR=$(dirname ${BASH_ARGV[0]}) +# Expand a version using the version cache +version() +{ + PATTERN=$1 + VERSION='' + # If it looks like an explicit version, don't do anything funny + if [[ $PATTERN == v*.*.* ]]; then + VERSION=$PATTERN + fi + # The default version is the current one + if [ ! $PATTERN -o $PATTERN = 'current' ]; then + VERSION=`node -v 2>/dev/null` + fi + if [ $PATTERN = 'stable' ]; then + PATTERN='*.*[02468].' + fi + if [ $PATTERN = 'latest' ]; then + PATTERN='*.*.' + fi + if [ $PATTERN = 'all' ]; then + (cd $NVM_DIR; ls -dG v* 2>/dev/null || echo "N/A") + return + fi + if [ ! "$VERSION" ]; then + VERSION=`(cd $NVM_DIR; ls -d v${PATTERN}* 2>/dev/null) | sort -t. -k 2,1n -k 2,2n -k 3,3n | tail -n1` + fi + if [ ! "$VERSION" ]; then + echo "N/A" + elif [ -e "$NVM_DIR/$VERSION" ]; then + (cd $NVM_DIR; ls -dG $VERSION) + else + echo "$VERSION" + fi +} + nvm() { if [ $# -lt 1 ]; then @@ -23,8 +58,10 @@ nvm() echo " nvm help Show this message" echo " nvm install Download and install a " echo " nvm use Modify PATH to use " - echo " nvm ls List versions currently installed" + echo " nvm ls List versions (installed versions are blue)" + echo " nvm ls List versions matching a given description" echo " nvm deactivate Undo effects of NVM on current shell" + echo " nvm sync Update the local cache of available versions" echo echo "Example:" echo " nvm install v0.2.5" @@ -38,6 +75,7 @@ nvm() fi START=`pwd` mkdir -p "$NVM_DIR/src" && \ + rm -f "$NVM_DIR/$2" && \ cd "$NVM_DIR/src" && \ wget "http://nodejs.org/dist/node-$2.tar.gz" -N && \ tar -xzf "node-$2.tar.gz" && \ @@ -93,16 +131,31 @@ nvm() ;; "ls" ) if [ $# -ne 1 ]; then - nvm help + version $2 return; fi - for f in $NVM_DIR/v*; do - if [[ $PATH == *$f/bin* ]]; then - echo "v${f##*v} *" - else - echo "v${f##*v}" - fi + version all + for P in {stable,latest,current}; do + echo -ne "$P: \t"; version $P done + echo "# use 'nvm sync' to update from nodejs.org" + ;; + "sync" ) + (cd $NVM_DIR + rm -f v* 2>/dev/null + echo -n "Syncing with nodejs.org..." + for VER in `curl -s http://nodejs.org/dist/ | grep 'node-v.*\.tar\.gz' | sed -e 's/.*node-//' -e 's/\.tar\.gz.*//'` + do touch $VER + done + echo " done." + ) + ;; + "clear-cache" ) + rm -f $NVM_DIR/v* + echo "Cache cleared." + ;; + "version" ) + version $2 ;; * ) nvm help From 0f6680e8b7cc47a72bc9ec8f5ce1e00fda623b65 Mon Sep 17 00:00:00 2001 From: Isaac Wolkerstorfer Date: Sat, 22 Jan 2011 17:57:08 +0100 Subject: [PATCH 2/7] Use version descriptors for 'install' and 'use' Allows things like "nvm install latest" or "nvm use stable" or "nvm use 0.2" --- nvm.sh | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/nvm.sh b/nvm.sh index 41526a6..77ab8c5 100644 --- a/nvm.sh +++ b/nvm.sh @@ -64,8 +64,10 @@ nvm() echo " nvm sync Update the local cache of available versions" echo echo "Example:" - echo " nvm install v0.2.5" - echo " nvm use v0.2.5" + echo " nvm install v0.2.5 Install a specific version number" + echo " nvm use stable Use the stable release" + echo " nvm install latest Install the latest, possibly unstable version" + echo " nvm use 0.3 Use the latest available 0.3.x release" echo ;; "install" ) @@ -73,17 +75,18 @@ nvm() nvm help return; fi + VERSION=`version $2` START=`pwd` mkdir -p "$NVM_DIR/src" && \ rm -f "$NVM_DIR/$2" && \ cd "$NVM_DIR/src" && \ - wget "http://nodejs.org/dist/node-$2.tar.gz" -N && \ - tar -xzf "node-$2.tar.gz" && \ - cd "node-$2" && \ - ./configure --prefix="$NVM_DIR/$2" && \ + wget "http://nodejs.org/dist/node-$VERSION.tar.gz" -N && \ + tar -xzf "node-$VERSION.tar.gz" && \ + cd "node-$VERSION" && \ + ./configure --prefix="$NVM_DIR/$VERSION" && \ make && \ make install && \ - nvm use $2 + nvm use $VERSION if ! which npm ; then echo "Installing npm..." curl http://npmjs.org/install.sh | sh @@ -109,25 +112,26 @@ nvm() nvm help return fi - if [ ! -d $NVM_DIR/$2 ]; then - echo "$2 version is not installed yet" + VERSION=`version $2` + if [ ! -d $NVM_DIR/$VERSION ]; then + echo "$VERSION version is not installed yet" return; fi if [[ $PATH == *$NVM_DIR/*/bin* ]]; then - PATH=${PATH%$NVM_DIR/*/bin*}$NVM_DIR/$2/bin${PATH#*$NVM_DIR/*/bin} + PATH=${PATH%$NVM_DIR/*/bin*}$NVM_DIR/$VERSION/bin${PATH#*$NVM_DIR/*/bin} else - PATH="$NVM_DIR/$2/bin:$PATH" + PATH="$NVM_DIR/$VERSION/bin:$PATH" fi if [[ $MANPATH == *$NVM_DIR/*/share/man* ]]; then - MANPATH=${MANPATH%$NVM_DIR/*/share/man*}$NVM_DIR/$2/share/man${MANPATH#*$NVM_DIR/*/share/man} + MANPATH=${MANPATH%$NVM_DIR/*/share/man*}$NVM_DIR/$VERSION/share/man${MANPATH#*$NVM_DIR/*/share/man} else - MANPATH="$NVM_DIR/$2/share/man:$MANPATH" + MANPATH="$NVM_DIR/$VERSION/share/man:$MANPATH" fi export PATH export MANPATH - export NVM_PATH="$NVM_DIR/$2/lib/node" - export NVM_BIN="$NVM_DIR/$2/bin" - echo "Now using node $2" + export NVM_PATH="$NVM_DIR/$VERSION/lib/node" + export NVM_BIN="$NVM_DIR/$VERSION/bin" + echo "Now using node $VERSION" ;; "ls" ) if [ $# -ne 1 ]; then From a77c632e2a4d068c58be868b0a78b9406dc9178b Mon Sep 17 00:00:00 2001 From: Isaac Wolkerstorfer Date: Sat, 22 Jan 2011 19:12:13 +0100 Subject: [PATCH 3/7] Add aliases to versions Aliases are stored as plaintext files in the $NVM_DIR/alias dir. They may store either an explicit version (v0.3.6) or an implied version ("latest"). The latter is a "moving target", and thus possibly dangerous, but can be useful, too. --- .gitignore | 1 + .npmignore | 1 + nvm.sh | 78 +++++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index daa5138..d72736e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ HEAD src v* +alias diff --git a/.npmignore b/.npmignore index 846b8e8..207258b 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,3 @@ src v* +alias diff --git a/nvm.sh b/nvm.sh index 77ab8c5..5b74817 100644 --- a/nvm.sh +++ b/nvm.sh @@ -13,21 +13,25 @@ version() { PATTERN=$1 VERSION='' + if [ -f "$NVM_DIR/alias/$PATTERN" ]; then + version `cat $NVM_DIR/alias/$PATTERN` + return + fi # If it looks like an explicit version, don't do anything funny - if [[ $PATTERN == v*.*.* ]]; then - VERSION=$PATTERN + if [[ "$PATTERN" == v*.*.* ]]; then + VERSION="$PATTERN" fi # The default version is the current one - if [ ! $PATTERN -o $PATTERN = 'current' ]; then + if [ ! "$PATTERN" -o "$PATTERN" = 'current' ]; then VERSION=`node -v 2>/dev/null` fi - if [ $PATTERN = 'stable' ]; then + if [ "$PATTERN" = 'stable' ]; then PATTERN='*.*[02468].' fi - if [ $PATTERN = 'latest' ]; then + if [ "$PATTERN" = 'latest' ]; then PATTERN='*.*.' fi - if [ $PATTERN = 'all' ]; then + if [ "$PATTERN" = 'all' ]; then (cd $NVM_DIR; ls -dG v* 2>/dev/null || echo "N/A") return fi @@ -36,8 +40,9 @@ version() fi if [ ! "$VERSION" ]; then echo "N/A" + return -1 elif [ -e "$NVM_DIR/$VERSION" ]; then - (cd $NVM_DIR; ls -dG $VERSION) + (cd $NVM_DIR; ls -dG "$VERSION") else echo "$VERSION" fi @@ -55,19 +60,22 @@ nvm() echo "Node Version Manager" echo echo "Usage:" - echo " nvm help Show this message" - echo " nvm install Download and install a " - echo " nvm use Modify PATH to use " - echo " nvm ls List versions (installed versions are blue)" - echo " nvm ls List versions matching a given description" - echo " nvm deactivate Undo effects of NVM on current shell" - echo " nvm sync Update the local cache of available versions" + echo " nvm help Show this message" + echo " nvm install Download and install a " + echo " nvm use Modify PATH to use " + echo " nvm ls List versions (installed versions are blue)" + echo " nvm ls List versions matching a given description" + echo " nvm deactivate Undo effects of NVM on current shell" + echo " nvm sync Update the local cache of available versions" + echo " nvm alias [] Show all aliases beginning with " + echo " nvm alias Set an alias named pointing to " echo echo "Example:" - echo " nvm install v0.2.5 Install a specific version number" - echo " nvm use stable Use the stable release" - echo " nvm install latest Install the latest, possibly unstable version" - echo " nvm use 0.3 Use the latest available 0.3.x release" + echo " nvm install v0.2.5 Install a specific version number" + echo " nvm use stable Use the stable release" + echo " nvm install latest Install the latest, possibly unstable version" + echo " nvm use 0.3 Use the latest available 0.3.x release" + echo " nvm alias default v0.3.6 Set v0.3.6 as the default" echo ;; "install" ) @@ -136,14 +144,46 @@ nvm() "ls" ) if [ $# -ne 1 ]; then version $2 - return; + return fi version all for P in {stable,latest,current}; do echo -ne "$P: \t"; version $P done + nvm alias echo "# use 'nvm sync' to update from nodejs.org" ;; + "alias" ) + if [ $# -le 2 ]; then + (cd $NVM_DIR/alias; for ALIAS in `ls $2* 2>/dev/null`; do + DEST=`cat $ALIAS` + VERSION=`version $DEST` + if [ "$DEST" = "$VERSION" ]; then + echo "$ALIAS -> $DEST" + else + echo "$ALIAS -> $DEST (-> $VERSION)" + fi + done) + return + fi + if [ ! "$3" ]; then + rm -f $NVM_DIR/alias/$2 + echo "$2 -> *poof*" + return + fi + mkdir -p $NVM_DIR/alias + VERSION=`version $3` + if [ $? -ne 0 ]; then + echo "! WARNING: Version '$3' does not exist." >&2 + fi + echo $3 > "$NVM_DIR/alias/$2" + if [ ! "$3" = "$VERSION" ]; then + echo "$2 -> $3 (-> $VERSION)" + echo "! WARNING: Moving target. Aliases to implicit versions may change without warning." + else + echo "$2 -> $3" + fi + ;; "sync" ) (cd $NVM_DIR rm -f v* 2>/dev/null From f10ac8e8c3926420b616c0278aacc0d674897699 Mon Sep 17 00:00:00 2001 From: Isaac Wolkerstorfer Date: Sat, 22 Jan 2011 19:13:02 +0100 Subject: [PATCH 4/7] Fix README for ls command --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 274ffea..1e57c2a 100644 --- a/README.markdown +++ b/README.markdown @@ -27,7 +27,7 @@ And then in any new shell just use the installed version: nvm use v0.2.5 -If you want to see what versions you have installed issue: +If you want to see what versions are available: nvm ls From 861766372d0e8c1c900e4c66cef4631a411a2a72 Mon Sep 17 00:00:00 2001 From: Isaac Wolkerstorfer Date: Sat, 22 Jan 2011 19:16:24 +0100 Subject: [PATCH 5/7] Add a special "default" alias If you set a "default" alias, it will automatically be loaded when you start a new shell. --- README.markdown | 4 ++++ nvm.sh | 2 ++ 2 files changed, 6 insertions(+) diff --git a/README.markdown b/README.markdown index 1e57c2a..6cd0120 100644 --- a/README.markdown +++ b/README.markdown @@ -35,3 +35,7 @@ To restore your PATH, you can deactivate it. nvm deactivate +To set a default Node version to be used in any new shell, use the alias 'default': + + nvm alias default v0.2.5 + diff --git a/nvm.sh b/nvm.sh index 5b74817..cfba140 100644 --- a/nvm.sh +++ b/nvm.sh @@ -206,3 +206,5 @@ nvm() ;; esac } + +nvm ls default >/dev/null 2>&1 && nvm use default >/dev/null From a7328b371190d9bdd576b0aadfecd7ea66de9340 Mon Sep 17 00:00:00 2001 From: Isaac Wolkerstorfer Date: Sat, 22 Jan 2011 19:31:20 +0100 Subject: [PATCH 6/7] Add output to sync if stable/latest changes --- nvm.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/nvm.sh b/nvm.sh index cfba140..f0003f1 100644 --- a/nvm.sh +++ b/nvm.sh @@ -185,14 +185,18 @@ nvm() fi ;; "sync" ) + LATEST=`version latest` + STABLE=`version stable` (cd $NVM_DIR rm -f v* 2>/dev/null - echo -n "Syncing with nodejs.org..." - for VER in `curl -s http://nodejs.org/dist/ | grep 'node-v.*\.tar\.gz' | sed -e 's/.*node-//' -e 's/\.tar\.gz.*//'` - do touch $VER + echo -n "# syncing with nodejs.org..." + for VER in `curl -s http://nodejs.org/dist/ | grep 'node-v.*\.tar\.gz' | sed -e 's/.*node-//' -e 's/\.tar\.gz.*//'`; do + touch $VER done echo " done." ) + [ "$STABLE" = `version stable` ] || echo "NEW stable: `version stable`" + [ "$LATEST" = `version latest` ] || echo "NEW latest: `version latest`" ;; "clear-cache" ) rm -f $NVM_DIR/v* From 590b283e658d387b6f6feeea90c04261fdc866d2 Mon Sep 17 00:00:00 2001 From: Isaac Wolkerstorfer Date: Sat, 22 Jan 2011 20:54:15 +0100 Subject: [PATCH 7/7] Change version() to nvm_version() It's a bit less conflict-y --- nvm.sh | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/nvm.sh b/nvm.sh index f0003f1..1706c18 100644 --- a/nvm.sh +++ b/nvm.sh @@ -9,12 +9,12 @@ export NVM_DIR=$(dirname ${BASH_ARGV[0]}) # Expand a version using the version cache -version() +nvm_version() { PATTERN=$1 VERSION='' if [ -f "$NVM_DIR/alias/$PATTERN" ]; then - version `cat $NVM_DIR/alias/$PATTERN` + nvm_version `cat $NVM_DIR/alias/$PATTERN` return fi # If it looks like an explicit version, don't do anything funny @@ -83,7 +83,7 @@ nvm() nvm help return; fi - VERSION=`version $2` + VERSION=`nvm_version $2` START=`pwd` mkdir -p "$NVM_DIR/src" && \ rm -f "$NVM_DIR/$2" && \ @@ -120,7 +120,7 @@ nvm() nvm help return fi - VERSION=`version $2` + VERSION=`nvm_version $2` if [ ! -d $NVM_DIR/$VERSION ]; then echo "$VERSION version is not installed yet" return; @@ -143,12 +143,12 @@ nvm() ;; "ls" ) if [ $# -ne 1 ]; then - version $2 + nvm_version $2 return fi - version all + nvm_version all for P in {stable,latest,current}; do - echo -ne "$P: \t"; version $P + echo -ne "$P: \t"; nvm_version $P done nvm alias echo "# use 'nvm sync' to update from nodejs.org" @@ -157,7 +157,7 @@ nvm() if [ $# -le 2 ]; then (cd $NVM_DIR/alias; for ALIAS in `ls $2* 2>/dev/null`; do DEST=`cat $ALIAS` - VERSION=`version $DEST` + VERSION=`nvm_version $DEST` if [ "$DEST" = "$VERSION" ]; then echo "$ALIAS -> $DEST" else @@ -172,7 +172,7 @@ nvm() return fi mkdir -p $NVM_DIR/alias - VERSION=`version $3` + VERSION=`nvm_version $3` if [ $? -ne 0 ]; then echo "! WARNING: Version '$3' does not exist." >&2 fi @@ -185,8 +185,8 @@ nvm() fi ;; "sync" ) - LATEST=`version latest` - STABLE=`version stable` + LATEST=`nvm_version latest` + STABLE=`nvm_version stable` (cd $NVM_DIR rm -f v* 2>/dev/null echo -n "# syncing with nodejs.org..." @@ -195,15 +195,15 @@ nvm() done echo " done." ) - [ "$STABLE" = `version stable` ] || echo "NEW stable: `version stable`" - [ "$LATEST" = `version latest` ] || echo "NEW latest: `version latest`" + [ "$STABLE" = `nvm_version stable` ] || echo "NEW stable: `nvm_version stable`" + [ "$LATEST" = `nvm_version latest` ] || echo "NEW latest: `nvm_version latest`" ;; "clear-cache" ) rm -f $NVM_DIR/v* echo "Cache cleared." ;; "version" ) - version $2 + nvm_version $2 ;; * ) nvm help