blob: 50aa30eaf18c320c71d64d0a41f91e08c9b4a371 [file] [log] [blame]
#!/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 "$@"