├── modes ├── development │ ├── .gitignore │ └── js │ │ └── nvm │ │ ├── nvm-exec │ │ ├── bash_completion │ │ └── nvm.sh ├── development.mode.bash ├── scm.mode.bash └── pkg.mode.bash ├── core ├── README.md ├── modes.bash ├── main.bash ├── cht.pkg.bash └── bash_completion.sh ├── based └── debian │ └── index.bash ├── LICENSE ├── install.bash └── README.md /modes/development/.gitignore: -------------------------------------------------------------------------------- 1 | js/nvm/HEAD 2 | js/nvm/.cache 3 | js/nvm/v* 4 | js/nvm/alias 5 | v 6 | -------------------------------------------------------------------------------- /core/README.md: -------------------------------------------------------------------------------- 1 | 2 | ### Sources 3 | 4 | bash_completion.sh : https://github.com/cykerway/complete-alias 5 | -------------------------------------------------------------------------------- /based/debian/index.bash: -------------------------------------------------------------------------------- 1 | cat >>~/.inputrc< /dev/null || exit 127 10 | elif ! nvm use >/dev/null 2>&1; then 11 | echo "No NODE_VERSION provided; no .nvmrc file found" >&2 12 | exit 127 13 | fi 14 | 15 | exec "$@" 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Tadej Panjtar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /core/modes.bash: -------------------------------------------------------------------------------- 1 | mode() { 2 | if [[ $1 ]] && [[ ! $PS_MODE ]] && [[ -r ~/.bash4all/modes/"$1".mode.bash ]]; then 3 | export _PS_MODE="$PS1" 4 | export _MODE="$1" 5 | export PS_MODE="$1" 6 | shift 7 | . ~/.bash4all/modes/"$_MODE".mode.bash "$@" 8 | PS1="$PS1\[\033[93m\]\${PS_MODE}\[\033[00m\]> " 9 | else 10 | # clean up mode 11 | if [[ $PS_MODE ]]; then 12 | . <(cat ~/.bash4all/modes/"$_MODE".mode.bash | grep -e unalias -e unset |grep -v PS_MODE) 13 | export PS1="$_PS_MODE" 14 | unset _MODE _PS_MODE PS_MODE 15 | if [[ "$1" ]]; then # switch to new one 16 | export _PS_MODE="$PS1" 17 | export _MODE="$1" 18 | export PS_MODE="$1" 19 | shift 20 | . ~/.bash4all/modes/"$_MODE".mode.bash "$@" 21 | PS1="$PS1\e[93m\${PS_MODE}\e[00m> " 22 | fi 23 | fi 24 | fi 25 | } 26 | 27 | _modes_completions() 28 | { 29 | case $COMP_CWORD in 30 | 1) 31 | COMPREPLY=( $(compgen -W '$(for m in $(cd ~/.bash4all/modes/; ls *.mode.bash); do echo ${m:0:-10}; done)' -- "${COMP_WORDS[COMP_CWORD]}") ) 32 | ;; 33 | 2) 34 | COMPREPLY=( $(compgen -W "$(cat ~/.bash4all/modes/${COMP_WORDS[1]}.mode.bash |grep -oE '(\w+)\)' |tr -d ')' )" -- "${COMP_WORDS[COMP_CWORD]}") ) 35 | ;; 36 | esac 37 | return 0 38 | } 39 | complete -F _modes_completions mode 40 | -------------------------------------------------------------------------------- /core/main.bash: -------------------------------------------------------------------------------- 1 | 2 | _determine_scm() { 3 | D=$(realpath "$1") 4 | while [[ $D != "/" ]]; do 5 | [ -d .bzr ] && echo bzr && return 0 6 | [ -d .git ] && echo git && return 0 7 | [ -d .hg ] && echo hg && return 0 8 | [ -d .svn ] && echo svn && return 0 9 | builtin cd .. 10 | D=$(pwd) 11 | done 12 | echo "/" 13 | } 14 | 15 | cd() { 16 | if [ "$1" ]; then 17 | builtin cd "$1" 18 | else 19 | builtin cd 20 | fi 21 | local _SCM 22 | _SCM=$(_determine_scm "$PWD") 23 | if [[ "${_SCM}" != "/" ]]; then 24 | mode scm $_SCM 25 | else 26 | [[ "${PS_MODE:0:3}" == "scm" ]] && mode 27 | return 0 28 | fi 29 | } 30 | 31 | 32 | 33 | # Archives 34 | function extract { 35 | if [ -z "$1" ]; then 36 | echo "Usage: extract archive." 37 | else 38 | if [ -f "$1" ]; then 39 | case "$1" in 40 | *.tar.bz2) tar xvjf "$1" ;; 41 | *.tar.gz) tar xvzf "$1" ;; 42 | *.tar.xz) tar xvJf "$1" ;; 43 | *.lzma) unlzma "$1" ;; 44 | *.bz2) bunzip2 "$1" ;; 45 | *.rar) unrar x -ad "$1" ;; 46 | *.gz) gunzip "$1" ;; 47 | *.tar) tar xvf "$1" ;; 48 | *.tbz2) tar xvjf "$1" ;; 49 | *.tgz) tar xvzf "$1" ;; 50 | *.zip) unzip "$1" ;; 51 | *.Z) uncompress "$1" ;; 52 | *.7z) 7z x "$1" ;; 53 | *.xz) unxz "$1" ;; 54 | *.exe) cabextract "$1" ;; 55 | *) echo "extract: '$1' - unknown archive method" ;; 56 | esac 57 | else 58 | echo "$1 - file does not exist" 59 | fi 60 | fi 61 | } 62 | -------------------------------------------------------------------------------- /modes/development.mode.bash: -------------------------------------------------------------------------------- 1 | unalias gcl co st gb branch gob add commit revert pull push log 2>/dev/null 2 | unset -f cht 3 | 4 | if [[ -z "$1" ]]; then 5 | echo "Missing programming language acronim as last parameter" 6 | unset _MODE _PS_MODE PS_MODE 7 | return 1 8 | else 9 | _PLANG="$1" 10 | fi 11 | export PS_MODE="d-${_PLANG}" 12 | 13 | # minimal cheat sheets, for config and standalone use check https://github.com/chubin/cheat.sh 14 | cht() { 15 | input="$@" 16 | query=$(echo "$_PLANG $input" | sed 's@ *$@@; s@^ *@@; s@ @/@; s@ @+@g') 17 | curl -s "cht.sh"/"$query" 18 | } 19 | 20 | case "$_PLANG" in 21 | cc) 22 | unalias gcl gst gbra gco gcob gadd gcom gc gl gpus gpus glom ghom 2>/dev/null 23 | unset -f Cr 24 | Cr() { # compile and run, standalone file is first argument 25 | F="$1" 26 | shift 27 | FF="${F%.*}" 28 | echo Compiling "$F and running $FF" 29 | c++ "$F" -o "$FF" $@ && ./"$FF" 30 | } 31 | ;; 32 | js) 33 | unalias I Id 2>/dev/null 34 | nvm unload 2>/dev/null; unset NVM_VERSION 35 | export NVM_DIR=~/.bash4all/modes/development/js/nvm 36 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 37 | [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" 38 | alias I='npm install --save' 39 | alias Id='npm install --save-dev' 40 | alias se='npm search' 41 | ;; 42 | py) 43 | unalias pip 2>/dev/null 44 | alias pip='pip3' 45 | ;; 46 | vlang) 47 | v() { 48 | V_DIR=~/.bash4all/modes/development/v 49 | if [ up = "$1" -a ! -d "$V_DIR" ]; then 50 | git clone https://github.com/vlang/v $V_DIR 51 | (cd $V_DIR && make) 52 | return 53 | fi 54 | $V_DIR/v $@ 55 | } 56 | source /dev/stdin <<<"$(v complete setup bash)" 57 | ;; 58 | *) 59 | echo "Unknown ${_MODE} or not implemented" 60 | PS1="$_PS_MODE" 61 | unset _MODE _PS_MODE PS_MODE 62 | esac 63 | -------------------------------------------------------------------------------- /modes/scm.mode.bash: -------------------------------------------------------------------------------- 1 | unalias gcl co st sd gb branch gob add commit revert pull push log 2>/dev/null 2 | 3 | if [[ -z "$1" ]]; then 4 | _SCM=git 5 | else 6 | _SCM="$1" 7 | fi 8 | export PS_MODE="${_MODE}-${_SCM}" 9 | 10 | case "$_SCM" in 11 | bzr) 12 | alias st='bzr status' 13 | alias branch='bzr branch' 14 | alias revert='bzr checkout' 15 | alias sd='bzr diff' 16 | alias add='bzr add ' 17 | alias commit='bzr commit' 18 | alias pull='bzr pull' 19 | alias log='bzr log' 20 | alias push='bzr push' ;; 21 | git) 22 | unalias gcl gst gbra gco gcob gadd gcom gc gl gpus gpus glom ghom 2>/dev/null 23 | alias {gcl,co}='git clone' 24 | alias {gst,st}='git status' 25 | alias {gbra,gb,branch}='git branch' 26 | alias {gco,revert}='git checkout' 27 | alias {gcob,gob}='git checkout -b' 28 | alias sd='git diff' 29 | alias {gadd,add}='git add ' 30 | alias {gcom,gc,commit}='git commit' 31 | alias {gpul,pull}='git pull' 32 | alias {gl,log}='git log' 33 | alias {gpus,push}='git push' 34 | alias glom='git pull origin master' 35 | alias ghom='git push origin master' 36 | ;; 37 | hg) # mercurial 38 | alias st='hg status' 39 | alias branch='hg branch' 40 | alias revert='hg checkout' 41 | alias sd='hg diff' 42 | alias add='hg add ' 43 | alias commit='hg commit' 44 | alias pull='hg pull' 45 | alias log='hg log' 46 | alias push='hg push' 47 | ;; 48 | svn) 49 | unalias sco sst sadd svu sbr svc commit sl 2>/dev/null 50 | alias {sco,co}='svn checkout' 51 | alias {sst,st}='svn status' 52 | alias {sadd,add}='svn add' 53 | alias sd='svn diff' 54 | alias {svu,pull}='svn update' 55 | alias {sbr,branch}='svn tav' 56 | alias revert='svn revert' 57 | alias {svc,commit,push}='svn commit' 58 | alias {sl,log}='svn log' 59 | ;; 60 | *) 61 | echo "Unknown ${_MODE} or not implemented" 62 | PS1="$_PS_MODE" 63 | unset _MODE _PS_MODE PS_MODE 64 | esac 65 | -------------------------------------------------------------------------------- /modes/development/js/nvm/bash_completion: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # bash completion for Node Version Manager (NVM) 4 | 5 | if ! command -v nvm &> /dev/null; then 6 | return 7 | fi 8 | 9 | __nvm_generate_completion() { 10 | declare current_word 11 | current_word="${COMP_WORDS[COMP_CWORD]}" 12 | # shellcheck disable=SC2207 13 | COMPREPLY=($(compgen -W "$1" -- "${current_word}")) 14 | return 0 15 | } 16 | 17 | __nvm_commands() { 18 | declare current_word 19 | declare command 20 | 21 | current_word="${COMP_WORDS[COMP_CWORD]}" 22 | 23 | COMMANDS=' 24 | help install uninstall use run exec 25 | alias unalias reinstall-packages 26 | current list ls list-remote ls-remote 27 | install-latest-npm 28 | cache deactivate unload 29 | version version-remote which' 30 | 31 | if [ ${#COMP_WORDS[@]} == 4 ]; then 32 | 33 | command="${COMP_WORDS[COMP_CWORD - 2]}" 34 | case "${command}" in 35 | alias) __nvm_installed_nodes ;; 36 | esac 37 | 38 | else 39 | 40 | case "${current_word}" in 41 | -*) __nvm_options ;; 42 | *) __nvm_generate_completion "${COMMANDS}" ;; 43 | esac 44 | 45 | fi 46 | } 47 | 48 | __nvm_options() { 49 | OPTIONS='' 50 | __nvm_generate_completion "${OPTIONS}" 51 | } 52 | 53 | __nvm_installed_nodes() { 54 | __nvm_generate_completion "$(nvm_ls) $(__nvm_aliases)" 55 | } 56 | 57 | __nvm_aliases() { 58 | declare aliases 59 | aliases="" 60 | if [ -d "${NVM_DIR}/alias" ]; then 61 | aliases="$(cd "${NVM_DIR}/alias" && command find "${PWD}" -type f | command sed "s:${PWD}/::")" 62 | fi 63 | echo "${aliases} node stable unstable iojs" 64 | } 65 | 66 | __nvm_alias() { 67 | __nvm_generate_completion "$(__nvm_aliases)" 68 | } 69 | 70 | __nvm() { 71 | declare previous_word 72 | previous_word="${COMP_WORDS[COMP_CWORD - 1]}" 73 | 74 | case "${previous_word}" in 75 | use | run | exec | ls | list | uninstall) __nvm_installed_nodes ;; 76 | alias | unalias) __nvm_alias ;; 77 | *) __nvm_commands ;; 78 | esac 79 | 80 | return 0 81 | } 82 | 83 | # complete is a bash builtin, but recent versions of ZSH come with a function 84 | # called bashcompinit that will create a complete in ZSH. If the user is in 85 | # ZSH, load and run bashcompinit before calling the complete function. 86 | if [[ -n ${ZSH_VERSION-} ]]; then 87 | autoload -U +X bashcompinit && bashcompinit 88 | autoload -U +X compinit && if [[ ${ZSH_DISABLE_COMPFIX-} = true ]]; then 89 | compinit -u 90 | else 91 | compinit 92 | fi 93 | fi 94 | 95 | complete -o default -F __nvm nvm 96 | -------------------------------------------------------------------------------- /core/cht.pkg.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | 3 | FILE=~/.bash4all/modes/pkg.mode.bash 4 | 5 | _usage() { 6 | echo "usage: (DISTRIBS in any order; use autocompletion) e.g." _FROM_OS_ _TO_OS_ _optional_BASH4ALL_ 7 | } 8 | _aliases_full() { 9 | cat $FILE | sed -n "1,/if \[ $1 =/d;/^fi$/q;p" 10 | } 11 | _aliases_distrib() { 12 | _aliases_full $1 | sed 's/^alias\W\+//;s/\W\?=.*$//' 13 | } 14 | _alias_distrib() { 15 | _aliases_full $2 | grep -oP "^alias\W+$1\W?=?\K.*$" 16 | } 17 | 18 | _pkg_from_to() { 19 | declare -a H aliasesAll aliasesRow 20 | declare -A lenMax al 21 | for e in $( cat $FILE |grep -oP '\w+(?=\s+=\s+"\$BASED")' ); do 22 | i=0 23 | for ARGV in $@; do 24 | if [ $ARGV = $e ]; then 25 | H[$i]=$e 26 | elif [ BASH4ALL = "$ARGV" ]; then 27 | H[$i]="BASH4ALL" 28 | fi 29 | ((i++)) 30 | done 31 | done 32 | if [ ${#H[@]} -lt 1 ]; then _usage; return; fi 33 | IFS="," 34 | for d in ${H[@]}; do 35 | lenMax[$d]=0 36 | while read -r SHORT ALIAS; do 37 | aliasesAll+=($SHORT) 38 | if [ BASH4ALL = "$d" ]; then 39 | lenMax[$d]=10 40 | else 41 | if [ ${#ALIAS} -gt ${lenMax[$d]} ]; then lenMax[$d]=${#ALIAS}; fi 42 | fi 43 | done < <(_aliases_full $d | sed 's/^alias\W\+//;s/=/,/' && echo I) 44 | ((lenMax[$d]--)) 45 | done 46 | while read -r asu; do 47 | aliasesRow+=($asu) 48 | done < <(for a in ${aliasesAll[@]}; do echo $a; done | sort -u) 49 | unset IFS 50 | for a in HeaD LinE ${aliasesRow[@]}; do 51 | col=1 52 | for d in ${H[@]}; do 53 | if [ BASH4ALL = "$d" ]; then 54 | v=$a 55 | else 56 | v=$(_alias_distrib $a $d | sed "s/'//g") 57 | fi 58 | if [ LinE = "$a" ]; then 59 | DELIM="+"; 60 | v=$(printf '%0.s-' $(for ((i=0; i<=${lenMax[$d]}; i++)); do echo $i;done)) 61 | elif [ HeaD = "$a" ]; then 62 | DELIM="|"; v="$d" 63 | else 64 | DELIM="|"; 65 | fi 66 | if [ LinE = "$a" ]; then 67 | printf "%*s" "${lenMax[$d]}" "$v" 68 | else 69 | printf "%*s " "${lenMax[$d]}" "$v" 70 | fi 71 | if [ $col -lt ${#H[@]} ]; then echo -n $DELIM; fi 72 | ((col++)) 73 | done 74 | echo 75 | done 76 | } 77 | 78 | how-in() { 79 | if [ $# -lt 2 ]; then 80 | _usage 81 | else 82 | _pkg_from_to $@ 83 | fi 84 | } 85 | 86 | complete -W $'$( cat ~/.bash4all/modes/pkg.mode.bash |grep -oP \'\w+(?=\s+=\s+"\$BASED")\' ) BASH4ALL' how-in 87 | -------------------------------------------------------------------------------- /modes/pkg.mode.bash: -------------------------------------------------------------------------------- 1 | # A-Z Sorted. Alias content always in single quotes 2 | unalias I i Qf q S se U u 2>/dev/null 3 | 4 | if [ ARCH = "$BASED" ]; then 5 | alias I='sudo pacman -Syu --needed --noconfirm' 6 | alias i='sudo pacman -S --needed' 7 | alias Pkg='makepkg -fp PKGBUILD' 8 | alias Qf='sudo pacman -Fyl' 9 | alias q='pacman -Qi' 10 | alias se='pacman -Ss' 11 | alias U='sudo pacman -Rys --noconfirm' 12 | alias u='sudo pacman -Rs' 13 | fi 14 | 15 | if [ BEOS = "$BASED" ]; then 16 | alias I='pkgman install -y' 17 | alias i='pkgman install' 18 | alias se='pkgman search' 19 | alias U='pkgman uninstall -y' 20 | alias u='pkgman uninstall' 21 | fi 22 | 23 | if [ BSD = "$BASED" ]; then 24 | alias I='sudo pkg install -y' 25 | alias i='sudo pkg install' 26 | alias q='pkg info' 27 | alias se='pkg search' 28 | alias U='sudo pkg remove -y' 29 | alias u='sudo pkg remove' 30 | fi 31 | 32 | if [ DEBIAN = "$BASED" ]; then 33 | alias I='sudo apt-get -y install' 34 | alias i='sudo apt-get install' 35 | alias Pkg='dpkg-buildpackage --no-sign' 36 | alias Qf='apt-file search' 37 | alias q='apt show' 38 | alias S='sudo service' 39 | alias se='apt search' 40 | alias U='sudo apt-get -y remove' 41 | alias u='sudo apt-get remove' 42 | fi 43 | 44 | if [ GENTOO = "$BASED" ]; then 45 | alias I='emerge -a' 46 | alias i='emerge' 47 | alias Qf='pfl' 48 | alias q='emerge -S' 49 | alias se='emerge -S' 50 | alias U='emerge -avc' 51 | alias u='emerge -vc' 52 | fi 53 | 54 | if [ MAC = "$BASED" ]; then 55 | alias I='brew install' 56 | fi 57 | 58 | # add user to wheel group; now also moving to dnf 59 | if [ MAGEIA = "$BASED" ]; then 60 | alias I='sudo urpmi --no-recommends --auto' 61 | alias i='sudo urpmi --no-recommends' 62 | alias Pkg='rpmbuild -bb' 63 | alias Qf='urpmf' # outputs package:file 64 | alias q='urpmq -i' 65 | alias S='sudo service' 66 | alias se='urpmf --summary' # outputs package:summary 67 | alias U='sudo urpme --auto' 68 | alias u='sudo urpme' 69 | fi 70 | 71 | if [ REDHAT = "$BASED" ]; then 72 | alias I='sudo dnf install -y' 73 | alias i='sudo dnf install' 74 | alias Qf='dnf provides' 75 | alias q='dnf info' 76 | alias S='sudo service' 77 | alias se='dnf search' 78 | alias U='sudo dnf remove -y' 79 | alias u='sudo dnf remove' 80 | fi 81 | 82 | if [ SUSE = "$BASED" ]; then 83 | alias I='sudo zypper install -y' 84 | alias i='sudo zypper install' 85 | alias Qf='zypper info' 86 | alias q='zypper what-provides' 87 | alias S='sudo service' 88 | alias se='zypper search' 89 | alias U='zypper remove -y' 90 | alias u='zypper remove' 91 | fi 92 | 93 | # autocomplete aliases 94 | if [ -f ~/.bash4all/core/bash_completion.sh ]; then 95 | type _complete_alias >/dev/null 2>&1 96 | if [ $? = 1 ]; then . ~/.bash4all/core/bash_completion.sh; fi 97 | for c in I i Qf q S se U u; do 98 | complete -F _complete_alias $c 99 | done 100 | fi 101 | -------------------------------------------------------------------------------- /install.bash: -------------------------------------------------------------------------------- 1 | # Install and update script 2 | INSTALLED_FROM=https://raw.githubusercontent.com/tpanj/bash4all/master/modes/pkg.mode.bash 3 | OS=$(uname -o) 4 | shopt -s expand_aliases 5 | unset _FILE_EXSISTS _PROFILE 6 | 7 | Echo () { 8 | echo "=> $@" 9 | } 10 | 11 | [ -d ~/.bash4all ] && { 12 | Echo "Alreary installed. Proceed with update? [Y/n]" 13 | read yn 14 | if [[ $yn != [Nn]* ]]; then 15 | cd ~/.bash4all; git pull 16 | fi 17 | exit 0 18 | } 19 | 20 | nyi_contribute() { 21 | echo "Not yet implemented for $1 you have." 22 | echo "Have you thought to https://github.com/tpanj/bash4all/wiki/Contribute" 23 | exit 2 24 | } 25 | 26 | cmd_exists() { 27 | command -v "$@" >/dev/null 2>&1 28 | } 29 | 30 | get_install_cmd() { 31 | cmd_exists curl && BASED="$1" . <(curl -fsSL $INSTALLED_FROM) 32 | cmd_exists curl || { 33 | cmd_exists wget && BASED="$1" . <(wget -O- $INSTALLED_FROM) 34 | } 35 | echo "$(alias I); export BASED=$1" # export from f. 36 | } 37 | 38 | case $OS in 39 | "GNU/Linux") 40 | DISTRIB=$(lsb_release --id --short) 41 | case "$DISTRIB" in 42 | Ubuntu | LinuxMint | Debian | MX) 43 | . <(get_install_cmd DEBIAN) 44 | ;; 45 | Arch | ManjaroLinux | Garuda) 46 | . <(get_install_cmd ARCH) 47 | ;; 48 | CentOS | Redhat | Fedora | Scientific) 49 | . <(get_install_cmd REDHAT) 50 | ;; 51 | Fedora | Scientific) 52 | . <(get_install_cmd FEDORA) 53 | ;; 54 | Mageia | Mandriva | PCLinuxOS) 55 | . <(get_install_cmd MAGEIA) 56 | ;; 57 | "openSUSE project" | SUSE) 58 | . <(get_install_cmd SUSE) 59 | ;; 60 | PC) 61 | ;; 62 | *) 63 | nyi_contribute "$DISTRIB" 64 | esac 65 | ;; 66 | # not linuxes 67 | Haiku) 68 | . <(get_install_cmd BEOS) 69 | ;; 70 | Darwin*) 71 | . <(get_install_cmd MAC) 72 | ;; 73 | FreeBSD) 74 | . <(get_install_cmd BSD) 75 | ;; 76 | # Cygwin) 77 | # . <(get_install_cmd DOS) 78 | # ;; 79 | *) 80 | nyi_contribute $OS 81 | esac 82 | 83 | Echo "This script will backup necessary files and install per user config" 84 | cmd_exists git || { 85 | echo -n "Do you want to install needed git using \"" 86 | echo $(alias I | sed -n 's/^alias I=.//p'|sed -n 's/.$//p' ) git\" ? 87 | } 88 | Echo "[Y/n]" 89 | if [ Y = "$NON_INTERACTIVE" ]; then yn=Y; else read yn ;fi 90 | read yn 91 | [[ $yn != [Nn]* ]] && { 92 | cmd_exists git || I git 93 | git clone https://github.com/tpanj/bash4all ~/.bash4all 94 | } 95 | 96 | if [ -w ~/.bashrc ]; then 97 | _PROFILE=~/.bashrc; _FILE_EXSISTS="end of " 98 | else 99 | _PROFILE=~/.bashrc 100 | fi 101 | 102 | # special cases of locations 103 | [[ ${BASED} == 'BEOS' ]] && _PROFILE=~/config/settings/profile 104 | 105 | [ "$_FILE_EXSISTS" ] && { 106 | cp $_PROFILE{,.bash4all}; 107 | Echo "Backups of existing files will be created with .bash4all extensions" 108 | } 109 | 110 | cat >>$_PROFILE < 45 | Development and executing mode for programming language. 46 | 47 | ### pkg - managing software packages and services 48 | Aliases: 49 | * I - unconditionally installs package(s) 50 | * i - installs package(s) 51 | * U - unconditionally uninstall package(s) 52 | * u - uninstall package(s) 53 | * S - service command (start, stop, .. ) 54 | * ... 55 | 56 | Example: 57 | ```bash 58 | mode pkg 59 | I vlc # installs vlc 60 | ``` 61 | ### scm - managing software packages and services 62 | Source Code Management for bzr, git, hg or svn. 63 | 64 | **Generic SCM commands:** 65 | * **co** URL - Clone or checkout repository. Default set to git type 66 | * **add** item - add item under SCM 67 | * **commit** - track change 68 | * **push** - publish changes 69 | * **pull** - get changes from remote 70 | * **branch** - create branch 71 | * **log** - show commit history 72 | 73 | ## Core functions 74 | **mode** for a particular job 75 | * pkg - mode for installing and uninstalling software 76 | * scm - Source Code Management. This module starts also automatically when in SCM folder 77 | 78 | **extract** archive 79 | Extracting to current dir 80 | 81 | ## Keys bindings 82 | 83 | **Begin of line search** 84 | Type beginning of previous command and then PgUp / PgDown 85 | cycles through history only for matching entries. 86 | 87 | **Full text backward search** 88 | Famous Ctrl + r search through commands history. 89 | 90 | # More 91 | 92 | Bash4all uses some other great scripts: 93 | * **[nvm](https://github.com/nvm-sh/nvm)** - nodejs version manager. Available under `mode development js` 94 | * **[cht](https://github.com/chubin/cheat.sh)** - best community driven documentation repositories. Available under `mode development *` 95 | * ... 96 | 97 | You can also [personalize complex installer](https://github.com/tpanj/bash4all/wiki/pkg#advanced). The rest of doc is found in 98 | [Wiki](https://github.com/tpanj/bash4all/wiki) pages to minimize core repository. 99 | -------------------------------------------------------------------------------- /core/bash_completion.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ## :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 4 | ## programmable completion function for shell aliases; 5 | ## :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 6 | 7 | ## ============================================================================ 8 | ## Copyright (C) 2016-2018 Cyker Way 9 | ## 10 | ## This program is free software: you can redistribute it and/or modify it 11 | ## under the terms of the GNU General Public License as published by the Free 12 | ## Software Foundation, either version 3 of the License, or (at your option) 13 | ## any later version. 14 | ## 15 | ## This program is distributed in the hope that it will be useful, but WITHOUT 16 | ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 17 | ## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 18 | ## more details. 19 | ## 20 | ## You should have received a copy of the GNU General Public License along with 21 | ## this program. If not, see . 22 | ## ============================================================================ 23 | 24 | ## ============================================================================ 25 | ## variable; 26 | ## ============================================================================ 27 | 28 | ## register for keeping function return value; 29 | _retval= 30 | 31 | ## refcnt for alias expansion; expand aliases iff `_refcnt == 0`; 32 | _refcnt=0 33 | 34 | ## ============================================================================ 35 | ## function; 36 | ## ============================================================================ 37 | 38 | ## debug; 39 | _debug() { 40 | echo 41 | echo "#COMP_WORDS=${#COMP_WORDS[@]}" 42 | echo "COMP_WORDS=(" 43 | for x in "${COMP_WORDS[@]}"; do 44 | echo "'$x'" 45 | done 46 | echo ")" 47 | echo "COMP_CWORD=${COMP_CWORD}" 48 | echo "COMP_LINE='${COMP_LINE}'" 49 | echo "COMP_POINT=${COMP_POINT}" 50 | echo 51 | } 52 | 53 | ## test whether element is in array; 54 | ## 55 | ## $@ 56 | ## : ( elem arr[0] arr[1] ... ) 57 | _inarr() { 58 | for e in "${@:2}"; do 59 | [[ "$e" == "$1" ]] && return 0 60 | done 61 | return 1 62 | } 63 | 64 | ## split command line into words; 65 | ## 66 | ## $1 67 | ## : command line string; 68 | _split_cmd_line() { 69 | ## command line string; 70 | local str="$1" 71 | 72 | ## an array that will contain words after split; 73 | local words=() 74 | 75 | ## alloc a temp stack to track open and close chars when splitting; 76 | local sta=() 77 | 78 | ## examine each char of `str`; 79 | local i=0 j=0 80 | for (( ; j < ${#str}; j++ )); do 81 | if (( ${#sta[@]} == 0 )); then 82 | if [[ '$(' == "${str:j:2}" ]]; then 83 | sta+=( ')' ) 84 | (( j++ )) 85 | elif [[ '`' == "${str:j:1}" ]]; then 86 | sta+=( '`' ) 87 | elif [[ '(' == "${str:j:1}" ]]; then 88 | sta+=( ')' ) 89 | elif [[ '{' == "${str:j:1}" ]]; then 90 | sta+=( '}' ) 91 | elif [[ '"' == "${str:j:1}" ]]; then 92 | sta+=( '"' ) 93 | elif [[ "'" == "${str:j:1}" ]]; then 94 | sta+=( "'" ) 95 | elif [[ '\$' == "${str:j:2}" ]]; then 96 | (( j++ )) 97 | elif [[ '\`' == "${str:j:2}" ]]; then 98 | (( j++ )) 99 | elif [[ '\"' == "${str:j:2}" ]]; then 100 | (( j++ )) 101 | elif [[ '\\' == "${str:j:2}" ]]; then 102 | (( j++ )) 103 | elif [[ "\'" == "${str:j:2}" ]]; then 104 | (( j++ )) 105 | elif [[ $' \t\n' == *"${str:j:1}"* ]]; then 106 | (( i < j )) && words+=( "${str:i:j-i}" ) 107 | (( i = j + 1 )) 108 | elif [[ "><=;|&:" == *"${str:j:1}"* ]]; then 109 | (( i < j )) && words+=( "${str:i:j-i}" ) 110 | words+=( "${str:j:1}" ) 111 | (( i = j + 1 )) 112 | fi 113 | elif [[ "${sta[-1]}" == ')' ]]; then 114 | if [[ ')' == "${str:j:1}" ]]; then 115 | unset sta[-1] 116 | elif [[ '$(' == "${str:j:2}" ]]; then 117 | sta+=( ')' ) 118 | (( j++ )) 119 | elif [[ '`' == "${str:j:1}" ]]; then 120 | sta+=( '`' ) 121 | elif [[ '(' == "${str:j:1}" ]]; then 122 | sta+=( ')' ) 123 | elif [[ '{' == "${str:j:1}" ]]; then 124 | sta+=( '}' ) 125 | elif [[ '"' == "${str:j:1}" ]]; then 126 | sta+=( '"' ) 127 | elif [[ "'" == "${str:j:1}" ]]; then 128 | sta+=( "'" ) 129 | elif [[ '\$' == "${str:j:2}" ]]; then 130 | (( j++ )) 131 | elif [[ '\`' == "${str:j:2}" ]]; then 132 | (( j++ )) 133 | elif [[ '\"' == "${str:j:2}" ]]; then 134 | (( j++ )) 135 | elif [[ '\\' == "${str:j:2}" ]]; then 136 | (( j++ )) 137 | elif [[ "\'" == "${str:j:2}" ]]; then 138 | (( j++ )) 139 | fi 140 | elif [[ "${sta[-1]}" == '}' ]]; then 141 | if [[ '}' == "${str:j:1}" ]]; then 142 | unset sta[-1] 143 | elif [[ '$(' == "${str:j:2}" ]]; then 144 | sta+=( ')' ) 145 | (( j++ )) 146 | elif [[ '`' == "${str:j:1}" ]]; then 147 | sta+=( '`' ) 148 | elif [[ '(' == "${str:j:1}" ]]; then 149 | sta+=( ')' ) 150 | elif [[ '{' == "${str:j:1}" ]]; then 151 | sta+=( '}' ) 152 | elif [[ '"' == "${str:j:1}" ]]; then 153 | sta+=( '"' ) 154 | elif [[ "'" == "${str:j:1}" ]]; then 155 | sta+=( "'" ) 156 | elif [[ '\$' == "${str:j:2}" ]]; then 157 | (( j++ )) 158 | elif [[ '\`' == "${str:j:2}" ]]; then 159 | (( j++ )) 160 | elif [[ '\"' == "${str:j:2}" ]]; then 161 | (( j++ )) 162 | elif [[ '\\' == "${str:j:2}" ]]; then 163 | (( j++ )) 164 | elif [[ "\'" == "${str:j:2}" ]]; then 165 | (( j++ )) 166 | fi 167 | elif [[ "${sta[-1]}" == '`' ]]; then 168 | if [[ '`' == "${str:j:1}" ]]; then 169 | unset sta[-1] 170 | elif [[ '$(' == "${str:j:2}" ]]; then 171 | sta+=( ')' ) 172 | (( j++ )) 173 | elif [[ '(' == "${str:j:1}" ]]; then 174 | sta+=( ')' ) 175 | elif [[ '{' == "${str:j:1}" ]]; then 176 | sta+=( '}' ) 177 | elif [[ '"' == "${str:j:1}" ]]; then 178 | sta+=( '"' ) 179 | elif [[ "'" == "${str:j:1}" ]]; then 180 | sta+=( "'" ) 181 | elif [[ '\$' == "${str:j:2}" ]]; then 182 | (( j++ )) 183 | elif [[ '\`' == "${str:j:2}" ]]; then 184 | (( j++ )) 185 | elif [[ '\"' == "${str:j:2}" ]]; then 186 | (( j++ )) 187 | elif [[ '\\' == "${str:j:2}" ]]; then 188 | (( j++ )) 189 | elif [[ "\'" == "${str:j:2}" ]]; then 190 | (( j++ )) 191 | fi 192 | elif [[ "${sta[-1]}" == "'" ]]; then 193 | if [[ "'" == "${str:j:1}" ]]; then 194 | unset sta[-1] 195 | fi 196 | elif [[ "${sta[-1]}" == '"' ]]; then 197 | if [[ '"' == "${str:j:1}" ]]; then 198 | unset sta[-1] 199 | elif [[ '$(' == "${str:j:2}" ]]; then 200 | sta+=( ')' ) 201 | (( j++ )) 202 | elif [[ '`' == "${str:j:1}" ]]; then 203 | sta+=( '`' ) 204 | elif [[ '\$' == "${str:j:2}" ]]; then 205 | (( j++ )) 206 | elif [[ '\`' == "${str:j:2}" ]]; then 207 | (( j++ )) 208 | elif [[ '\"' == "${str:j:2}" ]]; then 209 | (( j++ )) 210 | elif [[ '\\' == "${str:j:2}" ]]; then 211 | (( j++ )) 212 | fi 213 | fi 214 | done 215 | 216 | ## append the last word; 217 | (( i < j )) && words+=( "${str:i:j-i}" ) 218 | 219 | ## unset the temp stack; 220 | unset sta 221 | 222 | ## return value; 223 | _retval=( "${words[@]}" ) 224 | } 225 | 226 | ## expand aliases in command line; 227 | ## 228 | ## $1 229 | ## : beg word index; 230 | ## $2 231 | ## : end word index; 232 | ## $3 233 | ## : ignored word index (can be null); 234 | ## $4 235 | ## : number of used aliases; 236 | ## ${@:4} 237 | ## : used aliases; 238 | ## $? 239 | ## : difference of `${#COMP_WORDS}` before and after expansion; 240 | _expand_alias() { 241 | local beg="$1" end="$2" ignore="$3" n_used="$4"; shift 4 242 | local used=( "${@:1:$n_used}" ); shift "$n_used" 243 | 244 | if (( $beg == $end )) ; then 245 | ## case 1: range is empty; 246 | _retval=0 247 | elif [[ -n "$ignore" ]] && (( $beg == $ignore )); then 248 | ## case 2: beg index is ignored; pass it; 249 | _expand_alias \ 250 | "$(( $beg + 1 ))" \ 251 | "$end" \ 252 | "$ignore" \ 253 | "${#used[@]}" \ 254 | "${used[@]}" 255 | elif ! alias "${COMP_WORDS[$beg]}" &>/dev/null; then 256 | ## case 3: command is not an alias; 257 | _retval=0 258 | elif ( _inarr "${COMP_WORDS[$beg]}" "${used[@]}" ); then 259 | ## case 4: command is an used alias; 260 | _retval=0 261 | else 262 | ## case 5: command is an unused alias; 263 | 264 | ## get alias name; 265 | local cmd="${COMP_WORDS[$beg]}" 266 | 267 | ## get alias body; 268 | local str0="$( alias "$cmd" | sed -E 's/[^=]*=//' | xargs )" 269 | 270 | ## split alias body into words; 271 | _split_cmd_line "$str0" 272 | local words0=( "${_retval[@]}" ) 273 | 274 | ## find index range of word `$COMP_WORDS[$beg]` in string `$COMP_LINE`; 275 | local i=0 j=0 276 | for (( i = 0; i <= $beg; i++ )); do 277 | for (( ; j <= ${#COMP_LINE}; j++ )); do 278 | [[ "${COMP_LINE:j}" == "${COMP_WORDS[i]}"* ]] && break 279 | done 280 | (( i == $beg )) && break 281 | (( j += ${#COMP_WORDS[i]} )) 282 | done 283 | 284 | ## now `j` is at the beginning of word `$COMP_WORDS[$beg]`; and we know 285 | ## the index range is `[j, j+${#cmd})`; update `$COMP_LINE` and 286 | ## `$COMP_POINT`; 287 | COMP_LINE="${COMP_LINE:0:j}${str0}${COMP_LINE:j+${#cmd}}" 288 | if (( $COMP_POINT < j )); then 289 | : 290 | elif (( $COMP_POINT < j + ${#cmd} )); then 291 | ## set current cursor position to the end of replacement string; 292 | (( COMP_POINT = j + ${#str0} )) 293 | else 294 | (( COMP_POINT += ${#str0} - ${#cmd} )) 295 | fi 296 | 297 | ## update `$COMP_WORDS` and `$COMP_CWORD`; 298 | COMP_WORDS=( 299 | "${COMP_WORDS[@]:0:beg}" 300 | "${words0[@]}" 301 | "${COMP_WORDS[@]:beg+1}" 302 | ) 303 | if (( $COMP_CWORD < $beg )); then 304 | : 305 | elif (( $COMP_CWORD < $beg + 1 )); then 306 | ## set current word index to the last of replacement words; 307 | (( COMP_CWORD = $beg + ${#words0[@]} - 1 )) 308 | else 309 | (( COMP_CWORD += ${#words0[@]} - 1 )) 310 | fi 311 | 312 | ## update `$ignore` if it is not empty; if `$ignore` is not empty, then 313 | ## we know it is not equal to `$beg` because we checked that in case 2; 314 | if [[ -n "$ignore" ]] && (( $ignore > $beg )); then 315 | (( ignore += ${#words0[@]} - 1 )) 316 | fi 317 | 318 | ## recursively expand part 0; 319 | local used0=( "${used[@]}" "$cmd" ) 320 | _expand_alias \ 321 | "$beg" \ 322 | "$(( $beg + ${#words0[@]} ))" \ 323 | "$ignore" \ 324 | "${#used0[@]}" \ 325 | "${used0[@]}" 326 | local diff0="$_retval" 327 | 328 | ## recursively expand part 1; 329 | if [[ -n "$str0" ]] && [[ "${str0: -1}" == ' ' ]]; then 330 | local used1=( "${used[@]}" ) 331 | _expand_alias \ 332 | "$(( $beg + ${#words0[@]} + $diff0 ))" \ 333 | "$(( $end + ${#words0[@]} - 1 + $diff0 ))" \ 334 | "$ignore" \ 335 | "${#used1[@]}" \ 336 | "${used1[@]}" 337 | local diff1="$_retval" 338 | else 339 | local diff1=0 340 | fi 341 | 342 | ## return value; 343 | _retval=$(( ${#words0[@]} - 1 + diff0 + diff1 )) 344 | fi 345 | } 346 | 347 | ## set a command completion function to the default one; users may edit this 348 | ## function to fit their own needs; 349 | _set_default_completion() { 350 | local cmd="$1" 351 | 352 | case "$cmd" in 353 | bind) 354 | complete -A binding "$cmd" 355 | ;; 356 | help) 357 | complete -A helptopic "$cmd" 358 | ;; 359 | set) 360 | complete -A setopt "$cmd" 361 | ;; 362 | shopt) 363 | complete -A shopt "$cmd" 364 | ;; 365 | bg) 366 | complete -A stopped -P '"%' -S '"' "$cmd" 367 | ;; 368 | service) 369 | complete -F _service "$cmd" 370 | ;; 371 | unalias) 372 | complete -a "$cmd" 373 | ;; 374 | builtin) 375 | complete -b "$cmd" 376 | ;; 377 | command|type|which) 378 | complete -c "$cmd" 379 | ;; 380 | fg|jobs|disown) 381 | complete -j -P '"%' -S '"' "$cmd" 382 | ;; 383 | groups|slay|w|sux) 384 | complete -u "$cmd" 385 | ;; 386 | readonly|unset) 387 | complete -v "$cmd" 388 | ;; 389 | traceroute|traceroute6|tracepath|tracepath6|fping|fping6|telnet|rsh|\ 390 | rlogin|ftp|dig|mtr|ssh-installkeys|showmount) 391 | complete -F _known_hosts "$cmd" 392 | ;; 393 | aoss|command|do|else|eval|exec|ltrace|nice|nohup|padsp|then|time|\ 394 | tsocks|vsound|xargs) 395 | complete -F _command "$cmd" 396 | ;; 397 | fakeroot|gksu|gksudo|kdesudo|really) 398 | complete -F _root_command "$cmd" 399 | ;; 400 | a2ps|awk|base64|bash|bc|bison|cat|chroot|colordiff|cp|csplit|cut|date|\ 401 | df|diff|dir|du|enscript|env|expand|fmt|fold|gperf|grep|grub|head|\ 402 | irb|ld|ldd|less|ln|ls|m4|md5sum|mkdir|mkfifo|mknod|mv|netstat|nl|\ 403 | nm|objcopy|objdump|od|paste|pr|ptx|readelf|rm|rmdir|sed|seq|\ 404 | sha{,1,224,256,384,512}sum|shar|sort|split|strip|sum|tac|tail|tee|\ 405 | texindex|touch|tr|uname|unexpand|uniq|units|vdir|wc|who) 406 | complete -F _longopt "$cmd" 407 | ;; 408 | *) 409 | _completion_loader "$cmd" 410 | ;; 411 | esac 412 | } 413 | 414 | ## programmable completion function for aliases; this is the function to be set 415 | ## with `complete -F`; 416 | _complete_alias() { 417 | ## get command; 418 | local cmd="${COMP_WORDS[0]}" 419 | 420 | ## we expand aliases only for the original command line (ie: the command 421 | ## line after which user pressed ``); this means we expand aliases 422 | ## only in the outmost call of this function; we ensure this by using a 423 | ## refcnt and expand aliases iff the refcnt is equal to 0; 424 | if (( _refcnt == 0 )); then 425 | 426 | ## find index range of word `$COMP_WORDS[$COMP_CWORD]` in string 427 | ## `$COMP_LINE`; dont expand this word if `$COMP_POINT` (cursor 428 | ## position) lies in this range because the word may be incomplete; 429 | local i=0 j=0 430 | for (( ; i <= $COMP_CWORD; i++ )); do 431 | for (( ; j <= ${#COMP_LINE}; j++ )); do 432 | [[ "${COMP_LINE:j}" == "${COMP_WORDS[i]}"* ]] && break 433 | done 434 | (( i == $COMP_CWORD )) && break 435 | (( j += ${#COMP_WORDS[i]} )) 436 | done 437 | 438 | ## now `j` is at the beginning of word `$COMP_WORDS[$COMP_CWORD]`; and 439 | ## we know the index range is `[j, j+${#COMP_WORDS[$COMP_CWORD]}]`; we 440 | ## include the right endpoint to cover the case where cursor is at the 441 | ## exact end of the word; compare the index range with `$COMP_POINT`; 442 | if (( j <= $COMP_POINT )) && \ 443 | (( $COMP_POINT <= j + ${#COMP_WORDS[$COMP_CWORD]} )); then 444 | local ignore="$COMP_CWORD" 445 | else 446 | local ignore="" 447 | fi 448 | 449 | ## expand aliases; 450 | _expand_alias 0 "${#COMP_WORDS[@]}" "$ignore" 0 451 | fi 452 | 453 | ## increase refcnt; 454 | (( _refcnt++ )) 455 | 456 | ## since aliases have been fully expanded, we no longer need to consider 457 | ## aliases in the resulting command line; so we now set this command 458 | ## completion function to the default one (which is alias-agnostic); this 459 | ## avoids infinite recursion when a command is aliased to itself (ie: 460 | ## `alias ls='ls -a'`); 461 | _set_default_completion "$cmd" 462 | 463 | ## do actual completion; 464 | _command_offset 0 465 | 466 | ## reset this command completion function to `_complete_alias`; 467 | complete -F _complete_alias "$cmd" 468 | 469 | ## decrease refcnt; 470 | (( _refcnt-- )) 471 | } 472 | 473 | ## ============================================================================ 474 | ## complete user-defined aliases; 475 | ## 476 | ## uncomment and edit these lines to complete your aliases; 477 | ## ============================================================================ 478 | 479 | #complete -F _complete_alias myalias1 480 | #complete -F _complete_alias myalias2 481 | #complete -F _complete_alias myalias3 482 | 483 | -------------------------------------------------------------------------------- /modes/development/js/nvm/nvm.sh: -------------------------------------------------------------------------------- 1 | # Node Version Manager 2 | # Implemented as a POSIX-compliant function 3 | # Should work on sh, dash, bash, ksh, zsh 4 | # To use source this file from your bash profile 5 | # 6 | # Implemented by Tim Caswell 7 | # with much bash help from Matthew Ranney 8 | 9 | # "local" warning, quote expansion warning 10 | # shellcheck disable=SC2039,SC2016,SC2001 11 | { # this ensures the entire script is downloaded # 12 | 13 | NVM_SCRIPT_SOURCE="$_" 14 | 15 | nvm_is_zsh() { 16 | [ -n "${ZSH_VERSION-}" ] 17 | } 18 | 19 | nvm_stdout_is_terminal() { 20 | [ -t 1 ] 21 | } 22 | 23 | nvm_echo() { 24 | command printf %s\\n "$*" 2>/dev/null 25 | } 26 | 27 | nvm_cd() { 28 | \cd "$@" 29 | } 30 | 31 | nvm_err() { 32 | >&2 nvm_echo "$@" 33 | } 34 | 35 | nvm_grep() { 36 | GREP_OPTIONS='' command grep "$@" 37 | } 38 | 39 | nvm_has() { 40 | type "${1-}" >/dev/null 2>&1 41 | } 42 | 43 | nvm_has_non_aliased() { 44 | nvm_has "${1-}" && ! nvm_is_alias "${1-}" 45 | } 46 | 47 | nvm_is_alias() { 48 | # this is intentionally not "command alias" so it works in zsh. 49 | \alias "${1-}" >/dev/null 2>&1 50 | } 51 | 52 | nvm_command_info() { 53 | local COMMAND 54 | local INFO 55 | COMMAND="${1}" 56 | if type "${COMMAND}" | nvm_grep -q hashed; then 57 | INFO="$(type "${COMMAND}" | command sed -E 's/\(|\)//g' | command awk '{print $4}')" 58 | elif type "${COMMAND}" | nvm_grep -q aliased; then 59 | # shellcheck disable=SC2230 60 | INFO="$(which "${COMMAND}") ($(type "${COMMAND}" | command awk '{ $1=$2=$3=$4="" ;print }' | command sed -e 's/^\ *//g' -Ee "s/\`|'//g"))" 61 | elif type "${COMMAND}" | nvm_grep -q "^${COMMAND} is an alias for"; then 62 | # shellcheck disable=SC2230 63 | INFO="$(which "${COMMAND}") ($(type "${COMMAND}" | command awk '{ $1=$2=$3=$4=$5="" ;print }' | command sed 's/^\ *//g'))" 64 | elif type "${COMMAND}" | nvm_grep -q "^${COMMAND} is \\/"; then 65 | INFO="$(type "${COMMAND}" | command awk '{print $3}')" 66 | else 67 | INFO="$(type "${COMMAND}")" 68 | fi 69 | nvm_echo "${INFO}" 70 | } 71 | 72 | nvm_has_colors() { 73 | local NVM_COLORS 74 | if nvm_has tput; then 75 | NVM_COLORS="$(tput -T "${TERM:-vt100}" colors)" 76 | fi 77 | [ "${NVM_COLORS:--1}" -ge 8 ] 78 | } 79 | 80 | nvm_curl_libz_support() { 81 | curl -V 2>/dev/null | nvm_grep "^Features:" | nvm_grep -q "libz" 82 | } 83 | 84 | nvm_curl_use_compression() { 85 | nvm_curl_libz_support && nvm_version_greater_than_or_equal_to "$(nvm_curl_version)" 7.21.0 86 | } 87 | 88 | nvm_get_latest() { 89 | local NVM_LATEST_URL 90 | local CURL_COMPRESSED_FLAG 91 | if nvm_has "curl"; then 92 | if nvm_curl_use_compression; then 93 | CURL_COMPRESSED_FLAG="--compressed" 94 | fi 95 | NVM_LATEST_URL="$(curl ${CURL_COMPRESSED_FLAG:-} -q -w "%{url_effective}\\n" -L -s -S http://latest.nvm.sh -o /dev/null)" 96 | elif nvm_has "wget"; then 97 | NVM_LATEST_URL="$(wget -q http://latest.nvm.sh --server-response -O /dev/null 2>&1 | command awk '/^ Location: /{DEST=$2} END{ print DEST }')" 98 | else 99 | nvm_err 'nvm needs curl or wget to proceed.' 100 | return 1 101 | fi 102 | if [ -z "${NVM_LATEST_URL}" ]; then 103 | nvm_err "http://latest.nvm.sh did not redirect to the latest release on GitHub" 104 | return 2 105 | fi 106 | nvm_echo "${NVM_LATEST_URL##*/}" 107 | } 108 | 109 | nvm_download() { 110 | local CURL_COMPRESSED_FLAG 111 | if nvm_has "curl"; then 112 | if nvm_curl_use_compression; then 113 | CURL_COMPRESSED_FLAG="--compressed" 114 | fi 115 | curl --fail ${CURL_COMPRESSED_FLAG:-} -q "$@" 116 | elif nvm_has "wget"; then 117 | # Emulate curl with wget 118 | ARGS=$(nvm_echo "$@" | command sed -e 's/--progress-bar /--progress=bar /' \ 119 | -e 's/--compressed //' \ 120 | -e 's/--fail //' \ 121 | -e 's/-L //' \ 122 | -e 's/-I /--server-response /' \ 123 | -e 's/-s /-q /' \ 124 | -e 's/-sS /-nv /' \ 125 | -e 's/-o /-O /' \ 126 | -e 's/-C - /-c /') 127 | # shellcheck disable=SC2086 128 | eval wget $ARGS 129 | fi 130 | } 131 | 132 | nvm_has_system_node() { 133 | [ "$(nvm deactivate >/dev/null 2>&1 && command -v node)" != '' ] 134 | } 135 | 136 | nvm_has_system_iojs() { 137 | [ "$(nvm deactivate >/dev/null 2>&1 && command -v iojs)" != '' ] 138 | } 139 | 140 | nvm_is_version_installed() { 141 | [ -n "${1-}" ] && [ -x "$(nvm_version_path "$1" 2>/dev/null)"/bin/node ] 142 | } 143 | 144 | nvm_print_npm_version() { 145 | if nvm_has "npm"; then 146 | command printf " (npm v$(npm --version 2>/dev/null))" 147 | fi 148 | } 149 | 150 | nvm_install_latest_npm() { 151 | nvm_echo 'Attempting to upgrade to the latest working version of npm...' 152 | local NODE_VERSION 153 | NODE_VERSION="$(nvm_strip_iojs_prefix "$(nvm_ls_current)")" 154 | if [ "${NODE_VERSION}" = 'system' ]; then 155 | NODE_VERSION="$(node --version)" 156 | elif [ "${NODE_VERSION}" = 'none' ]; then 157 | nvm_echo "Detected node version ${NODE_VERSION}, npm version v${NPM_VERSION}" 158 | NODE_VERSION='' 159 | fi 160 | if [ -z "${NODE_VERSION}" ]; then 161 | nvm_err 'Unable to obtain node version.' 162 | return 1 163 | fi 164 | local NPM_VERSION 165 | NPM_VERSION="$(npm --version 2>/dev/null)" 166 | if [ -z "${NPM_VERSION}" ]; then 167 | nvm_err 'Unable to obtain npm version.' 168 | return 2 169 | fi 170 | 171 | local NVM_NPM_CMD 172 | NVM_NPM_CMD='npm' 173 | if [ "${NVM_DEBUG-}" = 1 ]; then 174 | nvm_echo "Detected node version ${NODE_VERSION}, npm version v${NPM_VERSION}" 175 | NVM_NPM_CMD='nvm_echo npm' 176 | fi 177 | 178 | local NVM_IS_0_6 179 | NVM_IS_0_6=0 180 | if nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 0.6.0 && nvm_version_greater 0.7.0 "${NODE_VERSION}"; then 181 | NVM_IS_0_6=1 182 | fi 183 | local NVM_IS_0_9 184 | NVM_IS_0_9=0 185 | if nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 0.9.0 && nvm_version_greater 0.10.0 "${NODE_VERSION}"; then 186 | NVM_IS_0_9=1 187 | fi 188 | 189 | if [ $NVM_IS_0_6 -eq 1 ]; then 190 | nvm_echo '* `node` v0.6.x can only upgrade to `npm` v1.3.x' 191 | $NVM_NPM_CMD install -g npm@1.3 192 | elif [ $NVM_IS_0_9 -eq 0 ]; then 193 | # node 0.9 breaks here, for some reason 194 | if nvm_version_greater_than_or_equal_to "${NPM_VERSION}" 1.0.0 && nvm_version_greater 2.0.0 "${NPM_VERSION}"; then 195 | nvm_echo '* `npm` v1.x needs to first jump to `npm` v1.4.28 to be able to upgrade further' 196 | $NVM_NPM_CMD install -g npm@1.4.28 197 | elif nvm_version_greater_than_or_equal_to "${NPM_VERSION}" 2.0.0 && nvm_version_greater 3.0.0 "${NPM_VERSION}"; then 198 | nvm_echo '* `npm` v2.x needs to first jump to the latest v2 to be able to upgrade further' 199 | $NVM_NPM_CMD install -g npm@2 200 | fi 201 | fi 202 | 203 | if [ $NVM_IS_0_9 -eq 1 ] || [ $NVM_IS_0_6 -eq 1 ]; then 204 | nvm_echo '* node v0.6 and v0.9 are unable to upgrade further' 205 | elif nvm_version_greater 1.1.0 "${NODE_VERSION}"; then 206 | nvm_echo '* `npm` v4.5.x is the last version that works on `node` versions < v1.1.0' 207 | $NVM_NPM_CMD install -g npm@4.5 208 | elif nvm_version_greater 4.0.0 "${NODE_VERSION}"; then 209 | nvm_echo '* `npm` v5 and higher do not work on `node` versions below v4.0.0' 210 | $NVM_NPM_CMD install -g npm@4 211 | elif [ $NVM_IS_0_9 -eq 0 ] && [ $NVM_IS_0_6 -eq 0 ]; then 212 | local NVM_IS_4_4_OR_BELOW 213 | NVM_IS_4_4_OR_BELOW=0 214 | if nvm_version_greater 4.5.0 "${NODE_VERSION}"; then 215 | NVM_IS_4_4_OR_BELOW=1 216 | fi 217 | 218 | local NVM_IS_5_OR_ABOVE 219 | NVM_IS_5_OR_ABOVE=0 220 | if [ $NVM_IS_4_4_OR_BELOW -eq 0 ] && nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 5.0.0; then 221 | NVM_IS_5_OR_ABOVE=1 222 | fi 223 | 224 | local NVM_IS_6_OR_ABOVE 225 | NVM_IS_6_OR_ABOVE=0 226 | local NVM_IS_6_2_OR_ABOVE 227 | NVM_IS_6_2_OR_ABOVE=0 228 | if [ $NVM_IS_5_OR_ABOVE -eq 1 ] && nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 6.0.0; then 229 | NVM_IS_6_OR_ABOVE=1 230 | if nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 6.2.0; then 231 | NVM_IS_6_2_OR_ABOVE=1 232 | fi 233 | fi 234 | 235 | local NVM_IS_9_OR_ABOVE 236 | NVM_IS_9_OR_ABOVE=0 237 | local NVM_IS_9_3_OR_ABOVE 238 | NVM_IS_9_3_OR_ABOVE=0 239 | if [ $NVM_IS_6_2_OR_ABOVE -eq 1 ] && nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 9.0.0; then 240 | NVM_IS_9_OR_ABOVE=1 241 | if nvm_version_greater_than_or_equal_to "${NODE_VERSION}" 9.3.0; then 242 | NVM_IS_9_3_OR_ABOVE=1 243 | fi 244 | fi 245 | 246 | if [ $NVM_IS_4_4_OR_BELOW -eq 1 ] || { 247 | [ $NVM_IS_5_OR_ABOVE -eq 1 ] && nvm_version_greater 5.10.0 "${NODE_VERSION}"; \ 248 | }; then 249 | nvm_echo '* `npm` `v5.3.x` is the last version that works on `node` 4.x versions below v4.4, or 5.x versions below v5.10, due to `Buffer.alloc`' 250 | $NVM_NPM_CMD install -g npm@5.3 251 | elif [ $NVM_IS_4_4_OR_BELOW -eq 0 ] && nvm_version_greater 4.7.0 "${NODE_VERSION}"; then 252 | nvm_echo '* `npm` `v5.4.1` is the last version that works on `node` `v4.5` and `v4.6`' 253 | $NVM_NPM_CMD install -g npm@5.4.1 254 | elif [ $NVM_IS_6_OR_ABOVE -eq 0 ]; then 255 | nvm_echo '* `npm` `v5.x` is the last version that works on `node` below `v6.0.0`' 256 | $NVM_NPM_CMD install -g npm@5 257 | elif \ 258 | { [ $NVM_IS_6_OR_ABOVE -eq 1 ] && [ $NVM_IS_6_2_OR_ABOVE -eq 0 ]; } \ 259 | || { [ $NVM_IS_9_OR_ABOVE -eq 1 ] && [ $NVM_IS_9_3_OR_ABOVE -eq 0 ]; } \ 260 | ; then 261 | nvm_echo '* `npm` `v6.9` is the last version that works on `node` `v6.0.x`, `v6.1.x`, `v9.0.x`, `v9.1.x`, or `v9.2.x`' 262 | $NVM_NPM_CMD install -g npm@6.9 263 | else 264 | nvm_echo '* Installing latest `npm`; if this does not work on your node version, please report a bug!' 265 | $NVM_NPM_CMD install -g npm 266 | fi 267 | fi 268 | nvm_echo "* npm upgraded to: v$(npm --version 2>/dev/null)" 269 | } 270 | 271 | # Make zsh glob matching behave same as bash 272 | # This fixes the "zsh: no matches found" errors 273 | if [ -z "${NVM_CD_FLAGS-}" ]; then 274 | export NVM_CD_FLAGS='' 275 | fi 276 | if nvm_is_zsh; then 277 | NVM_CD_FLAGS="-q" 278 | fi 279 | 280 | # Auto detect the NVM_DIR when not set 281 | if [ -z "${NVM_DIR-}" ]; then 282 | # shellcheck disable=SC2128 283 | if [ -n "${BASH_SOURCE-}" ]; then 284 | # shellcheck disable=SC2169 285 | NVM_SCRIPT_SOURCE="${BASH_SOURCE[0]}" 286 | fi 287 | NVM_DIR="$(nvm_cd ${NVM_CD_FLAGS} "$(dirname "${NVM_SCRIPT_SOURCE:-$0}")" >/dev/null && \pwd)" 288 | export NVM_DIR 289 | else 290 | # https://unix.stackexchange.com/a/198289 291 | case $NVM_DIR in 292 | *[!/]*/) 293 | NVM_DIR="${NVM_DIR%"${NVM_DIR##*[!/]}"}" 294 | export NVM_DIR 295 | nvm_err "Warning: \$NVM_DIR should not have trailing slashes" 296 | ;; 297 | esac 298 | fi 299 | unset NVM_SCRIPT_SOURCE 2>/dev/null 300 | 301 | nvm_tree_contains_path() { 302 | local tree 303 | tree="${1-}" 304 | local node_path 305 | node_path="${2-}" 306 | 307 | if [ "@${tree}@" = "@@" ] || [ "@${node_path}@" = "@@" ]; then 308 | nvm_err "both the tree and the node path are required" 309 | return 2 310 | fi 311 | 312 | local pathdir 313 | pathdir=$(dirname "${node_path}") 314 | while [ "${pathdir}" != "" ] && [ "${pathdir}" != "." ] && [ "${pathdir}" != "/" ] && [ "${pathdir}" != "${tree}" ]; do 315 | pathdir=$(dirname "${pathdir}") 316 | done 317 | [ "${pathdir}" = "${tree}" ] 318 | } 319 | 320 | # Traverse up in directory tree to find containing folder 321 | nvm_find_up() { 322 | local path_ 323 | path_="${PWD}" 324 | while [ "${path_}" != "" ] && [ ! -f "${path_}/${1-}" ]; do 325 | path_=${path_%/*} 326 | done 327 | nvm_echo "${path_}" 328 | } 329 | 330 | nvm_find_nvmrc() { 331 | local dir 332 | dir="$(nvm_find_up '.nvmrc')" 333 | if [ -e "${dir}/.nvmrc" ]; then 334 | nvm_echo "${dir}/.nvmrc" 335 | fi 336 | } 337 | 338 | # Obtain nvm version from rc file 339 | nvm_rc_version() { 340 | export NVM_RC_VERSION='' 341 | local NVMRC_PATH 342 | NVMRC_PATH="$(nvm_find_nvmrc)" 343 | if [ ! -e "${NVMRC_PATH}" ]; then 344 | nvm_err "No .nvmrc file found" 345 | return 1 346 | fi 347 | NVM_RC_VERSION="$(command head -n 1 "${NVMRC_PATH}" | command tr -d '\r')" || command printf '' 348 | if [ -z "${NVM_RC_VERSION}" ]; then 349 | nvm_err "Warning: empty .nvmrc file found at \"${NVMRC_PATH}\"" 350 | return 2 351 | fi 352 | nvm_echo "Found '${NVMRC_PATH}' with version <${NVM_RC_VERSION}>" 353 | } 354 | 355 | nvm_clang_version() { 356 | clang --version | command awk '{ if ($2 == "version") print $3; else if ($3 == "version") print $4 }' | command sed 's/-.*$//g' 357 | } 358 | 359 | nvm_curl_version() { 360 | curl -V | command awk '{ if ($1 == "curl") print $2 }' | command sed 's/-.*$//g' 361 | } 362 | 363 | nvm_version_greater() { 364 | command awk 'BEGIN { 365 | if (ARGV[1] == "" || ARGV[2] == "") exit(1) 366 | split(ARGV[1], a, /\./); 367 | split(ARGV[2], b, /\./); 368 | for (i=1; i<=3; i++) { 369 | if (a[i] && a[i] !~ /^[0-9]+$/) exit(2); 370 | if (b[i] && b[i] !~ /^[0-9]+$/) { exit(0); } 371 | if (a[i] < b[i]) exit(3); 372 | else if (a[i] > b[i]) exit(0); 373 | } 374 | exit(4) 375 | }' "${1#v}" "${2#v}" 376 | } 377 | 378 | nvm_version_greater_than_or_equal_to() { 379 | command awk 'BEGIN { 380 | if (ARGV[1] == "" || ARGV[2] == "") exit(1) 381 | split(ARGV[1], a, /\./); 382 | split(ARGV[2], b, /\./); 383 | for (i=1; i<=3; i++) { 384 | if (a[i] && a[i] !~ /^[0-9]+$/) exit(2); 385 | if (a[i] < b[i]) exit(3); 386 | else if (a[i] > b[i]) exit(0); 387 | } 388 | exit(0) 389 | }' "${1#v}" "${2#v}" 390 | } 391 | 392 | nvm_version_dir() { 393 | local NVM_WHICH_DIR 394 | NVM_WHICH_DIR="${1-}" 395 | if [ -z "${NVM_WHICH_DIR}" ] || [ "${NVM_WHICH_DIR}" = "new" ]; then 396 | nvm_echo "${NVM_DIR}/versions/node" 397 | elif [ "_${NVM_WHICH_DIR}" = "_iojs" ]; then 398 | nvm_echo "${NVM_DIR}/versions/io.js" 399 | elif [ "_${NVM_WHICH_DIR}" = "_old" ]; then 400 | nvm_echo "${NVM_DIR}" 401 | else 402 | nvm_err 'unknown version dir' 403 | return 3 404 | fi 405 | } 406 | 407 | nvm_alias_path() { 408 | nvm_echo "$(nvm_version_dir old)/alias" 409 | } 410 | 411 | nvm_version_path() { 412 | local VERSION 413 | VERSION="${1-}" 414 | if [ -z "${VERSION}" ]; then 415 | nvm_err 'version is required' 416 | return 3 417 | elif nvm_is_iojs_version "${VERSION}"; then 418 | nvm_echo "$(nvm_version_dir iojs)/$(nvm_strip_iojs_prefix "${VERSION}")" 419 | elif nvm_version_greater 0.12.0 "${VERSION}"; then 420 | nvm_echo "$(nvm_version_dir old)/${VERSION}" 421 | else 422 | nvm_echo "$(nvm_version_dir new)/${VERSION}" 423 | fi 424 | } 425 | 426 | nvm_ensure_version_installed() { 427 | local PROVIDED_VERSION 428 | PROVIDED_VERSION="${1-}" 429 | if [ "${PROVIDED_VERSION}" = 'system' ]; then 430 | if nvm_has_system_iojs || nvm_has_system_node; then 431 | return 0 432 | fi 433 | nvm_err "N/A: no system version of node/io.js is installed." 434 | return 1 435 | fi 436 | local LOCAL_VERSION 437 | local EXIT_CODE 438 | LOCAL_VERSION="$(nvm_version "${PROVIDED_VERSION}")" 439 | EXIT_CODE="$?" 440 | local NVM_VERSION_DIR 441 | if [ "${EXIT_CODE}" != "0" ] || ! nvm_is_version_installed "${LOCAL_VERSION}"; then 442 | if VERSION="$(nvm_resolve_alias "${PROVIDED_VERSION}")"; then 443 | nvm_err "N/A: version \"${PROVIDED_VERSION} -> ${VERSION}\" is not yet installed." 444 | else 445 | local PREFIXED_VERSION 446 | PREFIXED_VERSION="$(nvm_ensure_version_prefix "${PROVIDED_VERSION}")" 447 | nvm_err "N/A: version \"${PREFIXED_VERSION:-$PROVIDED_VERSION}\" is not yet installed." 448 | fi 449 | nvm_err "" 450 | nvm_err "You need to run \"nvm install ${PROVIDED_VERSION}\" to install it before using it." 451 | return 1 452 | fi 453 | } 454 | 455 | # Expand a version using the version cache 456 | nvm_version() { 457 | local PATTERN 458 | PATTERN="${1-}" 459 | local VERSION 460 | # The default version is the current one 461 | if [ -z "${PATTERN}" ]; then 462 | PATTERN='current' 463 | fi 464 | 465 | if [ "${PATTERN}" = "current" ]; then 466 | nvm_ls_current 467 | return $? 468 | fi 469 | 470 | local NVM_NODE_PREFIX 471 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 472 | case "_${PATTERN}" in 473 | "_${NVM_NODE_PREFIX}" | "_${NVM_NODE_PREFIX}-") 474 | PATTERN="stable" 475 | ;; 476 | esac 477 | VERSION="$(nvm_ls "${PATTERN}" | command tail -1)" 478 | if [ -z "${VERSION}" ] || [ "_${VERSION}" = "_N/A" ]; then 479 | nvm_echo "N/A" 480 | return 3 481 | fi 482 | nvm_echo "${VERSION}" 483 | } 484 | 485 | nvm_remote_version() { 486 | local PATTERN 487 | PATTERN="${1-}" 488 | local VERSION 489 | if nvm_validate_implicit_alias "${PATTERN}" 2>/dev/null; then 490 | case "${PATTERN}" in 491 | "$(nvm_iojs_prefix)") 492 | VERSION="$(NVM_LTS="${NVM_LTS-}" nvm_ls_remote_iojs | command tail -1)" &&: 493 | ;; 494 | *) 495 | VERSION="$(NVM_LTS="${NVM_LTS-}" nvm_ls_remote "${PATTERN}")" &&: 496 | ;; 497 | esac 498 | else 499 | VERSION="$(NVM_LTS="${NVM_LTS-}" nvm_remote_versions "${PATTERN}" | command tail -1)" 500 | fi 501 | if [ -n "${NVM_VERSION_ONLY-}" ]; then 502 | command awk 'BEGIN { 503 | n = split(ARGV[1], a); 504 | print a[1] 505 | }' "${VERSION}" 506 | else 507 | nvm_echo "${VERSION}" 508 | fi 509 | if [ "${VERSION}" = 'N/A' ]; then 510 | return 3 511 | fi 512 | } 513 | 514 | nvm_remote_versions() { 515 | local NVM_IOJS_PREFIX 516 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 517 | local NVM_NODE_PREFIX 518 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 519 | 520 | local PATTERN 521 | PATTERN="${1-}" 522 | 523 | local NVM_FLAVOR 524 | if [ -n "${NVM_LTS-}" ]; then 525 | NVM_FLAVOR="${NVM_NODE_PREFIX}" 526 | fi 527 | 528 | case "${PATTERN}" in 529 | "${NVM_IOJS_PREFIX}" | "io.js") 530 | NVM_FLAVOR="${NVM_IOJS_PREFIX}" 531 | unset PATTERN 532 | ;; 533 | "${NVM_NODE_PREFIX}") 534 | NVM_FLAVOR="${NVM_NODE_PREFIX}" 535 | unset PATTERN 536 | ;; 537 | esac 538 | 539 | if nvm_validate_implicit_alias "${PATTERN-}" 2>/dev/null; then 540 | nvm_err 'Implicit aliases are not supported in nvm_remote_versions.' 541 | return 1 542 | fi 543 | 544 | local NVM_LS_REMOTE_EXIT_CODE 545 | NVM_LS_REMOTE_EXIT_CODE=0 546 | local NVM_LS_REMOTE_PRE_MERGED_OUTPUT 547 | NVM_LS_REMOTE_PRE_MERGED_OUTPUT='' 548 | local NVM_LS_REMOTE_POST_MERGED_OUTPUT 549 | NVM_LS_REMOTE_POST_MERGED_OUTPUT='' 550 | if [ -z "${NVM_FLAVOR-}" ] || [ "${NVM_FLAVOR-}" = "${NVM_NODE_PREFIX}" ]; then 551 | local NVM_LS_REMOTE_OUTPUT 552 | NVM_LS_REMOTE_OUTPUT=$(NVM_LTS="${NVM_LTS-}" nvm_ls_remote "${PATTERN-}") &&: 553 | NVM_LS_REMOTE_EXIT_CODE=$? 554 | # split output into two 555 | NVM_LS_REMOTE_PRE_MERGED_OUTPUT="${NVM_LS_REMOTE_OUTPUT%%v4\.0\.0*}" 556 | NVM_LS_REMOTE_POST_MERGED_OUTPUT="${NVM_LS_REMOTE_OUTPUT#$NVM_LS_REMOTE_PRE_MERGED_OUTPUT}" 557 | fi 558 | 559 | local NVM_LS_REMOTE_IOJS_EXIT_CODE 560 | NVM_LS_REMOTE_IOJS_EXIT_CODE=0 561 | local NVM_LS_REMOTE_IOJS_OUTPUT 562 | NVM_LS_REMOTE_IOJS_OUTPUT='' 563 | if [ -z "${NVM_LTS-}" ] && { 564 | [ -z "${NVM_FLAVOR-}" ] || [ "${NVM_FLAVOR-}" = "${NVM_IOJS_PREFIX}" ]; 565 | }; then 566 | NVM_LS_REMOTE_IOJS_OUTPUT=$(nvm_ls_remote_iojs "${PATTERN-}") &&: 567 | NVM_LS_REMOTE_IOJS_EXIT_CODE=$? 568 | fi 569 | 570 | VERSIONS="$(nvm_echo "${NVM_LS_REMOTE_PRE_MERGED_OUTPUT} 571 | ${NVM_LS_REMOTE_IOJS_OUTPUT} 572 | ${NVM_LS_REMOTE_POST_MERGED_OUTPUT}" | nvm_grep -v "N/A" | command sed '/^$/d')" 573 | 574 | if [ -z "${VERSIONS}" ]; then 575 | nvm_echo 'N/A' 576 | return 3 577 | fi 578 | nvm_echo "${VERSIONS}" 579 | return $NVM_LS_REMOTE_EXIT_CODE || $NVM_LS_REMOTE_IOJS_EXIT_CODE 580 | } 581 | 582 | nvm_is_valid_version() { 583 | if nvm_validate_implicit_alias "${1-}" 2>/dev/null; then 584 | return 0 585 | fi 586 | case "${1-}" in 587 | "$(nvm_iojs_prefix)" | \ 588 | "$(nvm_node_prefix)") 589 | return 0 590 | ;; 591 | *) 592 | local VERSION 593 | VERSION="$(nvm_strip_iojs_prefix "${1-}")" 594 | nvm_version_greater_than_or_equal_to "${VERSION}" 0 595 | ;; 596 | esac 597 | } 598 | 599 | nvm_normalize_version() { 600 | command awk 'BEGIN { 601 | split(ARGV[1], a, /\./); 602 | printf "%d%06d%06d\n", a[1], a[2], a[3]; 603 | exit; 604 | }' "${1#v}" 605 | } 606 | 607 | nvm_ensure_version_prefix() { 608 | local NVM_VERSION 609 | NVM_VERSION="$(nvm_strip_iojs_prefix "${1-}" | command sed -e 's/^\([0-9]\)/v\1/g')" 610 | if nvm_is_iojs_version "${1-}"; then 611 | nvm_add_iojs_prefix "${NVM_VERSION}" 612 | else 613 | nvm_echo "${NVM_VERSION}" 614 | fi 615 | } 616 | 617 | nvm_format_version() { 618 | local VERSION 619 | VERSION="$(nvm_ensure_version_prefix "${1-}")" 620 | local NUM_GROUPS 621 | NUM_GROUPS="$(nvm_num_version_groups "${VERSION}")" 622 | if [ "${NUM_GROUPS}" -lt 3 ]; then 623 | nvm_format_version "${VERSION%.}.0" 624 | else 625 | nvm_echo "${VERSION}" | command cut -f1-3 -d. 626 | fi 627 | } 628 | 629 | nvm_num_version_groups() { 630 | local VERSION 631 | VERSION="${1-}" 632 | VERSION="${VERSION#v}" 633 | VERSION="${VERSION%.}" 634 | if [ -z "${VERSION}" ]; then 635 | nvm_echo "0" 636 | return 637 | fi 638 | local NVM_NUM_DOTS 639 | NVM_NUM_DOTS=$(nvm_echo "${VERSION}" | command sed -e 's/[^\.]//g') 640 | local NVM_NUM_GROUPS 641 | NVM_NUM_GROUPS=".${NVM_NUM_DOTS}" # add extra dot, since it's (n - 1) dots at this point 642 | nvm_echo "${#NVM_NUM_GROUPS}" 643 | } 644 | 645 | nvm_strip_path() { 646 | if [ -z "${NVM_DIR-}" ]; then 647 | nvm_err '${NVM_DIR} not set!' 648 | return 1 649 | fi 650 | nvm_echo "${1-}" | command sed \ 651 | -e "s#${NVM_DIR}/[^/]*${2-}[^:]*:##g" \ 652 | -e "s#:${NVM_DIR}/[^/]*${2-}[^:]*##g" \ 653 | -e "s#${NVM_DIR}/[^/]*${2-}[^:]*##g" \ 654 | -e "s#${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*:##g" \ 655 | -e "s#:${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*##g" \ 656 | -e "s#${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*##g" 657 | } 658 | 659 | nvm_change_path() { 660 | # if there’s no initial path, just return the supplementary path 661 | if [ -z "${1-}" ]; then 662 | nvm_echo "${3-}${2-}" 663 | # if the initial path doesn’t contain an nvm path, prepend the supplementary 664 | # path 665 | elif ! nvm_echo "${1-}" | nvm_grep -q "${NVM_DIR}/[^/]*${2-}" \ 666 | && ! nvm_echo "${1-}" | nvm_grep -q "${NVM_DIR}/versions/[^/]*/[^/]*${2-}"; then 667 | nvm_echo "${3-}${2-}:${1-}" 668 | # if the initial path contains BOTH an nvm path (checked for above) and 669 | # that nvm path is preceded by a system binary path, just prepend the 670 | # supplementary path instead of replacing it. 671 | # https://github.com/nvm-sh/nvm/issues/1652#issuecomment-342571223 672 | elif nvm_echo "${1-}" | nvm_grep -Eq "(^|:)(/usr(/local)?)?${2-}:.*${NVM_DIR}/[^/]*${2-}" \ 673 | || nvm_echo "${1-}" | nvm_grep -Eq "(^|:)(/usr(/local)?)?${2-}:.*${NVM_DIR}/versions/[^/]*/[^/]*${2-}"; then 674 | nvm_echo "${3-}${2-}:${1-}" 675 | # use sed to replace the existing nvm path with the supplementary path. This 676 | # preserves the order of the path. 677 | else 678 | nvm_echo "${1-}" | command sed \ 679 | -e "s#${NVM_DIR}/[^/]*${2-}[^:]*#${3-}${2-}#" \ 680 | -e "s#${NVM_DIR}/versions/[^/]*/[^/]*${2-}[^:]*#${3-}${2-}#" 681 | fi 682 | } 683 | 684 | nvm_binary_available() { 685 | # binaries started with node 0.8.6 686 | nvm_version_greater_than_or_equal_to "$(nvm_strip_iojs_prefix "${1-}")" v0.8.6 687 | } 688 | 689 | nvm_print_formatted_alias() { 690 | local ALIAS 691 | ALIAS="${1-}" 692 | local DEST 693 | DEST="${2-}" 694 | local VERSION 695 | VERSION="${3-}" 696 | if [ -z "${VERSION}" ]; then 697 | VERSION="$(nvm_version "${DEST}")" ||: 698 | fi 699 | local VERSION_FORMAT 700 | local ALIAS_FORMAT 701 | local DEST_FORMAT 702 | ALIAS_FORMAT='%s' 703 | DEST_FORMAT='%s' 704 | VERSION_FORMAT='%s' 705 | local NEWLINE 706 | NEWLINE='\n' 707 | if [ "_${DEFAULT}" = '_true' ]; then 708 | NEWLINE=' (default)\n' 709 | fi 710 | local ARROW 711 | ARROW='->' 712 | if [ -z "${NVM_NO_COLORS}" ] && nvm_has_colors; then 713 | ARROW='\033[0;90m->\033[0m' 714 | if [ "_${DEFAULT}" = '_true' ]; then 715 | NEWLINE=' \033[0;37m(default)\033[0m\n' 716 | fi 717 | if [ "_${VERSION}" = "_${NVM_CURRENT-}" ]; then 718 | ALIAS_FORMAT='\033[0;32m%s\033[0m' 719 | DEST_FORMAT='\033[0;32m%s\033[0m' 720 | VERSION_FORMAT='\033[0;32m%s\033[0m' 721 | elif nvm_is_version_installed "${VERSION}"; then 722 | ALIAS_FORMAT='\033[0;34m%s\033[0m' 723 | DEST_FORMAT='\033[0;34m%s\033[0m' 724 | VERSION_FORMAT='\033[0;34m%s\033[0m' 725 | elif [ "${VERSION}" = '∞' ] || [ "${VERSION}" = 'N/A' ]; then 726 | ALIAS_FORMAT='\033[1;31m%s\033[0m' 727 | DEST_FORMAT='\033[1;31m%s\033[0m' 728 | VERSION_FORMAT='\033[1;31m%s\033[0m' 729 | fi 730 | if [ "_${NVM_LTS-}" = '_true' ]; then 731 | ALIAS_FORMAT='\033[1;33m%s\033[0m' 732 | fi 733 | if [ "_${DEST%/*}" = "_lts" ]; then 734 | DEST_FORMAT='\033[1;33m%s\033[0m' 735 | fi 736 | elif [ "_${VERSION}" != '_∞' ] && [ "_${VERSION}" != '_N/A' ]; then 737 | VERSION_FORMAT='%s *' 738 | fi 739 | if [ "${DEST}" = "${VERSION}" ]; then 740 | command printf -- "${ALIAS_FORMAT} ${ARROW} ${VERSION_FORMAT}${NEWLINE}" "${ALIAS}" "${DEST}" 741 | else 742 | command printf -- "${ALIAS_FORMAT} ${ARROW} ${DEST_FORMAT} (${ARROW} ${VERSION_FORMAT})${NEWLINE}" "${ALIAS}" "${DEST}" "${VERSION}" 743 | fi 744 | } 745 | 746 | nvm_print_alias_path() { 747 | local NVM_ALIAS_DIR 748 | NVM_ALIAS_DIR="${1-}" 749 | if [ -z "${NVM_ALIAS_DIR}" ]; then 750 | nvm_err 'An alias dir is required.' 751 | return 1 752 | fi 753 | local ALIAS_PATH 754 | ALIAS_PATH="${2-}" 755 | if [ -z "${ALIAS_PATH}" ]; then 756 | nvm_err 'An alias path is required.' 757 | return 2 758 | fi 759 | local ALIAS 760 | ALIAS="${ALIAS_PATH##${NVM_ALIAS_DIR}\/}" 761 | local DEST 762 | DEST="$(nvm_alias "${ALIAS}" 2>/dev/null)" ||: 763 | if [ -n "${DEST}" ]; then 764 | NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_LTS="${NVM_LTS-}" DEFAULT=false nvm_print_formatted_alias "${ALIAS}" "${DEST}" 765 | fi 766 | } 767 | 768 | nvm_print_default_alias() { 769 | local ALIAS 770 | ALIAS="${1-}" 771 | if [ -z "${ALIAS}" ]; then 772 | nvm_err 'A default alias is required.' 773 | return 1 774 | fi 775 | local DEST 776 | DEST="$(nvm_print_implicit_alias local "${ALIAS}")" 777 | if [ -n "${DEST}" ]; then 778 | NVM_NO_COLORS="${NVM_NO_COLORS-}" DEFAULT=true nvm_print_formatted_alias "${ALIAS}" "${DEST}" 779 | fi 780 | } 781 | 782 | nvm_make_alias() { 783 | local ALIAS 784 | ALIAS="${1-}" 785 | if [ -z "${ALIAS}" ]; then 786 | nvm_err "an alias name is required" 787 | return 1 788 | fi 789 | local VERSION 790 | VERSION="${2-}" 791 | if [ -z "${VERSION}" ]; then 792 | nvm_err "an alias target version is required" 793 | return 2 794 | fi 795 | nvm_echo "${VERSION}" | tee "$(nvm_alias_path)/${ALIAS}" >/dev/null 796 | } 797 | 798 | nvm_list_aliases() { 799 | local ALIAS 800 | ALIAS="${1-}" 801 | 802 | local NVM_CURRENT 803 | NVM_CURRENT="$(nvm_ls_current)" 804 | local NVM_ALIAS_DIR 805 | NVM_ALIAS_DIR="$(nvm_alias_path)" 806 | command mkdir -p "${NVM_ALIAS_DIR}/lts" 807 | 808 | ( 809 | local ALIAS_PATH 810 | for ALIAS_PATH in "${NVM_ALIAS_DIR}/${ALIAS}"*; do 811 | NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}" & 812 | done 813 | wait 814 | ) | sort 815 | 816 | ( 817 | local ALIAS_NAME 818 | for ALIAS_NAME in "$(nvm_node_prefix)" "stable" "unstable"; do 819 | { 820 | if [ ! -f "${NVM_ALIAS_DIR}/${ALIAS_NAME}" ] && { [ -z "${ALIAS}" ] || [ "${ALIAS_NAME}" = "${ALIAS}" ]; }; then 821 | NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_default_alias "${ALIAS_NAME}" 822 | fi 823 | } & 824 | done 825 | wait 826 | ALIAS_NAME="$(nvm_iojs_prefix)" 827 | if [ ! -f "${NVM_ALIAS_DIR}/${ALIAS_NAME}" ] && { [ -z "${ALIAS}" ] || [ "${ALIAS_NAME}" = "${ALIAS}" ]; }; then 828 | NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT}" nvm_print_default_alias "${ALIAS_NAME}" 829 | fi 830 | ) | sort 831 | 832 | ( 833 | local LTS_ALIAS 834 | for ALIAS_PATH in "${NVM_ALIAS_DIR}/lts/${ALIAS}"*; do 835 | { 836 | LTS_ALIAS="$(NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_LTS=true nvm_print_alias_path "${NVM_ALIAS_DIR}" "${ALIAS_PATH}")" 837 | if [ -n "${LTS_ALIAS}" ]; then 838 | nvm_echo "${LTS_ALIAS}" 839 | fi 840 | } & 841 | done 842 | wait 843 | ) | sort 844 | return 845 | } 846 | 847 | nvm_alias() { 848 | local ALIAS 849 | ALIAS="${1-}" 850 | if [ -z "${ALIAS}" ]; then 851 | nvm_err 'An alias is required.' 852 | return 1 853 | fi 854 | 855 | local NVM_ALIAS_PATH 856 | NVM_ALIAS_PATH="$(nvm_alias_path)/${ALIAS}" 857 | if [ ! -f "${NVM_ALIAS_PATH}" ]; then 858 | nvm_err 'Alias does not exist.' 859 | return 2 860 | fi 861 | 862 | command cat "${NVM_ALIAS_PATH}" 863 | } 864 | 865 | nvm_ls_current() { 866 | local NVM_LS_CURRENT_NODE_PATH 867 | if ! NVM_LS_CURRENT_NODE_PATH="$(command which node 2>/dev/null)"; then 868 | nvm_echo 'none' 869 | elif nvm_tree_contains_path "$(nvm_version_dir iojs)" "${NVM_LS_CURRENT_NODE_PATH}"; then 870 | nvm_add_iojs_prefix "$(iojs --version 2>/dev/null)" 871 | elif nvm_tree_contains_path "${NVM_DIR}" "${NVM_LS_CURRENT_NODE_PATH}"; then 872 | local VERSION 873 | VERSION="$(node --version 2>/dev/null)" 874 | if [ "${VERSION}" = "v0.6.21-pre" ]; then 875 | nvm_echo 'v0.6.21' 876 | else 877 | nvm_echo "${VERSION}" 878 | fi 879 | else 880 | nvm_echo 'system' 881 | fi 882 | } 883 | 884 | nvm_resolve_alias() { 885 | if [ -z "${1-}" ]; then 886 | return 1 887 | fi 888 | 889 | local PATTERN 890 | PATTERN="${1-}" 891 | 892 | local ALIAS 893 | ALIAS="${PATTERN}" 894 | local ALIAS_TEMP 895 | 896 | local SEEN_ALIASES 897 | SEEN_ALIASES="${ALIAS}" 898 | while true; do 899 | ALIAS_TEMP="$(nvm_alias "${ALIAS}" 2>/dev/null || nvm_echo)" 900 | 901 | if [ -z "${ALIAS_TEMP}" ]; then 902 | break 903 | fi 904 | 905 | if command printf "${SEEN_ALIASES}" | nvm_grep -q -e "^${ALIAS_TEMP}$"; then 906 | ALIAS="∞" 907 | break 908 | fi 909 | 910 | SEEN_ALIASES="${SEEN_ALIASES}\\n${ALIAS_TEMP}" 911 | ALIAS="${ALIAS_TEMP}" 912 | done 913 | 914 | if [ -n "${ALIAS}" ] && [ "_${ALIAS}" != "_${PATTERN}" ]; then 915 | local NVM_IOJS_PREFIX 916 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 917 | local NVM_NODE_PREFIX 918 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 919 | case "${ALIAS}" in 920 | '∞' | \ 921 | "${NVM_IOJS_PREFIX}" | "${NVM_IOJS_PREFIX}-" | \ 922 | "${NVM_NODE_PREFIX}") 923 | nvm_echo "${ALIAS}" 924 | ;; 925 | *) 926 | nvm_ensure_version_prefix "${ALIAS}" 927 | ;; 928 | esac 929 | return 0 930 | fi 931 | 932 | if nvm_validate_implicit_alias "${PATTERN}" 2>/dev/null; then 933 | local IMPLICIT 934 | IMPLICIT="$(nvm_print_implicit_alias local "${PATTERN}" 2>/dev/null)" 935 | if [ -n "${IMPLICIT}" ]; then 936 | nvm_ensure_version_prefix "${IMPLICIT}" 937 | fi 938 | fi 939 | 940 | return 2 941 | } 942 | 943 | nvm_resolve_local_alias() { 944 | if [ -z "${1-}" ]; then 945 | return 1 946 | fi 947 | 948 | local VERSION 949 | local EXIT_CODE 950 | VERSION="$(nvm_resolve_alias "${1-}")" 951 | EXIT_CODE=$? 952 | if [ -z "${VERSION}" ]; then 953 | return $EXIT_CODE 954 | fi 955 | if [ "_${VERSION}" != '_∞' ]; then 956 | nvm_version "${VERSION}" 957 | else 958 | nvm_echo "${VERSION}" 959 | fi 960 | } 961 | 962 | nvm_iojs_prefix() { 963 | nvm_echo 'iojs' 964 | } 965 | nvm_node_prefix() { 966 | nvm_echo 'node' 967 | } 968 | 969 | nvm_is_iojs_version() { 970 | case "${1-}" in iojs-*) return 0 ;; esac 971 | return 1 972 | } 973 | 974 | nvm_add_iojs_prefix() { 975 | nvm_echo "$(nvm_iojs_prefix)-$(nvm_ensure_version_prefix "$(nvm_strip_iojs_prefix "${1-}")")" 976 | } 977 | 978 | nvm_strip_iojs_prefix() { 979 | local NVM_IOJS_PREFIX 980 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 981 | if [ "${1-}" = "${NVM_IOJS_PREFIX}" ]; then 982 | nvm_echo 983 | else 984 | nvm_echo "${1#${NVM_IOJS_PREFIX}-}" 985 | fi 986 | } 987 | 988 | nvm_ls() { 989 | local PATTERN 990 | PATTERN="${1-}" 991 | local VERSIONS 992 | VERSIONS='' 993 | if [ "${PATTERN}" = 'current' ]; then 994 | nvm_ls_current 995 | return 996 | fi 997 | 998 | local NVM_IOJS_PREFIX 999 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 1000 | local NVM_NODE_PREFIX 1001 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 1002 | local NVM_VERSION_DIR_IOJS 1003 | NVM_VERSION_DIR_IOJS="$(nvm_version_dir "${NVM_IOJS_PREFIX}")" 1004 | local NVM_VERSION_DIR_NEW 1005 | NVM_VERSION_DIR_NEW="$(nvm_version_dir new)" 1006 | local NVM_VERSION_DIR_OLD 1007 | NVM_VERSION_DIR_OLD="$(nvm_version_dir old)" 1008 | 1009 | case "${PATTERN}" in 1010 | "${NVM_IOJS_PREFIX}" | "${NVM_NODE_PREFIX}") 1011 | PATTERN="${PATTERN}-" 1012 | ;; 1013 | *) 1014 | if nvm_resolve_local_alias "${PATTERN}"; then 1015 | return 1016 | fi 1017 | PATTERN="$(nvm_ensure_version_prefix "${PATTERN}")" 1018 | ;; 1019 | esac 1020 | if [ "${PATTERN}" = 'N/A' ]; then 1021 | return 1022 | fi 1023 | # If it looks like an explicit version, don't do anything funny 1024 | local NVM_PATTERN_STARTS_WITH_V 1025 | case $PATTERN in 1026 | v*) NVM_PATTERN_STARTS_WITH_V=true ;; 1027 | *) NVM_PATTERN_STARTS_WITH_V=false ;; 1028 | esac 1029 | if [ $NVM_PATTERN_STARTS_WITH_V = true ] && [ "_$(nvm_num_version_groups "${PATTERN}")" = "_3" ]; then 1030 | if nvm_is_version_installed "${PATTERN}"; then 1031 | VERSIONS="${PATTERN}" 1032 | elif nvm_is_version_installed "$(nvm_add_iojs_prefix "${PATTERN}")"; then 1033 | VERSIONS="$(nvm_add_iojs_prefix "${PATTERN}")" 1034 | fi 1035 | else 1036 | case "${PATTERN}" in 1037 | "${NVM_IOJS_PREFIX}-" | "${NVM_NODE_PREFIX}-" | "system") ;; 1038 | *) 1039 | local NUM_VERSION_GROUPS 1040 | NUM_VERSION_GROUPS="$(nvm_num_version_groups "${PATTERN}")" 1041 | if [ "${NUM_VERSION_GROUPS}" = "2" ] || [ "${NUM_VERSION_GROUPS}" = "1" ]; then 1042 | PATTERN="${PATTERN%.}." 1043 | fi 1044 | ;; 1045 | esac 1046 | 1047 | nvm_is_zsh && setopt local_options shwordsplit 1048 | 1049 | local NVM_DIRS_TO_SEARCH1 1050 | NVM_DIRS_TO_SEARCH1='' 1051 | local NVM_DIRS_TO_SEARCH2 1052 | NVM_DIRS_TO_SEARCH2='' 1053 | local NVM_DIRS_TO_SEARCH3 1054 | NVM_DIRS_TO_SEARCH3='' 1055 | local NVM_ADD_SYSTEM 1056 | NVM_ADD_SYSTEM=false 1057 | if nvm_is_iojs_version "${PATTERN}"; then 1058 | NVM_DIRS_TO_SEARCH1="${NVM_VERSION_DIR_IOJS}" 1059 | PATTERN="$(nvm_strip_iojs_prefix "${PATTERN}")" 1060 | if nvm_has_system_iojs; then 1061 | NVM_ADD_SYSTEM=true 1062 | fi 1063 | elif [ "${PATTERN}" = "${NVM_NODE_PREFIX}-" ]; then 1064 | NVM_DIRS_TO_SEARCH1="${NVM_VERSION_DIR_OLD}" 1065 | NVM_DIRS_TO_SEARCH2="${NVM_VERSION_DIR_NEW}" 1066 | PATTERN='' 1067 | if nvm_has_system_node; then 1068 | NVM_ADD_SYSTEM=true 1069 | fi 1070 | else 1071 | NVM_DIRS_TO_SEARCH1="${NVM_VERSION_DIR_OLD}" 1072 | NVM_DIRS_TO_SEARCH2="${NVM_VERSION_DIR_NEW}" 1073 | NVM_DIRS_TO_SEARCH3="${NVM_VERSION_DIR_IOJS}" 1074 | if nvm_has_system_iojs || nvm_has_system_node; then 1075 | NVM_ADD_SYSTEM=true 1076 | fi 1077 | fi 1078 | 1079 | if ! [ -d "${NVM_DIRS_TO_SEARCH1}" ] || ! (command ls -1qA "${NVM_DIRS_TO_SEARCH1}" | nvm_grep -q .); then 1080 | NVM_DIRS_TO_SEARCH1='' 1081 | fi 1082 | if ! [ -d "${NVM_DIRS_TO_SEARCH2}" ] || ! (command ls -1qA "${NVM_DIRS_TO_SEARCH2}" | nvm_grep -q .); then 1083 | NVM_DIRS_TO_SEARCH2="${NVM_DIRS_TO_SEARCH1}" 1084 | fi 1085 | if ! [ -d "${NVM_DIRS_TO_SEARCH3}" ] || ! (command ls -1qA "${NVM_DIRS_TO_SEARCH3}" | nvm_grep -q .); then 1086 | NVM_DIRS_TO_SEARCH3="${NVM_DIRS_TO_SEARCH2}" 1087 | fi 1088 | 1089 | local SEARCH_PATTERN 1090 | if [ -z "${PATTERN}" ]; then 1091 | PATTERN='v' 1092 | SEARCH_PATTERN='.*' 1093 | else 1094 | SEARCH_PATTERN="$(nvm_echo "${PATTERN}" | command sed 's#\.#\\\.#g;')" 1095 | fi 1096 | if [ -n "${NVM_DIRS_TO_SEARCH1}${NVM_DIRS_TO_SEARCH2}${NVM_DIRS_TO_SEARCH3}" ]; then 1097 | VERSIONS="$(command find "${NVM_DIRS_TO_SEARCH1}"/* "${NVM_DIRS_TO_SEARCH2}"/* "${NVM_DIRS_TO_SEARCH3}"/* -name . -o -type d -prune -o -path "${PATTERN}*" \ 1098 | | command sed -e " 1099 | s#${NVM_VERSION_DIR_IOJS}/#versions/${NVM_IOJS_PREFIX}/#; 1100 | s#^${NVM_DIR}/##; 1101 | \\#^[^v]# d; 1102 | \\#^versions\$# d; 1103 | s#^versions/##; 1104 | s#^v#${NVM_NODE_PREFIX}/v#; 1105 | \\#${SEARCH_PATTERN}# !d; 1106 | " \ 1107 | -e 's#^\([^/]\{1,\}\)/\(.*\)$#\2.\1#;' \ 1108 | | command sort -t. -u -k 1.2,1n -k 2,2n -k 3,3n \ 1109 | | command sed -e 's#\(.*\)\.\([^\.]\{1,\}\)$#\2-\1#;' \ 1110 | -e "s#^${NVM_NODE_PREFIX}-##;" \ 1111 | )" 1112 | fi 1113 | fi 1114 | 1115 | if [ "${NVM_ADD_SYSTEM-}" = true ]; then 1116 | if [ -z "${PATTERN}" ] || [ "${PATTERN}" = 'v' ]; then 1117 | VERSIONS="${VERSIONS}$(command printf '\n%s' 'system')" 1118 | elif [ "${PATTERN}" = 'system' ]; then 1119 | VERSIONS="$(command printf '%s' 'system')" 1120 | fi 1121 | fi 1122 | 1123 | if [ -z "${VERSIONS}" ]; then 1124 | nvm_echo 'N/A' 1125 | return 3 1126 | fi 1127 | 1128 | nvm_echo "${VERSIONS}" 1129 | } 1130 | 1131 | nvm_ls_remote() { 1132 | local PATTERN 1133 | PATTERN="${1-}" 1134 | if nvm_validate_implicit_alias "${PATTERN}" 2>/dev/null ; then 1135 | local IMPLICIT 1136 | IMPLICIT="$(nvm_print_implicit_alias remote "${PATTERN}")" 1137 | if [ -z "${IMPLICIT-}" ] || [ "${IMPLICIT}" = 'N/A' ]; then 1138 | nvm_echo "N/A" 1139 | return 3 1140 | fi 1141 | PATTERN="$(NVM_LTS="${NVM_LTS-}" nvm_ls_remote "${IMPLICIT}" | command tail -1 | command awk '{ print $1 }')" 1142 | elif [ -n "${PATTERN}" ]; then 1143 | PATTERN="$(nvm_ensure_version_prefix "${PATTERN}")" 1144 | else 1145 | PATTERN=".*" 1146 | fi 1147 | NVM_LTS="${NVM_LTS-}" nvm_ls_remote_index_tab node std "${PATTERN}" 1148 | } 1149 | 1150 | nvm_ls_remote_iojs() { 1151 | NVM_LTS="${NVM_LTS-}" nvm_ls_remote_index_tab iojs std "${1-}" 1152 | } 1153 | 1154 | # args flavor, type, version 1155 | nvm_ls_remote_index_tab() { 1156 | local LTS 1157 | LTS="${NVM_LTS-}" 1158 | if [ "$#" -lt 3 ]; then 1159 | nvm_err 'not enough arguments' 1160 | return 5 1161 | fi 1162 | 1163 | local FLAVOR 1164 | FLAVOR="${1-}" 1165 | 1166 | local TYPE 1167 | TYPE="${2-}" 1168 | 1169 | local MIRROR 1170 | MIRROR="$(nvm_get_mirror "${FLAVOR}" "${TYPE}")" 1171 | if [ -z "${MIRROR}" ]; then 1172 | return 3 1173 | fi 1174 | 1175 | local PREFIX 1176 | PREFIX='' 1177 | case "${FLAVOR}-${TYPE}" in 1178 | iojs-std) PREFIX="$(nvm_iojs_prefix)-" ;; 1179 | node-std) PREFIX='' ;; 1180 | iojs-*) 1181 | nvm_err 'unknown type of io.js release' 1182 | return 4 1183 | ;; 1184 | *) 1185 | nvm_err 'unknown type of node.js release' 1186 | return 4 1187 | ;; 1188 | esac 1189 | local SORT_COMMAND 1190 | SORT_COMMAND='command sort' 1191 | case "${FLAVOR}" in 1192 | node) SORT_COMMAND='command sort -t. -u -k 1.2,1n -k 2,2n -k 3,3n' ;; 1193 | esac 1194 | 1195 | local PATTERN 1196 | PATTERN="${3-}" 1197 | 1198 | local VERSIONS 1199 | if [ -n "${PATTERN}" ]; then 1200 | if [ "${FLAVOR}" = 'iojs' ]; then 1201 | PATTERN="$(nvm_ensure_version_prefix "$(nvm_strip_iojs_prefix "${PATTERN}")")" 1202 | else 1203 | PATTERN="$(nvm_ensure_version_prefix "${PATTERN}")" 1204 | fi 1205 | else 1206 | unset PATTERN 1207 | fi 1208 | 1209 | nvm_is_zsh && setopt local_options shwordsplit 1210 | local VERSION_LIST 1211 | VERSION_LIST="$(nvm_download -L -s "${MIRROR}/index.tab" -o - \ 1212 | | command sed " 1213 | 1d; 1214 | s/^/${PREFIX}/; 1215 | " \ 1216 | )" 1217 | local LTS_ALIAS 1218 | local LTS_VERSION 1219 | command mkdir -p "$(nvm_alias_path)/lts" 1220 | nvm_echo "${VERSION_LIST}" \ 1221 | | command awk '{ 1222 | if ($10 ~ /^\-?$/) { next } 1223 | if ($10 && !a[tolower($10)]++) { 1224 | if (alias) { print alias, version } 1225 | alias_name = "lts/" tolower($10) 1226 | if (!alias) { print "lts/*", alias_name } 1227 | alias = alias_name 1228 | version = $1 1229 | } 1230 | } 1231 | END { 1232 | if (alias) { 1233 | print alias, version 1234 | } 1235 | }' \ 1236 | | while read -r LTS_ALIAS_LINE; do 1237 | LTS_ALIAS="${LTS_ALIAS_LINE%% *}" 1238 | LTS_VERSION="${LTS_ALIAS_LINE#* }" 1239 | nvm_make_alias "${LTS_ALIAS}" "${LTS_VERSION}" >/dev/null 2>&1 1240 | done 1241 | 1242 | VERSIONS="$({ command awk -v pattern="${PATTERN-}" -v lts="${LTS-}" '{ 1243 | if (!$1) { next } 1244 | if (pattern && tolower($1) !~ tolower(pattern)) { next } 1245 | if (lts == "*" && $10 ~ /^\-?$/) { next } 1246 | if (lts && lts != "*" && tolower($10) !~ tolower(lts)) { next } 1247 | if ($10 !~ /^\-?$/) print $1, $10; else print $1 1248 | }' \ 1249 | | nvm_grep -w "${PATTERN:-.*}" \ 1250 | | $SORT_COMMAND; } << EOF 1251 | $VERSION_LIST 1252 | EOF 1253 | )" 1254 | if [ -z "${VERSIONS}" ]; then 1255 | nvm_echo 'N/A' 1256 | return 3 1257 | fi 1258 | nvm_echo "${VERSIONS}" 1259 | } 1260 | 1261 | nvm_get_checksum_alg() { 1262 | if nvm_has_non_aliased "sha256sum"; then 1263 | nvm_echo 'sha-256' 1264 | elif nvm_has_non_aliased "shasum"; then 1265 | nvm_echo 'sha-256' 1266 | elif nvm_has_non_aliased "sha256"; then 1267 | nvm_echo 'sha-256' 1268 | elif nvm_has_non_aliased "gsha256sum"; then 1269 | nvm_echo 'sha-256' 1270 | elif nvm_has_non_aliased "openssl"; then 1271 | nvm_echo 'sha-256' 1272 | elif nvm_has_non_aliased "bssl"; then 1273 | nvm_echo 'sha-256' 1274 | elif nvm_has_non_aliased "sha1sum"; then 1275 | nvm_echo 'sha-1' 1276 | elif nvm_has_non_aliased "sha1"; then 1277 | nvm_echo 'sha-1' 1278 | elif nvm_has_non_aliased "shasum"; then 1279 | nvm_echo 'sha-1' 1280 | else 1281 | nvm_err 'Unaliased sha256sum, shasum, sha256, gsha256sum, openssl, or bssl not found.' 1282 | nvm_err 'Unaliased sha1sum, sha1, or shasum not found.' 1283 | return 1 1284 | fi 1285 | } 1286 | 1287 | nvm_compute_checksum() { 1288 | local FILE 1289 | FILE="${1-}" 1290 | if [ -z "${FILE}" ]; then 1291 | nvm_err 'Provided file to checksum is empty.' 1292 | return 2 1293 | elif ! [ -f "${FILE}" ]; then 1294 | nvm_err 'Provided file to checksum does not exist.' 1295 | return 1 1296 | fi 1297 | 1298 | if nvm_has_non_aliased "sha256sum"; then 1299 | nvm_err 'Computing checksum with sha256sum' 1300 | command sha256sum "${FILE}" | command awk '{print $1}' 1301 | elif nvm_has_non_aliased "shasum"; then 1302 | nvm_err 'Computing checksum with shasum -a 256' 1303 | command shasum -a 256 "${FILE}" | command awk '{print $1}' 1304 | elif nvm_has_non_aliased "sha256"; then 1305 | nvm_err 'Computing checksum with sha256 -q' 1306 | command sha256 -q "${FILE}" | command awk '{print $1}' 1307 | elif nvm_has_non_aliased "gsha256sum"; then 1308 | nvm_err 'Computing checksum with gsha256sum' 1309 | command gsha256sum "${FILE}" | command awk '{print $1}' 1310 | elif nvm_has_non_aliased "openssl"; then 1311 | nvm_err 'Computing checksum with openssl dgst -sha256' 1312 | command openssl dgst -sha256 "${FILE}" | command awk '{print $NF}' 1313 | elif nvm_has_non_aliased "bssl"; then 1314 | nvm_err 'Computing checksum with bssl sha256sum' 1315 | command bssl sha256sum "${FILE}" | command awk '{print $1}' 1316 | elif nvm_has_non_aliased "sha1sum"; then 1317 | nvm_err 'Computing checksum with sha1sum' 1318 | command sha1sum "${FILE}" | command awk '{print $1}' 1319 | elif nvm_has_non_aliased "sha1"; then 1320 | nvm_err 'Computing checksum with sha1 -q' 1321 | command sha1 -q "${FILE}" 1322 | elif nvm_has_non_aliased "shasum"; then 1323 | nvm_err 'Computing checksum with shasum' 1324 | command shasum "${FILE}" | command awk '{print $1}' 1325 | fi 1326 | } 1327 | 1328 | nvm_compare_checksum() { 1329 | local FILE 1330 | FILE="${1-}" 1331 | if [ -z "${FILE}" ]; then 1332 | nvm_err 'Provided file to checksum is empty.' 1333 | return 4 1334 | elif ! [ -f "${FILE}" ]; then 1335 | nvm_err 'Provided file to checksum does not exist.' 1336 | return 3 1337 | fi 1338 | 1339 | local COMPUTED_SUM 1340 | COMPUTED_SUM="$(nvm_compute_checksum "${FILE}")" 1341 | 1342 | local CHECKSUM 1343 | CHECKSUM="${2-}" 1344 | if [ -z "${CHECKSUM}" ]; then 1345 | nvm_err 'Provided checksum to compare to is empty.' 1346 | return 2 1347 | fi 1348 | 1349 | if [ -z "${COMPUTED_SUM}" ]; then 1350 | nvm_err "Computed checksum of '${FILE}' is empty." # missing in raspberry pi binary 1351 | nvm_err 'WARNING: Continuing *without checksum verification*' 1352 | return 1353 | elif [ "${COMPUTED_SUM}" != "${CHECKSUM}" ]; then 1354 | nvm_err "Checksums do not match: '${COMPUTED_SUM}' found, '${CHECKSUM}' expected." 1355 | return 1 1356 | fi 1357 | nvm_err 'Checksums matched!' 1358 | } 1359 | 1360 | # args: flavor, type, version, slug, compression 1361 | nvm_get_checksum() { 1362 | local FLAVOR 1363 | case "${1-}" in 1364 | node | iojs) FLAVOR="${1}" ;; 1365 | *) 1366 | nvm_err 'supported flavors: node, iojs' 1367 | return 2 1368 | ;; 1369 | esac 1370 | 1371 | local MIRROR 1372 | MIRROR="$(nvm_get_mirror "${FLAVOR}" "${2-}")" 1373 | if [ -z "${MIRROR}" ]; then 1374 | return 1 1375 | fi 1376 | 1377 | local SHASUMS_URL 1378 | if [ "$(nvm_get_checksum_alg)" = 'sha-256' ]; then 1379 | SHASUMS_URL="${MIRROR}/${3}/SHASUMS256.txt" 1380 | else 1381 | SHASUMS_URL="${MIRROR}/${3}/SHASUMS.txt" 1382 | fi 1383 | 1384 | nvm_download -L -s "${SHASUMS_URL}" -o - | command awk "{ if (\"${4}.tar.${5}\" == \$2) print \$1}" 1385 | } 1386 | 1387 | nvm_checksum() { 1388 | local NVM_CHECKSUM 1389 | if [ -z "${3-}" ] || [ "${3-}" = 'sha1' ]; then 1390 | if nvm_has_non_aliased "sha1sum"; then 1391 | NVM_CHECKSUM="$(command sha1sum "${1-}" | command awk '{print $1}')" 1392 | elif nvm_has_non_aliased "sha1"; then 1393 | NVM_CHECKSUM="$(command sha1 -q "${1-}")" 1394 | elif nvm_has_non_aliased "shasum"; then 1395 | NVM_CHECKSUM="$(command shasum "${1-}" | command awk '{print $1}')" 1396 | else 1397 | nvm_err 'Unaliased sha1sum, sha1, or shasum not found.' 1398 | return 2 1399 | fi 1400 | else 1401 | if nvm_has_non_aliased "sha256sum"; then 1402 | NVM_CHECKSUM="$(command sha256sum "${1-}" | command awk '{print $1}')" 1403 | elif nvm_has_non_aliased "shasum"; then 1404 | NVM_CHECKSUM="$(command shasum -a 256 "${1-}" | command awk '{print $1}')" 1405 | elif nvm_has_non_aliased "sha256"; then 1406 | NVM_CHECKSUM="$(command sha256 -q "${1-}" | command awk '{print $1}')" 1407 | elif nvm_has_non_aliased "gsha256sum"; then 1408 | NVM_CHECKSUM="$(command gsha256sum "${1-}" | command awk '{print $1}')" 1409 | elif nvm_has_non_aliased "openssl"; then 1410 | NVM_CHECKSUM="$(command openssl dgst -sha256 "${1-}" | command awk '{print $NF}')" 1411 | elif nvm_has_non_aliased "bssl"; then 1412 | NVM_CHECKSUM="$(command bssl sha256sum "${1-}" | command awk '{print $1}')" 1413 | else 1414 | nvm_err 'Unaliased sha256sum, shasum, sha256, gsha256sum, openssl, or bssl not found.' 1415 | nvm_err 'WARNING: Continuing *without checksum verification*' 1416 | return 1417 | fi 1418 | fi 1419 | 1420 | if [ "_${NVM_CHECKSUM}" = "_${2-}" ]; then 1421 | return 1422 | elif [ -z "${2-}" ]; then 1423 | nvm_echo 'Checksums empty' #missing in raspberry pi binary 1424 | return 1425 | fi 1426 | nvm_err 'Checksums do not match.' 1427 | return 1 1428 | } 1429 | 1430 | nvm_print_versions() { 1431 | local VERSION 1432 | local LTS 1433 | local FORMAT 1434 | local NVM_CURRENT 1435 | NVM_CURRENT=$(nvm_ls_current) 1436 | local NVM_HAS_COLORS 1437 | if [ -z "${NVM_NO_COLORS-}" ] && nvm_has_colors; then 1438 | NVM_HAS_COLORS=1 1439 | fi 1440 | local LTS_LENGTH 1441 | local LTS_FORMAT 1442 | nvm_echo "${1-}" \ 1443 | | command sed '1!G;h;$!d' \ 1444 | | command awk '{ if ($2 && a[$2]++) { print $1, "(LTS: " $2 ")" } else if ($2) { print $1, "(Latest LTS: " $2 ")" } else { print $0 } }' \ 1445 | | command sed '1!G;h;$!d' \ 1446 | | while read -r VERSION_LINE; do 1447 | VERSION="${VERSION_LINE%% *}" 1448 | LTS="${VERSION_LINE#* }" 1449 | FORMAT='%15s' 1450 | if [ "_${VERSION}" = "_${NVM_CURRENT}" ]; then 1451 | if [ "${NVM_HAS_COLORS-}" = '1' ]; then 1452 | FORMAT='\033[0;32m-> %12s\033[0m' 1453 | else 1454 | FORMAT='-> %12s *' 1455 | fi 1456 | elif [ "${VERSION}" = "system" ]; then 1457 | if [ "${NVM_HAS_COLORS-}" = '1' ]; then 1458 | FORMAT='\033[0;33m%15s\033[0m' 1459 | else 1460 | FORMAT='%15s *' 1461 | fi 1462 | elif nvm_is_version_installed "${VERSION}"; then 1463 | if [ "${NVM_HAS_COLORS-}" = '1' ]; then 1464 | FORMAT='\033[0;34m%15s\033[0m' 1465 | else 1466 | FORMAT='%15s *' 1467 | fi 1468 | fi 1469 | if [ "${LTS}" != "${VERSION}" ]; then 1470 | case "${LTS}" in 1471 | *Latest*) 1472 | LTS="${LTS##Latest }" 1473 | LTS_LENGTH="${#LTS}" 1474 | if [ "${NVM_HAS_COLORS-}" = '1' ]; then 1475 | LTS_FORMAT=" \\033[1;32m%${LTS_LENGTH}s\\033[0m" 1476 | else 1477 | LTS_FORMAT=" %${LTS_LENGTH}s" 1478 | fi 1479 | ;; 1480 | *) 1481 | LTS_LENGTH="${#LTS}" 1482 | if [ "${NVM_HAS_COLORS-}" = '1' ]; then 1483 | LTS_FORMAT=" \\033[0;37m%${LTS_LENGTH}s\\033[0m" 1484 | else 1485 | LTS_FORMAT=" %${LTS_LENGTH}s" 1486 | fi 1487 | ;; 1488 | esac 1489 | command printf -- "${FORMAT}${LTS_FORMAT}\\n" "${VERSION}" " ${LTS}" 1490 | else 1491 | command printf -- "${FORMAT}\\n" "${VERSION}" 1492 | fi 1493 | done 1494 | } 1495 | 1496 | nvm_validate_implicit_alias() { 1497 | local NVM_IOJS_PREFIX 1498 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 1499 | local NVM_NODE_PREFIX 1500 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 1501 | 1502 | case "$1" in 1503 | "stable" | "unstable" | "${NVM_IOJS_PREFIX}" | "${NVM_NODE_PREFIX}") 1504 | return 1505 | ;; 1506 | *) 1507 | nvm_err "Only implicit aliases 'stable', 'unstable', '${NVM_IOJS_PREFIX}', and '${NVM_NODE_PREFIX}' are supported." 1508 | return 1 1509 | ;; 1510 | esac 1511 | } 1512 | 1513 | nvm_print_implicit_alias() { 1514 | if [ "_$1" != "_local" ] && [ "_$1" != "_remote" ]; then 1515 | nvm_err "nvm_print_implicit_alias must be specified with local or remote as the first argument." 1516 | return 1 1517 | fi 1518 | 1519 | local NVM_IMPLICIT 1520 | NVM_IMPLICIT="$2" 1521 | if ! nvm_validate_implicit_alias "${NVM_IMPLICIT}"; then 1522 | return 2 1523 | fi 1524 | 1525 | local NVM_IOJS_PREFIX 1526 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 1527 | local NVM_NODE_PREFIX 1528 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 1529 | local NVM_COMMAND 1530 | local NVM_ADD_PREFIX_COMMAND 1531 | local LAST_TWO 1532 | case "${NVM_IMPLICIT}" in 1533 | "${NVM_IOJS_PREFIX}") 1534 | NVM_COMMAND="nvm_ls_remote_iojs" 1535 | NVM_ADD_PREFIX_COMMAND="nvm_add_iojs_prefix" 1536 | if [ "_$1" = "_local" ]; then 1537 | NVM_COMMAND="nvm_ls ${NVM_IMPLICIT}" 1538 | fi 1539 | 1540 | nvm_is_zsh && setopt local_options shwordsplit 1541 | 1542 | local NVM_IOJS_VERSION 1543 | local EXIT_CODE 1544 | NVM_IOJS_VERSION="$(${NVM_COMMAND})" &&: 1545 | EXIT_CODE="$?" 1546 | if [ "_${EXIT_CODE}" = "_0" ]; then 1547 | NVM_IOJS_VERSION="$(nvm_echo "${NVM_IOJS_VERSION}" | command sed "s/^${NVM_IMPLICIT}-//" | nvm_grep -e '^v' | command cut -c2- | command cut -d . -f 1,2 | uniq | command tail -1)" 1548 | fi 1549 | 1550 | if [ "_$NVM_IOJS_VERSION" = "_N/A" ]; then 1551 | nvm_echo 'N/A' 1552 | else 1553 | ${NVM_ADD_PREFIX_COMMAND} "${NVM_IOJS_VERSION}" 1554 | fi 1555 | return $EXIT_CODE 1556 | ;; 1557 | "${NVM_NODE_PREFIX}") 1558 | nvm_echo 'stable' 1559 | return 1560 | ;; 1561 | *) 1562 | NVM_COMMAND="nvm_ls_remote" 1563 | if [ "_$1" = "_local" ]; then 1564 | NVM_COMMAND="nvm_ls node" 1565 | fi 1566 | 1567 | nvm_is_zsh && setopt local_options shwordsplit 1568 | 1569 | LAST_TWO=$($NVM_COMMAND | nvm_grep -e '^v' | command cut -c2- | command cut -d . -f 1,2 | uniq) 1570 | ;; 1571 | esac 1572 | local MINOR 1573 | local STABLE 1574 | local UNSTABLE 1575 | local MOD 1576 | local NORMALIZED_VERSION 1577 | 1578 | nvm_is_zsh && setopt local_options shwordsplit 1579 | for MINOR in $LAST_TWO; do 1580 | NORMALIZED_VERSION="$(nvm_normalize_version "$MINOR")" 1581 | if [ "_0${NORMALIZED_VERSION#?}" != "_$NORMALIZED_VERSION" ]; then 1582 | STABLE="$MINOR" 1583 | else 1584 | MOD="$(awk 'BEGIN { print int(ARGV[1] / 1000000) % 2 ; exit(0) }' "${NORMALIZED_VERSION}")" 1585 | if [ "${MOD}" -eq 0 ]; then 1586 | STABLE="${MINOR}" 1587 | elif [ "${MOD}" -eq 1 ]; then 1588 | UNSTABLE="${MINOR}" 1589 | fi 1590 | fi 1591 | done 1592 | 1593 | if [ "_$2" = '_stable' ]; then 1594 | nvm_echo "${STABLE}" 1595 | elif [ "_$2" = '_unstable' ]; then 1596 | nvm_echo "${UNSTABLE:-"N/A"}" 1597 | fi 1598 | } 1599 | 1600 | nvm_get_os() { 1601 | local NVM_UNAME 1602 | NVM_UNAME="$(command uname -a)" 1603 | local NVM_OS 1604 | case "${NVM_UNAME}" in 1605 | Linux\ *) NVM_OS=linux ;; 1606 | Darwin\ *) NVM_OS=darwin ;; 1607 | SunOS\ *) NVM_OS=sunos ;; 1608 | FreeBSD\ *) NVM_OS=freebsd ;; 1609 | AIX\ *) NVM_OS=aix ;; 1610 | esac 1611 | nvm_echo "${NVM_OS-}" 1612 | } 1613 | 1614 | nvm_get_arch() { 1615 | local HOST_ARCH 1616 | local NVM_OS 1617 | local EXIT_CODE 1618 | 1619 | NVM_OS="$(nvm_get_os)" 1620 | # If the OS is SunOS, first try to use pkgsrc to guess 1621 | # the most appropriate arch. If it's not available, use 1622 | # isainfo to get the instruction set supported by the 1623 | # kernel. 1624 | if [ "_${NVM_OS}" = "_sunos" ]; then 1625 | if HOST_ARCH=$(pkg_info -Q MACHINE_ARCH pkg_install); then 1626 | HOST_ARCH=$(nvm_echo "${HOST_ARCH}" | command tail -1) 1627 | else 1628 | HOST_ARCH=$(isainfo -n) 1629 | fi 1630 | elif [ "_${NVM_OS}" = "_aix" ]; then 1631 | HOST_ARCH=ppc64 1632 | else 1633 | HOST_ARCH="$(command uname -m)" 1634 | fi 1635 | 1636 | local NVM_ARCH 1637 | case "${HOST_ARCH}" in 1638 | x86_64 | amd64) NVM_ARCH="x64" ;; 1639 | i*86) NVM_ARCH="x86" ;; 1640 | aarch64) NVM_ARCH="arm64" ;; 1641 | *) NVM_ARCH="${HOST_ARCH}" ;; 1642 | esac 1643 | nvm_echo "${NVM_ARCH}" 1644 | } 1645 | 1646 | nvm_get_minor_version() { 1647 | local VERSION 1648 | VERSION="$1" 1649 | 1650 | if [ -z "${VERSION}" ]; then 1651 | nvm_err 'a version is required' 1652 | return 1 1653 | fi 1654 | 1655 | case "${VERSION}" in 1656 | v | .* | *..* | v*[!.0123456789]* | [!v]*[!.0123456789]* | [!v0123456789]* | v[!0123456789]*) 1657 | nvm_err 'invalid version number' 1658 | return 2 1659 | ;; 1660 | esac 1661 | 1662 | local PREFIXED_VERSION 1663 | PREFIXED_VERSION="$(nvm_format_version "${VERSION}")" 1664 | 1665 | local MINOR 1666 | MINOR="$(nvm_echo "${PREFIXED_VERSION}" | nvm_grep -e '^v' | command cut -c2- | command cut -d . -f 1,2)" 1667 | if [ -z "${MINOR}" ]; then 1668 | nvm_err 'invalid version number! (please report this)' 1669 | return 3 1670 | fi 1671 | nvm_echo "${MINOR}" 1672 | } 1673 | 1674 | nvm_ensure_default_set() { 1675 | local VERSION 1676 | VERSION="$1" 1677 | if [ -z "${VERSION}" ]; then 1678 | nvm_err 'nvm_ensure_default_set: a version is required' 1679 | return 1 1680 | elif nvm_alias default >/dev/null 2>&1; then 1681 | # default already set 1682 | return 0 1683 | fi 1684 | local OUTPUT 1685 | OUTPUT="$(nvm alias default "${VERSION}")" 1686 | local EXIT_CODE 1687 | EXIT_CODE="$?" 1688 | nvm_echo "Creating default alias: ${OUTPUT}" 1689 | return $EXIT_CODE 1690 | } 1691 | 1692 | nvm_is_merged_node_version() { 1693 | nvm_version_greater_than_or_equal_to "$1" v4.0.0 1694 | } 1695 | 1696 | nvm_get_mirror() { 1697 | case "${1}-${2}" in 1698 | node-std) nvm_echo "${NVM_NODEJS_ORG_MIRROR:-https://nodejs.org/dist}" ;; 1699 | iojs-std) nvm_echo "${NVM_IOJS_ORG_MIRROR:-https://iojs.org/dist}" ;; 1700 | *) 1701 | nvm_err 'unknown type of node.js or io.js release' 1702 | return 1 1703 | ;; 1704 | esac 1705 | } 1706 | 1707 | # args: flavor, type, version, reinstall 1708 | nvm_install_binary() { 1709 | local FLAVOR 1710 | case "${1-}" in 1711 | node | iojs) FLAVOR="${1}" ;; 1712 | *) 1713 | nvm_err 'supported flavors: node, iojs' 1714 | return 4 1715 | ;; 1716 | esac 1717 | 1718 | local TYPE 1719 | TYPE="${2-}" 1720 | 1721 | local PREFIXED_VERSION 1722 | PREFIXED_VERSION="${3-}" 1723 | if [ -z "${PREFIXED_VERSION}" ]; then 1724 | nvm_err 'A version number is required.' 1725 | return 3 1726 | fi 1727 | 1728 | local VERSION 1729 | VERSION="$(nvm_strip_iojs_prefix "${PREFIXED_VERSION}")" 1730 | 1731 | if [ -z "$(nvm_get_os)" ]; then 1732 | return 2 1733 | fi 1734 | 1735 | local tar_compression_flag 1736 | tar_compression_flag='z' 1737 | if nvm_supports_xz "${VERSION}"; then 1738 | tar_compression_flag='J' 1739 | fi 1740 | 1741 | local TARBALL 1742 | local TMPDIR 1743 | local VERSION_PATH 1744 | 1745 | local PROGRESS_BAR 1746 | local NODE_OR_IOJS 1747 | if [ "${FLAVOR}" = 'node' ]; then 1748 | NODE_OR_IOJS="${FLAVOR}" 1749 | elif [ "${FLAVOR}" = 'iojs' ]; then 1750 | NODE_OR_IOJS="io.js" 1751 | fi 1752 | if [ "${NVM_NO_PROGRESS-}" = "1" ]; then 1753 | # --silent, --show-error, use short option as @samrocketman mentions the compatibility issue. 1754 | PROGRESS_BAR="-sS" 1755 | else 1756 | PROGRESS_BAR="--progress-bar" 1757 | fi 1758 | nvm_echo "Downloading and installing ${NODE_OR_IOJS-} ${VERSION}..." 1759 | TARBALL="$(PROGRESS_BAR="${PROGRESS_BAR}" nvm_download_artifact "${FLAVOR}" binary "${TYPE-}" "${VERSION}" | command tail -1)" 1760 | if [ -f "${TARBALL}" ]; then 1761 | TMPDIR="$(dirname "${TARBALL}")/files" 1762 | fi 1763 | local tar 1764 | tar='tar' 1765 | if [ "${NVM_OS}" = 'aix' ]; then 1766 | tar='gtar' 1767 | fi 1768 | if ( 1769 | [ -n "${TMPDIR-}" ] && \ 1770 | command mkdir -p "${TMPDIR}" && \ 1771 | command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 && \ 1772 | VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" && \ 1773 | command mkdir -p "${VERSION_PATH}" && \ 1774 | command mv "${TMPDIR}/"* "${VERSION_PATH}" && \ 1775 | command rm -rf "${TMPDIR}" 1776 | ); then 1777 | return 0 1778 | fi 1779 | 1780 | nvm_err 'Binary download failed, trying source.' 1781 | if [ -n "${TMPDIR-}" ]; then 1782 | command rm -rf "${TMPDIR}" 1783 | fi 1784 | return 1 1785 | } 1786 | 1787 | # args: flavor, kind, version 1788 | nvm_get_download_slug() { 1789 | local FLAVOR 1790 | case "${1-}" in 1791 | node | iojs) FLAVOR="${1}" ;; 1792 | *) 1793 | nvm_err 'supported flavors: node, iojs' 1794 | return 1 1795 | ;; 1796 | esac 1797 | 1798 | local KIND 1799 | case "${2-}" in 1800 | binary | source) KIND="${2}" ;; 1801 | *) 1802 | nvm_err 'supported kinds: binary, source' 1803 | return 2 1804 | ;; 1805 | esac 1806 | 1807 | local VERSION 1808 | VERSION="${3-}" 1809 | 1810 | local NVM_OS 1811 | NVM_OS="$(nvm_get_os)" 1812 | 1813 | local NVM_ARCH 1814 | NVM_ARCH="$(nvm_get_arch)" 1815 | if ! nvm_is_merged_node_version "${VERSION}"; then 1816 | if [ "${NVM_ARCH}" = 'armv6l' ] || [ "${NVM_ARCH}" = 'armv7l' ]; then 1817 | NVM_ARCH="arm-pi" 1818 | fi 1819 | fi 1820 | 1821 | if [ "${KIND}" = 'binary' ]; then 1822 | nvm_echo "${FLAVOR}-${VERSION}-${NVM_OS}-${NVM_ARCH}" 1823 | elif [ "${KIND}" = 'source' ]; then 1824 | nvm_echo "${FLAVOR}-${VERSION}" 1825 | fi 1826 | } 1827 | 1828 | # args: flavor, kind, type, version 1829 | nvm_download_artifact() { 1830 | local FLAVOR 1831 | case "${1-}" in 1832 | node | iojs) FLAVOR="${1}" ;; 1833 | *) 1834 | nvm_err 'supported flavors: node, iojs' 1835 | return 1 1836 | ;; 1837 | esac 1838 | 1839 | local KIND 1840 | case "${2-}" in 1841 | binary | source) KIND="${2}" ;; 1842 | *) 1843 | nvm_err 'supported kinds: binary, source' 1844 | return 1 1845 | ;; 1846 | esac 1847 | 1848 | local TYPE 1849 | TYPE="${3-}" 1850 | 1851 | local MIRROR 1852 | MIRROR="$(nvm_get_mirror "${FLAVOR}" "${TYPE}")" 1853 | if [ -z "${MIRROR}" ]; then 1854 | return 2 1855 | fi 1856 | 1857 | local VERSION 1858 | VERSION="${4}" 1859 | 1860 | if [ -z "${VERSION}" ]; then 1861 | nvm_err 'A version number is required.' 1862 | return 3 1863 | fi 1864 | 1865 | if [ "${KIND}" = 'binary' ] && ! nvm_binary_available "${VERSION}"; then 1866 | nvm_err "No precompiled binary available for ${VERSION}." 1867 | return 1868 | fi 1869 | 1870 | local SLUG 1871 | SLUG="$(nvm_get_download_slug "${FLAVOR}" "${KIND}" "${VERSION}")" 1872 | 1873 | local COMPRESSION 1874 | COMPRESSION='gz' 1875 | if nvm_supports_xz "${VERSION}"; then 1876 | COMPRESSION='xz' 1877 | fi 1878 | 1879 | local CHECKSUM 1880 | CHECKSUM="$(nvm_get_checksum "${FLAVOR}" "${TYPE}" "${VERSION}" "${SLUG}" "${COMPRESSION}")" 1881 | 1882 | local tmpdir 1883 | if [ "${KIND}" = 'binary' ]; then 1884 | tmpdir="$(nvm_cache_dir)/bin/${SLUG}" 1885 | else 1886 | tmpdir="$(nvm_cache_dir)/src/${SLUG}" 1887 | fi 1888 | command mkdir -p "${tmpdir}/files" || ( 1889 | nvm_err "creating directory ${tmpdir}/files failed" 1890 | return 3 1891 | ) 1892 | 1893 | local TARBALL 1894 | TARBALL="${tmpdir}/${SLUG}.tar.${COMPRESSION}" 1895 | local TARBALL_URL 1896 | if nvm_version_greater_than_or_equal_to "${VERSION}" 0.1.14; then 1897 | TARBALL_URL="${MIRROR}/${VERSION}/${SLUG}.tar.${COMPRESSION}" 1898 | else 1899 | # node <= 0.1.13 does not have a directory 1900 | TARBALL_URL="${MIRROR}/${SLUG}.tar.${COMPRESSION}" 1901 | fi 1902 | 1903 | if [ -r "${TARBALL}" ]; then 1904 | nvm_err "Local cache found: $(nvm_sanitize_path "${TARBALL}")" 1905 | if nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" >/dev/null 2>&1; then 1906 | nvm_err "Checksums match! Using existing downloaded archive $(nvm_sanitize_path "${TARBALL}")" 1907 | nvm_echo "${TARBALL}" 1908 | return 0 1909 | fi 1910 | nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" 1911 | nvm_err "Checksum check failed!" 1912 | nvm_err "Removing the broken local cache..." 1913 | command rm -rf "${TARBALL}" 1914 | fi 1915 | nvm_err "Downloading ${TARBALL_URL}..." 1916 | nvm_download -L -C - "${PROGRESS_BAR}" "${TARBALL_URL}" -o "${TARBALL}" || ( 1917 | command rm -rf "${TARBALL}" "${tmpdir}" 1918 | nvm_err "Binary download from ${TARBALL_URL} failed, trying source." 1919 | return 4 1920 | ) 1921 | 1922 | if nvm_grep '404 Not Found' "${TARBALL}" >/dev/null; then 1923 | command rm -rf "${TARBALL}" "${tmpdir}" 1924 | nvm_err "HTTP 404 at URL ${TARBALL_URL}" 1925 | return 5 1926 | fi 1927 | 1928 | nvm_compare_checksum "${TARBALL}" "${CHECKSUM}" || ( 1929 | command rm -rf "${tmpdir}/files" 1930 | return 6 1931 | ) 1932 | 1933 | nvm_echo "${TARBALL}" 1934 | } 1935 | 1936 | nvm_get_make_jobs() { 1937 | if nvm_is_natural_num "${1-}"; then 1938 | NVM_MAKE_JOBS="$1" 1939 | nvm_echo "number of \`make\` jobs: ${NVM_MAKE_JOBS}" 1940 | return 1941 | elif [ -n "${1-}" ]; then 1942 | unset NVM_MAKE_JOBS 1943 | nvm_err "$1 is invalid for number of \`make\` jobs, must be a natural number" 1944 | fi 1945 | local NVM_OS 1946 | NVM_OS="$(nvm_get_os)" 1947 | local NVM_CPU_CORES 1948 | case "_${NVM_OS}" in 1949 | "_linux") 1950 | NVM_CPU_CORES="$(nvm_grep -c -E '^processor.+: [0-9]+' /proc/cpuinfo)" 1951 | ;; 1952 | "_freebsd" | "_darwin") 1953 | NVM_CPU_CORES="$(sysctl -n hw.ncpu)" 1954 | ;; 1955 | "_sunos") 1956 | NVM_CPU_CORES="$(psrinfo | wc -l)" 1957 | ;; 1958 | "_aix") 1959 | NVM_CPU_CORES="$(pmcycles -m | wc -l)" 1960 | ;; 1961 | esac 1962 | if ! nvm_is_natural_num "${NVM_CPU_CORES}"; then 1963 | nvm_err 'Can not determine how many core(s) are available, running in single-threaded mode.' 1964 | nvm_err 'Please report an issue on GitHub to help us make nvm run faster on your computer!' 1965 | NVM_MAKE_JOBS=1 1966 | else 1967 | nvm_echo "Detected that you have ${NVM_CPU_CORES} CPU core(s)" 1968 | if [ "${NVM_CPU_CORES}" -gt 2 ]; then 1969 | NVM_MAKE_JOBS=$((NVM_CPU_CORES - 1)) 1970 | nvm_echo "Running with ${NVM_MAKE_JOBS} threads to speed up the build" 1971 | else 1972 | NVM_MAKE_JOBS=1 1973 | nvm_echo 'Number of CPU core(s) less than or equal to 2, running in single-threaded mode' 1974 | fi 1975 | fi 1976 | } 1977 | 1978 | # args: flavor, type, version, make jobs, additional 1979 | nvm_install_source() { 1980 | local FLAVOR 1981 | case "${1-}" in 1982 | node | iojs) FLAVOR="${1}" ;; 1983 | *) 1984 | nvm_err 'supported flavors: node, iojs' 1985 | return 4 1986 | ;; 1987 | esac 1988 | 1989 | local TYPE 1990 | TYPE="${2-}" 1991 | 1992 | local PREFIXED_VERSION 1993 | PREFIXED_VERSION="${3-}" 1994 | if [ -z "${PREFIXED_VERSION}" ]; then 1995 | nvm_err 'A version number is required.' 1996 | return 3 1997 | fi 1998 | 1999 | local VERSION 2000 | VERSION="$(nvm_strip_iojs_prefix "${PREFIXED_VERSION}")" 2001 | 2002 | local NVM_MAKE_JOBS 2003 | NVM_MAKE_JOBS="${4-}" 2004 | 2005 | local ADDITIONAL_PARAMETERS 2006 | ADDITIONAL_PARAMETERS="${5-}" 2007 | 2008 | local NVM_ARCH 2009 | NVM_ARCH="$(nvm_get_arch)" 2010 | if [ "${NVM_ARCH}" = 'armv6l' ] || [ "${NVM_ARCH}" = 'armv7l' ]; then 2011 | if [ -n "${ADDITIONAL_PARAMETERS}" ]; then 2012 | ADDITIONAL_PARAMETERS="--without-snapshot ${ADDITIONAL_PARAMETERS}" 2013 | else 2014 | ADDITIONAL_PARAMETERS='--without-snapshot' 2015 | fi 2016 | fi 2017 | 2018 | if [ -n "${ADDITIONAL_PARAMETERS}" ]; then 2019 | nvm_echo "Additional options while compiling: ${ADDITIONAL_PARAMETERS}" 2020 | fi 2021 | 2022 | local NVM_OS 2023 | NVM_OS="$(nvm_get_os)" 2024 | 2025 | local make 2026 | make='make' 2027 | local MAKE_CXX 2028 | case "${NVM_OS}" in 2029 | 'freebsd') 2030 | make='gmake' 2031 | MAKE_CXX="CC=${CC:-cc} CXX=${CXX:-c++}" 2032 | ;; 2033 | 'darwin') 2034 | MAKE_CXX="CC=${CC:-cc} CXX=${CXX:-c++}" 2035 | ;; 2036 | 'aix') 2037 | make='gmake' 2038 | ;; 2039 | esac 2040 | if nvm_has "clang++" && nvm_has "clang" && nvm_version_greater_than_or_equal_to "$(nvm_clang_version)" 3.5; then 2041 | if [ -z "${CC-}" ] || [ -z "${CXX-}" ]; then 2042 | nvm_echo "Clang v3.5+ detected! CC or CXX not specified, will use Clang as C/C++ compiler!" 2043 | MAKE_CXX="CC=${CC:-cc} CXX=${CXX:-c++}" 2044 | fi 2045 | fi 2046 | 2047 | local tar_compression_flag 2048 | tar_compression_flag='z' 2049 | if nvm_supports_xz "${VERSION}"; then 2050 | tar_compression_flag='J' 2051 | fi 2052 | 2053 | local tar 2054 | tar='tar' 2055 | if [ "${NVM_OS}" = 'aix' ]; then 2056 | tar='gtar' 2057 | fi 2058 | 2059 | local TARBALL 2060 | local TMPDIR 2061 | local VERSION_PATH 2062 | 2063 | if [ "${NVM_NO_PROGRESS-}" = "1" ]; then 2064 | # --silent, --show-error, use short option as @samrocketman mentions the compatibility issue. 2065 | PROGRESS_BAR="-sS" 2066 | else 2067 | PROGRESS_BAR="--progress-bar" 2068 | fi 2069 | 2070 | nvm_is_zsh && setopt local_options shwordsplit 2071 | 2072 | TARBALL="$(PROGRESS_BAR="${PROGRESS_BAR}" nvm_download_artifact "${FLAVOR}" source "${TYPE}" "${VERSION}" | command tail -1)" && \ 2073 | [ -f "${TARBALL}" ] && \ 2074 | TMPDIR="$(dirname "${TARBALL}")/files" && \ 2075 | if ! ( 2076 | # shellcheck disable=SC2086 2077 | command mkdir -p "${TMPDIR}" && \ 2078 | command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 && \ 2079 | VERSION_PATH="$(nvm_version_path "${PREFIXED_VERSION}")" && \ 2080 | nvm_cd "${TMPDIR}" && \ 2081 | nvm_echo '$>'./configure --prefix="${VERSION_PATH}" $ADDITIONAL_PARAMETERS'<' && \ 2082 | ./configure --prefix="${VERSION_PATH}" $ADDITIONAL_PARAMETERS && \ 2083 | $make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} && \ 2084 | command rm -f "${VERSION_PATH}" 2>/dev/null && \ 2085 | $make -j "${NVM_MAKE_JOBS}" ${MAKE_CXX-} install 2086 | ); then 2087 | nvm_err "nvm: install ${VERSION} failed!" 2088 | command rm -rf "${TMPDIR-}" 2089 | return 1 2090 | fi 2091 | } 2092 | 2093 | nvm_use_if_needed() { 2094 | if [ "_${1-}" = "_$(nvm_ls_current)" ]; then 2095 | return 2096 | fi 2097 | nvm use "$@" 2098 | } 2099 | 2100 | nvm_install_npm_if_needed() { 2101 | local VERSION 2102 | VERSION="$(nvm_ls_current)" 2103 | if ! nvm_has "npm"; then 2104 | nvm_echo 'Installing npm...' 2105 | if nvm_version_greater 0.2.0 "${VERSION}"; then 2106 | nvm_err 'npm requires node v0.2.3 or higher' 2107 | elif nvm_version_greater_than_or_equal_to "${VERSION}" 0.2.0; then 2108 | if nvm_version_greater 0.2.3 "${VERSION}"; then 2109 | nvm_err 'npm requires node v0.2.3 or higher' 2110 | else 2111 | nvm_download -L https://npmjs.org/install.sh -o - | clean=yes npm_install=0.2.19 sh 2112 | fi 2113 | else 2114 | nvm_download -L https://npmjs.org/install.sh -o - | clean=yes sh 2115 | fi 2116 | fi 2117 | return $? 2118 | } 2119 | 2120 | nvm_match_version() { 2121 | local NVM_IOJS_PREFIX 2122 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 2123 | local PROVIDED_VERSION 2124 | PROVIDED_VERSION="$1" 2125 | case "_${PROVIDED_VERSION}" in 2126 | "_${NVM_IOJS_PREFIX}" | '_io.js') 2127 | nvm_version "${NVM_IOJS_PREFIX}" 2128 | ;; 2129 | '_system') 2130 | nvm_echo 'system' 2131 | ;; 2132 | *) 2133 | nvm_version "${PROVIDED_VERSION}" 2134 | ;; 2135 | esac 2136 | } 2137 | 2138 | nvm_npm_global_modules() { 2139 | local NPMLIST 2140 | local VERSION 2141 | VERSION="$1" 2142 | NPMLIST=$(nvm use "${VERSION}" >/dev/null && npm list -g --depth=0 2>/dev/null | command sed 1,1d) 2143 | 2144 | local INSTALLS 2145 | INSTALLS=$(nvm_echo "${NPMLIST}" | command sed -e '/ -> / d' -e '/\(empty\)/ d' -e 's/^.* \(.*@[^ ]*\).*/\1/' -e '/^npm@[^ ]*.*$/ d' | command xargs) 2146 | 2147 | local LINKS 2148 | LINKS="$(nvm_echo "${NPMLIST}" | command sed -n 's/.* -> \(.*\)/\1/ p')" 2149 | 2150 | nvm_echo "${INSTALLS} //// ${LINKS}" 2151 | } 2152 | 2153 | nvm_die_on_prefix() { 2154 | local NVM_DELETE_PREFIX 2155 | NVM_DELETE_PREFIX="$1" 2156 | case "${NVM_DELETE_PREFIX}" in 2157 | 0 | 1) ;; 2158 | *) 2159 | nvm_err 'First argument "delete the prefix" must be zero or one' 2160 | return 1 2161 | ;; 2162 | esac 2163 | local NVM_COMMAND 2164 | NVM_COMMAND="$2" 2165 | if [ -z "${NVM_COMMAND}" ]; then 2166 | nvm_err 'Second argument "nvm command" must be nonempty' 2167 | return 2 2168 | fi 2169 | 2170 | # npm first looks at $PREFIX (case-sensitive) 2171 | # we do not bother to test the value here; if this env var is set, unset it to continue. 2172 | if [ -n "${PREFIX-}" ]; then 2173 | nvm deactivate >/dev/null 2>&1 2174 | nvm_err "nvm is not compatible with the \"PREFIX\" environment variable: currently set to \"${PREFIX}\"" 2175 | nvm_err 'Run `unset PREFIX` to unset it.' 2176 | return 3 2177 | fi 2178 | 2179 | # npm normalizes NPM_CONFIG_-prefixed env vars 2180 | # https://github.com/npm/npmconf/blob/22827e4038d6eebaafeb5c13ed2b92cf97b8fb82/npmconf.js#L331-L348 2181 | # https://github.com/npm/npm/blob/5e426a78ca02d0044f8dd26e0c5f881217081cbd/lib/config/core.js#L343-L359 2182 | # 2183 | # here, we avoid trying to replicate "which one wins" or testing the value; if any are defined, it errors 2184 | # until none are left. 2185 | local NVM_NPM_CONFIG_PREFIX_ENV 2186 | NVM_NPM_CONFIG_PREFIX_ENV="$(command env | nvm_grep -i NPM_CONFIG_PREFIX | command tail -1 | command awk -F '=' '{print $1}')" 2187 | if [ -n "${NVM_NPM_CONFIG_PREFIX_ENV-}" ]; then 2188 | local NVM_CONFIG_VALUE 2189 | eval "NVM_CONFIG_VALUE=\"\$${NVM_NPM_CONFIG_PREFIX_ENV}\"" 2190 | if [ -n "${NVM_CONFIG_VALUE-}" ] && ! nvm_tree_contains_path "${NVM_DIR}" "${NVM_CONFIG_VALUE}"; then 2191 | nvm deactivate >/dev/null 2>&1 2192 | nvm_err "nvm is not compatible with the \"${NVM_NPM_CONFIG_PREFIX_ENV}\" environment variable: currently set to \"${NVM_CONFIG_VALUE}\"" 2193 | nvm_err "Run \`unset ${NVM_NPM_CONFIG_PREFIX_ENV}\` to unset it." 2194 | return 4 2195 | fi 2196 | fi 2197 | 2198 | if ! nvm_has 'npm'; then 2199 | return 2200 | fi 2201 | 2202 | local NVM_NPM_PREFIX 2203 | NVM_NPM_PREFIX="$(npm config --loglevel=warn get prefix)" 2204 | if ! (nvm_tree_contains_path "${NVM_DIR}" "${NVM_NPM_PREFIX}" >/dev/null 2>&1); then 2205 | if [ "_${NVM_DELETE_PREFIX}" = "_1" ]; then 2206 | npm config --loglevel=warn delete prefix 2207 | else 2208 | nvm deactivate >/dev/null 2>&1 2209 | nvm_err "nvm is not compatible with the npm config \"prefix\" option: currently set to \"${NVM_NPM_PREFIX}\"" 2210 | if nvm_has 'npm'; then 2211 | nvm_err "Run \`npm config delete prefix\` or \`${NVM_COMMAND}\` to unset it." 2212 | else 2213 | nvm_err "Run \`${NVM_COMMAND}\` to unset it." 2214 | fi 2215 | return 10 2216 | fi 2217 | fi 2218 | } 2219 | 2220 | # Succeeds if $IOJS_VERSION represents an io.js version that has a 2221 | # Solaris binary, fails otherwise. 2222 | # Currently, only io.js 3.3.1 has a Solaris binary available, and it's the 2223 | # latest io.js version available. The expectation is that any potential io.js 2224 | # version later than v3.3.1 will also have Solaris binaries. 2225 | iojs_version_has_solaris_binary() { 2226 | local IOJS_VERSION 2227 | IOJS_VERSION="$1" 2228 | local STRIPPED_IOJS_VERSION 2229 | STRIPPED_IOJS_VERSION="$(nvm_strip_iojs_prefix "${IOJS_VERSION}")" 2230 | if [ "_${STRIPPED_IOJS_VERSION}" = "${IOJS_VERSION}" ]; then 2231 | return 1 2232 | fi 2233 | 2234 | # io.js started shipping Solaris binaries with io.js v3.3.1 2235 | nvm_version_greater_than_or_equal_to "${STRIPPED_IOJS_VERSION}" v3.3.1 2236 | } 2237 | 2238 | # Succeeds if $NODE_VERSION represents a node version that has a 2239 | # Solaris binary, fails otherwise. 2240 | # Currently, node versions starting from v0.8.6 have a Solaris binary 2241 | # available. 2242 | node_version_has_solaris_binary() { 2243 | local NODE_VERSION 2244 | NODE_VERSION="$1" 2245 | # Error out if $NODE_VERSION is actually an io.js version 2246 | local STRIPPED_IOJS_VERSION 2247 | STRIPPED_IOJS_VERSION="$(nvm_strip_iojs_prefix "${NODE_VERSION}")" 2248 | if [ "_${STRIPPED_IOJS_VERSION}" != "_${NODE_VERSION}" ]; then 2249 | return 1 2250 | fi 2251 | 2252 | # node (unmerged) started shipping Solaris binaries with v0.8.6 and 2253 | # node versions v1.0.0 or greater are not considered valid "unmerged" node 2254 | # versions. 2255 | nvm_version_greater_than_or_equal_to "${NODE_VERSION}" v0.8.6 \ 2256 | && ! nvm_version_greater_than_or_equal_to "${NODE_VERSION}" v1.0.0 2257 | } 2258 | 2259 | # Succeeds if $VERSION represents a version (node, io.js or merged) that has a 2260 | # Solaris binary, fails otherwise. 2261 | nvm_has_solaris_binary() { 2262 | local VERSION=$1 2263 | if nvm_is_merged_node_version "${VERSION}"; then 2264 | return 0 # All merged node versions have a Solaris binary 2265 | elif nvm_is_iojs_version "${VERSION}"; then 2266 | iojs_version_has_solaris_binary "${VERSION}" 2267 | else 2268 | node_version_has_solaris_binary "${VERSION}" 2269 | fi 2270 | } 2271 | 2272 | nvm_sanitize_path() { 2273 | local SANITIZED_PATH 2274 | SANITIZED_PATH="${1-}" 2275 | if [ "_${SANITIZED_PATH}" != "_${NVM_DIR}" ]; then 2276 | SANITIZED_PATH="$(nvm_echo "${SANITIZED_PATH}" | command sed -e "s#${NVM_DIR}#\${NVM_DIR}#g")" 2277 | fi 2278 | if [ "_${SANITIZED_PATH}" != "_${HOME}" ]; then 2279 | SANITIZED_PATH="$(nvm_echo "${SANITIZED_PATH}" | command sed -e "s#${HOME}#\${HOME}#g")" 2280 | fi 2281 | nvm_echo "${SANITIZED_PATH}" 2282 | } 2283 | 2284 | nvm_is_natural_num() { 2285 | if [ -z "$1" ]; then 2286 | return 4 2287 | fi 2288 | case "$1" in 2289 | 0) return 1 ;; 2290 | -*) return 3 ;; # some BSDs return false positives for double-negated args 2291 | *) 2292 | [ "$1" -eq "$1" ] 2>/dev/null # returns 2 if it doesn't match 2293 | ;; 2294 | esac 2295 | } 2296 | 2297 | # Check version dir permissions 2298 | nvm_check_file_permissions() { 2299 | nvm_is_zsh && setopt local_options nonomatch 2300 | for FILE in "$1"/* "$1"/.[!.]* "$1"/..?* ; do 2301 | if [ -d "$FILE" ]; then 2302 | if ! nvm_check_file_permissions "$FILE"; then 2303 | return 2 2304 | fi 2305 | elif [ -e "$FILE" ] && [ ! -w "$FILE" ] && [ ! -O "$FILE" ]; then 2306 | nvm_err "file is not writable or self-owned: $(nvm_sanitize_path "$FILE")" 2307 | return 1 2308 | fi 2309 | done 2310 | return 0 2311 | } 2312 | 2313 | nvm_cache_dir() { 2314 | nvm_echo "${NVM_DIR}/.cache" 2315 | } 2316 | 2317 | nvm() { 2318 | if [ $# -lt 1 ]; then 2319 | nvm --help 2320 | return 2321 | fi 2322 | 2323 | local DEFAULT_IFS 2324 | DEFAULT_IFS=" $(nvm_echo t | command tr t \\t) 2325 | " 2326 | if [ "${-#*e}" != "$-" ]; then 2327 | set +e 2328 | local EXIT_CODE 2329 | IFS="${DEFAULT_IFS}" nvm "$@" 2330 | EXIT_CODE=$? 2331 | set -e 2332 | return $EXIT_CODE 2333 | elif [ "${IFS}" != "${DEFAULT_IFS}" ]; then 2334 | IFS="${DEFAULT_IFS}" nvm "$@" 2335 | return $? 2336 | fi 2337 | 2338 | local COMMAND 2339 | COMMAND="${1-}" 2340 | shift 2341 | 2342 | # initialize local variables 2343 | local VERSION 2344 | local ADDITIONAL_PARAMETERS 2345 | 2346 | case $COMMAND in 2347 | 'help' | '--help') 2348 | local NVM_IOJS_PREFIX 2349 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 2350 | local NVM_NODE_PREFIX 2351 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 2352 | NVM_VERSION="$(nvm --version)" 2353 | nvm_echo 2354 | nvm_echo "Node Version Manager (v${NVM_VERSION})" 2355 | nvm_echo 2356 | nvm_echo 'Note: refers to any version-like string nvm understands. This includes:' 2357 | nvm_echo ' - full or partial version numbers, starting with an optional "v" (0.10, v0.1.2, v1)' 2358 | nvm_echo " - default (built-in) aliases: ${NVM_NODE_PREFIX}, stable, unstable, ${NVM_IOJS_PREFIX}, system" 2359 | nvm_echo ' - custom aliases you define with `nvm alias foo`' 2360 | nvm_echo 2361 | nvm_echo ' Any options that produce colorized output should respect the `--no-colors` option.' 2362 | nvm_echo 2363 | nvm_echo 'Usage:' 2364 | nvm_echo ' nvm --help Show this message' 2365 | nvm_echo ' nvm --version Print out the installed version of nvm' 2366 | nvm_echo ' nvm install [-s] Download and install a , [-s] from source. Uses .nvmrc if available' 2367 | nvm_echo ' --reinstall-packages-from= When installing, reinstall packages installed in ' 2368 | nvm_echo ' --lts When installing, only select from LTS (long-term support) versions' 2369 | nvm_echo ' --lts= When installing, only select from versions for a specific LTS line' 2370 | nvm_echo ' --skip-default-packages When installing, skip the default-packages file if it exists' 2371 | nvm_echo ' --latest-npm After installing, attempt to upgrade to the latest working npm on the given node version' 2372 | nvm_echo ' --no-progress Disable the progress bar on any downloads' 2373 | nvm_echo ' nvm uninstall Uninstall a version' 2374 | nvm_echo ' nvm uninstall --lts Uninstall using automatic LTS (long-term support) alias `lts/*`, if available.' 2375 | nvm_echo ' nvm uninstall --lts= Uninstall using automatic alias for provided LTS line, if available.' 2376 | nvm_echo ' nvm use [--silent] Modify PATH to use . Uses .nvmrc if available' 2377 | nvm_echo ' --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.' 2378 | nvm_echo ' --lts= Uses automatic alias for provided LTS line, if available.' 2379 | nvm_echo ' nvm exec [--silent] [] Run on . Uses .nvmrc if available' 2380 | nvm_echo ' --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.' 2381 | nvm_echo ' --lts= Uses automatic alias for provided LTS line, if available.' 2382 | nvm_echo ' nvm run [--silent] [] Run `node` on with as arguments. Uses .nvmrc if available' 2383 | nvm_echo ' --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.' 2384 | nvm_echo ' --lts= Uses automatic alias for provided LTS line, if available.' 2385 | nvm_echo ' nvm current Display currently activated version of Node' 2386 | nvm_echo ' nvm ls [] List installed versions, matching a given if provided' 2387 | nvm_echo ' --no-colors Suppress colored output' 2388 | nvm_echo ' --no-alias Suppress `nvm alias` output' 2389 | nvm_echo ' nvm ls-remote [] List remote versions available for install, matching a given if provided' 2390 | nvm_echo ' --lts When listing, only show LTS (long-term support) versions' 2391 | nvm_echo ' --lts= When listing, only show versions for a specific LTS line' 2392 | nvm_echo ' --no-colors Suppress colored output' 2393 | nvm_echo ' nvm version Resolve the given description to a single local version' 2394 | nvm_echo ' nvm version-remote Resolve the given description to a single remote version' 2395 | nvm_echo ' --lts When listing, only select from LTS (long-term support) versions' 2396 | nvm_echo ' --lts= When listing, only select from versions for a specific LTS line' 2397 | nvm_echo ' nvm deactivate Undo effects of `nvm` on current shell' 2398 | nvm_echo ' nvm alias [] Show all aliases beginning with ' 2399 | nvm_echo ' --no-colors Suppress colored output' 2400 | nvm_echo ' nvm alias Set an alias named pointing to ' 2401 | nvm_echo ' nvm unalias Deletes the alias named ' 2402 | nvm_echo ' nvm install-latest-npm Attempt to upgrade to the latest working `npm` on the current node version' 2403 | nvm_echo ' nvm reinstall-packages Reinstall global `npm` packages contained in to current version' 2404 | nvm_echo ' nvm unload Unload `nvm` from shell' 2405 | nvm_echo ' nvm which [current | ] Display path to installed node version. Uses .nvmrc if available' 2406 | nvm_echo ' nvm cache dir Display path to the cache directory for nvm' 2407 | nvm_echo ' nvm cache clear Empty cache directory for nvm' 2408 | nvm_echo 2409 | nvm_echo 'Example:' 2410 | nvm_echo ' nvm install 8.0.0 Install a specific version number' 2411 | nvm_echo ' nvm use 8.0 Use the latest available 8.0.x release' 2412 | nvm_echo ' nvm run 6.10.3 app.js Run app.js using node 6.10.3' 2413 | nvm_echo ' nvm exec 4.8.3 node app.js Run `node app.js` with the PATH pointing to node 4.8.3' 2414 | nvm_echo ' nvm alias default 8.1.0 Set default node version on a shell' 2415 | nvm_echo ' nvm alias default node Always default to the latest available node version on a shell' 2416 | nvm_echo 2417 | nvm_echo 'Note:' 2418 | nvm_echo ' to remove, delete, or uninstall nvm - just remove the `$NVM_DIR` folder (usually `~/.nvm`)' 2419 | nvm_echo 2420 | ;; 2421 | 2422 | "cache") 2423 | case "${1-}" in 2424 | dir) nvm_cache_dir ;; 2425 | clear) 2426 | local DIR 2427 | DIR="$(nvm_cache_dir)" 2428 | if command rm -rf "${DIR}" && command mkdir -p "${DIR}"; then 2429 | nvm_echo 'nvm cache cleared.' 2430 | else 2431 | nvm_err "Unable to clear nvm cache: ${DIR}" 2432 | return 1 2433 | fi 2434 | ;; 2435 | *) 2436 | >&2 nvm --help 2437 | return 127 2438 | ;; 2439 | esac 2440 | ;; 2441 | 2442 | "debug") 2443 | local OS_VERSION 2444 | nvm_is_zsh && setopt local_options shwordsplit 2445 | nvm_err "nvm --version: v$(nvm --version)" 2446 | if [ -n "${TERM_PROGRAM-}" ]; then 2447 | nvm_err "\$TERM_PROGRAM: ${TERM_PROGRAM}" 2448 | fi 2449 | nvm_err "\$SHELL: ${SHELL}" 2450 | # shellcheck disable=SC2169 2451 | nvm_err "\$SHLVL: ${SHLVL-}" 2452 | nvm_err "\${HOME}: ${HOME}" 2453 | nvm_err "\${NVM_DIR}: '$(nvm_sanitize_path "${NVM_DIR}")'" 2454 | nvm_err "\${PATH}: $(nvm_sanitize_path "${PATH}")" 2455 | nvm_err "\$PREFIX: '$(nvm_sanitize_path "${PREFIX}")'" 2456 | nvm_err "\${NPM_CONFIG_PREFIX}: '$(nvm_sanitize_path "${NPM_CONFIG_PREFIX}")'" 2457 | nvm_err "\$NVM_NODEJS_ORG_MIRROR: '${NVM_NODEJS_ORG_MIRROR}'" 2458 | nvm_err "\$NVM_IOJS_ORG_MIRROR: '${NVM_IOJS_ORG_MIRROR}'" 2459 | nvm_err "shell version: '$(${SHELL} --version | command head -n 1)'" 2460 | nvm_err "uname -a: '$(command uname -a | command awk '{$2=""; print}' | command xargs)'" 2461 | if [ "$(nvm_get_os)" = "darwin" ] && nvm_has sw_vers; then 2462 | OS_VERSION="$(sw_vers | command awk '{print $2}' | command xargs)" 2463 | elif [ -r "/etc/issue" ]; then 2464 | OS_VERSION="$(command head -n 1 /etc/issue | command sed 's/\\.//g')" 2465 | if [ -z "${OS_VERSION}" ] && [ -r "/etc/os-release" ]; then 2466 | # shellcheck disable=SC1091 2467 | OS_VERSION="$(. /etc/os-release && echo "${NAME}" "${VERSION}")" 2468 | fi 2469 | fi 2470 | if [ -n "${OS_VERSION}" ]; then 2471 | nvm_err "OS version: ${OS_VERSION}" 2472 | fi 2473 | if nvm_has "curl"; then 2474 | nvm_err "curl: $(nvm_command_info curl), $(command curl -V | command head -n 1)" 2475 | else 2476 | nvm_err "curl: not found" 2477 | fi 2478 | if nvm_has "wget"; then 2479 | nvm_err "wget: $(nvm_command_info wget), $(command wget -V | command head -n 1)" 2480 | else 2481 | nvm_err "wget: not found" 2482 | fi 2483 | 2484 | local TEST_TOOLS ADD_TEST_TOOLS 2485 | TEST_TOOLS="git grep awk" 2486 | ADD_TEST_TOOLS="sed cut basename rm mkdir xargs" 2487 | if [ "darwin" != "$(nvm_get_os)" ] && [ "freebsd" != "$(nvm_get_os)" ]; then 2488 | TEST_TOOLS="${TEST_TOOLS} ${ADD_TEST_TOOLS}" 2489 | else 2490 | for tool in ${ADD_TEST_TOOLS} ; do 2491 | if nvm_has "${tool}"; then 2492 | nvm_err "${tool}: $(nvm_command_info "${tool}")" 2493 | else 2494 | nvm_err "${tool}: not found" 2495 | fi 2496 | done 2497 | fi 2498 | for tool in ${TEST_TOOLS} ; do 2499 | local NVM_TOOL_VERSION 2500 | if nvm_has "${tool}"; then 2501 | if command ls -l "$(nvm_command_info "${tool}" | command awk '{print $1}')" | command grep -q busybox; then 2502 | NVM_TOOL_VERSION="$(command "${tool}" --help 2>&1 | command head -n 1)" 2503 | else 2504 | NVM_TOOL_VERSION="$(command "${tool}" --version 2>&1 | command head -n 1)" 2505 | fi 2506 | nvm_err "${tool}: $(nvm_command_info "${tool}"), ${NVM_TOOL_VERSION}" 2507 | else 2508 | nvm_err "${tool}: not found" 2509 | fi 2510 | unset NVM_TOOL_VERSION 2511 | done 2512 | unset TEST_TOOLS ADD_TEST_TOOLS 2513 | 2514 | local NVM_DEBUG_OUTPUT 2515 | for NVM_DEBUG_COMMAND in 'nvm current' 'which node' 'which iojs' 'which npm' 'npm config get prefix' 'npm root -g'; do 2516 | NVM_DEBUG_OUTPUT="$(${NVM_DEBUG_COMMAND} 2>&1)" 2517 | nvm_err "${NVM_DEBUG_COMMAND}: $(nvm_sanitize_path "${NVM_DEBUG_OUTPUT}")" 2518 | done 2519 | return 42 2520 | ;; 2521 | 2522 | "install" | "i") 2523 | local version_not_provided 2524 | version_not_provided=0 2525 | local NVM_OS 2526 | NVM_OS="$(nvm_get_os)" 2527 | 2528 | if ! nvm_has "curl" && ! nvm_has "wget"; then 2529 | nvm_err 'nvm needs curl or wget to proceed.' 2530 | return 1 2531 | fi 2532 | 2533 | if [ $# -lt 1 ]; then 2534 | version_not_provided=1 2535 | fi 2536 | 2537 | local nobinary 2538 | local noprogress 2539 | nobinary=0 2540 | noprogress=0 2541 | local LTS 2542 | local NVM_UPGRADE_NPM 2543 | NVM_UPGRADE_NPM=0 2544 | while [ $# -ne 0 ]; do 2545 | case "$1" in 2546 | ---*) 2547 | nvm_err 'arguments with `---` are not supported - this is likely a typo' 2548 | return 55; 2549 | ;; 2550 | -s) 2551 | shift # consume "-s" 2552 | nobinary=1 2553 | ;; 2554 | -j) 2555 | shift # consume "-j" 2556 | nvm_get_make_jobs "$1" 2557 | shift # consume job count 2558 | ;; 2559 | --no-progress) 2560 | noprogress=1 2561 | shift 2562 | ;; 2563 | --lts) 2564 | LTS='*' 2565 | shift 2566 | ;; 2567 | --lts=*) 2568 | LTS="${1##--lts=}" 2569 | shift 2570 | ;; 2571 | --latest-npm) 2572 | NVM_UPGRADE_NPM=1 2573 | shift 2574 | ;; 2575 | *) 2576 | break # stop parsing args 2577 | ;; 2578 | esac 2579 | done 2580 | 2581 | local provided_version 2582 | provided_version="${1-}" 2583 | 2584 | if [ -z "${provided_version}" ]; then 2585 | if [ "_${LTS-}" = '_*' ]; then 2586 | nvm_echo 'Installing latest LTS version.' 2587 | if [ $# -gt 0 ]; then 2588 | shift 2589 | fi 2590 | elif [ "_${LTS-}" != '_' ]; then 2591 | nvm_echo "Installing with latest version of LTS line: ${LTS}" 2592 | if [ $# -gt 0 ]; then 2593 | shift 2594 | fi 2595 | else 2596 | nvm_rc_version 2597 | if [ $version_not_provided -eq 1 ] && [ -z "${NVM_RC_VERSION}" ]; then 2598 | unset NVM_RC_VERSION 2599 | >&2 nvm --help 2600 | return 127 2601 | fi 2602 | provided_version="${NVM_RC_VERSION}" 2603 | unset NVM_RC_VERSION 2604 | fi 2605 | elif [ $# -gt 0 ]; then 2606 | shift 2607 | fi 2608 | 2609 | case "${provided_version}" in 2610 | 'lts/*') 2611 | LTS='*' 2612 | provided_version='' 2613 | ;; 2614 | lts/*) 2615 | LTS="${provided_version##lts/}" 2616 | provided_version='' 2617 | ;; 2618 | esac 2619 | 2620 | VERSION="$(NVM_VERSION_ONLY=true NVM_LTS="${LTS-}" nvm_remote_version "${provided_version}")" 2621 | 2622 | if [ "${VERSION}" = 'N/A' ]; then 2623 | local LTS_MSG 2624 | local REMOTE_CMD 2625 | if [ "${LTS-}" = '*' ]; then 2626 | LTS_MSG='(with LTS filter) ' 2627 | REMOTE_CMD='nvm ls-remote --lts' 2628 | elif [ -n "${LTS-}" ]; then 2629 | LTS_MSG="(with LTS filter '${LTS}') " 2630 | REMOTE_CMD="nvm ls-remote --lts=${LTS}" 2631 | else 2632 | REMOTE_CMD='nvm ls-remote' 2633 | fi 2634 | nvm_err "Version '${provided_version}' ${LTS_MSG-}not found - try \`${REMOTE_CMD}\` to browse available versions." 2635 | return 3 2636 | fi 2637 | 2638 | ADDITIONAL_PARAMETERS='' 2639 | local PROVIDED_REINSTALL_PACKAGES_FROM 2640 | local REINSTALL_PACKAGES_FROM 2641 | local SKIP_DEFAULT_PACKAGES 2642 | local DEFAULT_PACKAGES 2643 | 2644 | while [ $# -ne 0 ]; do 2645 | case "$1" in 2646 | --reinstall-packages-from=*) 2647 | PROVIDED_REINSTALL_PACKAGES_FROM="$(nvm_echo "$1" | command cut -c 27-)" 2648 | if [ -z "${PROVIDED_REINSTALL_PACKAGES_FROM}" ]; then 2649 | nvm_err 'If --reinstall-packages-from is provided, it must point to an installed version of node.' 2650 | return 6 2651 | fi 2652 | REINSTALL_PACKAGES_FROM="$(nvm_version "${PROVIDED_REINSTALL_PACKAGES_FROM}")" ||: 2653 | ;; 2654 | --reinstall-packages-from) 2655 | nvm_err 'If --reinstall-packages-from is provided, it must point to an installed version of node using `=`.' 2656 | return 6 2657 | ;; 2658 | --copy-packages-from=*) 2659 | PROVIDED_REINSTALL_PACKAGES_FROM="$(nvm_echo "$1" | command cut -c 22-)" 2660 | REINSTALL_PACKAGES_FROM="$(nvm_version "${PROVIDED_REINSTALL_PACKAGES_FROM}")" ||: 2661 | ;; 2662 | --skip-default-packages) 2663 | SKIP_DEFAULT_PACKAGES=true 2664 | ;; 2665 | *) 2666 | ADDITIONAL_PARAMETERS="${ADDITIONAL_PARAMETERS} $1" 2667 | ;; 2668 | esac 2669 | shift 2670 | done 2671 | 2672 | if [ -z "${SKIP_DEFAULT_PACKAGES-}" ]; then 2673 | DEFAULT_PACKAGES="$(nvm_get_default_packages)" 2674 | EXIT_CODE=$? 2675 | if [ $EXIT_CODE -ne 0 ]; then 2676 | return $EXIT_CODE 2677 | fi 2678 | fi 2679 | 2680 | if [ -n "${PROVIDED_REINSTALL_PACKAGES_FROM-}" ] && [ "$(nvm_ensure_version_prefix "${PROVIDED_REINSTALL_PACKAGES_FROM}")" = "${VERSION}" ]; then 2681 | nvm_err "You can't reinstall global packages from the same version of node you're installing." 2682 | return 4 2683 | elif [ "${REINSTALL_PACKAGES_FROM-}" = 'N/A' ]; then 2684 | nvm_err "If --reinstall-packages-from is provided, it must point to an installed version of node." 2685 | return 5 2686 | fi 2687 | 2688 | local FLAVOR 2689 | if nvm_is_iojs_version "${VERSION}"; then 2690 | FLAVOR="$(nvm_iojs_prefix)" 2691 | else 2692 | FLAVOR="$(nvm_node_prefix)" 2693 | fi 2694 | 2695 | if nvm_is_version_installed "${VERSION}"; then 2696 | nvm_err "${VERSION} is already installed." 2697 | if nvm use "${VERSION}"; then 2698 | if [ "${NVM_UPGRADE_NPM}" = 1 ]; then 2699 | nvm install-latest-npm 2700 | fi 2701 | if [ -z "${SKIP_DEFAULT_PACKAGES-}" ] && [ -n "${DEFAULT_PACKAGES-}" ]; then 2702 | nvm_install_default_packages "${DEFAULT_PACKAGES}" 2703 | fi 2704 | if [ -n "${REINSTALL_PACKAGES_FROM-}" ] && [ "_${REINSTALL_PACKAGES_FROM}" != "_N/A" ]; then 2705 | nvm reinstall-packages "${REINSTALL_PACKAGES_FROM}" 2706 | fi 2707 | fi 2708 | if [ -n "${LTS-}" ]; then 2709 | LTS="$(echo "${LTS}" | tr '[:upper:]' '[:lower:]')" 2710 | nvm_ensure_default_set "lts/${LTS}" 2711 | else 2712 | nvm_ensure_default_set "${provided_version}" 2713 | fi 2714 | return $? 2715 | fi 2716 | 2717 | local EXIT_CODE 2718 | EXIT_CODE=-1 2719 | if [ -n "${NVM_INSTALL_THIRD_PARTY_HOOK-}" ]; then 2720 | nvm_err '** $NVM_INSTALL_THIRD_PARTY_HOOK env var set; dispatching to third-party installation method **' 2721 | local NVM_METHOD_PREFERENCE 2722 | NVM_METHOD_PREFERENCE='binary' 2723 | if [ $nobinary -eq 1 ]; then 2724 | NVM_METHOD_PREFERENCE='source' 2725 | fi 2726 | local VERSION_PATH 2727 | VERSION_PATH="$(nvm_version_path "${VERSION}")" 2728 | "${NVM_INSTALL_THIRD_PARTY_HOOK}" "${VERSION}" "${FLAVOR}" std "${NVM_METHOD_PREFERENCE}" "${VERSION_PATH}" || { 2729 | EXIT_CODE=$? 2730 | nvm_err '*** Third-party $NVM_INSTALL_THIRD_PARTY_HOOK env var failed to install! ***' 2731 | return $EXIT_CODE 2732 | } 2733 | if ! nvm_is_version_installed "${VERSION}"; then 2734 | nvm_err '*** Third-party $NVM_INSTALL_THIRD_PARTY_HOOK env var claimed to succeed, but failed to install! ***' 2735 | return 33 2736 | fi 2737 | EXIT_CODE=0 2738 | else 2739 | 2740 | if [ "_${NVM_OS}" = "_freebsd" ]; then 2741 | # node.js and io.js do not have a FreeBSD binary 2742 | nobinary=1 2743 | nvm_err "Currently, there is no binary for FreeBSD" 2744 | elif [ "_${NVM_OS}" = "_sunos" ]; then 2745 | # Not all node/io.js versions have a Solaris binary 2746 | if ! nvm_has_solaris_binary "${VERSION}"; then 2747 | nobinary=1 2748 | nvm_err "Currently, there is no binary of version ${VERSION} for SunOS" 2749 | fi 2750 | fi 2751 | 2752 | # skip binary install if "nobinary" option specified. 2753 | if [ $nobinary -ne 1 ] && nvm_binary_available "${VERSION}"; then 2754 | NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" nvm_install_binary "${FLAVOR}" std "${VERSION}" 2755 | EXIT_CODE=$? 2756 | fi 2757 | if [ $EXIT_CODE -ne 0 ]; then 2758 | if [ -z "${NVM_MAKE_JOBS-}" ]; then 2759 | nvm_get_make_jobs 2760 | fi 2761 | 2762 | NVM_NO_PROGRESS="${NVM_NO_PROGRESS:-${noprogress}}" nvm_install_source "${FLAVOR}" std "${VERSION}" "${NVM_MAKE_JOBS}" "${ADDITIONAL_PARAMETERS}" 2763 | EXIT_CODE=$? 2764 | fi 2765 | 2766 | fi 2767 | 2768 | if [ $EXIT_CODE -eq 0 ] && nvm_use_if_needed "${VERSION}" && nvm_install_npm_if_needed "${VERSION}"; then 2769 | if [ -n "${LTS-}" ]; then 2770 | nvm_ensure_default_set "lts/${LTS}" 2771 | else 2772 | nvm_ensure_default_set "${provided_version}" 2773 | fi 2774 | if [ "${NVM_UPGRADE_NPM}" = 1 ]; then 2775 | nvm install-latest-npm 2776 | EXIT_CODE=$? 2777 | fi 2778 | if [ -z "${SKIP_DEFAULT_PACKAGES-}" ] && [ -n "${DEFAULT_PACKAGES-}" ]; then 2779 | nvm_install_default_packages "${DEFAULT_PACKAGES}" 2780 | fi 2781 | if [ -n "${REINSTALL_PACKAGES_FROM-}" ] && [ "_${REINSTALL_PACKAGES_FROM}" != "_N/A" ]; then 2782 | nvm reinstall-packages "${REINSTALL_PACKAGES_FROM}" 2783 | EXIT_CODE=$? 2784 | fi 2785 | else 2786 | EXIT_CODE=$? 2787 | fi 2788 | return $EXIT_CODE 2789 | ;; 2790 | "uninstall") 2791 | if [ $# -ne 1 ]; then 2792 | >&2 nvm --help 2793 | return 127 2794 | fi 2795 | 2796 | local PATTERN 2797 | PATTERN="${1-}" 2798 | case "${PATTERN-}" in 2799 | --) ;; 2800 | --lts | 'lts/*') 2801 | VERSION="$(nvm_match_version "lts/*")" 2802 | ;; 2803 | lts/*) 2804 | VERSION="$(nvm_match_version "lts/${PATTERN##lts/}")" 2805 | ;; 2806 | --lts=*) 2807 | VERSION="$(nvm_match_version "lts/${PATTERN##--lts=}")" 2808 | ;; 2809 | *) 2810 | VERSION="$(nvm_version "${PATTERN}")" 2811 | ;; 2812 | esac 2813 | 2814 | if [ "_${VERSION}" = "_$(nvm_ls_current)" ]; then 2815 | if nvm_is_iojs_version "${VERSION}"; then 2816 | nvm_err "nvm: Cannot uninstall currently-active io.js version, ${VERSION} (inferred from ${PATTERN})." 2817 | else 2818 | nvm_err "nvm: Cannot uninstall currently-active node version, ${VERSION} (inferred from ${PATTERN})." 2819 | fi 2820 | return 1 2821 | fi 2822 | 2823 | if ! nvm_is_version_installed "${VERSION}"; then 2824 | nvm_err "${VERSION} version is not installed..." 2825 | return 2826 | fi 2827 | 2828 | local SLUG_BINARY 2829 | local SLUG_SOURCE 2830 | if nvm_is_iojs_version "${VERSION}"; then 2831 | SLUG_BINARY="$(nvm_get_download_slug iojs binary std "${VERSION}")" 2832 | SLUG_SOURCE="$(nvm_get_download_slug iojs source std "${VERSION}")" 2833 | else 2834 | SLUG_BINARY="$(nvm_get_download_slug node binary std "${VERSION}")" 2835 | SLUG_SOURCE="$(nvm_get_download_slug node source std "${VERSION}")" 2836 | fi 2837 | 2838 | local NVM_SUCCESS_MSG 2839 | if nvm_is_iojs_version "${VERSION}"; then 2840 | NVM_SUCCESS_MSG="Uninstalled io.js $(nvm_strip_iojs_prefix "${VERSION}")" 2841 | else 2842 | NVM_SUCCESS_MSG="Uninstalled node ${VERSION}" 2843 | fi 2844 | 2845 | local VERSION_PATH 2846 | VERSION_PATH="$(nvm_version_path "${VERSION}")" 2847 | if ! nvm_check_file_permissions "${VERSION_PATH}"; then 2848 | nvm_err 'Cannot uninstall, incorrect permissions on installation folder.' 2849 | nvm_err 'This is usually caused by running `npm install -g` as root. Run the following commands as root to fix the permissions and then try again.' 2850 | nvm_err 2851 | nvm_err " chown -R $(whoami) \"$(nvm_sanitize_path "${VERSION_PATH}")\"" 2852 | nvm_err " chmod -R u+w \"$(nvm_sanitize_path "${VERSION_PATH}")\"" 2853 | return 1 2854 | fi 2855 | 2856 | # Delete all files related to target version. 2857 | local CACHE_DIR 2858 | CACHE_DIR="$(nvm_cache_dir)" 2859 | command rm -rf \ 2860 | "${CACHE_DIR}/bin/${SLUG_BINARY}/files" \ 2861 | "${CACHE_DIR}/src/${SLUG_SOURCE}/files" \ 2862 | "${VERSION_PATH}" 2>/dev/null 2863 | nvm_echo "${NVM_SUCCESS_MSG}" 2864 | 2865 | # rm any aliases that point to uninstalled version. 2866 | for ALIAS in $(nvm_grep -l "${VERSION}" "$(nvm_alias_path)/*" 2>/dev/null); do 2867 | nvm unalias "$(command basename "${ALIAS}")" 2868 | done 2869 | ;; 2870 | "deactivate") 2871 | local NEWPATH 2872 | NEWPATH="$(nvm_strip_path "${PATH}" "/bin")" 2873 | if [ "_${PATH}" = "_${NEWPATH}" ]; then 2874 | nvm_err "Could not find ${NVM_DIR}/*/bin in \${PATH}" 2875 | else 2876 | export PATH="${NEWPATH}" 2877 | hash -r 2878 | nvm_echo "${NVM_DIR}/*/bin removed from \${PATH}" 2879 | fi 2880 | 2881 | if [ -n "${MANPATH-}" ]; then 2882 | NEWPATH="$(nvm_strip_path "${MANPATH}" "/share/man")" 2883 | if [ "_${MANPATH}" = "_${NEWPATH}" ]; then 2884 | nvm_err "Could not find ${NVM_DIR}/*/share/man in \${MANPATH}" 2885 | else 2886 | export MANPATH="${NEWPATH}" 2887 | nvm_echo "${NVM_DIR}/*/share/man removed from \${MANPATH}" 2888 | fi 2889 | fi 2890 | 2891 | if [ -n "${NODE_PATH-}" ]; then 2892 | NEWPATH="$(nvm_strip_path "${NODE_PATH}" "/lib/node_modules")" 2893 | if [ "_${NODE_PATH}" != "_${NEWPATH}" ]; then 2894 | export NODE_PATH="${NEWPATH}" 2895 | nvm_echo "${NVM_DIR}/*/lib/node_modules removed from \${NODE_PATH}" 2896 | fi 2897 | fi 2898 | unset NVM_BIN 2899 | ;; 2900 | "use") 2901 | local PROVIDED_VERSION 2902 | local NVM_USE_SILENT 2903 | NVM_USE_SILENT=0 2904 | local NVM_DELETE_PREFIX 2905 | NVM_DELETE_PREFIX=0 2906 | local NVM_LTS 2907 | 2908 | while [ $# -ne 0 ]; do 2909 | case "$1" in 2910 | --silent) NVM_USE_SILENT=1 ;; 2911 | --delete-prefix) NVM_DELETE_PREFIX=1 ;; 2912 | --) ;; 2913 | --lts) NVM_LTS='*' ;; 2914 | --lts=*) NVM_LTS="${1##--lts=}" ;; 2915 | --*) ;; 2916 | *) 2917 | if [ -n "${1-}" ]; then 2918 | PROVIDED_VERSION="$1" 2919 | fi 2920 | ;; 2921 | esac 2922 | shift 2923 | done 2924 | 2925 | if [ -n "${NVM_LTS-}" ]; then 2926 | VERSION="$(nvm_match_version "lts/${NVM_LTS:-*}")" 2927 | elif [ -z "${PROVIDED_VERSION-}" ]; then 2928 | nvm_rc_version 2929 | if [ -n "${NVM_RC_VERSION-}" ]; then 2930 | PROVIDED_VERSION="${NVM_RC_VERSION}" 2931 | VERSION="$(nvm_version "${PROVIDED_VERSION}")" 2932 | fi 2933 | unset NVM_RC_VERSION 2934 | if [ -z "${VERSION}" ]; then 2935 | nvm_err 'Please see `nvm --help` or https://github.com/nvm-sh/nvm#nvmrc for more information.' 2936 | return 127 2937 | fi 2938 | else 2939 | VERSION="$(nvm_match_version "${PROVIDED_VERSION}")" 2940 | fi 2941 | 2942 | if [ -z "${VERSION}" ]; then 2943 | >&2 nvm --help 2944 | return 127 2945 | fi 2946 | 2947 | if [ "_${VERSION}" = '_system' ]; then 2948 | if nvm_has_system_node && nvm deactivate >/dev/null 2>&1; then 2949 | if [ $NVM_USE_SILENT -ne 1 ]; then 2950 | nvm_echo "Now using system version of node: $(node -v 2>/dev/null)$(nvm_print_npm_version)" 2951 | fi 2952 | return 2953 | elif nvm_has_system_iojs && nvm deactivate >/dev/null 2>&1; then 2954 | if [ $NVM_USE_SILENT -ne 1 ]; then 2955 | nvm_echo "Now using system version of io.js: $(iojs --version 2>/dev/null)$(nvm_print_npm_version)" 2956 | fi 2957 | return 2958 | elif [ $NVM_USE_SILENT -ne 1 ]; then 2959 | nvm_err 'System version of node not found.' 2960 | fi 2961 | return 127 2962 | elif [ "_${VERSION}" = "_∞" ]; then 2963 | if [ $NVM_USE_SILENT -ne 1 ]; then 2964 | nvm_err "The alias \"${PROVIDED_VERSION}\" leads to an infinite loop. Aborting." 2965 | fi 2966 | return 8 2967 | fi 2968 | if [ "${VERSION}" = 'N/A' ]; then 2969 | nvm_err "N/A: version \"${PROVIDED_VERSION} -> ${VERSION}\" is not yet installed." 2970 | nvm_err "" 2971 | nvm_err "You need to run \"nvm install ${PROVIDED_VERSION}\" to install it before using it." 2972 | return 3 2973 | # This nvm_ensure_version_installed call can be a performance bottleneck 2974 | # on shell startup. Perhaps we can optimize it away or make it faster. 2975 | elif ! nvm_ensure_version_installed "${VERSION}"; then 2976 | return $? 2977 | fi 2978 | 2979 | local NVM_VERSION_DIR 2980 | NVM_VERSION_DIR="$(nvm_version_path "${VERSION}")" 2981 | 2982 | # Change current version 2983 | PATH="$(nvm_change_path "${PATH}" "/bin" "${NVM_VERSION_DIR}")" 2984 | if nvm_has manpath; then 2985 | if [ -z "${MANPATH-}" ]; then 2986 | local MANPATH 2987 | MANPATH=$(manpath) 2988 | fi 2989 | # Change current version 2990 | MANPATH="$(nvm_change_path "${MANPATH}" "/share/man" "${NVM_VERSION_DIR}")" 2991 | export MANPATH 2992 | fi 2993 | export PATH 2994 | hash -r 2995 | export NVM_BIN="${NVM_VERSION_DIR}/bin" 2996 | if [ "${NVM_SYMLINK_CURRENT-}" = true ]; then 2997 | command rm -f "${NVM_DIR}/current" && ln -s "${NVM_VERSION_DIR}" "${NVM_DIR}/current" 2998 | fi 2999 | local NVM_USE_OUTPUT 3000 | NVM_USE_OUTPUT='' 3001 | if [ $NVM_USE_SILENT -ne 1 ]; then 3002 | if nvm_is_iojs_version "${VERSION}"; then 3003 | NVM_USE_OUTPUT="Now using io.js $(nvm_strip_iojs_prefix "${VERSION}")$(nvm_print_npm_version)" 3004 | else 3005 | NVM_USE_OUTPUT="Now using node ${VERSION}$(nvm_print_npm_version)" 3006 | fi 3007 | fi 3008 | if [ "_${VERSION}" != "_system" ]; then 3009 | local NVM_USE_CMD 3010 | NVM_USE_CMD="nvm use --delete-prefix" 3011 | if [ -n "${PROVIDED_VERSION}" ]; then 3012 | NVM_USE_CMD="${NVM_USE_CMD} ${VERSION}" 3013 | fi 3014 | if [ $NVM_USE_SILENT -eq 1 ]; then 3015 | NVM_USE_CMD="${NVM_USE_CMD} --silent" 3016 | fi 3017 | if ! nvm_die_on_prefix "${NVM_DELETE_PREFIX}" "${NVM_USE_CMD}"; then 3018 | return 11 3019 | fi 3020 | fi 3021 | if [ -n "${NVM_USE_OUTPUT-}" ]; then 3022 | nvm_echo "${NVM_USE_OUTPUT}" 3023 | fi 3024 | ;; 3025 | "run") 3026 | local provided_version 3027 | local has_checked_nvmrc 3028 | has_checked_nvmrc=0 3029 | # run given version of node 3030 | 3031 | local NVM_SILENT 3032 | local NVM_LTS 3033 | while [ $# -gt 0 ]; do 3034 | case "$1" in 3035 | --silent) NVM_SILENT='--silent' ; shift ;; 3036 | --lts) NVM_LTS='*' ; shift ;; 3037 | --lts=*) NVM_LTS="${1##--lts=}" ; shift ;; 3038 | *) 3039 | if [ -n "$1" ]; then 3040 | break 3041 | else 3042 | shift 3043 | fi 3044 | ;; # stop processing arguments 3045 | esac 3046 | done 3047 | 3048 | if [ $# -lt 1 ] && [ -z "${NVM_LTS-}" ]; then 3049 | if [ -n "${NVM_SILENT-}" ]; then 3050 | nvm_rc_version >/dev/null 2>&1 && has_checked_nvmrc=1 3051 | else 3052 | nvm_rc_version && has_checked_nvmrc=1 3053 | fi 3054 | if [ -n "${NVM_RC_VERSION-}" ]; then 3055 | VERSION="$(nvm_version "${NVM_RC_VERSION-}")" ||: 3056 | fi 3057 | unset NVM_RC_VERSION 3058 | if [ "${VERSION:-N/A}" = 'N/A' ]; then 3059 | >&2 nvm --help 3060 | return 127 3061 | fi 3062 | fi 3063 | 3064 | if [ -z "${NVM_LTS-}" ]; then 3065 | provided_version="$1" 3066 | if [ -n "${provided_version}" ]; then 3067 | VERSION="$(nvm_version "${provided_version}")" ||: 3068 | if [ "_${VERSION:-N/A}" = '_N/A' ] && ! nvm_is_valid_version "${provided_version}"; then 3069 | provided_version='' 3070 | if [ $has_checked_nvmrc -ne 1 ]; then 3071 | if [ -n "${NVM_SILENT-}" ]; then 3072 | nvm_rc_version >/dev/null 2>&1 && has_checked_nvmrc=1 3073 | else 3074 | nvm_rc_version && has_checked_nvmrc=1 3075 | fi 3076 | fi 3077 | VERSION="$(nvm_version "${NVM_RC_VERSION}")" ||: 3078 | unset NVM_RC_VERSION 3079 | else 3080 | shift 3081 | fi 3082 | fi 3083 | fi 3084 | 3085 | local NVM_IOJS 3086 | if nvm_is_iojs_version "${VERSION}"; then 3087 | NVM_IOJS=true 3088 | fi 3089 | 3090 | local EXIT_CODE 3091 | 3092 | nvm_is_zsh && setopt local_options shwordsplit 3093 | local LTS_ARG 3094 | if [ -n "${NVM_LTS-}" ]; then 3095 | LTS_ARG="--lts=${NVM_LTS-}" 3096 | VERSION='' 3097 | fi 3098 | if [ "_${VERSION}" = "_N/A" ]; then 3099 | nvm_ensure_version_installed "${provided_version}" 3100 | elif [ "${NVM_IOJS}" = true ]; then 3101 | nvm exec "${NVM_SILENT-}" "${LTS_ARG-}" "${VERSION}" iojs "$@" 3102 | else 3103 | nvm exec "${NVM_SILENT-}" "${LTS_ARG-}" "${VERSION}" node "$@" 3104 | fi 3105 | EXIT_CODE="$?" 3106 | return $EXIT_CODE 3107 | ;; 3108 | "exec") 3109 | local NVM_SILENT 3110 | local NVM_LTS 3111 | while [ $# -gt 0 ]; do 3112 | case "$1" in 3113 | --silent) NVM_SILENT='--silent' ; shift ;; 3114 | --lts) NVM_LTS='*' ; shift ;; 3115 | --lts=*) NVM_LTS="${1##--lts=}" ; shift ;; 3116 | --) break ;; 3117 | --*) 3118 | nvm_err "Unsupported option \"$1\"." 3119 | return 55 3120 | ;; 3121 | *) 3122 | if [ -n "$1" ]; then 3123 | break 3124 | else 3125 | shift 3126 | fi 3127 | ;; # stop processing arguments 3128 | esac 3129 | done 3130 | 3131 | local provided_version 3132 | provided_version="$1" 3133 | if [ "${NVM_LTS-}" != '' ]; then 3134 | provided_version="lts/${NVM_LTS:-*}" 3135 | VERSION="${provided_version}" 3136 | elif [ -n "${provided_version}" ]; then 3137 | VERSION="$(nvm_version "${provided_version}")" ||: 3138 | if [ "_${VERSION}" = '_N/A' ] && ! nvm_is_valid_version "${provided_version}"; then 3139 | if [ -n "${NVM_SILENT-}" ]; then 3140 | nvm_rc_version >/dev/null 2>&1 3141 | else 3142 | nvm_rc_version 3143 | fi 3144 | provided_version="${NVM_RC_VERSION}" 3145 | unset NVM_RC_VERSION 3146 | VERSION="$(nvm_version "${provided_version}")" ||: 3147 | else 3148 | shift 3149 | fi 3150 | fi 3151 | 3152 | nvm_ensure_version_installed "${provided_version}" 3153 | EXIT_CODE=$? 3154 | if [ "${EXIT_CODE}" != "0" ]; then 3155 | return $EXIT_CODE 3156 | fi 3157 | 3158 | if [ -z "${NVM_SILENT-}" ]; then 3159 | if [ "${NVM_LTS-}" = '*' ]; then 3160 | nvm_echo "Running node latest LTS -> $(nvm_version "${VERSION}")$(nvm use --silent "${VERSION}" && nvm_print_npm_version)" 3161 | elif [ -n "${NVM_LTS-}" ]; then 3162 | nvm_echo "Running node LTS \"${NVM_LTS-}\" -> $(nvm_version "${VERSION}")$(nvm use --silent "${VERSION}" && nvm_print_npm_version)" 3163 | elif nvm_is_iojs_version "${VERSION}"; then 3164 | nvm_echo "Running io.js $(nvm_strip_iojs_prefix "${VERSION}")$(nvm use --silent "${VERSION}" && nvm_print_npm_version)" 3165 | else 3166 | nvm_echo "Running node ${VERSION}$(nvm use --silent "${VERSION}" && nvm_print_npm_version)" 3167 | fi 3168 | fi 3169 | NODE_VERSION="${VERSION}" "${NVM_DIR}/nvm-exec" "$@" 3170 | ;; 3171 | "ls" | "list") 3172 | local PATTERN 3173 | local NVM_NO_COLORS 3174 | local NVM_NO_ALIAS 3175 | while [ $# -gt 0 ]; do 3176 | case "${1}" in 3177 | --) ;; 3178 | --no-colors) NVM_NO_COLORS="${1}" ;; 3179 | --no-alias) NVM_NO_ALIAS="${1}" ;; 3180 | --*) 3181 | nvm_err "Unsupported option \"${1}\"." 3182 | return 55 3183 | ;; 3184 | *) 3185 | PATTERN="${PATTERN:-$1}" 3186 | ;; 3187 | esac 3188 | shift 3189 | done 3190 | if [ -n "${PATTERN-}" ] && [ -n "${NVM_NO_ALIAS-}" ]; then 3191 | nvm_err '`--no-alias` is not supported when a pattern is provided.' 3192 | return 55 3193 | fi 3194 | local NVM_LS_OUTPUT 3195 | local NVM_LS_EXIT_CODE 3196 | NVM_LS_OUTPUT=$(nvm_ls "${PATTERN-}") 3197 | NVM_LS_EXIT_CODE=$? 3198 | NVM_NO_COLORS="${NVM_NO_COLORS-}" nvm_print_versions "${NVM_LS_OUTPUT}" 3199 | if [ -z "${NVM_NO_ALIAS-}" ] && [ -z "${PATTERN-}" ]; then 3200 | if [ -n "${NVM_NO_COLORS-}" ]; then 3201 | nvm alias --no-colors 3202 | else 3203 | nvm alias 3204 | fi 3205 | fi 3206 | return $NVM_LS_EXIT_CODE 3207 | ;; 3208 | "ls-remote" | "list-remote") 3209 | local NVM_LTS 3210 | local PATTERN 3211 | local NVM_NO_COLORS 3212 | while [ $# -gt 0 ]; do 3213 | case "${1-}" in 3214 | --) ;; 3215 | --lts) 3216 | NVM_LTS='*' 3217 | ;; 3218 | --lts=*) 3219 | NVM_LTS="${1##--lts=}" 3220 | ;; 3221 | --no-colors) NVM_NO_COLORS="${1}" ;; 3222 | --*) 3223 | nvm_err "Unsupported option \"${1}\"." 3224 | return 55 3225 | ;; 3226 | *) 3227 | if [ -z "${PATTERN-}" ]; then 3228 | PATTERN="${1-}" 3229 | if [ -z "${NVM_LTS-}" ]; then 3230 | case "${PATTERN}" in 3231 | 'lts/*') NVM_LTS='*' ;; 3232 | lts/*) NVM_LTS="${PATTERN##lts/}" ;; 3233 | esac 3234 | fi 3235 | fi 3236 | ;; 3237 | esac 3238 | shift 3239 | done 3240 | 3241 | local NVM_OUTPUT 3242 | local EXIT_CODE 3243 | NVM_OUTPUT="$(NVM_LTS="${NVM_LTS-}" nvm_remote_versions "${PATTERN}" &&:)" 3244 | EXIT_CODE=$? 3245 | if [ -n "${NVM_OUTPUT}" ]; then 3246 | NVM_NO_COLORS="${NVM_NO_COLORS-}" nvm_print_versions "${NVM_OUTPUT}" 3247 | return $EXIT_CODE 3248 | fi 3249 | NVM_NO_COLORS="${NVM_NO_COLORS-}" nvm_print_versions "N/A" 3250 | return 3 3251 | ;; 3252 | "current") 3253 | nvm_version current 3254 | ;; 3255 | "which") 3256 | local provided_version 3257 | provided_version="${1-}" 3258 | if [ $# -eq 0 ]; then 3259 | nvm_rc_version 3260 | if [ -n "${NVM_RC_VERSION}" ]; then 3261 | provided_version="${NVM_RC_VERSION}" 3262 | VERSION=$(nvm_version "${NVM_RC_VERSION}") ||: 3263 | fi 3264 | unset NVM_RC_VERSION 3265 | elif [ "_${1}" != '_system' ]; then 3266 | VERSION="$(nvm_version "${provided_version}")" ||: 3267 | else 3268 | VERSION="${1-}" 3269 | fi 3270 | if [ -z "${VERSION}" ]; then 3271 | >&2 nvm --help 3272 | return 127 3273 | fi 3274 | 3275 | if [ "_${VERSION}" = '_system' ]; then 3276 | if nvm_has_system_iojs >/dev/null 2>&1 || nvm_has_system_node >/dev/null 2>&1; then 3277 | local NVM_BIN 3278 | NVM_BIN="$(nvm use system >/dev/null 2>&1 && command which node)" 3279 | if [ -n "${NVM_BIN}" ]; then 3280 | nvm_echo "${NVM_BIN}" 3281 | return 3282 | fi 3283 | return 1 3284 | fi 3285 | nvm_err 'System version of node not found.' 3286 | return 127 3287 | elif [ "_${VERSION}" = "_∞" ]; then 3288 | nvm_err "The alias \"$2\" leads to an infinite loop. Aborting." 3289 | return 8 3290 | fi 3291 | 3292 | nvm_ensure_version_installed "${provided_version}" 3293 | EXIT_CODE=$? 3294 | if [ "${EXIT_CODE}" != "0" ]; then 3295 | return $EXIT_CODE 3296 | fi 3297 | local NVM_VERSION_DIR 3298 | NVM_VERSION_DIR="$(nvm_version_path "${VERSION}")" 3299 | nvm_echo "${NVM_VERSION_DIR}/bin/node" 3300 | ;; 3301 | "alias") 3302 | local NVM_ALIAS_DIR 3303 | NVM_ALIAS_DIR="$(nvm_alias_path)" 3304 | local NVM_CURRENT 3305 | NVM_CURRENT="$(nvm_ls_current)" 3306 | 3307 | command mkdir -p "${NVM_ALIAS_DIR}/lts" 3308 | 3309 | local ALIAS 3310 | local TARGET 3311 | local NVM_NO_COLORS 3312 | ALIAS='--' 3313 | TARGET='--' 3314 | while [ $# -gt 0 ]; do 3315 | case "${1-}" in 3316 | --) ;; 3317 | --no-colors) NVM_NO_COLORS="${1}" ;; 3318 | --*) 3319 | nvm_err "Unsupported option \"${1}\"." 3320 | return 55 3321 | ;; 3322 | *) 3323 | if [ "${ALIAS}" = '--' ]; then 3324 | ALIAS="${1-}" 3325 | elif [ "${TARGET}" = '--' ]; then 3326 | TARGET="${1-}" 3327 | fi 3328 | ;; 3329 | esac 3330 | shift 3331 | done 3332 | 3333 | if [ -z "${TARGET}" ]; then 3334 | # for some reason the empty string was explicitly passed as the target 3335 | # so, unalias it. 3336 | nvm unalias "${ALIAS}" 3337 | return $? 3338 | elif [ "${TARGET}" != '--' ]; then 3339 | # a target was passed: create an alias 3340 | if [ "${ALIAS#*\/}" != "${ALIAS}" ]; then 3341 | nvm_err 'Aliases in subdirectories are not supported.' 3342 | return 1 3343 | fi 3344 | VERSION="$(nvm_version "${TARGET}")" ||: 3345 | if [ "${VERSION}" = 'N/A' ]; then 3346 | nvm_err "! WARNING: Version '${TARGET}' does not exist." 3347 | fi 3348 | nvm_make_alias "${ALIAS}" "${TARGET}" 3349 | NVM_NO_COLORS="${NVM_NO_COLORS-}" NVM_CURRENT="${NVM_CURRENT-}" DEFAULT=false nvm_print_formatted_alias "${ALIAS}" "${TARGET}" "${VERSION}" 3350 | else 3351 | if [ "${ALIAS-}" = '--' ]; then 3352 | unset ALIAS 3353 | fi 3354 | 3355 | nvm_list_aliases "${ALIAS-}" 3356 | fi 3357 | ;; 3358 | "unalias") 3359 | local NVM_ALIAS_DIR 3360 | NVM_ALIAS_DIR="$(nvm_alias_path)" 3361 | command mkdir -p "${NVM_ALIAS_DIR}" 3362 | if [ $# -ne 1 ]; then 3363 | >&2 nvm --help 3364 | return 127 3365 | fi 3366 | if [ "${1#*\/}" != "${1-}" ]; then 3367 | nvm_err 'Aliases in subdirectories are not supported.' 3368 | return 1 3369 | fi 3370 | 3371 | local NVM_IOJS_PREFIX 3372 | local NVM_NODE_PREFIX 3373 | NVM_IOJS_PREFIX="$(nvm_iojs_prefix)" 3374 | NVM_NODE_PREFIX="$(nvm_node_prefix)" 3375 | local NVM_ALIAS_EXISTS 3376 | NVM_ALIAS_EXISTS=0 3377 | if [ -f "${NVM_ALIAS_DIR}/${1-}" ]; then 3378 | NVM_ALIAS_EXISTS=1 3379 | fi 3380 | 3381 | if [ $NVM_ALIAS_EXISTS -eq 0 ]; then 3382 | case "$1" in 3383 | "stable" | "unstable" | "${NVM_IOJS_PREFIX}" | "${NVM_NODE_PREFIX}" | "system") 3384 | nvm_err "${1-} is a default (built-in) alias and cannot be deleted." 3385 | return 1 3386 | ;; 3387 | esac 3388 | 3389 | nvm_err "Alias ${1-} doesn't exist!" 3390 | return 3391 | fi 3392 | 3393 | local NVM_ALIAS_ORIGINAL 3394 | NVM_ALIAS_ORIGINAL="$(nvm_alias "${1}")" 3395 | command rm -f "${NVM_ALIAS_DIR}/${1}" 3396 | nvm_echo "Deleted alias ${1} - restore it with \`nvm alias \"${1}\" \"${NVM_ALIAS_ORIGINAL}\"\`" 3397 | ;; 3398 | "install-latest-npm") 3399 | if [ $# -ne 0 ]; then 3400 | >&2 nvm --help 3401 | return 127 3402 | fi 3403 | 3404 | nvm_install_latest_npm 3405 | ;; 3406 | "reinstall-packages" | "copy-packages") 3407 | if [ $# -ne 1 ]; then 3408 | >&2 nvm --help 3409 | return 127 3410 | fi 3411 | 3412 | local PROVIDED_VERSION 3413 | PROVIDED_VERSION="${1-}" 3414 | 3415 | if [ "${PROVIDED_VERSION}" = "$(nvm_ls_current)" ] || [ "$(nvm_version "${PROVIDED_VERSION}" ||:)" = "$(nvm_ls_current)" ]; then 3416 | nvm_err 'Can not reinstall packages from the current version of node.' 3417 | return 2 3418 | fi 3419 | 3420 | local VERSION 3421 | if [ "_${PROVIDED_VERSION}" = "_system" ]; then 3422 | if ! nvm_has_system_node && ! nvm_has_system_iojs; then 3423 | nvm_err 'No system version of node or io.js detected.' 3424 | return 3 3425 | fi 3426 | VERSION="system" 3427 | else 3428 | VERSION="$(nvm_version "${PROVIDED_VERSION}")" ||: 3429 | fi 3430 | 3431 | local NPMLIST 3432 | NPMLIST="$(nvm_npm_global_modules "${VERSION}")" 3433 | local INSTALLS 3434 | local LINKS 3435 | INSTALLS="${NPMLIST%% //// *}" 3436 | LINKS="${NPMLIST##* //// }" 3437 | 3438 | nvm_echo "Reinstalling global packages from ${VERSION}..." 3439 | if [ -n "${INSTALLS}" ]; then 3440 | nvm_echo "${INSTALLS}" | command xargs npm install -g --quiet 3441 | else 3442 | nvm_echo "No installed global packages found..." 3443 | fi 3444 | 3445 | nvm_echo "Linking global packages from ${VERSION}..." 3446 | if [ -n "${LINKS}" ]; then 3447 | ( 3448 | set -f; IFS=' 3449 | ' # necessary to turn off variable expansion except for newlines 3450 | for LINK in ${LINKS}; do 3451 | set +f; unset IFS # restore variable expansion 3452 | if [ -n "${LINK}" ]; then 3453 | (nvm_cd "${LINK}" && npm link) 3454 | fi 3455 | done 3456 | ) 3457 | else 3458 | nvm_echo "No linked global packages found..." 3459 | fi 3460 | ;; 3461 | "clear-cache") 3462 | command rm -f "${NVM_DIR}/v*" "$(nvm_version_dir)" 2>/dev/null 3463 | nvm_echo 'nvm cache cleared.' 3464 | ;; 3465 | "version") 3466 | nvm_version "${1}" 3467 | ;; 3468 | "version-remote") 3469 | local NVM_LTS 3470 | local PATTERN 3471 | while [ $# -gt 0 ]; do 3472 | case "${1-}" in 3473 | --) ;; 3474 | --lts) 3475 | NVM_LTS='*' 3476 | ;; 3477 | --lts=*) 3478 | NVM_LTS="${1##--lts=}" 3479 | ;; 3480 | --*) 3481 | nvm_err "Unsupported option \"${1}\"." 3482 | return 55 3483 | ;; 3484 | *) 3485 | PATTERN="${PATTERN:-${1}}" 3486 | ;; 3487 | esac 3488 | shift 3489 | done 3490 | case "${PATTERN-}" in 3491 | 'lts/*') 3492 | NVM_LTS='*' 3493 | unset PATTERN 3494 | ;; 3495 | lts/*) 3496 | NVM_LTS="${PATTERN##lts/}" 3497 | unset PATTERN 3498 | ;; 3499 | esac 3500 | NVM_VERSION_ONLY=true NVM_LTS="${NVM_LTS-}" nvm_remote_version "${PATTERN:-node}" 3501 | ;; 3502 | "--version") 3503 | nvm_echo '0.35.2' 3504 | ;; 3505 | "unload") 3506 | nvm deactivate >/dev/null 2>&1 3507 | unset -f nvm \ 3508 | nvm_iojs_prefix nvm_node_prefix \ 3509 | nvm_add_iojs_prefix nvm_strip_iojs_prefix \ 3510 | nvm_is_iojs_version nvm_is_alias nvm_has_non_aliased \ 3511 | nvm_ls_remote nvm_ls_remote_iojs nvm_ls_remote_index_tab \ 3512 | nvm_ls nvm_remote_version nvm_remote_versions \ 3513 | nvm_install_binary nvm_install_source nvm_clang_version \ 3514 | nvm_get_mirror nvm_get_download_slug nvm_download_artifact \ 3515 | nvm_install_npm_if_needed nvm_use_if_needed nvm_check_file_permissions \ 3516 | nvm_print_versions nvm_compute_checksum nvm_checksum \ 3517 | nvm_get_checksum_alg nvm_get_checksum nvm_compare_checksum \ 3518 | nvm_version nvm_rc_version nvm_match_version \ 3519 | nvm_ensure_default_set nvm_get_arch nvm_get_os \ 3520 | nvm_print_implicit_alias nvm_validate_implicit_alias \ 3521 | nvm_resolve_alias nvm_ls_current nvm_alias \ 3522 | nvm_binary_available nvm_change_path nvm_strip_path \ 3523 | nvm_num_version_groups nvm_format_version nvm_ensure_version_prefix \ 3524 | nvm_normalize_version nvm_is_valid_version \ 3525 | nvm_ensure_version_installed nvm_cache_dir \ 3526 | nvm_version_path nvm_alias_path nvm_version_dir \ 3527 | nvm_find_nvmrc nvm_find_up nvm_tree_contains_path \ 3528 | nvm_version_greater nvm_version_greater_than_or_equal_to \ 3529 | nvm_print_npm_version nvm_install_latest_npm nvm_npm_global_modules \ 3530 | nvm_has_system_node nvm_has_system_iojs \ 3531 | nvm_download nvm_get_latest nvm_has nvm_install_default_packages nvm_get_default_packages \ 3532 | nvm_curl_use_compression nvm_curl_version \ 3533 | nvm_supports_source_options nvm_auto nvm_supports_xz \ 3534 | nvm_echo nvm_err nvm_grep nvm_cd \ 3535 | nvm_die_on_prefix nvm_get_make_jobs nvm_get_minor_version \ 3536 | nvm_has_solaris_binary nvm_is_merged_node_version \ 3537 | nvm_is_natural_num nvm_is_version_installed \ 3538 | nvm_list_aliases nvm_make_alias nvm_print_alias_path \ 3539 | nvm_print_default_alias nvm_print_formatted_alias nvm_resolve_local_alias \ 3540 | nvm_sanitize_path nvm_has_colors nvm_process_parameters \ 3541 | node_version_has_solaris_binary iojs_version_has_solaris_binary \ 3542 | nvm_curl_libz_support nvm_command_info nvm_is_zsh nvm_stdout_is_terminal \ 3543 | >/dev/null 2>&1 3544 | unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \ 3545 | NVM_CD_FLAGS NVM_BIN NVM_MAKE_JOBS \ 3546 | >/dev/null 2>&1 3547 | ;; 3548 | *) 3549 | >&2 nvm --help 3550 | return 127 3551 | ;; 3552 | esac 3553 | } 3554 | 3555 | nvm_get_default_packages() { 3556 | local NVM_DEFAULT_PACKAGE_FILE="${NVM_DIR}/default-packages" 3557 | if [ -f "${NVM_DEFAULT_PACKAGE_FILE}" ]; then 3558 | local DEFAULT_PACKAGES 3559 | DEFAULT_PACKAGES='' 3560 | 3561 | # Read lines from $NVM_DIR/default-packages 3562 | local line 3563 | # ensure a trailing newline 3564 | WORK=$(mktemp -d) || exit $? 3565 | # shellcheck disable=SC2064 3566 | trap "rm -rf '$WORK'" EXIT 3567 | # shellcheck disable=SC1003 3568 | sed -e '$a\' "${NVM_DEFAULT_PACKAGE_FILE}" > "${WORK}/default-packages" 3569 | while IFS=' ' read -r line; do 3570 | # Skip empty lines. 3571 | [ -n "${line-}" ] || continue 3572 | 3573 | # Skip comment lines that begin with `#`. 3574 | [ "$(nvm_echo "${line}" | command cut -c1)" != "#" ] || continue 3575 | 3576 | # Fail on lines that have multiple space-separated words 3577 | case $line in 3578 | *\ *) 3579 | nvm_err "Only one package per line is allowed in the ${NVM_DIR}/default-packages file. Please remove any lines with multiple space-separated values." 3580 | return 1 3581 | ;; 3582 | esac 3583 | 3584 | DEFAULT_PACKAGES="${DEFAULT_PACKAGES}${line} " 3585 | done < "${WORK}/default-packages" 3586 | echo "${DEFAULT_PACKAGES}" | xargs 3587 | fi 3588 | } 3589 | 3590 | nvm_install_default_packages() { 3591 | nvm_echo "Installing default global packages from ${NVM_DIR}/default-packages..." 3592 | nvm_echo "npm install -g --quiet $1" 3593 | 3594 | if ! nvm_echo "$1" | command xargs npm install -g --quiet; then 3595 | nvm_err "Failed installing default packages. Please check if your default-packages file or a package in it has problems!" 3596 | return 1 3597 | fi 3598 | } 3599 | 3600 | nvm_supports_source_options() { 3601 | # shellcheck disable=SC1091,SC2240 3602 | [ "_$( . /dev/stdin yes 2> /dev/null <<'EOF' 3603 | [ $# -gt 0 ] && nvm_echo $1 3604 | EOF 3605 | )" = "_yes" ] 3606 | } 3607 | 3608 | nvm_supports_xz() { 3609 | if [ -z "${1-}" ] || ! command which xz >/dev/null 2>&1; then 3610 | return 1 3611 | fi 3612 | 3613 | # all node versions v4.0.0 and later have xz 3614 | if nvm_is_merged_node_version "${1}"; then 3615 | return 0 3616 | fi 3617 | 3618 | # 0.12x: node v0.12.10 and later have xz 3619 | if nvm_version_greater_than_or_equal_to "${1}" "0.12.10" && nvm_version_greater "0.13.0" "${1}"; then 3620 | return 0 3621 | fi 3622 | 3623 | # 0.10x: node v0.10.42 and later have xz 3624 | if nvm_version_greater_than_or_equal_to "${1}" "0.10.42" && nvm_version_greater "0.11.0" "${1}"; then 3625 | return 0 3626 | fi 3627 | 3628 | local NVM_OS 3629 | NVM_OS="$(nvm_get_os)" 3630 | case "${NVM_OS}" in 3631 | darwin) 3632 | # darwin only has xz for io.js v2.3.2 and later 3633 | nvm_version_greater_than_or_equal_to "${1}" "2.3.2" 3634 | ;; 3635 | *) 3636 | nvm_version_greater_than_or_equal_to "${1}" "1.0.0" 3637 | ;; 3638 | esac 3639 | return $? 3640 | } 3641 | 3642 | nvm_auto() { 3643 | local NVM_CURRENT 3644 | NVM_CURRENT="$(nvm_ls_current)" 3645 | local NVM_MODE 3646 | NVM_MODE="${1-}" 3647 | local VERSION 3648 | if [ "_${NVM_MODE}" = '_install' ]; then 3649 | VERSION="$(nvm_alias default 2>/dev/null || nvm_echo)" 3650 | if [ -n "${VERSION}" ]; then 3651 | nvm install "${VERSION}" >/dev/null 3652 | elif nvm_rc_version >/dev/null 2>&1; then 3653 | nvm install >/dev/null 3654 | fi 3655 | elif [ "_$NVM_MODE" = '_use' ]; then 3656 | if [ "_${NVM_CURRENT}" = '_none' ] || [ "_${NVM_CURRENT}" = '_system' ]; then 3657 | VERSION="$(nvm_resolve_local_alias default 2>/dev/null || nvm_echo)" 3658 | if [ -n "${VERSION}" ]; then 3659 | nvm use --silent "${VERSION}" >/dev/null 3660 | elif nvm_rc_version >/dev/null 2>&1; then 3661 | nvm use --silent >/dev/null 3662 | fi 3663 | else 3664 | nvm use --silent "${NVM_CURRENT}" >/dev/null 3665 | fi 3666 | elif [ "_${NVM_MODE}" != '_none' ]; then 3667 | nvm_err 'Invalid auto mode supplied.' 3668 | return 1 3669 | fi 3670 | } 3671 | 3672 | nvm_process_parameters() { 3673 | local NVM_AUTO_MODE 3674 | NVM_AUTO_MODE='use' 3675 | if nvm_supports_source_options; then 3676 | while [ $# -ne 0 ]; do 3677 | case "$1" in 3678 | --install) NVM_AUTO_MODE='install' ;; 3679 | --no-use) NVM_AUTO_MODE='none' ;; 3680 | esac 3681 | shift 3682 | done 3683 | fi 3684 | nvm_auto "${NVM_AUTO_MODE}" 3685 | } 3686 | 3687 | nvm_process_parameters "$@" 3688 | 3689 | } # this ensures the entire script is downloaded # 3690 | --------------------------------------------------------------------------------