diff --git a/lib/commands/command-current.bash b/lib/commands/command-current.bash index f4724626e..eab5ad3ab 100644 --- a/lib/commands/command-current.bash +++ b/lib/commands/command-current.bash @@ -1,6 +1,8 @@ # -*- sh -*- # shellcheck source=lib/functions/plugins.bash . "$(dirname "$(dirname "$0")")/lib/functions/plugins.bash" +# shellcheck source=lib/functions/versions.bash +. "$(dirname "$(dirname "$0")")/lib/functions/versions.bash" # shellcheck disable=SC2059 plugin_current_command() { @@ -21,7 +23,8 @@ plugin_current_command() { local description="" IFS=' ' read -r -a versions <<<"$full_version" - for version in "${versions[@]}"; do + for version_spec in "${versions[@]}"; do + version="$(resolve_version_spec "$version_spec")" if ! (check_if_version_exists "$plugin_name" "$version"); then version_not_installed="$version" fi diff --git a/lib/commands/command-env.bash b/lib/commands/command-env.bash index 30cf7ec4e..8c34169e1 100644 --- a/lib/commands/command-env.bash +++ b/lib/commands/command-env.bash @@ -1,4 +1,6 @@ # -*- sh -*- +# shellcheck source=lib/functions/versions.bash +. "$(dirname "$(dirname "$0")")/lib/functions/versions.bash" shim_env_command() { local shim_name="$1" diff --git a/lib/commands/command-exec.bash b/lib/commands/command-exec.bash index cb56b36c3..0d4e8d829 100644 --- a/lib/commands/command-exec.bash +++ b/lib/commands/command-exec.bash @@ -1,4 +1,6 @@ # -*- sh -*- +# shellcheck source=lib/functions/versions.bash +. "$(dirname "$(dirname "$0")")/lib/functions/versions.bash" shim_exec_command() { local shim_name diff --git a/lib/commands/command-which.bash b/lib/commands/command-which.bash index 8696dbf3e..661c19873 100644 --- a/lib/commands/command-which.bash +++ b/lib/commands/command-which.bash @@ -1,4 +1,6 @@ # -*- sh -*- +# shellcheck source=lib/functions/versions.bash +. "$(dirname "$(dirname "$0")")/lib/functions/versions.bash" which_command() { local shim_name diff --git a/lib/functions/versions.bash b/lib/functions/versions.bash index 7d1d941d6..f9f6ebf8b 100644 --- a/lib/functions/versions.bash +++ b/lib/functions/versions.bash @@ -37,15 +37,7 @@ version_command() { declare -a resolved_versions local item for item in "${!versions[@]}"; do - IFS=':' read -r -a version_info <<<"${versions[$item]}" - if [ "${version_info[0]}" = "latest" ] && [ -n "${version_info[1]}" ]; then - version=$(latest_command "$plugin_name" "${version_info[1]}") - elif [ "${version_info[0]}" = "latest" ] && [ -z "${version_info[1]}" ]; then - version=$(latest_command "$plugin_name") - else - # if branch handles ref: || path: || normal versions - version="${versions[$item]}" - fi + version="$(resolve_version_spec "${versions[$item]}")" # check_if_version_exists should probably handle if either param is empty string if [ -z "$version" ]; then @@ -79,6 +71,22 @@ version_command() { fi } +resolve_version_spec() { + local version_spec=$1 + + IFS=':' read -r -a version_info <<<"$version_spec" + if [ "${version_info[0]}" = "latest" ] && [ -n "${version_info[1]}" ]; then + version=$(latest_command "$plugin_name" "${version_info[1]}") + elif [ "${version_info[0]}" = "latest" ] && [ -z "${version_info[1]}" ]; then + version=$(latest_command "$plugin_name") + else + # if branch handles ref: || path: || normal versions + version="$version_spec" + fi + + printf "%s\n" "$version" +} + list_all_command() { local plugin_name=$1 local query=$2 diff --git a/lib/utils.bash b/lib/utils.bash index 21978a929..8b40bf548 100644 --- a/lib/utils.bash +++ b/lib/utils.bash @@ -736,7 +736,8 @@ select_version() { version_and_path=$(find_versions "$plugin_name" "$search_path") IFS='|' read -r version_string _path <<<"$version_and_path" IFS=' ' read -r -a usable_plugin_versions <<<"$version_string" - for plugin_version in "${usable_plugin_versions[@]}"; do + for version_spec in "${usable_plugin_versions[@]}"; do + plugin_version="$(resolve_version_spec "$version_spec")" for plugin_and_version in "${shim_versions[@]}"; do local plugin_shim_name local plugin_shim_version diff --git a/test/current_command.bats b/test/current_command.bats index 687bc9da8..b61d2afb9 100755 --- a/test/current_command.bats +++ b/test/current_command.bats @@ -47,6 +47,16 @@ teardown() { [ "$output" = "$expected" ] } +@test "current should not error on version specifications like 'latest:'" { + cd "$PROJECT_DIR" + echo "dummy 1.2.0 latest:1.1" >>"$PROJECT_DIR/.tool-versions" + expected="dummy 1.2.0 latest:1.1 $PROJECT_DIR/.tool-versions" + + run asdf current "dummy" + [ "$status" -eq 0 ] + [ "$output" = "$expected" ] +} + @test "current should derive from the legacy file if enabled" { cd "$PROJECT_DIR" echo 'legacy_version_file = yes' >"$HOME/.asdfrc" diff --git a/test/install_command.bats b/test/install_command.bats index bad99898a..0160ef9e4 100644 --- a/test/install_command.bats +++ b/test/install_command.bats @@ -45,6 +45,14 @@ teardown() { [ "$(cat "$ASDF_DIR/installs/dummy/1.2.0/version")" = "1.2.0" ] } +@test "install_command installs the 'latest:' version in .tool-versions" { + cd "$PROJECT_DIR" + echo -n 'dummy latest:1.1' >".tool-versions" + run asdf install dummy + [ "$status" -eq 0 ] + [ "$(cat "$ASDF_DIR/installs/dummy/1.1.0/version")" = "1.1.0" ] +} + @test "install_command set ASDF_CONCURRENCY" { run asdf install dummy 1.0.0 [ "$status" -eq 0 ] diff --git a/test/shim_exec.bats b/test/shim_exec.bats index 5c6d0673e..076f5b86e 100644 --- a/test/shim_exec.bats +++ b/test/shim_exec.bats @@ -141,6 +141,19 @@ teardown() { echo "$output" | grep -q "This is Dummy 3.0! hello world" 2>/dev/null } +@test "shim exec should respect 'latest:' in .tool-versions" { + run asdf install dummy 1.0.0 + run asdf install dummy 1.1.0 + run asdf install dummy 2.0.0 + + echo "dummy latest:1.1" >"$PROJECT_DIR/.tool-versions" + + run "$ASDF_DIR/shims/dummy" world hello + [ "$status" -eq 0 ] + + echo "$output" | grep -q "This is Dummy 1.1.0! hello world" 2>/dev/null +} + @test "shim exec should only use the first version found for a plugin" { run asdf install dummy 3.0 diff --git a/test/test_helpers.bash b/test/test_helpers.bash index 6f4468e1b..3ae79ae9a 100644 --- a/test/test_helpers.bash +++ b/test/test_helpers.bash @@ -4,6 +4,8 @@ bats_require_minimum_version 1.7.0 # shellcheck source=lib/utils.bash . "$(dirname "$BATS_TEST_DIRNAME")"/lib/utils.bash +# shellcheck source=lib/functions/versions.bash +. "$(dirname "$BATS_TEST_DIRNAME")"/lib/functions/versions.bash setup_asdf_dir() { if [ "$BATS_TEST_NAME" = 'test_shim_exec_should_use_path_executable_when_specified_version_path-3a-3cpath-3e' ]; then