Permalink
Browse files

add fish shell support

  • Loading branch information...
1 parent caa4a8e commit 5bfec84432e63c46df4724918080abe488ba64b4 Yamashita Yuu committed with mislav Aug 15, 2013
Showing with 129 additions and 15 deletions.
  1. +22 −0 completions/rbenv.fish
  2. +34 −3 libexec/rbenv-init
  3. +11 −1 libexec/rbenv-sh-rehash
  4. +18 −3 libexec/rbenv-sh-shell
  5. +24 −4 test/init.bats
  6. +20 −4 test/shell.bats
@@ -0,0 +1,22 @@
+function __fish_rbenv_needs_command
+ set cmd (commandline -opc)
+ if [ (count $cmd) -eq 1 -a $cmd[1] = 'rbenv' ]
+ return 0
+ end
+ return 1
+end
+
+function __fish_rbenv_using_command
+ set cmd (commandline -opc)
+ if [ (count $cmd) -gt 1 ]
+ if [ $argv[1] = $cmd[2] ]
+ return 0
+ end
+ end
+ return 1
+end
+
+complete -f -c rbenv -n '__fish_rbenv_needs_command' -a '(rbenv commands)'
+for cmd in (rbenv commands)
+ complete -f -c rbenv -n "__fish_rbenv_using_command $cmd" -a "(rbenv completions $cmd)"
+end
View
@@ -62,6 +62,9 @@ if [ -z "$print" ]; then
ksh )
profile='~/.profile'
;;
+ fish )
+ profile='~/.config/fish/config.fish'
+ ;;
* )
profile='your profile'
;;
@@ -80,7 +83,14 @@ fi
mkdir -p "${RBENV_ROOT}/"{shims,versions}
if [[ ":${PATH}:" != *:"${RBENV_ROOT}/shims":* ]]; then
- echo 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"'
+ case "$shell" in
+ fish )
+ echo 'setenv PATH "'${RBENV_ROOT}'/shims"' '$PATH' ';'
+ ;;
+ * )
+ echo 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"'
+ ;;
+ esac
fi
completion="${root}/completions/rbenv.${shell}"
@@ -91,8 +101,27 @@ if [ -z "$no_rehash" ]; then
fi
commands=(`rbenv-commands --sh`)
-IFS="|"
-cat <<EOS
+case "$shell" in
+fish )
+ cat <<EOS
+function rbenv
+ set command \$argv[1]
+ if [ (count \$argv) -gt 0 ]
+ set -e argv[1]
+ end
+
+ switch "\$command"
+ case ${commands[*]}
+ eval (rbenv "sh-\$command" \$argv)
+ case '*'
+ command rbenv "\$command" \$argv
+ end
+end
+EOS
+ ;;
+* )
+ IFS="|"
+ cat <<EOS
rbenv() {
typeset command
command="\$1"
@@ -108,3 +137,5 @@ rbenv() {
esac
}
EOS
+ ;;
+esac
@@ -7,7 +7,17 @@ if [ "$1" = "--complete" ]; then
exec rbenv-rehash --complete
fi
+shell="$(basename "$SHELL")"
+
# When rbenv shell integration is enabled, delegate to rbenv-rehash,
# then tell the shell to empty its command lookup cache.
rbenv-rehash
-echo "hash -r 2>/dev/null || true"
+
+case "$shell" in
+fish )
+ # nothing to do
+ ;;
+* )
+ echo "hash -r 2>/dev/null || true"
+ ;;
+esac
@@ -24,6 +24,7 @@ if [ "$1" = "--complete" ]; then
fi
version="$1"
+shell="$(basename "$SHELL")"
if [ -z "$version" ]; then
if [ -z "$RBENV_VERSION" ]; then
@@ -36,14 +37,28 @@ if [ -z "$version" ]; then
fi
if [ "$version" = "--unset" ]; then
- echo "unset RBENV_VERSION"
+ case "$shell" in
+ fish )
+ echo "set -e RBENV_VERSION"
+ ;;
+ * )
+ echo "unset RBENV_VERSION"
+ ;;
+ esac
exit
fi
# Make sure the specified version is installed.
if rbenv-prefix "$version" >/dev/null; then
- echo "export RBENV_VERSION=\"${version}\""
+ case "$shell" in
+ fish )
+ echo "setenv RBENV_VERSION \"${version}\""
+ ;;
+ * )
+ echo "export RBENV_VERSION=\"${version}\""
+ ;;
+ esac
else
- echo "return 1"
+ echo "false"
exit 1
fi
View
@@ -18,13 +18,19 @@ load test_helper
}
@test "setup shell completions" {
- export SHELL=/bin/bash
root="$(cd $BATS_TEST_DIRNAME/.. && pwd)"
- run rbenv-init -
+ SHELL=/bin/bash run rbenv-init -
assert_success
assert_line "source '${root}/libexec/../completions/rbenv.bash'"
}
+@test "setup shell completions (fish)" {
+ root="$(cd $BATS_TEST_DIRNAME/.. && pwd)"
+ SHELL=/usr/bin/fish run rbenv-init -
+ assert_success
+ assert_line '. "'${root}'/libexec/../completions/rbenv.fish";'
+}
+
@test "option to skip rehash" {
run rbenv-init - --no-rehash
assert_success
@@ -33,14 +39,28 @@ load test_helper
@test "adds shims to PATH" {
export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin"
- run rbenv-init -
+ SHELL=/bin/bash run rbenv-init -
assert_success
assert_line 0 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"'
}
+@test "adds shims to PATH (fish)" {
+ export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin"
+ SHELL=/usr/bin/fish run rbenv-init -
+ assert_success
+ assert_line 0 'setenv PATH "'${RBENV_ROOT}'/shims" $PATH ;'
+}
+
@test "doesn't add shims to PATH more than once" {
export PATH="${RBENV_ROOT}/shims:$PATH"
- run rbenv-init -
+ SHELL=/bin/bash run rbenv-init -
assert_success
refute_line 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"'
}
+
+@test "doesn't add shims to PATH more than once (fish)" {
+ export PATH="${RBENV_ROOT}/shims:$PATH"
+ SHELL=/usr/bin/fish run rbenv-init -
+ assert_success
+ refute_line 'setenv PATH "'${RBENV_ROOT}'/shims" $PATH ;'
+}
View
@@ -11,26 +11,42 @@ load test_helper
}
@test "shell version" {
- RBENV_VERSION="1.2.3" run rbenv-sh-shell
+ SHELL=/bin/bash RBENV_VERSION="1.2.3" run rbenv-sh-shell
+ assert_success 'echo "$RBENV_VERSION"'
+}
+
+@test "shell version (fish)" {
+ SHELL=/usr/bin/fish RBENV_VERSION="1.2.3" run rbenv-sh-shell
assert_success 'echo "$RBENV_VERSION"'
}
@test "shell unset" {
- run rbenv-sh-shell --unset
+ SHELL=/bin/bash run rbenv-sh-shell --unset
assert_success "unset RBENV_VERSION"
}
+@test "shell unset (fish)" {
+ SHELL=/usr/bin/fish run rbenv-sh-shell --unset
+ assert_success "set -e RBENV_VERSION"
+}
+
@test "shell change invalid version" {
run rbenv-sh-shell 1.2.3
assert_failure
assert_output <<SH
rbenv: version \`1.2.3' not installed
-return 1
+false
SH
}
@test "shell change version" {
mkdir -p "${RBENV_ROOT}/versions/1.2.3"
- run rbenv-sh-shell 1.2.3
+ SHELL=/bin/bash run rbenv-sh-shell 1.2.3
assert_success 'export RBENV_VERSION="1.2.3"'
}
+
+@test "shell change version (fish)" {
+ mkdir -p "${RBENV_ROOT}/versions/1.2.3"
+ SHELL=/usr/bin/fish run rbenv-sh-shell 1.2.3
+ assert_success 'setenv RBENV_VERSION "1.2.3"'
+}

0 comments on commit 5bfec84

Please sign in to comment.