diff --git a/lib/functions/versions.bash b/lib/functions/versions.bash index 7d1d941d..c02f05c5 100644 --- a/lib/functions/versions.bash +++ b/lib/functions/versions.bash @@ -53,8 +53,12 @@ version_command() { fi if ! (check_if_version_exists "$plugin_name" "$version"); then - version_not_installed_text "$plugin_name" "$version" 1>&2 - exit 1 + closest_version=$(try_get_closest_version "$plugin_name" "$version") + if [[ ! $closest_version ]]; then + version_not_installed_text "$plugin_name" "$version" 1>&2 + exit 1 + fi + version="$closest_version" fi resolved_versions+=("$version") diff --git a/lib/utils.bash b/lib/utils.bash index 21978a92..3d66fd57 100644 --- a/lib/utils.bash +++ b/lib/utils.bash @@ -137,6 +137,26 @@ check_if_version_exists() { fi } +try_get_closest_version() { + local plugin_name=$1 + local partial_version=$2 + local versions + + versions=$(list_installed_versions "$plugin_name") + + if [ -n "${versions}" ]; then + for version in $versions; do + if [[ $version == $partial_version* ]]; then + matched_versions+=("$version") + fi + done + fi + + if [ ${#matched_versions[@]} -eq 1 ]; then + printf "%s" "${matched_versions[0]}" + fi +} + version_not_installed_text() { local plugin_name=$1 local version=$2 diff --git a/test/version_commands.bats b/test/version_commands.bats index 3c9fd0f7..b6ddbee8 100644 --- a/test/version_commands.bats +++ b/test/version_commands.bats @@ -204,6 +204,18 @@ teardown() { [ "$(cat "$HOME/.tool-versions")" = "dummy 1.1.0" ] } +@test "global should create a global .tool-versions file when a close version is found" { + run asdf global "dummy" "1.1" + [ "$status" -eq 0 ] + [ "$(cat "$HOME/.tool-versions")" = "dummy 1.1.0" ] +} + +@test "global should emit an error when a single close plugin version is not found" { + run asdf global "dummy" "1" + [ "$status" -eq 1 ] + [ "$output" = "version 1 is not installed for dummy" ] +} + @test "[global - dummy_plugin] with latest should use the latest installed version" { run asdf global "dummy" "latest" [ "$status" -eq 0 ]