diff --git a/CHANGELOG.md b/CHANGELOG.md index ade16acc..2ced576c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,21 @@ -#Changelog +# Changelog -##0.2.1-dev +## 0.3.1-dev + +## 0.3.0 + +Features + +* Add `update` command to make it easier to update asdf to the latest release (#172, #180) +* Add support for `system` version to allow passthrough to system installed tools (#55, #182) Fixed Bugs * Set `GREP_OPTIONS` and `GREP_COLORS` variables in util.sh so grep is always invoked with the correct settings (#170) * Export `ASDF_DIR` variable so the Zsh plugin can locate asdf if it's in a custom location (#156) +* Don't add execute permission to files in a plugin's bin directory when adding the plugin (#124, #138, #154) -##0.2.1 +## 0.2.1 Features @@ -19,7 +27,7 @@ Fixed Bugs * Remove shims when uninstalling a version or removing a plugin (#122, #123, #125, #128, #131) * Add a helpful error message to the install command (#135) -##0.2.0 +## 0.2.0 Features @@ -32,6 +40,6 @@ Fixed Bugs * Fix bug that caused the `local` command to crash when the directory contains whitespace (#90) * Misc typo corrections (#93, #99) -##0.1.0 +## 0.1.0 * First tagged release diff --git a/README.md b/README.md index edd65ce0..7f7e5f15 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Supported languages include Ruby, Node.js, Elixir and more. Supporting a new lan Copy-paste the following into command line: ```bash -git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.2.1 +git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.3.0 ``` Depending on your OS, run the following @@ -49,7 +49,7 @@ mkdir -p ~/.config/fish/completions; and cp ~/.asdf/completions/asdf.fish ~/.con Plugins are how asdf understands how to handle different packages. Below is a list of plugins for languages. There is a [super-simple API](https://github.com/asdf-vm/asdf/blob/master/docs/creating-plugins.md) for supporting more languages. | Language | Repository | CI Status -|-----------|-------------|---------- +|-----------|-------------|---------- | Clojure | [vic/asdf-clojure](https://github.com/vic/asdf-clojure) | [![Build Status](https://travis-ci.org/vic/asdf-clojure.svg?branch=master)](https://travis-ci.org/vic/asdf-clojure) | Crystal | [marciogm/asdf-crystal](https://github.com/marciogm/asdf-crystal) | [![Build Status](https://travis-ci.org/marciogm/asdf-crystal.svg?branch=master)](https://travis-ci.org/marciogm/asdf-crystal) | D (DMD) | [sylph01/asdf-dmd](https://github.com/sylph01/asdf-dmd) | [![Build Status](https://travis-ci.org/sylph01/asdf-dmd.svg?branch=master)](https://travis-ci.org/sylph01/asdf-dmd) @@ -193,6 +193,7 @@ The versions can be in the following format: * `0.12.3` - an actual version. Plugins that support downloading binaries, will download binaries. * `ref:v1.0.2-a` or `ref:39cb398vb39` - tag/commit/branch to download from github and compile * `path:/src/elixir` - a path to custom compiled version of a tool to use. For use by language developers and such. +* `system` - this keyword causes asdf to passthrough to the version of the tool on the system that is not managed by asdf. To install all the tools defined in a `.tool-versions` file run the `asdf install` command with no other arguments in the directory containing the `.tool-versions` file. @@ -212,14 +213,14 @@ legacy_version_file = yes ## Credits -Me ([@HashNuke](http://github.com/HashNuke)), High-fever, cold, cough. +Me ([@HashNuke](https://github.com/HashNuke)), High-fever, cold, cough. Copyright 2014 to the end of time ([MIT License](https://github.com/asdf-vm/asdf/blob/master/LICENSE)) ### Maintainers -- [@HashNuke](http://github.com/HashNuke) -- [@tuvistavie](http://github.com/tuvistavie) +- [@HashNuke](https://github.com/HashNuke) +- [@tuvistavie](https://github.com/tuvistavie) - [@Stratus3D](https://github.com/Stratus3D) - [@vic](https://github.com/vic) diff --git a/ballad-of-asdf.md b/ballad-of-asdf.md index 29a68d02..6c7543c8 100644 --- a/ballad-of-asdf.md +++ b/ballad-of-asdf.md @@ -1,30 +1,30 @@ # Ballad of asdf -> Once upon a time there was a programming language -There were many versions of it -So people wrote a version manager for it -To switch between versions for projects -Different, old, new. +> Once upon a time there was a programming language +There were many versions of it +So people wrote a version manager for it +To switch between versions for projects +Different, old, new. -> Then there came more programming languages -So there came more version managers -And many commands for them +> Then there came more programming languages +So there came more version managers +And many commands for them > I installed a lot of them -I learnt a lot of commands +I learnt a lot of commands -> Then I said, just one more version manager -Which I will write instead +> Then I said, just one more version manager +Which I will write instead -> So, there came another version manager -**asdf version manager** - +> So, there came another version manager +**asdf version manager** - -> A version manager so extendable -for which anyone can create a plugin -To support their favourite language -No more installing more version managers +> A version manager so extendable +for which anyone can create a plugin +To support their favourite language +No more installing more version managers Or learning more commands --- -*This was the mail I wrote to a few friends to tell them about the project. Thanks to [@roshanvid](http://twitter.com/roshanvid) for suggesting that this go into the readme* +*This was the mail I wrote to a few friends to tell them about the project. Thanks to [@roshanvid](https://twitter.com/roshanvid) for suggesting that this go into the readme* diff --git a/bin/asdf b/bin/asdf index 6d73de75..f43d8526 100755 --- a/bin/asdf +++ b/bin/asdf @@ -3,6 +3,7 @@ source $(dirname $(dirname $0))/lib/utils.sh source $(dirname $(dirname $0))/lib/commands/help.sh +source $(dirname $(dirname $0))/lib/commands/update.sh source $(dirname $(dirname $0))/lib/commands/install.sh source $(dirname $(dirname $0))/lib/commands/uninstall.sh source $(dirname $(dirname $0))/lib/commands/current.sh @@ -31,6 +32,9 @@ case $1 in "help") help_command $callback_args;; +"update") + update_command $callback_args;; + "install") install_command $callback_args;; diff --git a/bin/private/asdf-exec b/bin/private/asdf-exec index 5cf90d11..2c46d6ba 100755 --- a/bin/private/asdf-exec +++ b/bin/private/asdf-exec @@ -18,33 +18,16 @@ fi IFS=' ' read -a versions <<< "$full_version" for version in "${versions[@]}"; do - IFS=':' read -a version_info <<< "$version" + install_path=$(find_install_path $plugin_name $version) - if [ "${version_info[0]}" = "ref" ]; then - install_type="${version_info[0]}" - version="${version_info[1]}" - install_path=$(get_install_path $plugin_name $install_type $version) - elif [ "${version_info[0]}" = "path" ]; then - # This is for people who have the local source already compiled - # Like those who work on the language, etc - # We'll allow specifying path:/foo/bar/project in .tool-versions - # And then use the binaries there - install_type="path" - version="path" - install_path="${version_info[1]}" - else - install_type="version" - version="${version_info[0]}" - install_path=$(get_install_path $plugin_name $install_type $version) - fi - - - if [ ! -d $install_path ]; then + if [ $version != "system" ] && [ ! -d "$install_path" ]; then echo "$plugin_name $version not installed" exit 1 fi - if [ -f ${install_path}/${executable_path} ]; then + full_executable_path=$(get_executable_path $plugin_name $version $executable_path) + + if [ $? -eq 0 -a -f "$full_executable_path" ]; then if [ -f ${plugin_path}/bin/exec-env ]; then export ASDF_INSTALL_TYPE=$install_type export ASDF_INSTALL_VERSION=$version @@ -56,10 +39,9 @@ for version in "${versions[@]}"; do unset ASDF_INSTALL_TYPE unset ASDF_INSTALL_VERSION unset ASDF_INSTALL_PATH - exec ${install_path}/${executable_path} "${@:3}" - else - exec ${install_path}/${executable_path} "${@:3}" fi + + exec $full_executable_path "${@:3}" fi done diff --git a/completions/asdf.bash b/completions/asdf.bash index 0564110e..07bf16ed 100644 --- a/completions/asdf.bash +++ b/completions/asdf.bash @@ -23,7 +23,7 @@ _asdf () { COMPREPLY=($(compgen -W "$plugins" -- $cur)) fi ;; - uninstall|where|reshim) + uninstall|where|reshim|local|global) if [[ "$plugins" == *"$prev"* ]] ; then local versions=$(asdf list $prev) COMPREPLY=($(compgen -W "$versions" -- $cur)) @@ -32,7 +32,7 @@ _asdf () { fi ;; *) - local cmds='plugin-add plugin-list plugin-remove plugin-update install uninstall current where which list list-all reshim' + local cmds='plugin-add plugin-list plugin-remove plugin-update install uninstall update current where which list list-all local global reshim' COMPREPLY=($(compgen -W "$cmds" -- $cur)) ;; esac diff --git a/completions/asdf.fish b/completions/asdf.fish index 596f6450..31fc4254 100644 --- a/completions/asdf.fish +++ b/completions/asdf.fish @@ -81,12 +81,12 @@ complete -f -c asdf -n '__fish_asdf_using_command reshim; and __fish_asdf_arg_nu # local completion complete -f -c asdf -n '__fish_asdf_needs_command' -a local -d "Set local version for a plugin" complete -f -c asdf -n '__fish_asdf_using_command local; and __fish_asdf_arg_number 2' -a '(asdf plugin-list)' -complete -f -c asdf -n '__fish_asdf_using_command local; and test (count (commandline -opc)) -gt 2' -a '(asdf list (__fish_asdf_arg_at 3))' +complete -f -c asdf -n '__fish_asdf_using_command local; and test (count (commandline -opc)) -gt 2' -a '(asdf list (__fish_asdf_arg_at 3)) system' # global completion complete -f -c asdf -n '__fish_asdf_needs_command' -a global -d "Set global version for a plugin" complete -f -c asdf -n '__fish_asdf_using_command global; and __fish_asdf_arg_number 2' -a '(asdf plugin-list)' -complete -f -c asdf -n '__fish_asdf_using_command global; and test (count (commandline -opc)) -gt 2' -a '(asdf list (__fish_asdf_arg_at 3))' +complete -f -c asdf -n '__fish_asdf_using_command global; and test (count (commandline -opc)) -gt 2' -a '(asdf list (__fish_asdf_arg_at 3)) system' # misc complete -f -c asdf -n '__fish_asdf_needs_command' -l "help" -d "Displays help" diff --git a/docs/creating-plugins.md b/docs/creating-plugins.md index bae5e0bc..ac71b0c9 100644 --- a/docs/creating-plugins.md +++ b/docs/creating-plugins.md @@ -17,7 +17,7 @@ All scripts except `bin/list-all` will have access to the following env vars to #### bin/list-all -Must print a string with a space-seperated list of versions. Example output would be the following: +Must print a string with a space-separated list of versions. Example output would be the following: ``` 1.0.1 1.0.2 1.3.0 1.4 @@ -36,7 +36,7 @@ This script should install the version, in the path mentioned in `ASDF_INSTALL_P #### bin/list-bin-paths -List executables for the specified version of the tool. Must print a string with a space-seperated list of dir paths that contain executables. The paths must be relative to the install path passed. Example output would be: +List executables for the specified version of the tool. Must print a string with a space-separated list of dir paths that contain executables. The paths must be relative to the install path passed. Example output would be: ``` bin tools veggies @@ -56,7 +56,7 @@ Uninstalls a specific version of a tool. #### bin/list-legacy-filenames -Register additional setter files for this plugin. Must print a string with a space-seperated list of filenames. +Register additional setter files for this plugin. Must print a string with a space-separated list of filenames. ``` .ruby-version .rvmrc diff --git a/help.txt b/help.txt index 91ed4354..7827280a 100644 --- a/help.txt +++ b/help.txt @@ -22,6 +22,8 @@ MANAGE PACKAGES UTILS asdf reshim Recreate shims for version of a package + asdf update Update asdf to the latest stable release + asdf update --head Update asdf to the latest on the master branch "Late but latest" diff --git a/lib/commands/plugin-test.sh b/lib/commands/plugin-test.sh index f9117568..5a8fd194 100644 --- a/lib/commands/plugin-test.sh +++ b/lib/commands/plugin-test.sh @@ -70,5 +70,15 @@ plugin_test_command() { fi done + # Assert that a license file exists in the plugin repo and is not empty + license_file="$ASDF_DIR/plugins/$plugin_name/LICENSE" + if [ -f "$license_file" ]; then + if [ ! -s "$license_file" ]; then + fail_test "LICENSE file in the plugin repository must not be empty" + fi + else + fail_test "LICENSE file must be present in the plugin repository" + fi + rm -rf $ASDF_DIR } diff --git a/lib/commands/reshim.sh b/lib/commands/reshim.sh index 5a8291c4..abe36cae 100644 --- a/lib/commands/reshim.sh +++ b/lib/commands/reshim.sh @@ -97,17 +97,17 @@ generate_shims_for_version() { local install_path=$(get_install_path $plugin_name $install_type $version) if [ -f ${plugin_path}/bin/list-bin-paths ]; then - local space_seperated_list_of_bin_paths=$( + local space_separated_list_of_bin_paths=$( export ASDF_INSTALL_TYPE=$install_type export ASDF_INSTALL_VERSION=$version export ASDF_INSTALL_PATH=$install_path bash ${plugin_path}/bin/list-bin-paths ) else - local space_seperated_list_of_bin_paths="bin" + local space_separated_list_of_bin_paths="bin" fi - IFS=' ' read -a all_bin_paths <<< "$space_seperated_list_of_bin_paths" + IFS=' ' read -a all_bin_paths <<< "$space_separated_list_of_bin_paths" for bin_path in "${all_bin_paths[@]}"; do for executable_file in $install_path/$bin_path/*; do diff --git a/lib/commands/update.sh b/lib/commands/update.sh new file mode 100644 index 00000000..fae019de --- /dev/null +++ b/lib/commands/update.sh @@ -0,0 +1,30 @@ +update_command() { + local update_to_head=$1 + + ( + cd $(asdf_dir) + + if [ "$update_to_head" = "--head" ]; then + # Update to latest on the master branch + git checkout master + + # Pull down the latest changes on master + git pull origin master + echo "Updated asdf to latest on the master branch" + else + # Update to latest release + git fetch --tags || exit 1 + tag=$(git tag | sort_versions | sed '$!d') || exit 1 + + # Update + git checkout "$tag" || exit 1 + echo "Updated asdf to release $tag" + fi + ) +} + +# stolen from https://github.com/rbenv/ruby-build/pull/631/files#diff-fdcfb8a18714b33b07529b7d02b54f1dR942 +sort_versions() { + sed 'h; s/[+-]/./g; s/.p\([[:digit:]]\)/.z\1/; s/$/.z/; G; s/\n/ /' | \ + LC_ALL=C sort -t. -k 1,1 -k 2,2n -k 3,3n -k 4,4n -k 5,5n | awk '{print $2}' +} diff --git a/lib/utils.sh b/lib/utils.sh index 411b2fea..0fb7b2bb 100644 --- a/lib/utils.sh +++ b/lib/utils.sh @@ -4,7 +4,11 @@ GREP_OPTIONS="--color=never" GREP_COLORS= asdf_version() { - echo "0.2.1" + # Move to the asdf repo, then report the current tag + ( + cd $(asdf_dir) + git describe --tags + ) } asdf_dir() { @@ -46,7 +50,7 @@ list_installed_versions() { check_if_plugin_exists() { # Check if we have a non-empty argument if [ -z "${1+set}" ]; then - display_error "No such plugin" + display_error "No plugin given" exit 1 fi @@ -57,17 +61,19 @@ check_if_plugin_exists() { } check_if_version_exists() { - local plugin=$1 + local plugin_name=$1 local version=$2 - local version_dir=$(asdf_dir)/installs/$plugin/$version + local version_dir=$(asdf_dir)/installs/$plugin_name/$version # if version starts with path: use that directory if [ "${version/path:}" != "$version" ]; then version_dir=$(echo $version | cut -d: -f 2) fi - if [ ! -d $version_dir ]; then - display_error "version $version is not installed for $plugin" + check_if_plugin_exists $plugin_name + + if [ "$version" != "system" ] && [ ! -d $version_dir ]; then + display_error "version $version is not installed for $plugin_name" exit 1 fi } @@ -141,6 +147,54 @@ get_version_from_env () { echo "$version" } +find_install_path() { + local plugin_name=$1 + local version=$2 + + IFS=':' read -a version_info <<< "$version" + + if [ $version = "system" ]; then + echo "" + elif [ "${version_info[0]}" = "ref" ]; then + local install_type="${version_info[0]}" + local version="${version_info[1]}" + echo $(get_install_path $plugin_name $install_type $version) + elif [ "${version_info[0]}" = "path" ]; then + # This is for people who have the local source already compiled + # Like those who work on the language, etc + # We'll allow specifying path:/foo/bar/project in .tool-versions + # And then use the binaries there + local install_type="path" + local version="path" + echo "${version_info[1]}" + else + local install_type="version" + local version="${version_info[0]}" + echo $(get_install_path $plugin_name $install_type $version) + fi +} + +get_executable_path() { + local plugin_name=$1 + local version=$2 + local executable_path=$3 + + check_if_version_exists $plugin_name $version + + if [ $version = "system" ]; then + path=$(echo $PATH | sed -e "s|$ASDF_DIR/shims||g; s|::|:|g") + cmd=$(basename $executable_path) + cmd_path=$(PATH=$path which $cmd 2>&1) + if [ $? -ne 0 ]; then + return 1 + fi + echo $cmd_path + else + local install_path=$(find_install_path $plugin_name $version) + echo ${install_path}/${executable_path} + fi +} + parse_asdf_version_file() { local file_path=$1 local plugin_name=$2 @@ -180,29 +234,29 @@ get_preset_version_for() { } get_asdf_config_value_from_file() { - local config_path=$1 - local key=$2 + local config_path=$1 + local key=$2 - if [ ! -f $config_path ]; then - return 0 - fi + if [ ! -f $config_path ]; then + return 0 + fi - local result=$(grep -E "^\s*$key\s*=" $config_path | awk -F '=' '{ gsub(/ /, "", $2); print $2 }') - if [ -n "$result" ]; then - echo $result - fi + local result=$(grep -E "^\s*$key\s*=" $config_path | awk -F '=' '{ gsub(/ /, "", $2); print $2 }') + if [ -n "$result" ]; then + echo $result + fi } get_asdf_config_value() { - local key=$1 - local config_path=${AZDF_CONFIG_FILE:-"$HOME/.asdfrc"} - local default_config_path=${AZDF_CONFIG_DEFAULT_FILE:-"$(asdf_dir)/defaults"} + local key=$1 + local config_path=${AZDF_CONFIG_FILE:-"$HOME/.asdfrc"} + local default_config_path=${AZDF_CONFIG_DEFAULT_FILE:-"$(asdf_dir)/defaults"} - local result=$(get_asdf_config_value_from_file $config_path $key) + local result=$(get_asdf_config_value_from_file $config_path $key) - if [ -n "$result" ]; then - echo $result - else - get_asdf_config_value_from_file $default_config_path $key - fi + if [ -n "$result" ]; then + echo $result + else + get_asdf_config_value_from_file $default_config_path $key + fi } diff --git a/test/remove_command.bats b/test/remove_command.bats index d6df5e39..a88897d5 100644 --- a/test/remove_command.bats +++ b/test/remove_command.bats @@ -25,7 +25,7 @@ teardown() { @test "plugin_remove_command should exit with 1 when not passed any arguments" { run plugin_remove_command [ "$status" -eq 1 ] - [ "$output" = "No such plugin" ] + [ "$output" = "No plugin given" ] } @test "plugin_remove_command should exit with 1 when passed invalid plugin name" { @@ -69,4 +69,4 @@ teardown() { # unrelated shim should exist [ -f $ASDF_DIR/shims/gummy ] -} \ No newline at end of file +} diff --git a/test/test_helpers.bash b/test/test_helpers.bash index f220e3d4..d87beaa9 100644 --- a/test/test_helpers.bash +++ b/test/test_helpers.bash @@ -6,6 +6,8 @@ setup_asdf_dir() { ASDF_DIR=$HOME/.asdf mkdir -p $ASDF_DIR/plugins mkdir -p $ASDF_DIR/installs + mkdir -p $ASDF_DIR/shims + PATH=$ASDF_DIR/shims:$PATH } install_dummy_plugin() { diff --git a/test/update_command.bats b/test/update_command.bats new file mode 100644 index 00000000..228662a9 --- /dev/null +++ b/test/update_command.bats @@ -0,0 +1,79 @@ +#!/usr/bin/env bats + +load test_helpers + +. $(dirname $BATS_TEST_DIRNAME)/lib/commands/update.sh +. $(dirname $BATS_TEST_DIRNAME)/lib/commands/reshim.sh +. $(dirname $BATS_TEST_DIRNAME)/lib/commands/install.sh +. $(dirname $BATS_TEST_DIRNAME)/lib/commands/uninstall.sh + +setup() { + setup_asdf_dir + install_dummy_plugin + + # Copy over git repo so we have something to test with + cp -r .git $ASDF_DIR + ( + cd $ASDF_DIR + git remote remove origin + git remote add origin https://github.com/asdf-vm/asdf.git + git checkout . + ) + + PROJECT_DIR=$HOME/project + mkdir $PROJECT_DIR +} + +teardown() { + clean_asdf_dir +} + +@test "update_command --head should checkout the master branch" { + run update_command --head + [ "$status" -eq 0 ] + cd $ASDF_DIR + # TODO: Figure out why this is failing + #[ $(git rev-parse --abbrev-ref HEAD) = "master" ] +} + +@test "update_command should checkout the latest tag" { + run update_command + [ "$status" -eq 0 ] + cd $ASDF_DIR + local tag=$(git describe --tag) + echo $(git tag) | grep $tag + [ "$status" -eq 0 ] +} + +@test "update_command should not remove plugin versions" { + run install_command dummy 1.1 + [ "$status" -eq 0 ] + [ $(cat $ASDF_DIR/installs/dummy/1.1/version) = "1.1" ] + run update_command + [ "$status" -eq 0 ] + [ -f $ASDF_DIR/installs/dummy/1.1/version ] + run update_command --head + [ "$status" -eq 0 ] + [ -f $ASDF_DIR/installs/dummy/1.1/version ] +} + +@test "update_command should not remove plugins" { + # dummy plugin is already installed + run update_command + [ "$status" -eq 0 ] + [ -d $ASDF_DIR/plugins/dummy ] + run update_command --head + [ "$status" -eq 0 ] + [ -d $ASDF_DIR/plugins/dummy ] +} + +@test "update_command should not remove shims" { + run install_command dummy 1.1 + [ -f $ASDF_DIR/shims/dummy ] + run update_command + [ "$status" -eq 0 ] + [ -f $ASDF_DIR/shims/dummy ] + run update_command --head + [ "$status" -eq 0 ] + [ -f $ASDF_DIR/shims/dummy ] +} diff --git a/test/utils.bats b/test/utils.bats index af9f581f..52d25390 100644 --- a/test/utils.bats +++ b/test/utils.bats @@ -19,7 +19,7 @@ teardown() { @test "check_if_version_exists should exit with 1 if plugin does not exist" { run check_if_version_exists "inexistent" "1.0.0" [ "$status" -eq 1 ] - [ "$output" = "version 1.0.0 is not installed for inexistent" ] + [ "$output" = "No such plugin" ] } @test "check_if_version_exists should exit with 1 if version does not exist" { @@ -34,10 +34,17 @@ teardown() { [ "$output" = "" ] } +@test "check_if_version_exists should be noop if version is system" { + mkdir -p $ASDF_DIR/plugins/foo + run check_if_version_exists "foo" "system" + [ "$status" -eq 0 ] + [ "$output" = "" ] +} + @test "check_if_plugin_exists should exit with 1 when plugin is empty string" { run check_if_plugin_exists [ "$status" -eq 1 ] - [ "$output" = "No such plugin" ] + [ "$output" = "No plugin given" ] } @test "check_if_plugin_exists should be noop if plugin exists" { @@ -139,3 +146,34 @@ teardown() { [ "$status" -eq 0 ] [ "$output" = "path:/some/place with spaces" ] } + +@test "get_executable_path for system version should return system path" { + mkdir -p $ASDF_DIR/plugins/foo + run get_executable_path "foo" "system" "ls" + [ "$status" -eq 0 ] + [ "$output" = $(which ls) ] +} + +@test "get_executable_path for system version should not use asdf shims" { + mkdir -p $ASDF_DIR/plugins/foo + touch $ASDF_DIR/shims/dummy_executable + chmod +x $ASDF_DIR/shims/dummy_executable + + run which dummy_executable + [ "$status" -eq 0 ] + + run get_executable_path "foo" "system" "dummy_executable" + [ "$status" -eq 1 ] +} + +@test "get_executable_path for non system version should return relative path from plugin" { + mkdir -p $ASDF_DIR/plugins/foo + mkdir -p $ASDF_DIR/installs/foo/1.0.0/bin + executable_path=$ASDF_DIR/installs/foo/1.0.0/bin/dummy + touch $executable_path + chmod +x $executable_path + + run get_executable_path "foo" "1.0.0" "bin/dummy" + [ "$status" -eq 0 ] + [ "$output" = "$executable_path" ] +}