Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

303 nvm in fish #579

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,24 @@ nvm_do_install() {
fi
fi

# Actions for fish shell
if (which fish > /dev/null); then
echo "=> fish found, copying nvm function"
FISH_CONFIG_DIR=$HOME/.config/fish
FISH_FUNCTIONS_DIR=$FISH_CONFIG_DIR/functions

mkdir -p $FISH_FUNCTIONS_DIR
cp $NVM_DIR/nvm.fish $FISH_FUNCTIONS_DIR

# Apply nvm in fish configuration
FISH_CONFIG_STRING="nvm > /dev/null ^&1"
FISH_CONFIG_FILE=$FISH_CONFIG_DIR/config.fish
if ! grep -q "$FISH_CONFIG_STRING" $FISH_CONFIG_FILE 2> /dev/null ; then
echo "=> appending nvm to fish configuration"
echo $FISH_CONFIG_STRING >> $FISH_CONFIG_DIR/config.fish
fi
fi

echo "=> Close and reopen your terminal to start using nvm"
nvm_reset
}
Expand Down
14 changes: 14 additions & 0 deletions nvm
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash

# Get this script after dereferincing all symlinks
# !! Doesn't check for circular symlinks !!
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

source "$DIR/nvm.sh"
'nvm' $@
24 changes: 24 additions & 0 deletions nvm.fish
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
function nvm --description "Node version manager" -a nvm_command nvm_command_arg1
set nvm_dir ~/.nvm
set nvm_ $nvm_dir/nvm

# This sets some environment vars that we need to set too
if test "$nvm_command" = "use"
eval $nvm_ use --print-paths $nvm_command_arg1 | sed -re "s|^(\w+=)|set -x \1|g" -e "s|[=:]| |g" | grep "set -x" | .
else
# Make sure we can use node
if test ! (which node)
# Have we installed node at all ?
if eval $nvm_ ls | grep "N/A" > /dev/null
echo "No node installation found, installing stable"
eval $nvm_ install stable
end
# Make sure we have a default picked
if eval $nvm_ ls default | grep "N/A"
eval $nvm_ alias default stable
end
nvm use default
end
eval $nvm_ $argv
end
end
69 changes: 45 additions & 24 deletions nvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -531,22 +531,22 @@ nvm() {
echo "Node Version Manager"
echo
echo "Usage:"
echo " nvm help Show this message"
echo " nvm --version Print out the latest released version of nvm"
echo " nvm install [-s] <version> Download and install a <version>, [-s] from source. Uses .nvmrc if available"
echo " nvm uninstall <version> Uninstall a version"
echo " nvm use <version> Modify PATH to use <version>. Uses .nvmrc if available"
echo " nvm run <version> [<args>] Run <version> with <args> as arguments. Uses .nvmrc if available for <version>"
echo " nvm current Display currently activated version"
echo " nvm ls List installed versions"
echo " nvm ls <version> List versions matching a given description"
echo " nvm ls-remote List remote versions available for install"
echo " nvm deactivate Undo effects of NVM on current shell"
echo " nvm alias [<pattern>] Show all aliases beginning with <pattern>"
echo " nvm alias <name> <version> Set an alias named <name> pointing to <version>"
echo " nvm unalias <name> Deletes the alias named <name>"
echo " nvm copy-packages <version> Install global NPM packages contained in <version> to current version"
echo " nvm unload Unload NVM from shell"
echo " nvm help Show this message"
echo " nvm --version Print out the latest released version of nvm"
echo " nvm install [-s] <version> Download and install a <version>, [-s] from source. Uses .nvmrc if available"
echo " nvm uninstall <version> Uninstall a version"
echo " nvm [--print-paths] use <version> Modify PATH (and optionally print it) to use <version>. Uses .nvmrc if available"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why would one need --print-paths rather than just nvm use foo && echo $PATH?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fish calls $NVM_DIR/nvm, which in turn is interpreted by bash. Fish is the parent of bash and cannot see changes to environment variables done in bash. So echo $PATH will return the unchanged PATH of fish, not bash.

That has been my experience at least, hence the output of the paths and reapplication nvm.fish#L7

echo " nvm run <version> [<args>] Run <version> with <args> as arguments. Uses .nvmrc if available for <version>"
echo " nvm current Display currently activated version"
echo " nvm ls List installed versions"
echo " nvm ls <version> List versions matching a given description"
echo " nvm ls-remote List remote versions available for install"
echo " nvm deactivate Undo effects of NVM on current shell"
echo " nvm alias [<pattern>] Show all aliases beginning with <pattern>"
echo " nvm alias <name> <version> Set an alias named <name> pointing to <version>"
echo " nvm unalias <name> Deletes the alias named <name>"
echo " nvm copy-packages <version> Install global NPM packages contained in <version> to current version"
echo " nvm unload Unload NVM from shell"
echo
echo "Example:"
echo " nvm install v0.10.24 Install a specific version number"
Expand Down Expand Up @@ -794,20 +794,35 @@ nvm() {
fi
;;
"use" )
shift # start treating the args given to "use"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After this change, what happens here when nvm use is run with no default alias and no .nvmrc version available?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That same as before. The change I made shifts all args left:

# nvm [ use --optional version ]
# $@ = [use --optional version]  <-- this was checked before
shift
# $@ = [ --optional version] <-- now this is checked

If the call is just nvm the args will be treated in the enclosing default case line 1070.

If the call is just nvm use it will be treated right after the shift --> .nvmrc

The other check was moved into the following while>case>default.

if [ $# -eq 0 ]; then
nvm help
return 127
fi
if [ $# -eq 1 ]; then
nvm_rc_version
if [ -n "$NVM_RC_VERSION" ]; then
VERSION=`nvm_version $NVM_RC_VERSION`
fi
elif [ "_$2" != '_system' ]; then
VERSION="$(nvm_version "$2")"
else
VERSION="$2"
# Handle options
while [ $# > 0 ]; do
key="$1"
shift
case $key in
--print-paths)
PRINT_PATHS=true
;;

*)
if [ "_$key" != '_system' ]; then
VERSION="$(nvm_version "$key")"
else
VERSION="$key"
fi
break
;;
esac
done
fi

if [ -z "$VERSION" ]; then
nvm help
return 127
Expand All @@ -822,7 +837,7 @@ nvm() {
return 127
fi
elif [ "_$VERSION" = "_∞" ]; then
echo "The alias \"$2\" leads to an infinite loop. Aborting." >&2
echo "The alias \"$key\" leads to an infinite loop. Aborting." >&2
return 8
fi

Expand Down Expand Up @@ -858,6 +873,12 @@ nvm() {
if [ "$NVM_SYMLINK_CURRENT" = true ]; then
rm -f "$NVM_DIR/current" && ln -s "$NVM_VERSION_DIR" "$NVM_DIR/current"
fi
if [ $PRINT_PATHS ]; then
echo PATH=$PATH
echo NODE_PATH=$NODE_PATH
echo NVM_PATH=$NVM_PATH
echo NVM_BIN=$NVM_BIN
fi
echo "Now using node $VERSION"
;;
"run" )
Expand Down