#!/bin/bash
# Copyright 2019 The gRPC Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# Keeping up with Bazel's breaking changes is currently difficult.
# This script wraps calling bazel by downloading the currently
# supported version, and then calling it. This way, we can make sure
# that running bazel will always get meaningful results, at least
# until Bazel 1.0 is released.
# NOTE: This script relies on bazel's feature where //tools/bazel
# script can be used to hijack "bazel" invocations in given workspace.

set -e

# DISABLE_BAZEL_WRAPPER can be set to eliminate the wrapper logic
if [ "${DISABLE_BAZEL_WRAPPER}" != "" ] && [ "${OVERRIDE_BAZEL_VERSION}" == "" ]
then
  if [ "${BAZEL_REAL}" != "" ]
  then
    # use BAZEL_REAL as set by
    # https://github.com/bazelbuild/bazel/blob/master/scripts/packages/bazel.sh
    # that originally invoked this script (this is what happens when you
    # run "bazel" in our workspace)
    exec -a "$0" "${BAZEL_REAL}" "$@"
  else
    # if BAZEL_REAL is not set, just invoke the default system bazel
    exec bazel "$@"
  fi
fi

# Read the bazel version from .bazelversion file in the root of the grpc repository
BAZELVERSION_FILE_PATH="$(dirname $(readlink -f "$0"))/../.bazelversion"
VERSION_FROM_BAZELVERSION_FILE=$(cat ${BAZELVERSION_FILE_PATH})
VERSION=${OVERRIDE_BAZEL_VERSION:-${VERSION_FROM_BAZELVERSION_FILE}}
echo "INFO: Running bazel wrapper (see //tools/bazel for details), bazel version $VERSION will be used instead of system-wide bazel installation." >&2

# update tools/update_mirror.sh to populate the mirror with new bazel archives
BASEURL_MIRROR="https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/bazel/releases/download"
BASEURL="https://github.com/bazelbuild/bazel/releases/download"
pushd "$(dirname "$0")" >/dev/null
# bazel binary will be downloaded to GRPC_REPO_ROOT/tools directory by default
DOWNLOAD_DIR=${OVERRIDE_BAZEL_WRAPPER_DOWNLOAD_DIR:-$(pwd)}

case $(uname -sm) in
  "Linux x86_64")
    suffix=linux-x86_64
    ;;
  "Linux aarch64")
    suffix=linux-arm64
    ;;
  "Darwin x86_64")
    suffix=darwin-x86_64
    ;;
  "Darwin arm64")
    suffix=darwin-arm64
    ;;
  "MINGW"* | "MSYS_NT"*)
    suffix=windows-x86_64.exe
    ;;
  *)
    echo "Unsupported architecture: $(uname -sm)" >&2
    exit 1
    ;;
esac

filename="bazel-$VERSION-$suffix"
filename_abs="${DOWNLOAD_DIR}/${filename}"

if [ ! -x "${filename_abs}" ] ; then
  # first try to download using mirror, fallback to download from github
  echo "Downloading bazel, will try URLs: ${BASEURL_MIRROR}/${VERSION}/${filename} ${BASEURL}/${VERSION}/${filename}" >&2
  curl --fail -L --output "${filename_abs}" "${BASEURL_MIRROR}/${VERSION}/${filename}" || curl --fail -L --output "${filename_abs}" "${BASEURL}/${VERSION}/${filename}"
  chmod a+x "${filename_abs}"
fi

popd >/dev/null
exec "${filename_abs}" "$@"
