1#!/bin/bash
2# Updater script for Bazel java_tools prebuilt jars and binaries in AOSP.
3#
4# Usage: update_java_tools.sh <commit> <absolute path to prebuilts/bazel/common> <absolute path to prebuilts/bazel/linux-x86_64>
5
6set -euo pipefail
7set -x
8
9function err() {
10    >&2 echo "$@"
11    exit 1
12}
13
14# Check that the necessary tools are installed.
15function check_prereqs() {
16    for cmd in curl xmllint git bazel-real; do
17        if ! command -v "${cmd}" &> /dev/null; then
18            err "Error: This script requires ${cmd}. Install it and ensure it is on your PATH."
19        fi
20    done
21}
22
23function check_sha256() {
24  local sha256=$1; shift
25  local downloaded_file=$1; shift
26    echo "Verifying checksum for ${downloaded_file} to be ${sha256}.."
27    if ! echo "${sha256} ${downloaded_file}" | sha256sum --check --status ; then
28      echo "ERROR: checksum of ${downloaded_file} did not match!"
29      echo "${sha256} ${downloaded_file}" | sha256sum --check --status
30      echo "${sha256} ${downloaded_file}" | sha256sum --check
31      exit 1
32    fi
33}
34
35BAZEL_BUILD_FLAGS=(
36  --incompatible_sandbox_hermetic_tmp
37  --verbose_failures
38)
39
40check_prereqs
41new_bazel="$1"; shift
42common_bazel_dir="$1"; shift
43linux_bazel_dir="$1"; shift
44bazel_src_dir="$1"; shift
45cd $(mktemp -d -p $HOME/.cache/bazel-aosp)
46touch WORKSPACE
47$new_bazel query "//external:remote_java_tools + //external:remote_java_tools_linux + //external:android_tools" --output=xml > repo_infos.xml
48remote_java_tools_url=$(xmllint --xpath "/query/rule[@name='//external:remote_java_tools']/list[@name='urls']/string[1]/@value" repo_infos.xml|sed -e "s/ value=\"//"|sed -e "s/\"//")
49remote_java_tools_sha256=$(xmllint --xpath "/query/rule[@name='//external:remote_java_tools']/string[@name='sha256']/@value" repo_infos.xml|sed -e "s/ value=\"//"|sed -e "s/\"//")
50remote_java_tools_linux_url=$(xmllint --xpath "/query/rule[@name='//external:remote_java_tools_linux']/list[@name='urls']/string[1]/@value" repo_infos.xml|sed -e "s/ value=\"//"|sed -e "s/\"//")
51remote_java_tools_linux_sha256=$(xmllint --xpath "/query/rule[@name='//external:remote_java_tools_linux']/string[@name='sha256']/@value" repo_infos.xml|sed -e "s/ value=\"//"|sed -e "s/\"//")
52android_tools_url=$(xmllint --xpath "/query/rule[@name='//external:android_tools']/string[@name='url']/@value" repo_infos.xml|sed -e "s/ value=\"//"|sed -e "s/\"//")
53android_tools_sha256=$(xmllint --xpath "/query/rule[@name='//external:android_tools']/string[@name='sha256']/@value" repo_infos.xml|sed -e "s/ value=\"//"|sed -e "s/\"//")
54
55echo "downloading remote_java_tools..."
56curl "${remote_java_tools_url}" --output java_tools.zip
57check_sha256 "${remote_java_tools_sha256}" "java_tools.zip"
58common_jars=("JavaBuilder_deploy.jar" "turbine_direct_binary_deploy.jar" "VanillaJavaBuilder_deploy.jar" "JacocoCoverage_jarjar_deploy.jar" "GenClass_deploy.jar" "Runner_deploy.jar")
59for jar in "${common_jars[@]}"
60do
61  unzip -o -d ${common_bazel_dir}/remote_java_tools java_tools.zip "java_tools/${jar}"
62done
63
64echo "downloading android_tools..."
65curl "${android_tools_url}" --output android_tools.tar
66check_sha256 "${android_tools_sha256}" "android_tools.tar"
67android_jars="all_android_tools_deploy.jar ImportDepsChecker_deploy.jar desugar_jdk_libs.jar"
68tar -C "${common_bazel_dir}/android_tools/android_tools" -xvf android_tools.tar ${android_jars}
69
70echo "downloading remote_java_tools_linux..."
71curl "${remote_java_tools_linux_url}" --output java_tools_prebuilt.zip
72check_sha256 "${remote_java_tools_linux_sha256}" "java_tools_prebuilt.zip"
73common_bins=("src/tools/singlejar/singlejar_local" "ijar/ijar")
74for bin in "${common_bins[@]}"
75do
76  unzip -o -d ${linux_bazel_dir}/remote_java_tools_linux java_tools_prebuilt.zip "java_tools/${bin}"
77done
78
79echo "building autocompletion script..."
80cd $bazel_src_dir
81$new_bazel build "${BAZEL_BUILD_FLAGS[@]}" //scripts:bazel-complete.bash
82cp bazel-bin/scripts/bazel-complete.bash ${common_bazel_dir}/bazel-complete.bash
83