#!/usr/bin/env bash # shellcheck disable=SC2001 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" OS=$(uname) case "$OS" in Linux) OS="${OS,,}" ;; Darwin) OS="osx" ;; *) printf 'Unsupported system\n' exit 1 ;; esac # get SDK version in the format of EDITIONuVERSIONbBUILD e.g. 11u06b722 function get_sdk_version() { sed 's/jbr\?sdk-\?\([[:digit:]]\+\)[u_]\([[:digit:]]\+\)[_-]\?\([[:digit:]]\+\)\(-[[:alpha:]]\+-[xi][[:digit:]]\+-\)\?\(b[[:digit:]]\+\)\..*/\1u\2\3\5/' <<< "$1" } function compare_sdk_versions() { readarray -d $'\t' L <<< "$(sed "s/^0*\([0-9]\+\)u0*\([0-9]\+\)b0*\([0-9]\+\)$/\1\t\2\t\3/" <<< "$1")" readarray -d $'\t' R <<< "$(sed "s/^0*\([0-9]\+\)u0*\([0-9]\+\)b0*\([0-9]\+\)$/\1\t\2\t\3/" <<< "$2")" for i in "${!L[@]}"; do if [[ "${L[$i]}" -lt "${R[$i]}" ]]; then printf -- '-1' return 0 elif [[ "${L[$i]}" -gt "${R[$i]}" ]]; then printf '1' return 0 fi done printf '0' } function get_download_link() { printf 'https://bintray.com/jetbrains/intellij-jbr/download_file?file_path=%s' "$1" } # list local SDKs readarray -d $'\n' -t SDK_LIST <<< "$(find "$DIR" -maxdepth 1 -type f \( -name "jbrsdk-11*.tar.gz" -or -name "jbrsdk-8*.tar.gz" \) -exec basename '{}' \; | sort)" printf 'Fetching file list...\n\n' # list remote SDKs via Bintray API for sdk_edition in '8' '11'; do DOWNLOADABLE_FILES_VAR_NAME="DOWNLOADABLE_FILES_$sdk_edition" BINTRAY_API="https://api.bintray.com/packages/jetbrains/intellij-jbr/jbrsdk$sdk_edition-$OS-x64/files" readarray -d $'\n' -t "$DOWNLOADABLE_FILES_VAR_NAME" <<< "$(curl $BINTRAY_API 2>/dev/null | jq -r '[.[] | select(.path | contains("sdk") and (contains("checksum") | not))] | sort_by(.created) | reverse | .[].path')" done declare -a TO_DOWNLOAD=() declare -a TO_REMOVE=() # find latest builds for local SDKs printf "INSTALLED\t\t\t\tLATEST\n" for sdk in "${SDK_LIST[@]}"; do SDK_VERSION=$(get_sdk_version "$sdk") FILE_NAME="" sdk_edition="$(cut -d 'u' -f 1 <<< "$SDK_VERSION")" DOWNLOADABLE_FILES_VAR_NAME="DOWNLOADABLE_FILES_${sdk_edition}[@]" for sdk_remote in "${!DOWNLOADABLE_FILES_VAR_NAME}"; do SDK_REMOTE_VERSION=$(get_sdk_version "$sdk_remote") if [[ "$SDK_VERSION" == "$SDK_REMOTE_VERSION" ]]; then # find out the filename of the latest build in DOWNLOADABLE_FILES_x, which was sorted by creation date descendingly FILE_NAME="$sdk_remote" break fi done if [[ "$sdk" == "$FILE_NAME" ]]; then printf '%s\t(UP-TO-DATE)\n' "$sdk" else printf '%s\t%s\n' "$sdk" "$FILE_NAME" DOWNLOAD_LINK=$(get_download_link "$FILE_NAME") TO_DOWNLOAD+=( "$DOWNLOAD_LINK" ) TO_REMOVE+=( "$sdk" ) fi done # find the latest remote SDK declare -A LATEST_INSTALLED declare -A LATEST_AVAILABLE declare -A LATEST_LINK for sdk_edition in '8' '11'; do for sdk in "${SDK_LIST[@]}"; do SDK_VERSION=$(get_sdk_version "$sdk") if [[ "$SDK_VERSION" == "$sdk_edition""u"* && ( -z "${LATEST_INSTALLED[$sdk_edition]}" || $(compare_sdk_versions "$SDK_VERSION" "${LATEST_INSTALLED[$sdk_edition]}") -gt 0 ) ]]; then LATEST_INSTALLED[$sdk_edition]="$SDK_VERSION" fi done DOWNLOADABLE_FILES_VAR_NAME="DOWNLOADABLE_FILES_${sdk_edition}[@]" # we have to traverse through the whole list as new builds of old versions can be released after new versions for sdk in "${!DOWNLOADABLE_FILES_VAR_NAME}"; do SDK_VERSION=$(get_sdk_version "$sdk") if [[ "$SDK_VERSION" == "$sdk_edition""u"* && ( -z "${LATEST_AVAILABLE[$sdk_edition]}" || $(compare_sdk_versions "$SDK_VERSION" "${LATEST_AVAILABLE[$sdk_edition]}") -gt 0 ) ]]; then LATEST_AVAILABLE[$sdk_edition]="$SDK_VERSION" LATEST_LINK[$sdk_edition]=$(get_download_link "$sdk") fi done done if [[ "${#TO_DOWNLOAD[@]}" -gt 0 ]]; then printf '\n' read -p "Upgrade all? [y/n] " -n 1 -r printf '\n' if [[ "$REPLY" != "y" ]]; then TO_DOWNLOAD=() TO_REMOVE=() fi fi for sdk_edition in '8' '11'; do if [[ -z "${LATEST_INSTALLED[$sdk_edition]}" || $(compare_sdk_versions "${LATEST_INSTALLED[$sdk_edition]}" "${LATEST_AVAILABLE[$sdk_edition]}") -lt 0 ]]; then printf '\n' read -p "Latest SDK $sdk_edition version ${LATEST_AVAILABLE[$sdk_edition]} is not installed yet. Download? [y/n] " -n 1 -r printf '\n' if [[ "$REPLY" == "y" ]]; then TO_DOWNLOAD+=( "${LATEST_LINK[$sdk_edition]}" ) TO_REMOVE+=( "" ) fi fi done if [[ "${#TO_DOWNLOAD[@]}" -eq 0 ]]; then exit 0 fi for i in "${!TO_DOWNLOAD[@]}"; do aria2c -d "$DIR" -s4 -x4 "${TO_DOWNLOAD[$i]}" # shellcheck disable=SC2181 if [[ $? -eq 0 && -n "${TO_REMOVE[$i]}" ]]; then # delete old build if download was successful rm "$DIR/${TO_REMOVE[$i]}" fi done