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

# Loads script libraries.
CONTRIB_DIR=$(dirname "$(readlink -f "$0")")
. "${CONTRIB_DIR}/common.sh" || exit 1

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/dev-util/+/HEAD/contrib/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:
"

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.)
"

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

# Script must run inside the chroot.
assert_inside_chroot

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"
JUSTIFICATION_BUG="b/338349867"

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 "Too many arguments"
  elif [[ "$#" -gt 0 ]]; then
    commit="$1"
  else
    commit="${UPSTREAM_REMOTE}"
  fi

  if no_fast_forward "${MASTER_REMOTE}" "${commit}"; then
    die "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 "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 "Aborting"
  fi

  if [[ "${FLAGS_master_only}" -eq "${FLAGS_TRUE}" ]]; then
    run_git push cros \
      -o push-justification="${JUSTIFICATION_BUG}" \
      "${commit}":"${MASTER}" || \
      die "Push failed (see above)"
  else
    run_git push --atomic cros \
      -o push-justification="${JUSTIFICATION_BUG}" \
      "${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 "Push failed (see above).
If you are seeing authorization errors ('update access denied'), you are
probably not a member of the chromeos-arm-trusted-firmware-pushers Ganpati
group. You can reach out to any current member of the group to add you."
  fi

  echo "Push successful!"
}

main "$@"
