asdf-java/bin/functions
Bojun Ren b966b6f706
support user home for macOS (#221)
Fix #213.

To install jdk at user home, set `java_macos_integration_in_home = yes`
2024-09-23 23:22:44 -04:00

268 lines
8.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# shellcheck source=/dev/null
### >>>>>>
### copy from https://github.com/asdf-vm/asdf/blob/master/lib/utils.bash
## fix https://github.com/halcyon/asdf-java/issues/177
## fix https://github.com/halcyon/asdf-java/issues/188
asdf_dir() {
if [ -z "$ASDF_DIR" ]; then
local current_script_path=${BASH_SOURCE[0]}
export ASDF_DIR
ASDF_DIR=$(
cd "$(dirname "$(dirname "$current_script_path")")" || exit
printf '%s\n' "$PWD"
)
fi
printf "%s\n" "$ASDF_DIR"
}
find_file_upwards() {
local name="$1"
local search_path
search_path=$PWD
while [ "$search_path" != "/" ]; do
if [ -f "$search_path/$name" ]; then
printf "%s\n" "${search_path}/$name"
return 0
fi
search_path=$(dirname "$search_path")
done
}
get_asdf_config_value_from_file() {
local config_path=$1
local key=$2
if [ ! -f "$config_path" ]; then
return 1
fi
local result
result=$(grep -E "^\s*$key\s*=\s*" "$config_path" | head | sed -e 's/^[^=]*= *//' -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
if [ -n "$result" ]; then
printf "%s\n" "$result"
return 0
fi
return 2
}
get_asdf_config_value() {
local key=$1
local config_path=${ASDF_CONFIG_FILE:-"$HOME/.asdfrc"}
local default_config_path=${ASDF_CONFIG_DEFAULT_FILE:-"$(asdf_dir)/defaults"}
local local_config_path
local_config_path="$(find_file_upwards ".asdfrc")"
get_asdf_config_value_from_file "$local_config_path" "$key" ||
get_asdf_config_value_from_file "$config_path" "$key" ||
get_asdf_config_value_from_file "$default_config_path" "$key"
}
### <<<<<<
CACHE_DIR="${TMPDIR:-/tmp}/asdf-java-$(whoami).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
local base_url="https://raw.githubusercontent.com/halcyon/asdf-java/master/data/jdk-${OS}-${ARCHITECTURE}"
local url
case "$(get_asdf_config_value "java_release_type")" in
ga) url="$base_url-ga.tsv" ;;
ea) url="$base_url-ea.tsv" ;;
all) url="$base_url-all.tsv" ;;
*) url="$base_url-ga.tsv" ;;
esac
curl -sS --compressed -L "${url}" -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 {
if [ "$(get_asdf_config_value "java_macos_integration_in_home")" = "yes" ]; then
rm -rf "$HOME/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}"
else
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}"
fi
}
function java_macos_integration_install {
local macOS_files_path
macOS_files_path="$1"
if [ "$(get_asdf_config_value "java_macos_integration_in_home")" = "yes" ]; then
mkdir -p "$HOME/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents"
cp -R "${macOS_files_path}/Contents/MacOS" "$HOME/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/"
cp -R "${macOS_files_path}/Contents/Info.plist" "$HOME/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/"
ln -s "${ASDF_INSTALL_PATH}" "$HOME/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home"
else
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"
fi
}
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