Node version manager as plugin
authorAntono Vasiljev <antono.vasiljev@gmail.com>
Sun, 17 Jul 2011 03:52:27 +0000 (06:52 +0300)
committerAntono Vasiljev <antono.vasiljev@gmail.com>
Sun, 17 Jul 2011 03:52:27 +0000 (06:52 +0300)
plugins/available/nvm.plugin.bash [new file with mode: 0644]

diff --git a/plugins/available/nvm.plugin.bash b/plugins/available/nvm.plugin.bash
new file mode 100644 (file)
index 0000000..a02722e
--- /dev/null
@@ -0,0 +1,251 @@
+# Node Version Manager
+# Implemented as a bash function
+# To use source this file from your bash profile
+#
+# Implemented by Tim Caswell <tim@creationix.com>
+# with much bash help from Matthew Ranney
+# https://github.com/creationix/nvm
+
+export NVM_DIR=$HOME/.nvm
+
+if [ ! -d "$NVM_DIR" ]; then
+    mkdir $NVM_DIR
+fi
+
+# Auto detect the NVM_DIR
+if [ ! -d "$NVM_DIR" ]; then
+    export NVM_DIR=$(cd $(dirname ${BASH_SOURCE[0]:-$0}); pwd)
+fi
+
+# Emulate curl with wget, if necessary
+if [ ! `which curl` ]; then
+    if [ `which wget` ]; then
+        curl() {
+            ARGS="$* "
+            ARGS=${ARGS/-s /-q }
+            ARGS=${ARGS/-\# /}
+            ARGS=${ARGS/-C - /-c }
+            ARGS=${ARGS/-o /-O }
+
+            wget $ARGS
+        }
+    else
+        NOCURL='nocurl'
+        curl() { echo 'Need curl or wget to proceed.' >&2; }
+    fi
+fi
+
+# Expand a version using the version cache
+nvm_version()
+{
+    PATTERN=$1
+    VERSION=''
+    if [ -f "$NVM_DIR/alias/$PATTERN" ]; then
+        nvm_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"
+    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"
+        return 13
+    elif [ -e "$NVM_DIR/$VERSION" ]; then
+        (cd $NVM_DIR; \ls -dG "$VERSION")
+    else
+        echo "$VERSION"
+    fi
+}
+
+nvm()
+{
+  if [ $# -lt 1 ]; then
+    nvm help
+    return
+  fi
+  case $1 in
+    "help" )
+      echo
+      echo "Node Version Manager"
+      echo
+      echo "Usage:"
+      echo "    nvm help                    Show this message"
+      echo "    nvm install <version>       Download and install a <version>"
+      echo "    nvm use <version>           Modify PATH to use <version>"
+      echo "    nvm ls                      List versions (installed versions are blue)"
+      echo "    nvm ls <version>            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 [<pattern>]       Show all aliases beginning with <pattern>"
+      echo "    nvm alias <name> <version>  Set an alias named <name> pointing to <version>"
+      echo
+      echo "Example:"
+      echo "    nvm install v0.4.0          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.2                 Use the latest available 0.2.x release"
+      echo "    nvm alias default v0.4.0    Set v0.4.0 as the default" 
+      echo
+    ;;
+    "install" )
+      if [ $# -ne 2 ]; then
+        nvm help
+        return
+      fi
+      [ "$NOCURL" ] && curl && return
+      VERSION=`nvm_version $2`
+      if (
+        mkdir -p "$NVM_DIR/src" && \
+        cd "$NVM_DIR/src" && \
+        curl -C - -# "http://nodejs.org/dist/node-$VERSION.tar.gz" -o "node-$VERSION.tar.gz" && \
+        tar -xzf "node-$VERSION.tar.gz" && \
+        cd "node-$VERSION" && \
+        ./configure --prefix="$NVM_DIR/$VERSION" && \
+        make && \
+        rm -f "$NVM_DIR/$VERSION" 2>/dev/null && \
+        make install
+        )
+      then
+        nvm use $VERSION
+        if ! which npm ; then
+          echo "Installing npm..."
+          # TODO: if node version 0.2.x add npm_install=0.2.19 before sh
+          curl http://npmjs.org/install.sh | clean=yes sh
+        fi
+      else
+        echo "nvm: install $VERSION failed!"
+      fi
+    ;;
+    "deactivate" )
+      if [[ $PATH == *$NVM_DIR/*/bin* ]]; then
+        export PATH=${PATH%$NVM_DIR/*/bin*}${PATH#*$NVM_DIR/*/bin:}
+        hash -r
+        echo "$NVM_DIR/*/bin removed from \$PATH"
+      else
+        echo "Could not find $NVM_DIR/*/bin in \$PATH"
+      fi
+      if [[ $MANPATH == *$NVM_DIR/*/share/man* ]]; then
+        export MANPATH=${MANPATH%$NVM_DIR/*/share/man*}${MANPATH#*$NVM_DIR/*/share/man:}
+        echo "$NVM_DIR/*/share/man removed from \$MANPATH"
+      else
+        echo "Could not find $NVM_DIR/*/share/man in \$MANPATH"
+      fi
+    ;;
+    "use" )
+      if [ $# -ne 2 ]; then
+        nvm help
+        return
+      fi
+      VERSION=`nvm_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/$VERSION/bin${PATH#*$NVM_DIR/*/bin}
+      else
+        PATH="$NVM_DIR/$VERSION/bin:$PATH"
+      fi
+      if [[ $MANPATH == *$NVM_DIR/*/share/man* ]]; then
+        MANPATH=${MANPATH%$NVM_DIR/*/share/man*}$NVM_DIR/$VERSION/share/man${MANPATH#*$NVM_DIR/*/share/man}
+      else
+        MANPATH="$NVM_DIR/$VERSION/share/man:$MANPATH"
+      fi
+      export PATH
+      hash -r
+      export MANPATH
+      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
+        nvm_version $2
+        return
+      fi
+      nvm_version all
+      for P in {stable,latest,current}; do
+          echo -ne "$P: \t"; nvm_version $P
+      done
+      nvm alias
+      echo "# use 'nvm sync' to update from nodejs.org"
+    ;;
+    "alias" )
+      mkdir -p $NVM_DIR/alias
+      if [ $# -le 2 ]; then
+        (cd $NVM_DIR/alias && for ALIAS in `\ls $2* 2>/dev/null`; do
+            DEST=`cat $ALIAS`
+            VERSION=`nvm_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=`nvm_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" )
+        [ "$NOCURL" ] && curl && return
+        LATEST=`nvm_version latest`
+        STABLE=`nvm_version stable`
+        (cd $NVM_DIR
+        rm -f v* 2>/dev/null
+        printf "# syncing with nodejs.org..."
+        for VER in `curl -s http://nodejs.org/dist/ -o - | grep 'node-v.*\.tar\.gz' | sed -e 's/.*node-//' -e 's/\.tar\.gz.*//'`; do
+            touch $VER
+        done
+        echo " done."
+        )
+        [ "$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* 2>/dev/null
+        echo "Cache cleared."
+    ;;
+    "version" )
+        nvm_version $2
+    ;;
+    * )
+      nvm help
+    ;;
+  esac
+}
+
+nvm ls default >/dev/null 2>&1 && nvm use default >/dev/null