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

set -ux

run() {
  echo ">> $@"
  local OUTPUT
  OUTPUT=$("$@" 2>&1)
  if [[ "$?" -eq 0 ]]; then
    echo ">> OK"
  else
    echo ">> FAILED"
    echo "${OUTPUT}"
    exit 1
  fi
}

check_environment() {
  # Check that the JIRI_ROOT environment variable is set.
  if [[ -z "${JIRI_ROOT}" ]]; then
    echo "The JIRI_ROOT environment variable is not set."
    echo "Set the environment variable and re-run."
    exit 1
  fi

  # Check that the JIRI_ROOT environment variable does not contain space.
  local -r PATTERN="[ ']"
  if [[ "${JIRI_ROOT}" =~ "${PATTERN}" ]]; then
    echo "The JIRI_ROOT environment variable cannot contain space."
    echo "NOTE: This limitation is inherited from Autotools."
    exit 1
  fi

  # Check that the JIRI_ROOT path does not exist.
  if [[ -e "${JIRI_ROOT}" ]]; then
    echo "The ${JIRI_ROOT} path already exists."
    echo "Remove it or choose a different path and re-run."
    exit 1
  fi

  # Check that the "jiri" command is not in the PATH already.
  local -r JIRI_CMD=$(which jiri)
  if [[ -n "${JIRI_CMD}" ]]; then
    echo "Your PATH already contains \"jiri\" command: ${JIRI_CMD}"
    echo "Remove it from the PATH and re-run."
    exit 1
  fi

  # Check that Go compiler version 1.4 or newer exists on the host.
  local -r GO_VERSION=$(go version 2> /dev/null)
  local -r RESULT="$?"
  local -a TOKENS=(${GO_VERSION})
  TOKENS=($(echo "${TOKENS[2]}" | tr '.' ' '))
  if [[ "${RESULT}" -ne 0 ]] || [[ "${TOKENS[0]}" = "go1" && "${TOKENS[1]}" -lt 4 ]]; then
    echo "Go compiler version 1.4 or newer is required for vanadium installation."
    echo "Install it and re-run."
    exit 1
  fi

  # Check that git exists on the host.
  local -r GIT_VERSION=$(git version 2> /dev/null)
  if [[ "$?" -ne 0 ]]; then
    echo "The 'git' command does not exist in your PATH."
    echo "Add it to the PATH and re-run."
    exit 1
  fi
}

main() {
  check_environment

  trap "rm -rf ${JIRI_ROOT}" INT TERM EXIT

  # Create initial directories.
  run mkdir -p "${JIRI_ROOT}/devtools/bin"

  # Clone the manifest repository.
  run git clone https://mojo.googlesource.com/mojo-manifest "${JIRI_ROOT}/.manifest"

  # Get and install the jiri tool.
  GOPATH="${JIRI_ROOT}/tmp" run go get -d v.io/jiri
  GOPATH="${JIRI_ROOT}/tmp" run go build -o "${JIRI_ROOT}/devtools/bin/jiri" v.io/jiri
  rm -rf "${JIRI_ROOT}/tmp"

  # Install all vanadium repositories and tools.
  local -r NATTEMPTS=3
  for attempt in $(seq 1 "${NATTEMPTS}"); do
    "${JIRI_ROOT}/devtools/bin/jiri" update && break
    if [[ "${attempt}" == "${NATTEMPTS}" ]]; then
      echo "\"jiri update\" failed ${NATTEMPTS} times in a row."
      echo "This can happen when our repository servers are"
      echo "temporarily unavailable. Please try again later."
      exit 1
    fi
    echo "\"jiri update\" failed, trying again."
  done

  echo "Please add ${JIRI_ROOT}/devtools/bin and ${JIRI_ROOT}/depot_tools to your PATH."

  trap - EXIT
}

main "$@"
