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

BIG_WARNING="
You are about to uprev the arm-trusted-firmware repository's master branch to a
new upstream commit. This should generally be safe since ARM already runs
compile tests upstream, but there is a rare chance that something like a
dependency from coreboot code on ARM TF may lead to build breakage. Since this
script bypasses the CQ, it is your responsibilty to monitor the next canary run
and confirm that the uprev did not cause any problems.

You should now go on http://go/crosoncall and paste the following statement:
===========================================================================
Hi crosoncall. FYI I am about to push an uprev to arm-trusted-firmware. This
should not be an issue but if you start seeing any build errors for the coreboot
ebuild, please let me know.
(See https://chromium.googlesource.com/chromiumos/platform/crosutils/+/master/arm_trusted_firmware_uprev for details.)
===========================================================================

Now, *after* you have coordinated with sheriffs and received no objections,
please confirm the uprev to the following commit:
"

. "$(dirname "$0")/common.sh" || exit 1

# Script must run inside the chroot.
restart_in_chroot_if_needed "$@"

assert_not_root_user

DEFINE_boolean master_only ${FLAGS_FALSE} \
  "Only uprev master, not prev1...5. Only use to repair a broken uprev!"

FLAGS_HELP="usage: ${SCRIPT_NAME} [flags] [commit]

Uprevs the arm-trusted-firmware repository's master branch to a new HEAD. Will
uprev to upstream_mirror/master by default, or [commit] if specified. Can only
be run by members of mdb/arm-trusted-firmware-pushers (ask jwerner@ if you want
to be added).

NOTE TO SHERIFFS: This script fast-forwards refs/heads/master in the
arm-trusted-firmware repo without going through the CQ. In the rare cases (e.g.
bad coreboot dependency) that this breaks the build, you can *not* just revert
this action because you would be rewriting history. Instead, this script
automatically saves the previous (known-good) master revisions as the branches
refs/heads/prev1 through refs/heads/prev5. In order to revert to the last
known-good state, you have to replace refs/heads/master with refs/heads/prev1
in the arm-trusted-firmware repository definition of the manifest.

Once the breakage has been identified and resolved with a new upstream commit,
you should uprev to that commit with the --master-only flag of this script,
and then change the manifest back to refs/heads/master.

Note that circular dependencies between coreboot and arm-trusted-firmware
cannot be handled cleanly. They require the use of this script with a
simultaneous CHUMP to the coreboot repository. (Reverting that action would
require CHUMPing a revert to coreboot in addition to the above steps.)
"

show_help_if_requested "$@"

# Parse command line flags.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"

# Only now can we die on error.  shflags functions leak non-zero error codes,
# so will die prematurely if 'switch_to_strict_mode' is specified before now.
switch_to_strict_mode

ARM_TF_PATH="${GCLIENT_ROOT}/src/third_party/arm-trusted-firmware/"
UPSTREAM_REMOTE="refs/remotes/cros/upstream_mirror/master"
MASTER="refs/heads/master"
MASTER_REMOTE="refs/remotes/cros/master"
PREV="refs/heads/prev"
PREV_REMOTE="refs/remotes/cros/prev"

run_git() {
  git --no-pager -C "${ARM_TF_PATH}" "$@"
}

# True iff $1 and $2 are different commits and $1 cannot fast-forward to $2.
no_fast_forward() {
  [[ -n "$(run_git rev-list -n 1 "$2..$1")" ]]
}

main() {
  local commit sure

  run_git fetch cros

  if [[ "$#" -gt 1 ]]; then
    die_notrace "Too many arguments"
  elif [[ "$#" -gt 0 ]]; then
    commit="$1"
  else
    commit="${UPSTREAM_REMOTE}"
  fi

  if no_fast_forward "${MASTER_REMOTE}" "${commit}"; then
    die_notrace "Cannot fast-forward cros/master to ${commit}"
  fi

  echo "${BIG_WARNING}"
  if no_fast_forward "${commit}" "${UPSTREAM_REMOTE}"; then
    if no_fast_forward "${UPSTREAM_REMOTE}" "${commit}"; then
      die_notrace "Don't uprev to a branch that diverges from upstream master!"
    fi
    warn "
You are about to uprev to a commit that is ahead of upstream master (presumably
one in upstream integration). This is dangerous and should not be done without
urgency. If the commit you're uprevving to does not later land with the exact
same SHA in upstream master, you will need manual intervention from cros-infra
to fix this repository.
"
    echo
  fi

  run_git log -n1 --pretty=format:"%h %ad %<(15,trunc)%an %s%n" \
    --date=short "${commit}"
  read -p "Uprev to this commit [y/N]? " sure
  if [[ "${sure:0:1}" != "y" ]]; then
    die_notrace "Aborting"
  fi

  if [[ "${FLAGS_master_only}" -eq "${FLAGS_TRUE}" ]]; then
    run_git push cros "${commit}":"${MASTER}" || \
      die_notrace "Push failed (see above)"
  else
    run_git push --atomic cros \
      "${PREV_REMOTE}4":"${PREV}5" \
      "${PREV_REMOTE}3":"${PREV}4" \
      "${PREV_REMOTE}2":"${PREV}3" \
      "${PREV_REMOTE}1":"${PREV}2" \
      "${MASTER_REMOTE}":"${PREV}1" \
      "${commit}":"${MASTER}" || die_notrace "Push failed (see above)"
  fi

  echo "Push successful!"
}

main "$@"
