Upgrade to a new, fixed version of Bazel

Change-Id: I90f63a9cb40bcfde7552a79355dfbf9123bcd798
diff --git a/tools/bazel b/tools/bazel
new file mode 100755
index 0000000..39951f3
--- /dev/null
+++ b/tools/bazel
@@ -0,0 +1,105 @@
+#!/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="201607070016+7a0d360"
+
+readonly DOWNLOAD_DIR="$(dirname "${BASH_SOURCE[0]}")/../bazel-downloads"
+# 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 "${DOWNLOAD_DIR}" || true
+fi
+if [[ ! -d "${DOWNLOAD_DIR}" ]]; then
+  echo "Failed to create ${DOWNLOAD_DIR}" >&2
+  exit 1
+fi
+
+readonly INSTALLER_NAME="bazel_${VERSION}_amd64.deb"
+readonly DOWNLOAD_URL="http://frc971.org/Build-Dependencies/${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.
+  TEMP_DIR="$(mktemp --directory --tmpdir="${DOWNLOAD_DIR}")"
+  readonly TEMP_DIR
+
+  ( cd "${TEMP_DIR}"
+    wget "${DOWNLOAD_URL}" -O "${INSTALLER_NAME}" --no-verbose --show-progress
+    echo "Unpacking Bazel version ${VERSION}..." >&2
+    dpkg-deb -x "${INSTALLER_NAME}" extracted
+  )
+
+  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
+
+if [[ -x "${VERSION_BAZEL}-real" ]]; then
+  exec -a "${VERSION_BAZEL}" env -i \
+      HOSTNAME="${HOSTNAME}" \
+      SHELL="${SHELL}" \
+      USER="${USER}" \
+      PATH="${PATH}" \
+      LANG="${LANG}" \
+      HOME="${HOME}" \
+      LOGNAME="${LOGNAME}" \
+      TERM="${TERM}" \
+      "${VERSION_BAZEL}-real" "$@"
+fi
+if [[ -x "${VERSION_BAZEL}" ]]; then
+  exec env -i \
+      HOSTNAME="${HOSTNAME}" \
+      SHELL="${SHELL}" \
+      USER="${USER}" \
+      PATH="${PATH}" \
+      LANG="${LANG}" \
+      HOME="${HOME}" \
+      LOGNAME="${LOGNAME}" \
+      TERM="${TERM}" \
+      "${VERSION_BAZEL}" "$@"
+fi
+
+echo "Can't find the real bazel!" >&2
+exit 1