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

# bootstrap_jiri initializes a root directory for jiri.  The following
# directories and files will be created:
#   <root_dir>                         - root directory (picked by user)
#   <root_dir>/.jiri_root              - root metadata directory
#   <root_dir>/.jiri_root/bin/jiri     - jiri binary
#   <root_dir>/.jiri_root/scripts/jiri - jiri script
#
# The jiri sources are downloaded and built into a temp directory, which is
# always deleted when this script finishes.  The <root_dir> is deleted on any
# failure.

set -euf -o pipefail

# fatal prints an error message, followed by the usage string, and then exits.
fatal() {
  usage='

Usage:
   bootstrap_jiri <root_dir>

A typical bootstrap workflow looks like this:

$ curl -s https://raw.githubusercontent.com/vanadium/go.jiri/master/scripts/bootstrap_jiri | bash -s myroot
$ export PATH=myroot/.jiri_root/scripts:$PATH
$ cd myroot
$ jiri import public https://vanadium.googlesource.com/manifest
$ jiri update'
  echo "ERROR: $@${usage}" 1>&2
  exit 1
}

# toabs converts the possibly relative argument into an absolute path.  Run in a
# subshell to avoid changing the caller's working directory.
toabs() (
  cd $(dirname $1)
  echo ${PWD}/$(basename $1)
)

# Check the <root_dir> argument is supplied and doesn't already exist.
if [[ $# -ne 1 ]]; then
  fatal "need <root_dir> argument"
fi
root_dir=$(toabs $1)
if [[ -e ${root_dir} ]]; then
  fatal "${root_dir} already exists"
fi
# Check that go is on the PATH.
if ! go version >& /dev/null ; then
  fatal 'ERROR: "go" tool not found, see https://golang.org/doc/install'
fi

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

# Make the output directories.
tmp_dir="${root_dir}/.jiri_root/tmp"
bin_dir="${root_dir}/.jiri_root/bin"
scripts_dir="${root_dir}/.jiri_root/scripts"
mkdir -p "${tmp_dir}" "${bin_dir}" "${scripts_dir}"

# Go get the jiri source files, build the jiri binary, and copy the jiri shim
# script from the sources.
GOPATH="${tmp_dir}" go get -d v.io/jiri
GOPATH="${tmp_dir}" go build -o "${bin_dir}/jiri" v.io/jiri
cp "${tmp_dir}/src/v.io/jiri/scripts/jiri" "${scripts_dir}/jiri"

# Clean up the tmp_dir.
rm -rf "${tmp_dir}"

echo "Please add ${scripts_dir} to your PATH."
trap - EXIT
