#!/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}" != "" ]
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

# IMPORTANT: if you update the version here, other parts of infrastructure might needs updating as well
# (e.g. win RBE builds, sanity checks, bazel toolchains etc.)
VERSION=3.7.1
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
TOOLDIR=$(pwd)

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

filename="bazel-$VERSION-$suffix"

if [ ! -x "$filename" ] ; 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}" "${BASEURL_MIRROR}/${VERSION}/${filename}" || curl --fail -L --output "${filename}" "${BASEURL}/${VERSION}/${filename}"
  chmod a+x "$filename"
fi

popd >/dev/null
exec "$TOOLDIR/$filename" "$@"
