diff --git a/libexec/rbenv-sh-shell b/libexec/rbenv-sh-shell index f4e0098f..04f81866 100755 --- a/libexec/rbenv-sh-shell +++ b/libexec/rbenv-sh-shell @@ -3,6 +3,7 @@ # Summary: Set or show the shell-specific Ruby version # # Usage: rbenv shell +# rbenv shell - # rbenv shell --unset # # Sets a shell-specific Ruby version by setting the `RBENV_VERSION' @@ -12,6 +13,11 @@ # should be a string matching a Ruby version known to rbenv. # The special version string `system' will use your default system Ruby. # Run `rbenv versions' for a list of available Ruby versions. +# +# When `-` is passed instead of the version string, the previously set +# version will be restored. With `--unset`, the `RBENV_VERSION` +# environment variable gets unset, restoring the environment to the +# state before the first `rbenv shell` call. set -e [ -n "$RBENV_DEBUG" ] && set -x @@ -31,7 +37,7 @@ if [ -z "$version" ]; then echo "rbenv: no shell-specific version configured" >&2 exit 1 else - echo "echo \"\$RBENV_VERSION\"" + echo 'echo "$RBENV_VERSION"' exit fi fi @@ -39,25 +45,73 @@ fi if [ "$version" = "--unset" ]; then case "$shell" in fish ) + echo 'set -gu OLD_RBENV_VERSION "$RBENV_VERSION"' echo "set -e RBENV_VERSION" ;; * ) + echo 'OLD_RBENV_VERSION="$RBENV_VERSION"' echo "unset RBENV_VERSION" ;; esac exit fi +if [ "$version" = "-" ]; then + case "$shell" in + fish ) + cat <&2 + false +end +EOS + ;; + * ) + cat <&2 + false +fi +EOS + ;; + esac + exit +fi + # Make sure the specified version is installed. if rbenv-prefix "$version" >/dev/null; then - case "$shell" in - fish ) - echo "setenv RBENV_VERSION \"${version}\"" - ;; - * ) - echo "export RBENV_VERSION=\"${version}\"" - ;; - esac + if [ "$version" != "$RBENV_VERSION" ]; then + case "$shell" in + fish ) + echo 'set -gu OLD_RBENV_VERSION "$RBENV_VERSION"' + echo "set -gx RBENV_VERSION \"$version\"" + ;; + * ) + echo 'OLD_RBENV_VERSION="$RBENV_VERSION"' + echo "export RBENV_VERSION=\"$version\"" + ;; + esac + fi else echo "false" exit 1 diff --git a/test/shell.bats b/test/shell.bats index 0f776745..a3c16b66 100644 --- a/test/shell.bats +++ b/test/shell.bats @@ -20,14 +20,34 @@ load test_helper assert_success 'echo "$RBENV_VERSION"' } +@test "shell revert" { + RBENV_SHELL=bash run rbenv-sh-shell - + assert_success + assert_line 0 'if [ -n "${OLD_RBENV_VERSION+x}" ]; then' +} + +@test "shell revert (fish)" { + RBENV_SHELL=fish run rbenv-sh-shell - + assert_success + assert_line 0 'if set -q OLD_RBENV_VERSION' +} + @test "shell unset" { RBENV_SHELL=bash run rbenv-sh-shell --unset - assert_success "unset RBENV_VERSION" + assert_success + assert_output <