asdf-java/bin/functions
Russell Dempsey e883d242d0
Allow unset ASDF_DIR environment variable (#163)
Resolves the following error that displays for users who do not set ASDF_DIR:

    $HOME/.asdf/plugins/java/bin/list-all: line 3: /lib/utils.bash: No such file or directory

As indicated in the [official asdf docs][asdf docs], `ASDF_DIR` should default to `~/.asdf`, though asdf itself defaults to `$HOME/.asdf`:

> ASDF_DIR - Defaults to ~/.asdf - Location of the asdf scripts. If you install asdf to some other directory, set this to that directory. For example, if you are installing via the AUR, you should set this to /opt/asdf-vm.

[asdf docs]: http://asdf-vm.com/manage/configuration.html#environment-variables
2021-11-01 16:38:42 -04:00

185 lines
6.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# shellcheck source=/dev/null
source "${ASDF_DIR:-$HOME/.asdf}/lib/utils.bash"
CACHE_DIR="${TMPDIR:-/tmp}/asdf-java.cache"
if [ ! -d "${CACHE_DIR}" ]
then
mkdir -p "${CACHE_DIR}"
fi
KERNEL_NAME="$(uname -s)"
case "${KERNEL_NAME}" in
Darwin)
OS="macosx"
SHA256SUM="shasum -a 256"
STAT="/usr/bin/stat"
STAT_OPTS=('-f' '%c')
TEMP_DIR=$(/usr/bin/mktemp -dt asdf-java)
;;
Linux)
OS="linux"
SHA256SUM="sha256sum"
STAT="stat"
STAT_OPTS=('-c' '%Z')
TEMP_DIR=$(mktemp -dp /tmp asdf-java.XXXXXXXX)
;;
*) echo "Unknown operating system: ${KERNEL_NAME}"
exit 1
esac
trap 'test -d "${TEMP_DIR}" && rm -rf "${TEMP_DIR}"' EXIT
MACHINE="$(uname -m)"
case "${MACHINE}" in
x86_64) ARCHITECTURE="x86_64" ;;
aarch64|arm64) ARCHITECTURE="aarch64" ;;
armv7l) ARCHITECTURE="arm32-vfp-hflt" ;;
*) echo "Unknown machine architecture: ${MACHINE}"
exit 1
esac
function check-unzip() {
USAGE="Install unzip to continue. Aborting."
if ! [ -x "$(command -v unzip)" ]; then
echo "${USAGE}" >&2
exit 1;
fi
}
function retrieve-release-data() {
local cache_file="${CACHE_DIR}/releases-${OS}-${ARCHITECTURE}.tsv"
# shellcheck disable=SC2046
if [[ ! -r "${cache_file}" ]] || (( $($STAT "${STAT_OPTS[@]}" "${cache_file}") <= $(date +%s) - 3600 )) ; then
curl -s -f --compressed -L "https://raw.githubusercontent.com/halcyon/asdf-java/master/data/jdk-${OS}-${ARCHITECTURE}.tsv" -o "${cache_file}"
fi
}
function list-all() {
retrieve-release-data
cut -d $'\t' -f 1 "${CACHE_DIR}/releases-${OS}-${ARCHITECTURE}.tsv" | uniq | tr '\n' ' '
}
function list-legacy-filenames() {
echo ".java-version"
}
function install {
local release_data package_link package_filename checksum
local -a dirs
retrieve-release-data
release_data=$(grep "^${ASDF_INSTALL_VERSION} " "${CACHE_DIR}/releases-${OS}-${ARCHITECTURE}.tsv" | tail -n 1)
if [[ -z "${release_data}" ]]; then
echo "Unknown release: ${ASDF_INSTALL_VERSION}"
exit 1
fi
package_filename=$(cut -d $'\t' -f 2 <<<"${release_data}")
package_link=$(cut -d $'\t' -f 3 <<<"${release_data}")
checksum=$(cut -d $'\t' -f 4 <<<"${release_data}")
if [[ "${package_filename}" =~ "zip$" ]]; then
check-unzip
fi
cd "${TEMP_DIR}" || return 1
if ! curl -LO -# -w "${package_filename}\n" "${package_link}"; then
exit 1
fi
${SHA256SUM} -c <<<"${checksum} ${package_filename}"
case "${package_filename}" in
*zip) unzip "${package_filename}"
;;
*tar.gz) tar xf "${package_filename}"
;;
*) echo "Cannot extract ${package_filename}"
exit 1
;;
esac
read -r -a dirs <<<"$(ls -d ./*/)"
cd "${dirs[0]}" || return 1
if [ ! -d "${ASDF_INSTALL_PATH}" ]; then
mkdir -p "${ASDF_INSTALL_PATH}"
fi
case ${OS} in
macosx)
case ${ASDF_INSTALL_VERSION} in
zulu*)
mv ./* "${ASDF_INSTALL_PATH}"
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
local macOS_integration_path
macOS_integration_path="$(dirname "$(dirname "$(dirname "$(absolute_dir_path "${ASDF_INSTALL_PATH}/bin/..")")")")"
java_macos_integration_install "$macOS_integration_path"
fi
;;
liberica*)
mv ./* "${ASDF_INSTALL_PATH}"
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
echo "The ZIP packages of liberica do not contain the required files (Info.plist and the MacOS folder) to make /usr/libexec/java_home work correctly. You need the .pkg version to get those files."
fi
;;
*)
mv Contents/Home/* "${ASDF_INSTALL_PATH}"
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
local macOS_integration_path
macOS_integration_path="$(absolute_dir_path ".")"
java_macos_integration_install "$macOS_integration_path"
fi
;;
esac ;;
*) mv ./* "${ASDF_INSTALL_PATH}" ;;
esac
}
function uninstall {
case ${OS} in
macosx)
if [ -z "${ASDF_INSTALL_VERSION}" ]; then
true
else
if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then
java_macos_integration_remove
fi
fi
esac
rm -rf "${ASDF_INSTALL_PATH}"
}
function java_macos_integration_remove {
printf "Removing the integration with /usr/libexec/java_home needs root permission to delete the folder at /Library/Java/JavaVirtualMachines/%s\n" "${ASDF_INSTALL_VERSION}"
sudo rm -rf "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}"
}
function java_macos_integration_install {
local macOS_files_path
macOS_files_path="$1"
printf "Integrating with /usr/libexec/java_home needs root permission for it to create folders under /Library/Java/JavaVirtualMachines\n"
sudo mkdir -p "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents"
sudo cp -R "${macOS_files_path}/Contents/MacOS" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/"
sudo cp -R "${macOS_files_path}/Contents/Info.plist" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/"
sudo ln -s "${ASDF_INSTALL_PATH}" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home"
}
function absolute_dir_path {
local absolute_path
absolute_path="$( cd -P "$( dirname "$1" )" && pwd )"
echo "$absolute_path"
}
case "$(basename "${0}")" in
list-all) list-all
;;
list-legacy-filenames) list-legacy-filenames
;;
install) install
;;
uninstall) uninstall ;;
esac