#!/bin/sh
#
# Copyright 2020 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

source_dir=$(cd "$(dirname "$0")"; pwd -P)

copybara_exe=copybara
copybara_file="$source_dir/copy.bara.sky"
init_history=''

for arg in "$@"; do
  case $arg in
    --copybara-exe=*)
      copybara_exe="${arg#*=}"
      shift
      ;;
    --copybara-file=*)
      copybara_file="${arg#*=}"
      shift
      ;;
    --init-history)
      init_history='--init-history --force'
      shift
      ;;
    *)
      echo -e "Usage:$arg"
      echo -e "    export_to_github.sh [--copybara-exe=<path-to-copybara>]\n" \
              "                       [--copybara-file=<path-to-copy.bara.sky>]"
      exit 1
  esac
done

v8_origin="https://chromium.googlesource.com/v8/v8.git"
v8_ref="master"

NOCOLOR="\033[0m"
RED="\033[0;31m"
GREEN="\033[0;32m"
BLUE="\033[0;34m"

function fail {
  echo -e "${RED}${1}${NOCOLOR}" > /dev/stderr
  exit 1
}

function success {
  echo -e "${BLUE}${1}${NOCOLOR}" > /dev/stderr
  exit 0
}

function message {
  echo -e "${GREEN}${1}${NOCOLOR}" > /dev/stderr
}

function cleanup {
  if [ -d "$git_temp_dir" ]; then
    rm -rf $git_temp_dir
  fi
}

trap "exit 1" HUP INT PIPE QUIT TERM
trap cleanup EXIT

[ ! -x $copybara_exe ] && fail "$copybara_exe doesn't exist or was not found in PATH!"
[ ! -f $copybara_file ] && fail "Input $copybara_file doesn't exist!"

git_temp_dir=$(mktemp -d)
if [[ ! "$git_temp_dir" || ! -d "$git_temp_dir" ]]; then
  fail "Failed to create temporary dir"
fi

if [[ $init_history ]]; then
  read -p "--init-history is only supposed to be used on the first export of \
cppgc. Is this what is really intended? (y/N)" answer
  if [ "$answer" != "y" ]; then
    exit 0
  fi
fi

message "Running copybara..."
$copybara_exe $init_history $copybara_file --dry-run --git-destination-path $git_temp_dir
result=$?
if [ "$result" -eq 4 ]; then
  success "Nothing needs to be done, exiting..."
elif [ "$result" -ne 0 ]; then
  fail "Failed to run copybara"
fi

cd $git_temp_dir

main_gn="BUILD.gn"
test_gn="test/unittests/BUILD.gn"
gen_cmake="tools/cppgc/gen_cmake.py"

message "Checking out BUILD.gn files..."
git remote add v8_origin "$v8_origin"
git fetch --depth=1 v8_origin $v8_ref
git checkout v8_origin/master -- "$main_gn" "$test_gn" "$gen_cmake" \
  || fail "Failed to checkout BUILD.gn from V8 origin"

message "Generating CMakeLists.txt..."
cmakelists="$git_temp_dir/CMakeLists.txt"
$gen_cmake --out=$cmakelists --main-gn=$main_gn --test-gn=$test_gn \
  || fail "CMakeLists.txt generation has failed!"

git rm -f $main_gn $test_gn $gen_cmake > /dev/null

if git status -s | grep -q $(basename $cmakelists); then
  message "CMakeLists.txt needs to be changed"
  git add $cmakelists
  git commit --amend --no-edit > /dev/null
else
  message "No changes in CMakeLists.txt need to be done"
fi

message "Pushing changes to GitHub..."
git push copybara_remote master

success "CppGC GitHub mirror was successfully updated"