#!/bin/bash
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#### CATEGORY=Build
### manage Goma distributed compilation client

## Usage: fx goma [--browser] [--update] [--disable-http2] [--disable-local-cache]
##                [--local-cache-dir ABS_PATH]
##
## This makes sure that both initial setup tasks are complete and that
## periodic maintenance actions are done.  It's probably only really
## necessary to run it once, but it should be harmless (and reasonably
## fast) to run it again any time, such as after a `jiri update`.  It's
## just not a good idea to run it while you have a build running in the
## background, since it may result in restarting the local Goma client
## service and causing all new compilation commands to fail for a moment.
##
## See also `fx goma_auth` and `fx goma_ctl`.  This mostly just runs those.
##
## The `fx goma_auth` command is usually only needed once at setup time to
## run `fx goma_auth login`, which is done by `fx goma` if needed.  Use `fx
## goma_auth help` for details on `fx goma_auth` subcommands.  If something
## seems to be wrong, you can run the command `fx goma_auth logout` and
## then repeat `fx goma`.
##
## The `fx goma_ctl` command controls the Goma client service on your local
## machine.  Use `fx goma_ctl help` for details.  The common subcommand used
## every day is `fx goma_ctl ensure_start` to make sure your local client
## service is running.  (`fx goma` does this for you but only after a few other
## checks that might be somewhat slower than `fx goma_ctl ensure_start` alone.)
##
## The `--browser` switch is passed along to `fx goma_auth login` so that
## it attempts to launch a browser window to perform authentication.  This
## may or may not work, depending on your desktop and command-line setup.
## Without that switch, it will print out a URL you need to visit in your
## browser to (authenticate and) copy a token to paste into a prompt.
##
## The `--disable-http2` switch disables the experimental HTTP2 proxy.
## By default, the HTTP2 proxy is enabled to improve Goma network
## performance.
##
## The `--disable-local-cache` switch disables the experimental local
## output cache. By default, this is enabled to reduce Goma network
## traffic.
##
## The `--local-cache-dir ABS_PATH` switch sets the cache directory for Goma.
## By default it uses the `//.jiri_root/goma_cache` directory. If you have
## multiple Fuchsia checkouts, it is recommended to set its value to
## `${HOME}/.goma_cache` to allow cache sharing. The value needs to be an
## absolute path.
##
## The `--kill` switch shuts down all goma related processes.
##
## **NOTE:** _The following features are temporary for the transition._
##
## `fx goma` checks for an old Goma installation and recommends commands to
## update to the current recommended style managed by `fx goma`.
##
## It also checks the current Fuchsia build directory's Goma configuration.
## This is the only aspect of `fx goma` that refers to a build directory
## (as controlled by the `--dir` switch to `fx` or the most recent `fx set`
## or `fx use` command).  It will report whether the build is set to use
## the recommended Goma setup managed by `fx goma`.  If given the
## `--update` switch, it will modify the existing `args.gn` and then re-run
## `fx gen` to enable Goma with the standard setup.  This results in the
## same configuration that a fresh `fx set` will with the `--goma` switch
## (or without the switch, once `fx goma` has been done once).
##

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $?

set -euo pipefail


if [[ -z "${GOMA_LOCAL_OUTPUT_CACHE_DIR+x}" ]]; then
  GOMA_CACHE_DIR="${FUCHSIA_DIR}/.jiri_root/goma_cache"
else
  # inherit the local cache dir from the environment if already set
  GOMA_CACHE_DIR="$GOMA_LOCAL_OUTPUT_CACHE_DIR"
fi

function main {
  local login_args=() update=false use_http2=true use_local_cache=true use_ats=false

  while [ $# -gt 0 ]; do
    case "$1" in
    --browser)
      login_args+=("$1")
      shift
      ;;
    --update)
      update=true
      shift
      ;;
    --disable-http2)
      use_http2=false
      shift
      ;;
    --disable-local-cache)
      use_local_cache=false
      shift
      ;;
    --enable-ats)
      use_ats=true
      shift
      ;;
    --local-cache-dir)
      if [[ $# -lt 2 ]]; then
        fx-command-help
        return 1
      fi
      shift
      GOMA_CACHE_DIR="$1"
      shift
      ;;
    --kill)
      kill-goma
      return 0
      ;;
    *)
      fx-command-help
      return 1
      ;;
    esac
  done

  # TODO(mcgrathr): Remove these after some period when old installs are gone.
  check
  check-build $update

  fx-command-run goma_auth info || fx-command-run goma_auth login "$@"
  if fx-command-run goma_ctl status; then
    fx-command-run goma_ctl update_hook
    return 0
  fi
  goma_tmp_dir=""
  if $use_local_cache; then
    goma_tmp_dir="$GOMA_CACHE_DIR"
    echo "*** Using Goma local output cache at \`$goma_tmp_dir\`"
    echo "*** If you experience cache errors, please run: "
    echo "*** \`fx goma --kill && fx goma --disable-local-cache\`"
    echo "*** to restart goma without local caching."
    echo ""
    echo "*** If you want to change the local output cache directory, please run"
    echo "*** \`fx goma --kill && fx goma --local-cache-dir ABS_PATH\`"
    echo "*** to restart goma with your desired cache location."
    echo ""
  fi
  if $use_http2; then
    echo "*** Using Goma experimental HTTP2 proxy."
    echo "*** If you experiencing instability, please run: "
    echo "*** \`fx goma --kill && fx goma --disable-http2\`"
    echo "*** to restart goma without HTTP2 proxy."
    echo ""
  fi
  if ! $use_ats; then
    echo "*** Goma Arbitrary Toolchain Support(ATS) is disabled."
    echo "*** If you would like to use this feature, please run: "
    echo "*** \`fx goma --kill && fx goma --enable-ats\`"
    echo "*** to restart goma with ATS."
    echo ""
  fi

  GOMA_ARBITRARY_TOOLCHAIN_SUPPORT="$use_ats" GOMACTL_USE_PROXY="$use_http2" GOMA_LOCAL_OUTPUT_CACHE_DIR="$goma_tmp_dir" fx-command-run goma_ctl ensure_start
}

