mirror of
https://github.com/lukechilds/zsh-nvm.git
synced 2025-01-30 09:47:14 +08:00
8367ab3120
If ZSH_NVM_NO_LOAD is set to true then zsh-nvm won't actually do anything after setting up environment variables and functions. This is usefull for unit tests and debugging.
161 lines
3.8 KiB
Bash
161 lines
3.8 KiB
Bash
ZSH_NVM_DIR=${0:a:h}
|
|
|
|
[[ -z "$NVM_DIR" ]] && export NVM_DIR="$HOME/.nvm"
|
|
|
|
_zsh_nvm_rename_function() {
|
|
test -n "$(declare -f $1)" || return
|
|
eval "${_/$1/$2}"
|
|
unset -f $1
|
|
}
|
|
|
|
_zsh_nvm_has() {
|
|
type "$1" > /dev/null 2>&1
|
|
}
|
|
|
|
_zsh_nvm_latest_release_tag() {
|
|
echo $(cd "$NVM_DIR" && git fetch --quiet origin && git describe --abbrev=0 --tags --match "v[0-9]*" origin)
|
|
}
|
|
|
|
_zsh_nvm_install() {
|
|
echo "Installing nvm..."
|
|
git clone https://github.com/creationix/nvm.git "$NVM_DIR"
|
|
$(cd "$NVM_DIR" && git checkout --quiet "$(_zsh_nvm_latest_release_tag)")
|
|
}
|
|
|
|
_zsh_nvm_global_binaries() {
|
|
|
|
# Look for global binaries
|
|
local global_binary_paths="$(echo "$NVM_DIR"/v0*/bin/*(N) "$NVM_DIR"/versions/*/*/bin/*(N))"
|
|
|
|
# If we have some, format them
|
|
if [[ -n "$global_binary_paths" ]]; then
|
|
echo "$NVM_DIR"/v0*/bin/*(N) "$NVM_DIR"/versions/*/*/bin/*(N) |
|
|
xargs -n 1 basename |
|
|
sort |
|
|
uniq
|
|
fi
|
|
}
|
|
|
|
_zsh_nvm_load() {
|
|
|
|
# Source nvm (check if `nvm use` should be ran after load)
|
|
if [[ "$NVM_NO_USE" == true ]]; then
|
|
source "$NVM_DIR/nvm.sh" --no-use
|
|
else
|
|
source "$NVM_DIR/nvm.sh"
|
|
fi
|
|
|
|
# Rename main nvm function
|
|
_zsh_nvm_rename_function nvm _zsh_nvm_nvm
|
|
|
|
# Wrap nvm in our own function
|
|
nvm() {
|
|
case $1 in
|
|
'upgrade')
|
|
_zsh_nvm_upgrade
|
|
;;
|
|
'revert')
|
|
_zsh_nvm_revert
|
|
;;
|
|
*)
|
|
_zsh_nvm_nvm "$@"
|
|
;;
|
|
esac
|
|
}
|
|
}
|
|
|
|
_zsh_nvm_lazy_load() {
|
|
|
|
# Get all global node module binaries including node
|
|
# (only if NVM_NO_USE is off)
|
|
local global_binaries
|
|
if [[ "$NVM_NO_USE" == true ]]; then
|
|
global_binaries=()
|
|
else
|
|
global_binaries=($(_zsh_nvm_global_binaries))
|
|
fi
|
|
|
|
# Add nvm
|
|
global_binaries+=('nvm')
|
|
|
|
# Remove any binaries that conflict with current globals
|
|
local cmds
|
|
cmds=()
|
|
for bin in $global_binaries; do
|
|
_zsh_nvm_has $bin || cmds+=($bin)
|
|
done
|
|
|
|
# Create function for each command
|
|
for cmd in $cmds; do
|
|
|
|
# When called, unset all lazy loaders, load nvm then run current command
|
|
eval "$cmd(){
|
|
unset -f $cmds
|
|
_zsh_nvm_load
|
|
$cmd \"\$@\"
|
|
}"
|
|
done
|
|
}
|
|
|
|
nvm_update() {
|
|
echo 'Deprecated, please use `nvm upgrade`'
|
|
}
|
|
_zsh_nvm_upgrade() {
|
|
|
|
# Use default upgrade if it's built in
|
|
if [[ -n "$(_zsh_nvm_nvm help | grep 'nvm upgrade')" ]]; then
|
|
_zsh_nvm_nvm upgrade
|
|
return
|
|
fi
|
|
|
|
# Otherwise use our own
|
|
local installed_version=$(cd "$NVM_DIR" && git describe --tags)
|
|
echo "Installed version is $installed_version"
|
|
echo "Checking latest version of nvm..."
|
|
local latest_version=$(_zsh_nvm_latest_release_tag)
|
|
if [[ "$installed_version" = "$latest_version" ]]; then
|
|
echo "You're already up to date"
|
|
else
|
|
echo "Updating to $latest_version..."
|
|
echo "$installed_version" > "$ZSH_NVM_DIR/previous_version"
|
|
$(cd "$NVM_DIR" && git fetch --quiet && git checkout "$latest_version")
|
|
_zsh_nvm_load
|
|
fi
|
|
}
|
|
|
|
_zsh_nvm_previous_version() {
|
|
cat "$ZSH_NVM_DIR/previous_version" 2>/dev/null
|
|
}
|
|
|
|
_zsh_nvm_revert() {
|
|
local previous_version="$(_zsh_nvm_previous_version)"
|
|
if [[ -n "$previous_version" ]]; then
|
|
local installed_version=$(cd "$NVM_DIR" && git describe --tags)
|
|
if [[ "$installed_version" = "$previous_version" ]]; then
|
|
echo "Already reverted to $installed_version"
|
|
return
|
|
fi
|
|
echo "Installed version is $installed_version"
|
|
echo "Reverting to $previous_version..."
|
|
$(cd "$NVM_DIR" && git checkout "$previous_version")
|
|
_zsh_nvm_load
|
|
else
|
|
echo "No previous version found"
|
|
fi
|
|
}
|
|
|
|
# Don't init anything if this is true (debug/testing only)
|
|
if [[ "$ZSH_NVM_NO_LOAD" != true ]]; then
|
|
|
|
# Install nvm if it isn't already installed
|
|
[[ ! -f "$NVM_DIR/nvm.sh" ]] && _zsh_nvm_install
|
|
|
|
# If nvm is installed
|
|
if [[ -f "$NVM_DIR/nvm.sh" ]]; then
|
|
|
|
# Load it
|
|
[[ "$NVM_LAZY_LOAD" == true ]] && _zsh_nvm_lazy_load || _zsh_nvm_load
|
|
fi
|
|
|
|
fi
|