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

# This script installs cipd in ./tools/ and then executes it, passing through
# all arguments.

set -eo pipefail; [[ "${TRACE}" ]] && set -x

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

readonly VERSION_FILE="${SCRIPT_DIR}/.cipd_version"
readonly CIPD_BACKEND="https://chrome-infra-packages.appspot.com"

declare HOST_PLATFORM="$(uname -s | tr '[:upper:]' '[:lower:]')"
case "${HOST_PLATFORM}" in
  linux)
    readonly HOST_PLATFORM="linux"
    ;;
  darwin)
    readonly HOST_PLATFORM="mac"
    ;;
  *)
    echo "Unknown operating system." >&2
    exit 1
esac

HOST_ARCH="$(uname -m | tr '[:upper:]' '[:lower:]')"
case "${HOST_ARCH}" in
  x86_64|amd64)
    readonly HOST_ARCH="amd64"
    ;;
  arm*)
    readonly HOST_ARCH="${HOST_ARCH}"
    ;;
  *86)
    readonly HOST_ARCH=386
    ;;
  *)
    echo "Unknown machine architecture." >&2
    exit 1
esac

readonly PLATFORM="${HOST_PLATFORM}-${HOST_ARCH}"
readonly VERSION="$(cat ${VERSION_FILE})"
readonly URL="${CIPD_BACKEND}/client?platform=${PLATFORM}&version=${VERSION}"
# Put it in tools so that users can easily get it in their PATH.
readonly CLIENT="${SCRIPT_DIR}/tools/cipd"

readonly USER_AGENT="fuchsia-infra/prebuilt/$(git -C ${SCRIPT_DIR} rev-parse HEAD 2>/dev/null || echo "???")"

function actual_sha256() {
  if type shasum >/dev/null ; then
    shasum -a 256 "$1" | cut -d' ' -f1
  else
    echo "The \`shasum\` command is missing. Please use your package manager to install it." >&2
    return 1
  fi
}

function expected_sha256() {
  local line
  while read -r line; do
    if [[ "${line}" =~ ^([0-9a-z\-]+)[[:blank:]]+sha256[[:blank:]]+([0-9a-f]+)$ ]] ; then
      local platform="${BASH_REMATCH[1]}"
      local hash="${BASH_REMATCH[2]}"
      if [[ "${platform}" ==  "$1" ]]; then
        echo "${hash}"
        return 0
      fi
    fi
  done < "${VERSION_FILE}.digests"

  echo "Platform $1 is not supported by the CIPD client bootstrap. There's no pinned hash for it in the *.digests file." >&2

  return 1
}

# bootstraps the client from scratch using 'curl'.
function bootstrap() {
  local expected_hash="$(expected_sha256 "${PLATFORM}")"
  if [[ -z "${expected_hash}" ]] ; then
    exit 1
  fi

  echo "Bootstrapping cipd client for ${HOST_PLATFORM}-${HOST_ARCH}..."
  local CLIENT_TMP="$(mktemp -p "${SCRIPT_DIR}" 2>/dev/null || mktemp "${SCRIPT_DIR}/.cipd_client.XXXXXXX")"
  if type curl >/dev/null ; then
    curl -f --progress-bar "${URL}" -A "${USER_AGENT}"  -L -o "${CLIENT_TMP}"
  else
    echo "The \`curl\` command is missing. Please use your package manager to install it." >&2
    exit 1
  fi
  trap "rm -f '${CLIENT_TMP}'" EXIT ERR HUP INT TERM

  local actual_hash="$(actual_sha256 "${CLIENT_TMP}")"
  if [[ -z "${actual_hash}" ]] ; then
    exit 1
  fi

  if [[ "${actual_hash}" != "${expected_hash}" ]]; then
    echo "SHA256 digest of the downloaded CIPD client is incorrect. Check that *.digests file is up-to-date." >&2
    exit 1
  fi

  chmod +x "${CLIENT_TMP}"
  mkdir -p $(dirname ${CLIENT})
  mv -f "${CLIENT_TMP}" "${CLIENT}"
  trap - EXIT
}

# self_update asks the existing client to update itself, if necessary.
function self_update() {
  "${CLIENT}" selfupdate -version-file "${VERSION_FILE}" -service-url "${CIPD_BACKEND}"
}

if [[ ! -x "${CLIENT}" ]]; then
  bootstrap
fi

export CIPD_HTTP_USER_AGENT_PREFIX="${USER_AGENT}"
if ! self_update ; then
  echo "CIPD selfupdate failed. Trying to bootstrap the CIPD client from scratch..." >&2
  bootstrap
  if ! self_update ; then  # we need to run it again to setup .cipd_version file
    echo "Bootstrap from scratch failed. Run \`CIPD_HTTP_USER_AGENT_PREFIX=${USER_AGENT}/manual ${CLIENT} selfupdate -version-file '${VERSION_FILE}'\` to diagnose if this is repeating." >&2
  fi
fi

exec "${CLIENT}" "${@}"
