#!/usr/bin/env python3
#
# Copyright 2021 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import subprocess
import sys
import tempfile


def call(cmd):
  print("Executing: " + " ".join(cmd))
  subprocess.check_call(cmd)


def main():
  build_or_test = sys.argv[1]
  assert build_or_test in ["build", "test"]

  local_or_rbe = sys.argv[2]
  assert local_or_rbe in ["local", "rbe"]

  target = sys.argv[3]
  assert target in ["android-arm", "android-arm64", "linux", "windows"]

  print("Hello from {platform} in {cwd}!".format(platform=sys.platform,
                                                 cwd=os.getcwd()))

  # Create a temporary directory for the Bazel cache.
  #
  # We cannot use the default Bazel cache location ($HOME/.cache/bazel) because:
  #
  #  - The cache can be large (>10G).
  #  - Swarming bots have limited storage space on the root partition (15G).
  #  - Because the above, the Bazel build fails with a "no space left on
  #    device" error.
  #  - The Bazel cache under $HOME/.cache/bazel lingers after the tryjob
  #    completes, causing the Swarming bot to be quarantined due to low disk
  #    space.
  #  - Generally, it's considered poor hygiene to leave a bot in a different
  #    state.
  #
  # The temporary directory created by the below function call lives under
  # /mnt/pd0, which has significantly more storage space, and will be wiped
  # after the tryjob completes.
  #
  # Reference: https://docs.bazel.build/versions/master/output_directories.html#current-layout.
  with tempfile.TemporaryDirectory(prefix="bazel-cache-",
                                   dir=os.environ["TMPDIR"]) as cache_dir:
    def bazel(args):
      cmd = ["C:\\b\\s\\w\\ir\\bazel_win\\bazel.exe"] if target == "windows" \
            else ["bazel", "--output_user_root=" + cache_dir]
      call(cmd + args)

    try:
      # Print the Bazel version.
      bazel(["version"])

      # Compute the Bazel configuration to use.
      config = target
      if local_or_rbe == "rbe":
        config += "-rbe"

      # Run the requested Bazel command.
      os.chdir("skcms")
      bazel([build_or_test, "//...", "--config=" + config, "--google_default_credentials"])

    finally:
      # Kill the Bazel server, so as not to leave any children processes
      # outliving the Swarming task.
      bazel(["shutdown"])

if __name__ == "__main__":
  main()
