|  | #!/usr/bin/env bash | 
|  |  | 
|  | # Copyright 2018 The Fuchsia Authors | 
|  | # | 
|  | # Use of this source code is governed by a MIT-style | 
|  | # license that can be found in the LICENSE file or at | 
|  | # https://opensource.org/licenses/MIT | 
|  |  | 
|  | readonly SCRIPT_DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)" | 
|  | readonly ZIRCON_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" | 
|  | readonly PREBUILTS_DIR="$(cd "${ZIRCON_ROOT}/prebuilt" && pwd)" | 
|  | readonly ENSURE_FILE="${PREBUILTS_DIR}/zircon.ensure" | 
|  | readonly VERSIONS_FILE="${PREBUILTS_DIR}/zircon.versions" | 
|  | readonly GSUTIL="gsutil" | 
|  | readonly GS_URL_PREFIX="gs://fuchsia" | 
|  |  | 
|  | case "$#:$1" in | 
|  | 0:|1:--update) | 
|  | mode=update | 
|  | ;; | 
|  | 1:--verify) | 
|  | mode=verify | 
|  | ;; | 
|  | 1:--upload) | 
|  | mode=upload | 
|  | ;; | 
|  | *) | 
|  | echo >&2 "Usage: $0 [--update | --upload | --verify]" | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  |  | 
|  |  | 
|  | find_cipd() { | 
|  | # If the Zircon checkout is part of a jiri checkout that includes | 
|  | # //buildtools, then find cipd there.  Otherwise, if cipd is in | 
|  | # the PATH, take it from there. | 
|  | type -p "${ZIRCON_ROOT}/../buildtools/cipd" || type -p cipd | 
|  | } | 
|  |  | 
|  | readonly CIPD="$(find_cipd)" || { | 
|  | echo >&2 "$0: Need cipd in the PATH" | 
|  | } | 
|  |  | 
|  | resolve_one_package() { | 
|  | local -r package="$1" version="$2" | 
|  | local result | 
|  | result="$($CIPD resolve "fuchsia/$package" -version "$version")" || { | 
|  | local rc=$? | 
|  | echo >&2 "$0: cipd cannot resolve fuchsia/$package -version $version" | 
|  | return $rc | 
|  | } | 
|  | echo "${package} ${result##*:}" | 
|  | } | 
|  |  | 
|  | # TODO(crbug.com/827637): Use `cipd ensure-file-verify -resolve` when that | 
|  | # gets implemented. | 
|  | resolve_ensure_file() { | 
|  | echo "\ | 
|  | # This file is generated by scripts/update-prebuilt-versions.  DO NOT EDIT! | 
|  | # Instead, edit zircon.ensure and run the script. | 
|  | " | 
|  |  | 
|  | local -a platforms matched_platforms | 
|  | local lhs rhs package platform | 
|  | while read lhs rhs; do | 
|  | case "$lhs" in | 
|  | '$VerifiedPlatform') | 
|  | platforms+=("$rhs") | 
|  | ;; | 
|  | '#MatchedPlatform') | 
|  | matched_platforms+=("$rhs") | 
|  | ;; | 
|  | fuchsia/*/\${platform}) | 
|  | lhs="${lhs#fuchsia/}" | 
|  | package="${lhs%/*}" | 
|  | for platform in "${platforms[@]}"; do | 
|  | resolve_one_package "${package}/${platform}" "$rhs" || return | 
|  | done | 
|  | ;; | 
|  | fuchsia/*/\${os=*) | 
|  | lhs="${lhs#fuchsia/}" | 
|  | package="${lhs%/*}" | 
|  | lhs="${lhs#*=}" | 
|  | lhs="${lhs%%\}*}" | 
|  | for platform in "${platforms[@]}" "${matched_platforms[@]}"; do | 
|  | if [[ "$platform" == $lhs-* ]]; then | 
|  | resolve_one_package "${package}/${platform}" "$rhs" || return | 
|  | fi | 
|  | done | 
|  | ;; | 
|  | fuchsia/*) | 
|  | package="${lhs#fuchsia/}" | 
|  | resolve_one_package "$package" "$rhs" || return | 
|  | ;; | 
|  | esac | 
|  | done | 
|  | } | 
|  |  | 
|  | do_staged_uploads() { | 
|  | local -r zipfile="$1" | 
|  | while read package instance; do | 
|  | if [[ -z "$package" || "$package" == \#* ]]; then | 
|  | continue | 
|  | fi | 
|  | rm -f "$zipfile" | 
|  | "$CIPD" pkg-fetch "fuchsia/$package" -version "$instance" -out "$zipfile" | 
|  | "$GSUTIL" cp -n "$zipfile" "${GS_URL_PREFIX}/${package}/${instance}" | 
|  | done | 
|  | } | 
|  |  | 
|  | NEW_VERSIONS_FILE="$(mktemp "${PREBUILTS_DIR}/tmp.versions.XXXXXX")" || exit | 
|  | trap 'rm -f "$NEW_VERSIONS_FILE"' EXIT ERR HUP INT TERM | 
|  |  | 
|  | set -e -o pipefail | 
|  |  | 
|  | resolve_ensure_file < "$ENSURE_FILE" > "$NEW_VERSIONS_FILE" | 
|  |  | 
|  | if [[ "$mode" = upload ]]; then | 
|  | cmp -s "$VERSIONS_FILE" "$NEW_VERSIONS_FILE" || { | 
|  | echo >&2 "Run $0 --update first." | 
|  | exit 1 | 
|  | } | 
|  | rm -f "$NEW_VERSIONS_FILE" | 
|  | STAGING_ZIP="$(mktemp "${PREBUILTS_DIR}/tmp.zip.XXXXXX")" | 
|  | trap 'rm -f "$STAGING_ZIP"' EXIT ERR HUP INT TERM | 
|  | do_staged_uploads "$STAGING_ZIP" < "$VERSIONS_FILE" | 
|  | exit | 
|  | fi | 
|  |  | 
|  | diff -u "$VERSIONS_FILE" "$NEW_VERSIONS_FILE" && exit 0 | 
|  | status=$? | 
|  |  | 
|  | if [[ "$mode" = update ]]; then | 
|  | mv -f "$NEW_VERSIONS_FILE" "$VERSIONS_FILE" | 
|  | exit 0 | 
|  | fi | 
|  |  | 
|  | exit $status |