From e00e4ac5604a168de1f46cdb6ddf5de07ce173db Mon Sep 17 00:00:00 2001 From: bootleq Date: Tue, 20 Feb 2024 19:33:36 +0800 Subject: [PATCH 1/2] Add test to reproduce the misleading message Simulation steps, where dummy/dummyman behave like node/npm - User install dummy 1.0, with `dummyman` command shimmed - User install dummy 1.3 - User run `dummyman` will print incorrect message which suggest to install `dummy 1.3` (has already installed), or set `dummy 1.0` in tool-versions (is not what user want). --- test/shim_exec.bats | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/shim_exec.bats b/test/shim_exec.bats index 5c6d0673e..93ddc1958 100644 --- a/test/shim_exec.bats +++ b/test/shim_exec.bats @@ -129,6 +129,36 @@ teardown() { echo "$output" | grep -q "dummy 1.0" 2>/dev/null } +@test "issue #928" { + # 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" + chmod +x "$ASDF_DIR/installs/dummy/1.0/bin/dummyman" + run asdf reshim dummy 1.0 + + # Install 1.3 + run asdf install dummy 1.3 + + echo "dummy 1.3" >"$PROJECT_DIR/.tool-versions" + + # reshim doesn't help + run asdf reshim dummy + 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 +} + @test "shim exec should execute first plugin that is installed and set" { run asdf install dummy 2.0.0 run asdf install dummy 3.0 From 897ea7f014a187218577403c2366e06c36f0e4c2 Mon Sep 17 00:00:00 2001 From: bootleq Date: Tue, 20 Feb 2024 22:41:08 +0800 Subject: [PATCH 2/2] Provide dedicated message for obsolete shim case When a shimmed command can't find usable plugin version, we used to do several detection then output suggestion to user. The original message assumes "preset" plugin version is not installed, which could be false when shimmed command has old `asdf-plugin:` version written, while not being updated when install newer plugin version. Here add small `preset_plugin_installed` flag to detect if any considered "missing" plugin is in fact exist. Print only simple message for it. Example output: Shimmed command 'yarn' has no matched plugin version Check the executable or try install yarn for your preset plugin version --- lib/utils.bash | 33 ++++++++++++++++++++++----------- test/shim_exec.bats | 13 +++---------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/lib/utils.bash b/lib/utils.bash index 21978a929..3f2038c62 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 93ddc1958..0c4860bef 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" {