#!/usr/bin/env bash
# Copyright 2015 The Vanadium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# bootstrap_jiri initializes a root directory for jiri.  The following
# directories and files will be created:
#   <root_dir>                         - root directory (picked by user)
#   <root_dir>/.jiri_root              - root metadata directory
#   <root_dir>/.jiri_root/bin/jiri     - jiri binary
#
# The jiri sources are downloaded and built into a temp directory, which is
# always deleted when this script finishes.  The <root_dir> is deleted on any
# failure.

set -euf -o pipefail

# Jiri repo, from which we will download the jiri script wrapper.
readonly JIRI_REPO_URL="https://fuchsia.googlesource.com/jiri"

# Google Storage bucket that contains prebuilt versions of jiri.
readonly CIPD_ENDPOINT_URL="https://chrome-infra-packages.appspot.com/dl/fuchsia/tools/jiri"

# fatal prints an error message, followed by the usage string, and then exits.
fatal() {
  usage='

Usage:
   bootstrap_jiri <root_dir>

A typical bootstrap workflow looks like this:

$ curl -s https://fuchsia.googlesource.com/jiri/+/main/scripts/bootstrap_jiri?format=TEXT | base64 --decode | bash -s myroot
$ export PATH=myroot/.jiri_root/bin:$PATH
$ cd myroot
$ jiri import manifest https://example.com/manifest
$ jiri update'
  echo "ERROR: $@${usage}" 1>&2
  exit 1
}

readonly HOST_ARCH=$(uname -m)
if [ "$HOST_ARCH" == "aarch64" -o "$HOST_ARCH" == "arm64" ]; then
  readonly ARCH="arm64"
elif [ "$HOST_ARCH" == "x86_64" ]; then
  readonly ARCH="amd64"
else
  echo "Arch not supported: $HOST_ARCH"
  exit 1
fi

# toabs converts the possibly relative argument into an absolute path.  Run in a
# subshell to avoid changing the caller's working directory.
toabs() (
  cd $(dirname $1)
  echo ${PWD}/$(basename $1)
)

# Check the <root_dir> argument is supplied.
if [[ $# -ne 1 ]]; then
  fatal "need <root_dir> argument"
fi

readonly ROOT_DIR="$(toabs $1)"
readonly BIN_DIR="${ROOT_DIR}/.jiri_root/bin"

# If ROOT_DIR doesn't already exist, we will destroy it during the exit trap,
# otherwise we will only destroy the BIN_DIR
if [[ -d "${ROOT_DIR}" ]]; then
  CLEANUP_DIR="${BIN_DIR}"
else
  CLEANUP_DIR="${ROOT_DIR}"
fi
mkdir -p "${BIN_DIR}"

# Remove the root_dir if this script fails so as to not leave the environment in a strange half-state.
trap "rm -rf -- \"${CLEANUP_DIR}\"" INT TERM EXIT

# Determine and validate the version of jiri.
HOST_OS=$(uname | tr '[:upper:]' '[:lower:]')
if [[ ${HOST_OS} == "darwin" ]]; then
  HOST_OS="mac"
fi
readonly TARGET="${HOST_OS}-${ARCH}"
readonly COMMIT_URL="${JIRI_REPO_URL}/+refs/heads/main?format=JSON"
readonly LOG_URL="${JIRI_REPO_URL}/+log/refs/heads/main?format=JSON"
readonly VERSION=$(curl -sSf "${COMMIT_URL}" | sed -n 's/.*"value": "\([0-9a-f]\{40\}\)"/\1/p')
readonly VERSIONS=$(curl -sSf "${LOG_URL}" | sed -n 's/.*"commit": "\([0-9a-f]\{40\}\)".*/\1/p')
readonly TEMP_FILE=$(mktemp)

JIRI_URL=""
for version in ${VERSIONS}; do
  url="${CIPD_ENDPOINT_URL}/${TARGET}/+/git_revision:${version}"
  if curl --output /dev/null --silent --fail "${url}"; then
    JIRI_URL="${url}"
	break
  fi
done

if [[ -z "${JIRI_URL}" ]]; then
  echo "Cannot find prebuilt Jiri binary." 1>&2
  exit 1
fi

if ! curl -sfL -o "${TEMP_FILE}" "${JIRI_URL}"; then
  echo "Failed downloading prebuilt Jiri archive." 1>&2
  exit 1
fi

if ! unzip -o ${TEMP_FILE} jiri -d ${BIN_DIR}  > /dev/null; then
  echo "Failed unarchiving Jiri"
  rm -rf ${TEMP_FILE}
  exit 1
fi

rm -rf ${TEMP_FILE}
chmod 755 "${BIN_DIR}/jiri"

# Install cipd, which is frequently needed to use manifests.
pushd "${BIN_DIR}" > /dev/null
if ! "${BIN_DIR}/jiri" bootstrap cipd; then
  echo "Running jiri bootstrap failed." 1>&2
  popd > /dev/null
  exit 1
fi
popd > /dev/null

echo "Please add ${BIN_DIR} to your PATH"

trap - EXIT