function kill-goma {
  fx-command-run goma_ctl ensure_stop
}

# TODO(mcgrathr): Remove this after some period when old installs are gone.
function check {
  if [[ ! -z "${GOMA_DIR+x}" ]]; then
    echo "*** Detected GOMA_DIR environment variable."
    echo "*** Remove GOMA_DIR from the environment and run \`fx goma\` again."
    echo "*** \`unset GOMA_DIR\` will remove it from the running shell."
    echo "*** But check your dot files to make sure it's not set at login."
  fi

  local goma_dir running_goma_version prebuilt_goma_version
  goma_dir="$(fx-command-run goma_ctl goma_dir 2> /dev/null)"
  if [[ -d "$goma_dir" && \
        "$(cd "$goma_dir" && /bin/pwd)" = "$(cd "$PREBUILT_GOMA_DIR" && /bin/pwd)" ]]; then
    return 0
  fi
  # Running goma has different directory than current one, test the versions.
  running_goma_version="$("$goma_dir"/compiler_proxy --version)"
  prebuilt_goma_version="$("$PREBUILT_GOMA_DIR"/compiler_proxy --version)"
  if [[ "$running_goma_version" = "$prebuilt_goma_version" ]]; then
    # Running daemon has same version string as one from prebuilt.
    return 0
  fi

  echo "*** Detected a different version of Goma daemon running at $goma_dir"
  echo "*** Recommend \`fx goma_ctl ensure_stop\` and \`fx goma\` to restart Goma daemon with current version."
  echo "*** Goma-client should not be used when there is a version mismatch."
  return 1
}

# TODO(mcgrathr): Remove this after some period when old installs are gone.
function check-build {
  local update=$1

  unset USE_GOMA GOMA_DIR # Just in case it's in the environment.
  fx-config-read || return

  if [[ -z "$USE_GOMA" ]]; then
    echo "*** Run \`fx gen\` and then try \`fx goma\` again."
    echo "*** Or else just do a fresh \`fx set\` to get the right defaults!"
    return 1
  fi

  local status=0
  local gen=false

  if [[ "$USE_GOMA" = true ]]; then
    echo "$FUCHSIA_BUILD_DIR has Goma enabled."
  elif $update; then
    echo "*** Enabling Goma in $FUCHSIA_BUILD_DIR..."
    sed -e /use_goma/d "$FUCHSIA_BUILD_DIR/args.gn" > "$FUCHSIA_BUILD_DIR/args.gn.new"
    mv -f "$FUCHSIA_BUILD_DIR/args.gn.new" "$FUCHSIA_BUILD_DIR/args.gn"
    echo "use_goma = true" >> "$FUCHSIA_BUILD_DIR/args.gn"
    gen=true
  else
    echo "$FUCHSIA_BUILD_DIR has Goma disabled."
    status=1
  fi

  if [[ -z "${GOMA_DIR+x}" ]]; then
    echo "$FUCHSIA_BUILD_DIR uses prebuilt Goma client."
  elif $update; then
    echo "*** $FUCHSIA_BUILD_DIR was using non-default goma_dir=\"$GOMA_DIR\"."
    sed -i /goma_dir/d "$FUCHSIA_BUILD_DIR/args.gn"
    echo "*** Reset to default prebuilt Goma client."
    gen=true
  else
    echo "$FUCHSIA_BUILD_DIR uses non-default goma_dir=\"$GOMA_DIR\"."
    status=1
  fi

  if $gen; then
    echo "*** Running \`fx gen\` after $FUCHSIA_BUILD_DIR/args.gn updates..."
    fx-command-run gen
  fi

  if [[ $status -ne 0 ]]; then
    echo "*** Run \`fx goma --update\` to reset this build to defaults."
    echo "*** Or else just do a fresh \`fx set\` to get the right defaults!"
  fi
  return $status
}

main "$@"
