#!/bin/bash

# The bazel script calls this instead of the bazel-real binary which is
# installed next to it. This script downloads a specific version of Bazel and
# then calls that.

# Alternatively, if the environment variable BAZEL_OVERRIDE is set, that will be
# run directly (after printing a message). That is intended for testing only.

# This script operates based on the assumption that any directory of the correct
# name is a fully extracted, valid Bazel installation. It is careful to avoid
# putting an invalid directory at that name at any point.

set -e
set -u
set -o pipefail

if [[ -n "${BAZEL_OVERRIDE+x}" ]]; then
  tput setaf 1 >&2
  echo -n "Actually calling " >&2
  tput setaf 3 >&2
  echo "${BAZEL_OVERRIDE}" >&2
  tput sgr0 >&2
  exec "${BAZEL_OVERRIDE}" "$@"
fi

readonly VERSION="7.2.0rc1"

readonly DOWNLOAD_DIR="${HOME}/.cache/bazel"
# Directory to unpack bazel into.  This must change whenever bazel changes.
readonly VERSION_DIR="${DOWNLOAD_DIR}/${VERSION}-v1"
readonly VERSION_BAZEL="${VERSION_DIR}/usr/bin/bazel"

# Creating might fail if another invocation is racing us.
if [[ ! -d "${DOWNLOAD_DIR}" ]]; then
  mkdir -p "${DOWNLOAD_DIR}" || true
fi
if [[ ! -d "${DOWNLOAD_DIR}" ]]; then
  echo "Failed to create ${DOWNLOAD_DIR}" >&2
  exit 1
fi

readonly INSTALLER_NAME="bazel-${VERSION}-linux-x86_64"
readonly DOWNLOAD_URL="https://software.frc971.org/Build-Dependencies/github.com/bazelbuild/bazel/releases/download/${VERSION}/${INSTALLER_NAME}"

if [[ ! -d "${VERSION_DIR}" ]]; then
  echo "Downloading Bazel version ${VERSION} from ${DOWNLOAD_URL}..." >&2

  # A temporary directory which is definitely on the same filesystem as our final
  # destination, which is important so we can atomically move it.
  # If this move is non-atomic, then a concurrent Bazel command (like the verifier
  # uses several of) could use a half-copied Bazel installation.
  mkdir -p "${HOME}/.cache/bazel"
  DOWNLOAD_TEMP_DIR="$(mktemp --directory --tmpdir="${HOME}/.cache/bazel")"
  TEMP_DIR="$(mktemp --directory --tmpdir="${DOWNLOAD_DIR}")"
  readonly DOWNLOAD_TEMP_DIR
  readonly TEMP_DIR

  ( cd "${DOWNLOAD_TEMP_DIR}"
    # Now, download into the ~/.cache folder
    if [ ! -e "${HOME}/.cache/bazel/${INSTALLER_NAME}" ];
    then
      NOISINESS=--silent
      if [ -t 0 ] ; then
        echo on terminal
        NOISINESS=
      fi
      curl --output "${INSTALLER_NAME}" "${DOWNLOAD_URL}" ${NOISINESS}
      mv "${INSTALLER_NAME}" "${HOME}/.cache/bazel/${INSTALLER_NAME}"
    fi
    rm -rf "${DOWNLOAD_TEMP_DIR}"
  )

  ( cd "${TEMP_DIR}"
    echo "Copying Bazel version ${VERSION}..." >&2
    mkdir -p extracted/usr/bin
    cp ${HOME}/.cache/bazel/${INSTALLER_NAME} extracted/usr/bin/bazel-real
    chmod a+x extracted/usr/bin/bazel-real
  )

  touch "${TEMP_DIR}/extracted/usr/bin/bazel.bazelrc"

  # Careful: somebody else might have already done it. If they manage to make
  # the move between our check and our move, then we'll end up with a random
  # extracted directory which won't do anybody any harm. If somebody else does
  # that first, then our move will fail.
  if [[ ! -d "${VERSION_DIR}" ]]; then
    mv "${TEMP_DIR}/extracted" "${VERSION_DIR}" || true
  fi
  if [[ ! -d "${VERSION_DIR}" ]]; then
    echo "Failed to create ${VERSION_DIR}" >&2
    exit 1
  fi
  rm -rf "${TEMP_DIR}"
  echo "Done downloading Bazel version ${VERSION}"
fi

ENVIRONMENT_VARIABLES=()
ENVIRONMENT_VARIABLES+=(HOSTNAME="${HOSTNAME}")
ENVIRONMENT_VARIABLES+=(SHELL="${SHELL}")
ENVIRONMENT_VARIABLES+=(USER="${USER}")
ENVIRONMENT_VARIABLES+=(PATH="${PATH}")
ENVIRONMENT_VARIABLES+=(HOME="${HOME}")
ENVIRONMENT_VARIABLES+=(TERM="${TERM}")
ENVIRONMENT_VARIABLES+=(LANG="${LANG:-C}")
ENVIRONMENT_VARIABLES+=(BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1)

if [[ ! -z "${CARGO_BAZEL_REPIN+x}" ]]; then
  ENVIRONMENT_VARIABLES+=(CARGO_BAZEL_REPIN="${CARGO_BAZEL_REPIN}")
fi

if [[ ! -z "${DISPLAY+x}" ]]; then
  ENVIRONMENT_VARIABLES+=(DISPLAY="${DISPLAY}")
fi

if [[ ! -z "${SSH_AUTH_SOCK+x}" ]]; then
  ENVIRONMENT_VARIABLES+=(SSH_AUTH_SOCK="${SSH_AUTH_SOCK}")
fi

if [[ ! -z "${LOGNAME+x}" ]]; then
    ENVIRONMENT_VARIABLES+=(LOGNAME="${LOGNAME}")
fi

if [[ -x "${VERSION_BAZEL}-real" ]]; then
  exec -a "${VERSION_BAZEL}" env -i \
      "${ENVIRONMENT_VARIABLES[@]}" \
      "${VERSION_BAZEL}-real" "$@"
fi
if [[ -x "${VERSION_BAZEL}" ]]; then
  exec env -i \
      "${ENVIRONMENT_VARIABLES[@]}" \
      "${VERSION_BAZEL}" "$@"
fi

echo "Can't find the real bazel!" >&2
exit 1
