asdf-java/bin/functions

193 lines
6.6 KiB
Bash
Executable File

#!/usr/bin/env bash
PLUGIN_HOME="$(dirname "$(dirname "${0}")")"
CACHE_DIR="${TMPDIR:-/tmp}/asdf-java.cache"
CURL_OPTS=('-f' '-s')
shopt -s nullglob
CACHE_FILES=("${CACHE_DIR}"/*)
shopt -u nullglob
if [ ! -d "${CACHE_DIR}" ]
then
mkdir -p "${CACHE_DIR}"
fi
KERNEL_NAME="$(uname -s)"
case "${KERNEL_NAME}" in
Darwin) BASE64_OPTS=('-D')
OS="mac"
SHA256SUM="gsha256sum"
STAT_OPTS=('-f' '%c')
TEMP_DIR=$(/usr/bin/mktemp -dt asdf-java)
;;
Linux) BASE64_OPTS=('-d')
OS="linux"
SHA256SUM="sha256sum"
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="x64" ;;
*) echo "Unknown machine architecture: ${MACHINE}"
exit 1
esac
function check-jq() {
USAGE="Install jq to continue. Aborting."
if ! [ -x "$(command -v jq)" ]; then
echo "${USAGE}" >&2
exit 1;
fi
}
function retrieve-adoptopenjdk() {
local -a urls
local min_java=8
local max_java=14
local adopt_openjdk_url="https://api.adoptopenjdk.net/v3/assets/feature_releases/"
local github_curl_opts=("${CURL_OPTS[@]}" '-H' "Authorization: token $GITHUB_API_TOKEN")
for i in $(seq "${min_java}" "${max_java}")
do
local adopt_openjdk_options="&image_type=jdk&page=0&page_size=100&project=jdk&sort_order=ASC&vendor=adoptopenjdk"
local url="${adopt_openjdk_url}{${i}}/ga?architecture=${ARCHITECTURE}&os=${OS}${adopt_openjdk_options}"
urls+=("${url}")
done
urls+=('https://api.github.com/repos/SAP/SapMachine/releases')
if (( ${#CACHE_FILES[@]} == 0 )) || (( $(stat "${STAT_OPTS[@]}" "${CACHE_FILES[0]}") <= $(date +%s) - 3600 )) ; then
for url in "${urls[@]}"
do
case "${url}" in
*"api.adoptopenjdk.net"*)
curl "${CURL_OPTS[@]}" -L "${url}" -w "%{filename_effective}\n" \
-o "${CACHE_DIR}/adopt-#1.json" > /dev/null 2>&1
[[ "${url}" =~ \{([0-9]*)\} ]]
jq '(.[].release_name) |= sub("jdk-";"adopt-openjdk-") | (.[].release_name) |= sub("^jdk";"adopt-openjdk-")' \
"${CACHE_DIR}"/adopt-"${BASH_REMATCH[1]}".json > "${CACHE_DIR}"/adopt-"${BASH_REMATCH[1]}".temp
mv "${CACHE_DIR}"/adopt-"${BASH_REMATCH[1]}".temp "${CACHE_DIR}"/adopt-"${BASH_REMATCH[1]}".json
;;
*"api.github.com"*)
curl "${github_curl_opts[@]}" "${url}" -o "${CACHE_DIR}/sapmachine.json" > /dev/null 2>&1
jq '[.[]
| select(.prerelease == false and .draft == false)
| {
release_name: .name,
binaries: [
.assets[]
| select(.content_type == "application/x-tar")
| select(.name | startswith("sapmachine-jdk"))
| select(.name | endswith("linux-x64_bin.tar.gz") or endswith("osx-x64_bin.tar.gz"))
| {
package: {
link: .browser_download_url,
checksum_link: (.browser_download_url | sub("tar\\.gz$"; "sha256.txt"))
},
os: (if .name | endswith("osx-x64_bin.tar.gz") then "mac" else "linux" end),
architecture: "x64",
jvm_impl: "hotspot",
heap_size: "normal"
}]}]' "${CACHE_DIR}/sapmachine.json" > "${CACHE_DIR}/sapmachine.temp"
mv "${CACHE_DIR}"/sapmachine.temp "${CACHE_DIR}"/sapmachine.json
;;
esac
done
fi
}
function all-json() {
check-jq
jq -s 'add' "${CACHE_DIR}"/*.json "${PLUGIN_HOME}"/corretto/corretto.json "${PLUGIN_HOME}"/zulu/zulu.json
}
function list-all() {
check-jq
retrieve-adoptopenjdk
local hotspot="map(select(.binaries[].jvm_impl == \"hotspot\")) \
| map(.release_name) | unique[]"
local openj9_normal_heap="map(select(.binaries[].heap_size == \"normal\")) \
| map(.release_name) | unique[] | select(contains(\"openj9\"))"
local openj9_large_heap="map(select(.binaries[].heap_size == \"large\")) \
| map(.release_name + \"_large-heap\") | unique[] | select(contains(\"openj9\"))"
# shellcheck disable=SC2046
echo $(all-json | jq -r "${hotspot}" ; all-json | jq -r "${openj9_normal_heap}" ; all-json | jq -r "${openj9_large_heap}")
}
function list-legacy-filenames() {
echo ".java-version"
}
function install {
local package_link package_filename checksum checksum_or_checksum_link
local -a package sum dirs
case "${ASDF_INSTALL_VERSION}" in
*_large-heap) RELEASE="${ASDF_INSTALL_VERSION%%_large-heap}"
HEAP_SIZE="large"
;;
*) RELEASE="${ASDF_INSTALL_VERSION}"
HEAP_SIZE="normal"
;;
esac
check-jq
retrieve-adoptopenjdk
read -r -a package \
<<<"$(jq -r "map(select(.release_name==\"${RELEASE}\"))
| unique[]
| .binaries[]
| select(.os==\"${OS}\" and .architecture==\"${ARCHITECTURE}\" and .heap_size==\"${HEAP_SIZE}\")
| \"\(.package.link) \(.package.checksum // .package.checksum_link) \"" <<<"$(all-json)")"
package_link="${package[0]}"
checksum_or_checksum_link="${package[1]}"
package_filename=$(basename "${package_link}")
if base64 "${BASE64_OPTS[@]}" > /dev/null 2>&1 <<<"${checksum_or_checksum_link}"; then
checksum="${checksum_or_checksum_link}"
else
read -r -a sum<<<"$(curl -sL "${checksum_or_checksum_link}")"
checksum="${sum[0]}"
fi
cd "${TEMP_DIR}" || return 1
if ! curl -LO -# -w "${package_filename}\n" "${package_link}"; then
exit 1
fi
${SHA256SUM} -c <<<"${checksum} ${package_filename}"
tar xf "${package_filename}"
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
mac) case ${RELEASE} in
azul*) mv ./* "${ASDF_INSTALL_PATH}" ;;
*) mv Contents/Home/* "${ASDF_INSTALL_PATH}" ;;
esac ;;
*) mv ./* "${ASDF_INSTALL_PATH}" ;;
esac
}
case "$(basename "${0}")" in
list-all) list-all
;;
list-legacy-filenames) list-legacy-filenames
;;
install) install
;;
esac