From eb759df8bba3b43ef262b6b0c502d9ec480e5434 Mon Sep 17 00:00:00 2001 From: Wessel van Norel Date: Tue, 6 Apr 2021 00:12:36 +0200 Subject: [PATCH 1/5] Liberica now also has macOS Integration support With the help of BellLabs (https://github.com/bell-sw/Liberica/issues/42) we now also have Liberica macOS integration support. It doesn't work for all versions we can install, so it logs a warning in case it's not possible to use their "trick". For this to work we depend on @joschi java-metadata project. This project provides the shasum (and with that the check if the .pkg version exists). Other things done: - Fail if commands fail - Fixed unzip check - All error messages go to stderr - Aligned indent to 4 spaces - Removed all echo's in favor of printf in line with https://github.com/asdf-vm/asdf/pull/806 - Use the bash [[ conditions --- .github/workflows/tests.yml | 9 ++++ README.md | 5 +- bin/functions | 103 ++++++++++++++++++++++++------------ 3 files changed, 81 insertions(+), 36 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index be4e01ee..4ebdb1a5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,6 +37,7 @@ jobs: . asdf/asdf.sh asdf plugin-test java "$GITHUB_WORKSPACE" --asdf-plugin-gitref "$GITHUB_SHA" --asdf-tool-version adoptopenjdk-8.0.252+9.1.openj9-0.20.0 java -version - name: macOS Check java_home integration + if: matrix.os == 'macOS-latest' env: GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | @@ -44,4 +45,12 @@ jobs: echo "java_macos_integration_enable = yes" > "${ASDF_CONFIG_FILE}" . asdf/asdf.sh asdf plugin-test java "$GITHUB_WORKSPACE" --asdf-plugin-gitref "$GITHUB_SHA" --asdf-tool-version zulu-8.52.0.23 /usr/libexec/java_home -V 2>&1 | grep "Zulu 8.52.0.23" + - name: macOS Check java_home integration Liberica if: matrix.os == 'macOS-latest' + env: + GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + export ASDF_CONFIG_FILE=${HOME}"/.asdfrc" + echo "java_macos_integration_enable = yes" > "${ASDF_CONFIG_FILE}" + . asdf/asdf.sh + asdf plugin-test java "$GITHUB_WORKSPACE" --asdf-plugin-gitref "$GITHUB_SHA" --asdf-tool-version liberica-11.0.4 /usr/libexec/java_home -V 2>&1 | grep "OpenJDK 11.0.4-BellSoft" diff --git a/README.md b/README.md index 94bfdad4..966cb317 100644 --- a/README.md +++ b/README.md @@ -61,4 +61,7 @@ Setting java_macos_integration_enable to yes on `.asdfrc` file enables this inte java_macos_integration_enable = yes ``` -_Note: Not all distributions of Java JDK packages offer this integration (eg. liberica). This option only works for packages that **do offer** that integration._ +### Liberica +The Liberica distributions this plugin uses do not [contain the needed files for the macOS integration](https://github.com/bell-sw/Liberica/issues/42). +The plugin will try to download the `.pkg` distribution for the same version, but this does not always exist. +If it doesn't exist this plugin cannot provide the macOS Integration for that version. It will log a warning when that happens. diff --git a/bin/functions b/bin/functions index 19d5f806..b8e4ea57 100755 --- a/bin/functions +++ b/bin/functions @@ -1,9 +1,12 @@ #!/usr/bin/env bash +# If a command fails we want to abort right away, and we do not want to use unset variables +set -euo pipefail + # shellcheck source=/dev/null -source "$ASDF_DIR/lib/utils.bash" +source "${ASDF_DIR}/lib/utils.bash" CACHE_DIR="${TMPDIR:-/tmp}/asdf-java.cache" -if [ ! -d "${CACHE_DIR}" ] +if [[ ! -d "${CACHE_DIR}" ]] then mkdir -p "${CACHE_DIR}" fi @@ -24,7 +27,7 @@ case "${KERNEL_NAME}" in STAT_OPTS=('-c' '%Z') TEMP_DIR=$(mktemp -dp /tmp asdf-java.XXXXXXXX) ;; - *) echo "Unknown operating system: ${KERNEL_NAME}" + *) >&2 printf "Unknown operating system: %s\n" "${KERNEL_NAME}" exit 1 esac @@ -35,17 +38,17 @@ case "${MACHINE}" in x86_64) ARCHITECTURE="x86_64" ;; aarch64|arm64) ARCHITECTURE="aarch64" ;; armv7l) ARCHITECTURE="arm32-vfp-hflt" ;; - *) echo "Unknown machine architecture: ${MACHINE}" + *) >&2 printf "Unknown machine architecture: %s\n" "${MACHINE}" exit 1 esac function check-unzip() { - USAGE="Install unzip to continue. Aborting." + USAGE="Install unzip to continue. Aborting." - if ! [ -x "$(command -v unzip)" ]; then - echo "${USAGE}" >&2 - exit 1; - fi + if ! [[ -x "$(command -v unzip)" ]]; then + >&2 printf "%s\n" "${USAGE}" + exit 1 + fi } function retrieve-release-data() { @@ -63,7 +66,7 @@ function list-all() { } function list-legacy-filenames() { - echo ".java-version" + printf ".java-version\n" } function install { @@ -74,7 +77,7 @@ function install { release_data=$(grep "^${ASDF_INSTALL_VERSION} " "${CACHE_DIR}/releases.tsv" | tail -n 1) if [[ -z "${release_data}" ]]; then - echo "Unknown release: ${ASDF_INSTALL_VERSION}" + >&2 printf "Unknown release: %s\n" "${ASDF_INSTALL_VERSION}" exit 1 fi @@ -82,30 +85,56 @@ function install { package_link=$(cut -d $'\t' -f 3 <<<"${release_data}") checksum=$(cut -d $'\t' -f 4 <<<"${release_data}") - if [[ "${package_filename}" =~ "zip$" ]]; then + if [[ "${package_filename: -4}" == ".zip" ]]; then check-unzip fi - cd "${TEMP_DIR}" || return 1 - if ! curl -LO -# -w "${package_filename}\n" "${package_link}"; then - exit 1 + cd "${TEMP_DIR}" + + if [[ "${OS}" == "macosx" && + "${ASDF_INSTALL_VERSION}" == "liberica"* && + "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then + # change package_filename, link and checksum + new_package_filename="${package_filename/tar.gz/pkg}" + new_package_filename="${new_package_filename/zip/pkg}" + http_status=$(curl -s -o sha256 -w "%{http_code}" "https://joschi.github.io/java-metadata/checksums/liberica/${new_package_filename}.sha256") + new_checksum=$(cat sha256) + rm sha256 + if [[ "${http_status}" = "200" && "${#new_checksum}" -gt 0 ]]; then + package_filename=${new_package_filename} + package_link=${package_link/tar.gz/pkg} + package_link=${package_link/zip/pkg} + IFS=" " read -r -a checksum_parts <<< "${new_checksum}" + checksum=${checksum_parts[0]} + else + >&2 printf "Could not find a PKG version of %s so the macOS java_home integration will not work for this version\nSee https://github.com/halcyon/asdf-java/blob/master/README.md for more information\n" "${ASDF_INSTALL_VERSION}" + fi fi + curl -LO -# -w "${package_filename}\n" "${package_link}" + ${SHA256SUM} -c <<<"${checksum} ${package_filename}" case "${package_filename}" in - *zip) unzip "${package_filename}" + *zip) unzip -q "${package_filename}" ;; *tar.gz) tar xf "${package_filename}" ;; - *) echo "Cannot extract ${package_filename}" + *pkg) mkdir "${ASDF_INSTALL_VERSION}" + cd "${ASDF_INSTALL_VERSION}" + pkgutil --expand "../${package_filename}" tmp + gunzip -dc < tmp/*.pkg/Payload | cpio -i + rm -r tmp + cd .. + ;; + *) >&2 printf "Cannot extract %s\n" "${package_filename}" exit 1 ;; esac read -r -a dirs <<<"$(ls -d ./*/)" - cd "${dirs[0]}" || return 1 - if [ ! -d "${ASDF_INSTALL_PATH}" ]; then + cd "${dirs[0]}" + if [[ ! -d "${ASDF_INSTALL_PATH}" ]]; then mkdir -p "${ASDF_INSTALL_PATH}" fi @@ -114,21 +143,26 @@ function install { case ${ASDF_INSTALL_VERSION} in zulu*) mv ./* "${ASDF_INSTALL_PATH}" - if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then + 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." + if [[ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" && + "${package_filename}" = *".pkg" ]]; then + mv Contents/Home/* "${ASDF_INSTALL_PATH}" + local macOS_integration_path + macOS_integration_path="$(absolute_dir_path ".")" + java_macos_integration_install "$macOS_integration_path" + else + mv ./* "${ASDF_INSTALL_PATH}" fi ;; - *) + *) mv Contents/Home/* "${ASDF_INSTALL_PATH}" - if [ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]; then + 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" @@ -142,20 +176,18 @@ function install { 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 + if [[ -n "${ASDF_INSTALL_VERSION}" && "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then + java_macos_integration_remove + 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}" + if [[ -d "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" ]]; then + 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 { @@ -181,5 +213,6 @@ case "$(basename "${0}")" in ;; install) install ;; - uninstall) uninstall ;; + uninstall) uninstall + ;; esac From ef73d90cc6c4900af2b2f27efd33cdceb9af39b1 Mon Sep 17 00:00:00 2001 From: Wessel van Norel Date: Tue, 6 Apr 2021 00:14:57 +0200 Subject: [PATCH 2/5] Add do not to the link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 966cb317..56946cf2 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,6 @@ java_macos_integration_enable = yes ``` ### Liberica -The Liberica distributions this plugin uses do not [contain the needed files for the macOS integration](https://github.com/bell-sw/Liberica/issues/42). +The Liberica distributions this plugin uses [do not contain the needed files for the macOS integration](https://github.com/bell-sw/Liberica/issues/42). The plugin will try to download the `.pkg` distribution for the same version, but this does not always exist. If it doesn't exist this plugin cannot provide the macOS Integration for that version. It will log a warning when that happens. From b87ea32c915fa332745950db59a3873618f2ccaa Mon Sep 17 00:00:00 2001 From: Wessel van Norel Date: Tue, 6 Apr 2021 23:28:27 +0200 Subject: [PATCH 3/5] Removed `set -euo pipefail` and added exit 1 to commands that should not fail. Also improved some error handling. For example not being able to install the /usr/libexec/java_home integration should not fail the entire install --- bin/functions | 84 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/bin/functions b/bin/functions index b8e4ea57..c476bd29 100755 --- a/bin/functions +++ b/bin/functions @@ -1,14 +1,14 @@ #!/usr/bin/env bash -# If a command fails we want to abort right away, and we do not want to use unset variables -set -euo pipefail - # shellcheck source=/dev/null source "${ASDF_DIR}/lib/utils.bash" CACHE_DIR="${TMPDIR:-/tmp}/asdf-java.cache" if [[ ! -d "${CACHE_DIR}" ]] then - mkdir -p "${CACHE_DIR}" + if ! mkdir -p "${CACHE_DIR}"; then + >&2 printf "Could not create cache dir: '%s'. Aborting.\n" "${CACHE_DIR}" + exit 1 + fi fi KERNEL_NAME="$(uname -s)" @@ -89,7 +89,7 @@ function install { check-unzip fi - cd "${TEMP_DIR}" + cd "${TEMP_DIR}" || exit 1 if [[ "${OS}" == "macosx" && "${ASDF_INSTALL_VERSION}" == "liberica"* && @@ -111,53 +111,72 @@ function install { fi fi - curl -LO -# -w "${package_filename}\n" "${package_link}" + curl -LO -# -w "${package_filename}\n" "${package_link}" || exit 1 - ${SHA256SUM} -c <<<"${checksum} ${package_filename}" + ${SHA256SUM} -c <<<"${checksum} ${package_filename}" || exit 1 case "${package_filename}" in - *zip) unzip -q "${package_filename}" + *zip) if ! unzip -q "${package_filename}"; then + printf "Could not unzip '%s'. Aborting.\n" "${package_filename}" + exit 1 + fi ;; - *tar.gz) tar xf "${package_filename}" + *tar.gz) if ! tar xf "${package_filename}"; then + printf "Could not extract tar '%s'. Aborting.\n" "${package_filename}" + exit 1 + fi ;; - *pkg) mkdir "${ASDF_INSTALL_VERSION}" - cd "${ASDF_INSTALL_VERSION}" - pkgutil --expand "../${package_filename}" tmp - gunzip -dc < tmp/*.pkg/Payload | cpio -i + *pkg) error="Could not unpack '%s'. Aborting.\n" + mkdir "${ASDF_INSTALL_VERSION}" + cd "${ASDF_INSTALL_VERSION}" || exit 1 + if ! pkgutil --expand "../${package_filename}" tmp; then + # shellcheck disable=SC2059 + printf "${error}" "$package_filename" + exit 1 + fi + if ! gunzip -dc < tmp/*.pkg/Payload | cpio -i; then + # shellcheck disable=SC2059 + printf "${error}" "$package_filename" + exit 1 + fi rm -r tmp cd .. ;; - *) >&2 printf "Cannot extract %s\n" "${package_filename}" + *) >&2 printf "Don't know how to extract '%s'\n" "${package_filename}" exit 1 ;; esac read -r -a dirs <<<"$(ls -d ./*/)" - cd "${dirs[0]}" + cd "${dirs[0]}" || exit 1 if [[ ! -d "${ASDF_INSTALL_PATH}" ]]; then - mkdir -p "${ASDF_INSTALL_PATH}" + mkdir -p "${ASDF_INSTALL_PATH}" || exit 1 fi case ${OS} in macosx) case ${ASDF_INSTALL_VERSION} in zulu*) - mv ./* "${ASDF_INSTALL_PATH}" + mv ./* "${ASDF_INSTALL_PATH}" || exit 1 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" + if ! java_macos_integration_install "$macOS_integration_path"; then + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi fi ;; liberica*) if [[ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" && "${package_filename}" = *".pkg" ]]; then - mv Contents/Home/* "${ASDF_INSTALL_PATH}" + mv Contents/Home/* "${ASDF_INSTALL_PATH}" || exit 1 local macOS_integration_path macOS_integration_path="$(absolute_dir_path ".")" - java_macos_integration_install "$macOS_integration_path" + if ! java_macos_integration_install "$macOS_integration_path"; then + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi else - mv ./* "${ASDF_INSTALL_PATH}" + mv ./* "${ASDF_INSTALL_PATH}" || exit 1 fi ;; *) @@ -165,11 +184,14 @@ function install { 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" + if ! java_macos_integration_install "$macOS_integration_path"; then + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi fi ;; esac ;; - *) mv ./* "${ASDF_INSTALL_PATH}" ;; + *) mv ./* "${ASDF_INSTALL_PATH}" || exit 1 + ;; esac } @@ -177,16 +199,18 @@ function uninstall { case ${OS} in macosx) if [[ -n "${ASDF_INSTALL_VERSION}" && "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then - java_macos_integration_remove + if ! java_macos_integration_remove; then + >&2 printf "Removing the macos integration '%s' failed." "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi fi esac - rm -rf "${ASDF_INSTALL_PATH}" + rm -rf "${ASDF_INSTALL_PATH}" || exit 1 } function java_macos_integration_remove { if [[ -d "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" ]]; then 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}" + sudo rm -rf "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" || return 1 fi } @@ -194,10 +218,10 @@ 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" + sudo mkdir -p "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents" || return 1 + sudo cp -R "${macOS_files_path}/Contents/MacOS" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 + sudo cp -R "${macOS_files_path}/Contents/Info.plist" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 + sudo ln -s "${ASDF_INSTALL_PATH}" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 } function absolute_dir_path { From 8ab79b10b8aed9269e33e656712181ee2347e440 Mon Sep 17 00:00:00 2001 From: Wessel van Norel Date: Tue, 6 Apr 2021 23:32:09 +0200 Subject: [PATCH 4/5] Indent: 2 --- bin/functions | 374 +++++++++++++++++++++++++------------------------- 1 file changed, 187 insertions(+), 187 deletions(-) diff --git a/bin/functions b/bin/functions index c476bd29..8a7d7a8b 100755 --- a/bin/functions +++ b/bin/functions @@ -5,238 +5,238 @@ CACHE_DIR="${TMPDIR:-/tmp}/asdf-java.cache" if [[ ! -d "${CACHE_DIR}" ]] then - if ! mkdir -p "${CACHE_DIR}"; then - >&2 printf "Could not create cache dir: '%s'. Aborting.\n" "${CACHE_DIR}" - exit 1 - fi + if ! mkdir -p "${CACHE_DIR}"; then + >&2 printf "Could not create cache dir: '%s'. Aborting.\n" "${CACHE_DIR}" + exit 1 + fi 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) - ;; - *) >&2 printf "Unknown operating system: %s\n" "${KERNEL_NAME}" - exit 1 + 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) + ;; + *) >&2 printf "Unknown operating system: %s\n" "${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" ;; - *) >&2 printf "Unknown machine architecture: %s\n" "${MACHINE}" - exit 1 + x86_64) ARCHITECTURE="x86_64" ;; + aarch64|arm64) ARCHITECTURE="aarch64" ;; + armv7l) ARCHITECTURE="arm32-vfp-hflt" ;; + *) >&2 printf "Unknown machine architecture: %s\n" "${MACHINE}" + exit 1 esac function check-unzip() { - USAGE="Install unzip to continue. Aborting." + USAGE="Install unzip to continue. Aborting." - if ! [[ -x "$(command -v unzip)" ]]; then - >&2 printf "%s\n" "${USAGE}" - exit 1 - fi + if ! [[ -x "$(command -v unzip)" ]]; then + >&2 printf "%s\n" "${USAGE}" + exit 1 + fi } function retrieve-release-data() { - local cache_file="${CACHE_DIR}/releases.tsv" + local cache_file="${CACHE_DIR}/releases.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 + # 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.tsv" | uniq | tr '\n' ' ' + retrieve-release-data + cut -d $'\t' -f 1 "${CACHE_DIR}/releases.tsv" | uniq | tr '\n' ' ' } function list-legacy-filenames() { - printf ".java-version\n" + printf ".java-version\n" } 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.tsv" | tail -n 1) - if [[ -z "${release_data}" ]]; then - >&2 printf "Unknown release: %s\n" "${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: -4}" == ".zip" ]]; then - check-unzip + local release_data package_link package_filename checksum + local -a dirs + + retrieve-release-data + + release_data=$(grep "^${ASDF_INSTALL_VERSION} " "${CACHE_DIR}/releases.tsv" | tail -n 1) + if [[ -z "${release_data}" ]]; then + >&2 printf "Unknown release: %s\n" "${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: -4}" == ".zip" ]]; then + check-unzip + fi + + cd "${TEMP_DIR}" || exit 1 + + if [[ "${OS}" == "macosx" && + "${ASDF_INSTALL_VERSION}" == "liberica"* && + "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then + # change package_filename, link and checksum + new_package_filename="${package_filename/tar.gz/pkg}" + new_package_filename="${new_package_filename/zip/pkg}" + http_status=$(curl -s -o sha256 -w "%{http_code}" "https://joschi.github.io/java-metadata/checksums/liberica/${new_package_filename}.sha256") + new_checksum=$(cat sha256) + rm sha256 + if [[ "${http_status}" = "200" && "${#new_checksum}" -gt 0 ]]; then + package_filename=${new_package_filename} + package_link=${package_link/tar.gz/pkg} + package_link=${package_link/zip/pkg} + IFS=" " read -r -a checksum_parts <<< "${new_checksum}" + checksum=${checksum_parts[0]} + else + >&2 printf "Could not find a PKG version of %s so the macOS java_home integration will not work for this version\nSee https://github.com/halcyon/asdf-java/blob/master/README.md for more information\n" "${ASDF_INSTALL_VERSION}" fi + fi - cd "${TEMP_DIR}" || exit 1 - - if [[ "${OS}" == "macosx" && - "${ASDF_INSTALL_VERSION}" == "liberica"* && - "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then - # change package_filename, link and checksum - new_package_filename="${package_filename/tar.gz/pkg}" - new_package_filename="${new_package_filename/zip/pkg}" - http_status=$(curl -s -o sha256 -w "%{http_code}" "https://joschi.github.io/java-metadata/checksums/liberica/${new_package_filename}.sha256") - new_checksum=$(cat sha256) - rm sha256 - if [[ "${http_status}" = "200" && "${#new_checksum}" -gt 0 ]]; then - package_filename=${new_package_filename} - package_link=${package_link/tar.gz/pkg} - package_link=${package_link/zip/pkg} - IFS=" " read -r -a checksum_parts <<< "${new_checksum}" - checksum=${checksum_parts[0]} - else - >&2 printf "Could not find a PKG version of %s so the macOS java_home integration will not work for this version\nSee https://github.com/halcyon/asdf-java/blob/master/README.md for more information\n" "${ASDF_INSTALL_VERSION}" - fi - fi - - curl -LO -# -w "${package_filename}\n" "${package_link}" || exit 1 - - ${SHA256SUM} -c <<<"${checksum} ${package_filename}" || exit 1 - - case "${package_filename}" in - *zip) if ! unzip -q "${package_filename}"; then - printf "Could not unzip '%s'. Aborting.\n" "${package_filename}" - exit 1 - fi - ;; - *tar.gz) if ! tar xf "${package_filename}"; then - printf "Could not extract tar '%s'. Aborting.\n" "${package_filename}" - exit 1 - fi - ;; - *pkg) error="Could not unpack '%s'. Aborting.\n" - mkdir "${ASDF_INSTALL_VERSION}" - cd "${ASDF_INSTALL_VERSION}" || exit 1 - if ! pkgutil --expand "../${package_filename}" tmp; then - # shellcheck disable=SC2059 - printf "${error}" "$package_filename" - exit 1 - fi - if ! gunzip -dc < tmp/*.pkg/Payload | cpio -i; then - # shellcheck disable=SC2059 - printf "${error}" "$package_filename" - exit 1 - fi - rm -r tmp - cd .. - ;; - *) >&2 printf "Don't know how to extract '%s'\n" "${package_filename}" - exit 1 - ;; - esac + curl -LO -# -w "${package_filename}\n" "${package_link}" || exit 1 - read -r -a dirs <<<"$(ls -d ./*/)" - cd "${dirs[0]}" || exit 1 - if [[ ! -d "${ASDF_INSTALL_PATH}" ]]; then - mkdir -p "${ASDF_INSTALL_PATH}" || exit 1 - fi + ${SHA256SUM} -c <<<"${checksum} ${package_filename}" || exit 1 - case ${OS} in - macosx) - case ${ASDF_INSTALL_VERSION} in - zulu*) - mv ./* "${ASDF_INSTALL_PATH}" || exit 1 - 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/..")")")")" - if ! java_macos_integration_install "$macOS_integration_path"; then - >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" - fi - fi - ;; - liberica*) - if [[ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" && - "${package_filename}" = *".pkg" ]]; then - mv Contents/Home/* "${ASDF_INSTALL_PATH}" || exit 1 - local macOS_integration_path - macOS_integration_path="$(absolute_dir_path ".")" - if ! java_macos_integration_install "$macOS_integration_path"; then - >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" - fi - else - mv ./* "${ASDF_INSTALL_PATH}" || exit 1 - 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 ".")" - if ! java_macos_integration_install "$macOS_integration_path"; then - >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" - fi - fi - ;; - esac ;; - *) mv ./* "${ASDF_INSTALL_PATH}" || exit 1 - ;; - esac + case "${package_filename}" in + *zip) if ! unzip -q "${package_filename}"; then + printf "Could not unzip '%s'. Aborting.\n" "${package_filename}" + exit 1 + fi + ;; + *tar.gz) if ! tar xf "${package_filename}"; then + printf "Could not extract tar '%s'. Aborting.\n" "${package_filename}" + exit 1 + fi + ;; + *pkg) error="Could not unpack '%s'. Aborting.\n" + mkdir "${ASDF_INSTALL_VERSION}" + cd "${ASDF_INSTALL_VERSION}" || exit 1 + if ! pkgutil --expand "../${package_filename}" tmp; then + # shellcheck disable=SC2059 + printf "${error}" "$package_filename" + exit 1 + fi + if ! gunzip -dc < tmp/*.pkg/Payload | cpio -i; then + # shellcheck disable=SC2059 + printf "${error}" "$package_filename" + exit 1 + fi + rm -r tmp + cd .. + ;; + *) >&2 printf "Don't know how to extract '%s'\n" "${package_filename}" + exit 1 + ;; + esac + + read -r -a dirs <<<"$(ls -d ./*/)" + cd "${dirs[0]}" || exit 1 + if [[ ! -d "${ASDF_INSTALL_PATH}" ]]; then + mkdir -p "${ASDF_INSTALL_PATH}" || exit 1 + fi + + case ${OS} in + macosx) + case ${ASDF_INSTALL_VERSION} in + zulu*) + mv ./* "${ASDF_INSTALL_PATH}" || exit 1 + 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/..")")")")" + if ! java_macos_integration_install "$macOS_integration_path"; then + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi + fi + ;; + liberica*) + if [[ "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" && + "${package_filename}" = *".pkg" ]]; then + mv Contents/Home/* "${ASDF_INSTALL_PATH}" || exit 1 + local macOS_integration_path + macOS_integration_path="$(absolute_dir_path ".")" + if ! java_macos_integration_install "$macOS_integration_path"; then + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi + else + mv ./* "${ASDF_INSTALL_PATH}" || exit 1 + 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 ".")" + if ! java_macos_integration_install "$macOS_integration_path"; then + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi + fi + ;; + esac ;; + *) mv ./* "${ASDF_INSTALL_PATH}" || exit 1 + ;; +esac } function uninstall { - case ${OS} in - macosx) - if [[ -n "${ASDF_INSTALL_VERSION}" && "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then - if ! java_macos_integration_remove; then - >&2 printf "Removing the macos integration '%s' failed." "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" - fi - fi - esac - rm -rf "${ASDF_INSTALL_PATH}" || exit 1 + case ${OS} in + macosx) + if [[ -n "${ASDF_INSTALL_VERSION}" && "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then + if ! java_macos_integration_remove; then + >&2 printf "Removing the macos integration '%s' failed." "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + fi + fi + esac + rm -rf "${ASDF_INSTALL_PATH}" || exit 1 } function java_macos_integration_remove { - if [[ -d "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" ]]; then - 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}" || return 1 - fi + if [[ -d "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" ]]; then + 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}" || return 1 + fi } 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" || return 1 - sudo cp -R "${macOS_files_path}/Contents/MacOS" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 - sudo cp -R "${macOS_files_path}/Contents/Info.plist" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 - sudo ln -s "${ASDF_INSTALL_PATH}" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 + 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" || return 1 + sudo cp -R "${macOS_files_path}/Contents/MacOS" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 + sudo cp -R "${macOS_files_path}/Contents/Info.plist" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 + sudo ln -s "${ASDF_INSTALL_PATH}" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 } function absolute_dir_path { - local absolute_path - absolute_path="$( cd -P "$( dirname "$1" )" && pwd )" - echo "$absolute_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 + list-all) list-all + ;; + list-legacy-filenames) list-legacy-filenames + ;; + install) install + ;; + uninstall) uninstall ;; - uninstall) uninstall - ;; esac From 3489228df2ffbb55824e26b69bc5496286480a8a Mon Sep 17 00:00:00 2001 From: Wessel van Norel Date: Tue, 6 Apr 2021 23:48:28 +0200 Subject: [PATCH 5/5] Broke java_home integration, added () to fix that. Also added some missing \n to printf commands. --- bin/functions | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/functions b/bin/functions index 8a7d7a8b..3d58715a 100755 --- a/bin/functions +++ b/bin/functions @@ -162,7 +162,7 @@ function install { local macOS_integration_path macOS_integration_path="$(dirname "$(dirname "$(dirname "$(absolute_dir_path "${ASDF_INSTALL_PATH}/bin/..")")")")" if ! java_macos_integration_install "$macOS_integration_path"; then - >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'\n" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" fi fi ;; @@ -173,7 +173,7 @@ function install { local macOS_integration_path macOS_integration_path="$(absolute_dir_path ".")" if ! java_macos_integration_install "$macOS_integration_path"; then - >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'\n" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" fi else mv ./* "${ASDF_INSTALL_PATH}" || exit 1 @@ -185,7 +185,7 @@ function install { local macOS_integration_path macOS_integration_path="$(absolute_dir_path ".")" if ! java_macos_integration_install "$macOS_integration_path"; then - >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + >&2 printf "Failed to install the /usr/libexec/java_home integration in '%s'\n" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" fi fi ;; @@ -200,7 +200,7 @@ function uninstall { macosx) if [[ -n "${ASDF_INSTALL_VERSION}" && "$(get_asdf_config_value "java_macos_integration_enable")" = "yes" ]]; then if ! java_macos_integration_remove; then - >&2 printf "Removing the macos integration '%s' failed." "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" + >&2 printf "Removing the macos integration '%s' failed.\n" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" fi fi esac @@ -219,9 +219,9 @@ function java_macos_integration_install { 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" || return 1 - sudo cp -R "${macOS_files_path}/Contents/MacOS" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 - sudo cp -R "${macOS_files_path}/Contents/Info.plist" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 - sudo ln -s "${ASDF_INSTALL_PATH}" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home" || sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1 + sudo cp -R "${macOS_files_path}/Contents/MacOS" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || (sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1) + sudo cp -R "${macOS_files_path}/Contents/Info.plist" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/" || (sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1) + sudo ln -s "${ASDF_INSTALL_PATH}" "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}/Contents/Home" || (sudo rm -r "/Library/Java/JavaVirtualMachines/${ASDF_INSTALL_VERSION}" && return 1) } function absolute_dir_path {