Merge pull request #371 from koenpunt/single-installer

Merged installer and gitless installer into one
diff --git a/README.markdown b/README.markdown
index f93f8f7..3ed58d8 100644
--- a/README.markdown
+++ b/README.markdown
@@ -6,7 +6,7 @@
 
 ### Install script
 
-To install you could use the [install script](https://github.com/creationix/nvm/blob/v0.3.0/install.sh) (requires Git) using cURL:
+To install you could use the [install script](https://github.com/creationix/nvm/blob/v0.3.0/install.sh) using cURL:
 
     curl https://raw.github.com/creationix/nvm/v0.3.0/install.sh | sh
 
@@ -14,8 +14,11 @@
 
     wget -qO- https://raw.github.com/creationix/nvm/v0.3.0/install.sh | sh
 
-<sub>The script clones the nvm repository to `~/.nvm` and adds the source line to your profile (`~/.bash_profile` or `~/.profile`).</sub>
+<sub>The script clones the nvm repository to `~/.nvm` and adds the source line to your profile (`~/.bash_profile`, `~/.zshrc` or `~/.profile`).</sub>
 
+You can customize the install source, directory and profile using the `NVM_SOURCE`, `NVM_DIR` and `NVM_PROFILE` variables. Eg: `curl ... | NVM_DIR=/usr/local/nvm sh` for a global install.
+
+<sub>*NB. The installer can use Git, cURL or Wget to download NVM, whatever is available.*</sub>
 
 ### Manual install
 
diff --git a/install-gitless.sh b/install-gitless.sh
deleted file mode 100755
index d4b96b4..0000000
--- a/install-gitless.sh
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/bash
-
-fatalExit (){
-  echo "$@" && exit 1;
-}
-
-# an alternative URL that could be used: https://github.com/creationix/nvm/tarball/master
-if [ "$NVM_SOURCE" = "" ]; then
-  NVM_SOURCE="https://raw.github.com/creationix/nvm/master/nvm.sh"
-fi
-
-if [ "$NVM_DIR" = "" ]; then
-  NVM_DIR="$HOME/.nvm"
-fi
-
-# Downloading to $NVM_DIR
-mkdir -p "$NVM_DIR"
-pushd "$NVM_DIR" > /dev/null
-echo -ne "=> Downloading... "
-
-# Detect if curl or wget is installed to download NVM_SOURCE
-if type curl > /dev/null 2>&1; then
-  curl --silent "$NVM_SOURCE" -o nvm.sh || fatalExit "Failed";
-elif type wget > /dev/null 2>&1; then 
-  wget --quiet "$NVM_SOURCE" -O nvm.sh || fatalExit "Failed";
-else
-  fatalExit "Must have curl or wget to install nvm";
-fi
-
-echo "Downloaded"
-popd > /dev/null
-
-# Detect profile file, .bash_profile has precedence over .profile
-if [ ! -z "$1" ]; then
-  PROFILE="$1"
-else
-  if [ -f "$HOME/.bash_profile" ]; then
-    PROFILE="$HOME/.bash_profile"
-  elif [ -f "$HOME/.profile" ]; then
-    PROFILE="$HOME/.profile"
-  fi
-fi
-
-SOURCE_STR="[[ -s "$NVM_DIR/nvm.sh" ]] && . "$NVM_DIR/nvm.sh"  # This loads NVM"
-
-if [ -z "$PROFILE" ] || [ ! -f "$PROFILE" ] ; then
-  if [ -z $PROFILE ]; then
-    echo "=> Profile not found"
-  else
-    echo "=> Profile $PROFILE not found"
-  fi
-  echo "=> Append the following line to the correct file yourself"
-  echo
-  echo "\t$SOURCE_STR"
-  echo
-  echo "=> Close and reopen your terminal to start using NVM"
-  exit
-fi
-
-if ! grep -qc 'nvm.sh' $PROFILE; then
-  echo "=> Appending source string to $PROFILE"
-  echo "" >> "$PROFILE"
-  echo $SOURCE_STR >> "$PROFILE"
-else
-  echo "=> Source string already in $PROFILE"
-fi
-
-echo "=> Close and reopen your terminal to start using NVM"
-
diff --git a/install.sh b/install.sh
index e76fcd5..17b97bb 100755
--- a/install.sh
+++ b/install.sh
@@ -1,66 +1,130 @@
 #!/bin/bash
 
-NVM_DIR="$HOME/.nvm"
+set -e
 
-if ! hash git 2>/dev/null; then
-  echo >&2 "You need to install git - visit http://git-scm.com/downloads"
-  echo >&2 "or, use install-gitless.sh instead."
-  exit 1
+has() {
+  type "$1" > /dev/null 2>&1
+  return $?
+}
+
+if [ -z "$NVM_DIR" ]; then
+  NVM_DIR="$HOME/.nvm"
 fi
 
-if [ -d "$NVM_DIR" ]; then
-  echo "=> NVM is already installed in $NVM_DIR, trying to update"
-  echo -ne "\r=> "
-  cd $NVM_DIR && git pull
+if ! has "curl"; then
+  if has "wget"; then
+    # Emulate curl with wget
+    curl() {
+      ARGS="$* "
+      ARGS=${ARGS/-s /-q }
+      ARGS=${ARGS/-o /-O }
+      wget $ARGS
+    }
+  fi
+fi
+
+install_from_git() {
+  if [ -z "$NVM_SOURCE" ]; then
+    NVM_SOURCE="https://github.com/creationix/nvm.git"
+  fi
+
+  if [ -d "$NVM_DIR/.git" ]; then
+    echo "=> nvm is already installed in $NVM_DIR, trying to update"
+    echo -e "\r=> \c"
+    cd "$NVM_DIR" && git pull 2> /dev/null || {
+      echo >&2 "Failed to update nvm, run 'git pull' in $NVM_DIR yourself.."
+    }
+  else
+    # Cloning to $NVM_DIR
+    echo "=> Downloading nvm from git to '$NVM_DIR'"
+    echo -e "\r=> \c"
+    mkdir -p "$NVM_DIR"
+    git clone "$NVM_SOURCE" "$NVM_DIR"
+  fi
+}
+
+install_as_script() {
+  if [ -z "$NVM_SOURCE" ]; then
+    NVM_SOURCE="https://raw.github.com/creationix/nvm/master/nvm.sh"
+  fi
+
+  # Downloading to $NVM_DIR
+  mkdir -p "$NVM_DIR"
+  if [ -d "$NVM_DIR/nvm.sh" ]; then
+    echo "=> nvm is already installed in $NVM_DIR, trying to update"
+  else
+    echo "=> Downloading nvm as script to '$NVM_DIR'"
+  fi
+  curl -s "$NVM_SOURCE" -o "$NVM_DIR/nvm.sh" || {
+    echo >&2 "Failed to download '$NVM_SOURCE'.."
+    return 1
+  }
+}
+
+if [ -z "$METHOD" ]; then
+  # Autodetect install method
+  if has "git"; then
+    install_from_git
+  elif has "curl"; then
+    install_as_script
+  else
+    echo >&2 "You need git, curl or wget to install nvm"
+    exit 1
+  fi
 else
-  # Cloning to $NVM_DIR
-  git clone https://github.com/creationix/nvm.git $NVM_DIR  
+  if [ "$METHOD" = "git" ]; then
+    if ! has "git"; then
+      echo >&2 "You need git to install nvm"
+      exit 1
+    fi
+    install_from_git
+  fi
+  if [ "$METHOD" = "script" ]; then
+    if ! has "curl"; then
+      echo >&2 "You need curl or wget to install nvm"
+      exit 1
+    fi
+    install_as_script
+  fi
 fi
 
 echo
 
-# Detect profile file, .bash_profile has precedence over .profile
-if [ ! -z "$1" ]; then
-  PROFILE="$1"
-else
+# Detect profile file if not specified as environment variable (eg: PROFILE=~/.myprofile).
+if [ -z "$PROFILE" ]; then
   if [ -f "$HOME/.bash_profile" ]; then
-	PROFILE="$HOME/.bash_profile"
+    PROFILE="$HOME/.bash_profile"
   elif [ -f "$HOME/.zshrc" ]; then
-  	PROFILE="$HOME/.zshrc"
+    PROFILE="$HOME/.zshrc"
   elif [ -f "$HOME/.profile" ]; then
-	PROFILE="$HOME/.profile"
+    PROFILE="$HOME/.profile"
   fi
 fi
 
-SOURCE_STR="[[ -s \$HOME/.nvm/nvm.sh ]] && . \$HOME/.nvm/nvm.sh  # This loads NVM"
+SOURCE_STR="[ -s \"$NVM_DIR/nvm.sh\" ] && . \"$NVM_DIR/nvm.sh\"  # This loads nvm"
 
 if [ -z "$PROFILE" ] || [ ! -f "$PROFILE" ] ; then
   if [ -z $PROFILE ]; then
-	echo "=> Profile not found. Tried $HOME/.bash_profile and $HOME/.profile"
+    echo "=> Profile not found. Tried ~/.bash_profile ~/.zshrc and ~/.profile."
+    echo "=> Create one of them and run this script again"
   else
-	echo "=> Profile $PROFILE not found"
+    echo "=> Profile $PROFILE not found"
+    echo "=> Create it (touch $PROFILE) and run this script again"
   fi
-  echo "=> Run this script again after running the following:"
+  echo "   OR"
+  echo "=> Append the following line to the correct file yourself:"
   echo
-  echo "\ttouch $HOME/.profile"
+  echo "   $SOURCE_STR"
   echo
-  echo "-- OR --"
-  echo
-  echo "=> Append the following line to the correct file yourself"
-  echo
-  echo "\t$SOURCE_STR"
-  echo
-  echo "=> Close and reopen your terminal afterwards to start using NVM"
-  exit
-fi
-
-if ! grep -qc 'nvm.sh' $PROFILE; then
-  echo "=> Appending source string to $PROFILE"
-  echo "" >> "$PROFILE"
-  echo $SOURCE_STR >> "$PROFILE"
 else
-  echo "=> Source string already in $PROFILE"
+  if ! grep -qc 'nvm.sh' $PROFILE; then
+    echo "=> Appending source string to $PROFILE"
+    echo "" >> "$PROFILE"
+    echo $SOURCE_STR >> "$PROFILE"
+  else
+    echo "=> Source string already in $PROFILE"
+  fi
 fi
 
-echo "=> Close and reopen your terminal to start using NVM"
+echo "=> Close and reopen your terminal to start using nvm"