#!/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