mirror of
https://github.com/asdf-vm/asdf.git
synced 2024-11-15 09:38:16 -07:00
9430a39aef
* feat: Displays a warning when the plugin from the tools-version does not exist When calling the install command, it tried to look for versions for all the plugins available and installed them. With this change, it will attempt to find versions for all the installed plugins and plugins defined in the `.tool-versions`. Fixes https://github.com/asdf-vm/asdf/issues/574 * feat: Changes the algorithm to detect not installed plugins This patch changes the algorithm. It preserves the original logic for the plugin resolution, but at the same time, reports entries with plugins not available. * fix: Addresses the pull request comments. - Changes the comparison to be strict rather than partial. - Prints a list of missing plugins. - Exists if at least one plugin is not present. - Adds unit tests.
244 lines
6.6 KiB
Bash
244 lines
6.6 KiB
Bash
# -*- sh -*-
|
|
|
|
handle_failure() {
|
|
local install_path="$1"
|
|
rm -rf "$install_path"
|
|
exit 1
|
|
}
|
|
|
|
handle_cancel() {
|
|
local install_path="$1"
|
|
printf "\\nreceived sigint, cleaning up"
|
|
handle_failure "$install_path"
|
|
}
|
|
|
|
install_command() {
|
|
local plugin_name=$1
|
|
local full_version=$2
|
|
local extra_args="${*:3}"
|
|
|
|
if [ "$plugin_name" = "" ] && [ "$full_version" = "" ]; then
|
|
install_local_tool_versions "$extra_args"
|
|
elif [[ $# -eq 1 ]]; then
|
|
install_one_local_tool "$plugin_name"
|
|
else
|
|
install_tool_version "$plugin_name" "$full_version" "$extra_args"
|
|
fi
|
|
}
|
|
|
|
get_concurrency() {
|
|
if command -v nproc >/dev/null 2>&1; then
|
|
nproc
|
|
elif command -v sysctl >/dev/null 2>&1 && sysctl hw.ncpu >/dev/null 2>&1; then
|
|
sysctl -n hw.ncpu
|
|
elif [ -f /proc/cpuinfo ]; then
|
|
grep -c processor /proc/cpuinfo
|
|
else
|
|
printf "1\\n"
|
|
fi
|
|
}
|
|
|
|
install_one_local_tool() {
|
|
local plugin_name=$1
|
|
local search_path
|
|
search_path=$(pwd)
|
|
|
|
local plugin_versions
|
|
|
|
local plugin_version
|
|
|
|
local plugin_version_and_path
|
|
plugin_version_and_path="$(find_versions "$plugin_name" "$search_path")"
|
|
|
|
if [ -n "$plugin_version_and_path" ]; then
|
|
local plugin_version
|
|
some_tools_installed='yes'
|
|
plugin_versions=$(cut -d '|' -f 1 <<<"$plugin_version_and_path")
|
|
for plugin_version in $plugin_versions; do
|
|
install_tool_version "$plugin_name" "$plugin_version"
|
|
done
|
|
else
|
|
printf "No versions specified for %s in config files or environment\\n" "$plugin_name"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
install_local_tool_versions() {
|
|
local plugins_path
|
|
plugins_path=$(get_plugin_path)
|
|
|
|
local search_path
|
|
search_path=$(pwd)
|
|
|
|
local some_tools_installed
|
|
local some_plugin_not_installed
|
|
|
|
local tool_versions_path
|
|
tool_versions_path=$(find_tool_versions)
|
|
|
|
# Locate all the plugins installed in the system
|
|
local plugins_installed
|
|
if ls "$plugins_path" &>/dev/null; then
|
|
for plugin_path in "$plugins_path"/*; do
|
|
local plugin_name
|
|
plugin_name=$(basename "$plugin_path")
|
|
plugins_installed="$plugins_installed $plugin_name"
|
|
done
|
|
plugins_installed=$(printf "%s" "$plugins_installed" | tr " " "\n")
|
|
fi
|
|
|
|
if [ -z "$plugins_installed" ]; then
|
|
printf "Install plugins first to be able to install tools\\n"
|
|
exit 1
|
|
fi
|
|
|
|
# Locate all the plugins defined in the versions file.
|
|
local tools_file
|
|
if [ -f "$tool_versions_path" ]; then
|
|
tools_file=$(strip_tool_version_comments "$tool_versions_path" | cut -d ' ' -f 1)
|
|
for plugin_name in $tools_file; do
|
|
if ! printf '%s\n' "${plugins_installed[@]}" | grep -q "^$plugin_name\$"; then
|
|
printf "%s plugin is not installed\n" "$plugin_name"
|
|
some_plugin_not_installed='yes'
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ -n "$some_plugin_not_installed" ]; then
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$plugins_installed" ]; then
|
|
for plugin_name in $plugins_installed; do
|
|
local plugin_version_and_path
|
|
plugin_version_and_path="$(find_versions "$plugin_name" "$search_path")"
|
|
|
|
if [ -n "$plugin_version_and_path" ]; then
|
|
local plugin_version
|
|
some_tools_installed='yes'
|
|
plugin_versions=$(cut -d '|' -f 1 <<<"$plugin_version_and_path")
|
|
for plugin_version in $plugin_versions; do
|
|
install_tool_version "$plugin_name" "$plugin_version"
|
|
done
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ -z "$some_tools_installed" ]; then
|
|
printf "Either specify a tool & version in the command\\n"
|
|
printf "OR add .tool-versions file in this directory\\n"
|
|
printf "or in a parent directory\\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
install_tool_version() {
|
|
local plugin_name=$1
|
|
local full_version=$2
|
|
local flags=$3
|
|
local keep_download
|
|
local plugin_path
|
|
|
|
plugin_path=$(get_plugin_path "$plugin_name")
|
|
check_if_plugin_exists "$plugin_name"
|
|
|
|
for flag in $flags; do
|
|
case "$flag" in
|
|
"--keep-download")
|
|
keep_download=true
|
|
shift
|
|
;;
|
|
*)
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "$full_version" = "system" ]; then
|
|
return
|
|
fi
|
|
|
|
IFS=':' read -r -a version_info <<<"$full_version"
|
|
if [ "${version_info[0]}" = "ref" ]; then
|
|
local install_type="${version_info[0]}"
|
|
local version="${version_info[1]}"
|
|
else
|
|
local install_type="version"
|
|
|
|
if [ "${version_info[0]}" = "latest" ]; then
|
|
local version
|
|
version=$(asdf latest "$plugin_name" "${version_info[1]}")
|
|
full_version=$version
|
|
else
|
|
local version="${version_info[0]}"
|
|
fi
|
|
fi
|
|
|
|
local install_path
|
|
install_path=$(get_install_path "$plugin_name" "$install_type" "$version")
|
|
local download_path
|
|
download_path=$(get_download_path "$plugin_name" "$install_type" "$version")
|
|
local concurrency
|
|
concurrency=$(get_concurrency)
|
|
trap 'handle_cancel $install_path' INT
|
|
|
|
if [ -d "$install_path" ]; then
|
|
printf "%s %s is already installed\\n" "$plugin_name" "$full_version"
|
|
else
|
|
|
|
if [ -f "${plugin_path}/bin/download" ]; then
|
|
# Not a legacy plugin
|
|
# Run the download script
|
|
(
|
|
# shellcheck disable=SC2030
|
|
export ASDF_INSTALL_TYPE=$install_type
|
|
# shellcheck disable=SC2030
|
|
export ASDF_INSTALL_VERSION=$version
|
|
# shellcheck disable=SC2030
|
|
export ASDF_INSTALL_PATH=$install_path
|
|
# shellcheck disable=SC2030
|
|
export ASDF_DOWNLOAD_PATH=$download_path
|
|
mkdir "$download_path"
|
|
asdf_run_hook "pre_asdf_download_${plugin_name}" "$full_version"
|
|
"${plugin_path}"/bin/download
|
|
)
|
|
fi
|
|
|
|
local download_exit_code=$?
|
|
if [ $download_exit_code -eq 0 ]; then
|
|
(
|
|
# shellcheck disable=SC2031
|
|
export ASDF_INSTALL_TYPE=$install_type
|
|
# shellcheck disable=SC2031
|
|
export ASDF_INSTALL_VERSION=$version
|
|
# shellcheck disable=SC2031
|
|
export ASDF_INSTALL_PATH=$install_path
|
|
# shellcheck disable=SC2031
|
|
export ASDF_DOWNLOAD_PATH=$download_path
|
|
# shellcheck disable=SC2031
|
|
export ASDF_CONCURRENCY=$concurrency
|
|
mkdir "$install_path"
|
|
asdf_run_hook "pre_asdf_install_${plugin_name}" "$full_version"
|
|
"${plugin_path}"/bin/install
|
|
)
|
|
fi
|
|
|
|
local install_exit_code=$?
|
|
if [ $install_exit_code -eq 0 ] && [ $download_exit_code -eq 0 ]; then
|
|
# Remove download directory if --keep-download flag or always_keep_download config setting are not set
|
|
always_keep_download=$(get_asdf_config_value "always_keep_download")
|
|
if [ ! "$keep_download" = "true" ] && [ ! "$always_keep_download" = "yes" ] && [ -d "$download_path" ]; then
|
|
rm -r "$download_path"
|
|
fi
|
|
|
|
asdf reshim "$plugin_name" "$full_version"
|
|
|
|
asdf_run_hook "post_asdf_install_${plugin_name}" "$full_version"
|
|
else
|
|
handle_failure "$install_path"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
install_command "$@"
|