#!/bin/bash
# Copyright 2021 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=Other
### Set up the checkout for Go development.

## usage: fx setup-go [-d]
##
## Creates symlinks from //third_party/golibs into the root of the tree
## and the //vendor directory so that standard Go tooling and IDE features
## will work. All of the symlink paths should already be ignored by git, so
## this symlinking will not require any .gitignore modifications.
##
## This is not necessary for development, only to improve the experience when
## using Go IDE features and standard tooling.
##
## Prints the names of any symlinks it creates or removes, unless the
## operation is a no-op, in which case it prints nothing.
##
## optional arguments:
##   -d     Tear down the symlinks created by `fx setup-go`. Also idempotent (i.e.
##          safe to run multiple times in a row).

set -e -o pipefail

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

function main {
  fx-standard-switches "$@"
  set -- "${FX_ARGV[@]}"

  # For simplicity, all functions assume that they are executed within the
  # checkout root.
  pushd "$FUCHSIA_DIR" > /dev/null
  trap 'popd > /dev/null' EXIT

  local down=false
  while [[ $# -ne 0 ]]; do
    case "$1" in
      -d)
        down=true
        ;;
      *)
        fx-error "Unknown argument \"$1\""
        fx-command-help
        return 1
        ;;
    esac
    shift
  done

  if $down; then
    teardown
  else
    setup
  fi
}

# We'll write a go.mod file to each of these directories so that gopls and
# other tools don't search these directories for Go code, which can cause a
# significant slowdown.
gomod_dirs=(out third_party prebuilt)

function setup {
  link "third_party/golibs/go.mod" go.mod
  link "third_party/golibs/go.sum" go.sum

  mkdir -p vendor
  find third_party/golibs/vendor -mindepth 1 -maxdepth 1 | while read -r file; do
    base="$(basename "$file")"
    link "../third_party/golibs/vendor/$base" "vendor/$base"
  done

  for dir in "${gomod_dirs[@]}"; do
    if ! [ -d "$dir" ]; then
      continue
    fi
    if ! [ -f "$dir/go.mod" ]; then
      echo "creating $dir/go.mod"
      (cd "$dir" && fx-command-run go mod init "go.fuchsia.dev/fuchsia/$dir" 2> /dev/null)
    fi
  done

  fx-config-read
  link "$FUCHSIA_BUILD_DIR/gopher/gen/fidl_for_ide/fidl" "vendor/fidl"
}

function teardown {
  # -v causes rm to print names of files it deletes.
  rm -v -f go.mod
  rm -v -f go.sum

  # Remove all symlinks from //vendor that point into
  # //third_party/golibs/vendor.
  local src
  find vendor -maxdepth 1 -type l | while read -r file; do
    src="$(readlink "$file")"
    if [[ "$src" = ../third_party/golibs/vendor/* ]]; then
      rm -v "$file"
    fi
  done

  rm -v -f vendor/fidl

  for dir in "${gomod_dirs[@]}"; do
    rm -v -f "$dir/go.mod"
  done
}

# Create a symlink. Note that `src` must be an absolute path, or a path relative
# to the directory containing `target`.
function link {
  local src="$1"
  local target="$2"

  local current_src
  local verb="creating"
  if [ -f "$target" ] || [ -d "$target" ]; then
    if [ -L "$target" ]; then
      current_src="$(readlink "$target")"
      if [ "$src" = "$current_src" ]; then
        # If the symlink already points to the right place, don't bother
        # rewriting it.
        return
      fi
    else
      fx-info "cannot overwrite non-symlink $target"
      return 1
    fi
    verb="overwriting"
  fi

  echo "$verb symlink $target -> $src"
  ln -sf "$src" "$target"
}

main "$@"
