diff --git a/lib/utils.bash b/lib/utils.bash index 21978a92..3f2038c6 100644 --- a/lib/utils.bash +++ b/lib/utils.bash @@ -803,6 +803,7 @@ with_shim_executable() { ( local preset_plugin_versions preset_plugin_versions=() + local preset_plugin_installed= local closest_tool_version closest_tool_version=$(find_tool_versions) @@ -815,22 +816,32 @@ with_shim_executable() { IFS=' ' read -r -a shim_versions <<<"$version_string" local usable_plugin_versions for shim_version in "${shim_versions[@]}"; do - preset_plugin_versions+=("$shim_plugin $shim_version") + if grep -q "$shim_version" <<<"$(asdf list "$shim_plugin")"; then + preset_plugin_installed="yes" + else + preset_plugin_versions+=("$shim_plugin $shim_version") + fi done done - if [ -n "${preset_plugin_versions[*]}" ]; then - printf "%s %s\n" "No preset version installed for command" "$shim_name" - printf "%s\n\n" "Please install a version by running one of the following:" - for preset_plugin_version in "${preset_plugin_versions[@]}"; do - printf "%s %s\n" "asdf install" "$preset_plugin_version" - done - printf "\n%s %s\n" "or add one of the following versions in your config file at" "$closest_tool_version" + if [ -n "$preset_plugin_installed" ]; then + printf "%s '%s' %s\n" "Shimmed command" "$shim_name" "has no matched plugin version" + printf "%s %s %s\n" "Check the executable or try install" "$shim_name" "for your preset plugin version" else - printf "%s %s\n" "No version is set for command" "$shim_name" - printf "%s %s\n" "Consider adding one of the following versions in your config file at" "$closest_tool_version" + if [ -n "${preset_plugin_versions[*]}" ]; then + printf "%s %s\n" "No preset version installed for command" "$shim_name" + printf "%s\n\n" "Please install a version by running one of the following:" + for preset_plugin_version in "${preset_plugin_versions[@]}"; do + printf "%s %s\n" "asdf install" "$preset_plugin_version" + done + printf "\n%s %s\n" "or add one of the following versions in your config file at" "$closest_tool_version" + shim_plugin_versions "${shim_name}" + else + printf "%s %s\n" "No version is set for command" "$shim_name" + printf "%s %s\n" "Consider adding one of the following versions in your config file at" "$closest_tool_version" + shim_plugin_versions "${shim_name}" + fi fi - shim_plugin_versions "${shim_name}" ) >&2 return 126 diff --git a/test/shim_exec.bats b/test/shim_exec.bats index 93ddc195..0c4860be 100644 --- a/test/shim_exec.bats +++ b/test/shim_exec.bats @@ -129,7 +129,7 @@ teardown() { echo "$output" | grep -q "dummy 1.0" 2>/dev/null } -@test "issue #928" { +@test "shim exec should suggest to check obsolete shim" { # Install 1.0, with fake "dummyman" command, shimmed for 1.0 run asdf install dummy 1.0 echo "echo Dummy Manager" >"$ASDF_DIR/installs/dummy/1.0/bin/dummyman" @@ -138,7 +138,6 @@ teardown() { # Install 1.3 run asdf install dummy 1.3 - echo "dummy 1.3" >"$PROJECT_DIR/.tool-versions" # reshim doesn't help @@ -146,17 +145,11 @@ teardown() { run asdf shim-versions dummyman [ "$status" -eq 0 ] [ "$output" = "dummy 1.0" ] - run "$ASDF_DIR/shims/dummyman" [ "$status" -eq 126 ] - echo ">> $output" >&3 - # Below is current (misleading) message - echo "$output" | grep -q "No preset version installed for command dummyman" 2>/dev/null - echo "$output" | grep -q "Please install a version by running one of the following:" 2>/dev/null - echo "$output" | grep -q "asdf install dummy 1.3" 2>/dev/null - echo "$output" | grep -q "or add one of the following versions in your config file at $PROJECT_DIR/.tool-versions" 2>/dev/null - echo "$output" | grep -q "dummy 1.0" 2>/dev/null + echo "$output" | grep -q "Shimmed command 'dummyman' has no matched plugin version" 2>/dev/null + echo "$output" | grep -q "Check the executable or try install dummyman for your preset plugin version" 2>/dev/null } @test "shim exec should execute first plugin that is installed and set" {