New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: don't invoke asdf inside asdf commands #1208
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,6 @@ | ||
# -*- sh -*- | ||
# shellcheck source=lib/functions/versions.bash | ||
. "$(dirname "$(dirname "$0")")/lib/functions/versions.bash" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since we are now invoking the functions instead of |
||
|
||
asdf_help() { | ||
printf "version: %s\\n\\n" "$(asdf_version)" | ||
|
@@ -53,7 +55,7 @@ help_command() { | |
|
||
if [ "${version_info[0]}" = "latest" ]; then | ||
local version | ||
version=$(asdf latest "$plugin_name" "${version_info[1]}") | ||
version=$(latest_command "$plugin_name" "${version_info[1]}") | ||
else | ||
local version="${version_info[0]}" | ||
fi | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,13 @@ | ||
# -*- sh -*- | ||
# shellcheck source=lib/functions/plugins.bash | ||
. "$(dirname "$(dirname "$0")")/lib/functions/plugins.bash" | ||
|
||
info_command() { | ||
printf "%s:\\n%s\\n\\n" "OS" "$(uname -a)" | ||
printf "%s:\\n%s\\n\\n" "SHELL" "$($SHELL --version)" | ||
printf "%s:\\n%s\\n\\n" "ASDF VERSION" "$(asdf_version)" | ||
printf "%s:\\n%s\\n\\n" "ASDF ENVIRONMENT VARIABLES" "$(env | grep -E "ASDF_DIR|ASDF_DATA_DIR|ASDF_CONFIG_FILE|ASDF_DEFAULT_TOOL_VERSIONS_FILENAME")" | ||
printf "%s:\\n%s\\n\\n" "ASDF INSTALLED PLUGINS" "$(asdf plugin list --urls --refs)" | ||
printf "%s:\\n%s\\n\\n" "ASDF INSTALLED PLUGINS" "$(plugin_list_command --urls --refs)" | ||
} | ||
|
||
info_command "$@" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,243 +1,9 @@ | ||
# -*- 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 find "$plugins_path" -mindepth 1 -type d &>/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 | ||
} | ||
# shellcheck source=lib/functions/versions.bash | ||
. "$(dirname "$(dirname "$0")")/lib/functions/versions.bash" | ||
# shellcheck source=lib/commands/reshim.bash | ||
. "$(dirname "$ASDF_CMD_FILE")/reshim.bash" | ||
# shellcheck source=lib/functions/installs.bash | ||
. "$(dirname "$(dirname "$0")")/lib/functions/installs.bash" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Code was re-arranged and calls to |
||
|
||
install_command "$@" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
asdf
is a binary on the user's path, whereasplugin_list_command
is a Bash function already in memory. While the code looks similar invokingasdf
results in a new process that re-executes all the code inbin/asdf
.