chrome-ec/util/tagbranch.sh

85 lines
2.8 KiB
Bash
Executable File

#!/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.
#
# Generate git strings for tagging EC branches.
#
# This script builds up on ideas put by vpalatin@ into util/getversion.sh
#
# Git allows to count number of patches between the current state of the tree
# and any directly preceding tag in the tree. That is if we tag the first
# patch in the current branch, we can tell how many patches are in the branch
# above that tag. And if we tag the branch such that the tag string includes
# the branch name, we can also say what branch we are in looking at the
# closest tag in the tree.
#
# This admittedly brittle script automates the process of tagging for the EC
# git tree in Chrome OS repo, but it could be used for any other Chrome OS
# repo git tree just as well.
#
# The script is brittle because it relies on the following assumptions which
# are true for Chrome OS repo at the time of writing:
#
# - the upstream branch alias name shows up in the 'git branch -a' output
# separated by ->
# - the upstream branch alias name has the format of
# cros/<branch name>
# - the remote git server name shows up in 'git config -l' output in the
# line starting with "remote.cros.url="
# - firmware branch names have format of firmware-<board>-XXXXXX
# - the current branch was cut off of <remote name>/master
#
# The tag name generated by this script would be the XXXXX string with dots,
# if any, replaced by underscores.
# Retrieve the upstream branch alias name
UPSTREAM="$(git branch -a | awk '/->/ {print $3}')"
if [[ -z "${UPSTREAM}" ]]; then
echo "Failed to determine upstream branch alias" >&2
exit 1
fi
export ORIGIN_NAME="cros"
ORIGIN="$(git config "remote.${ORIGIN_NAME}.url")"
# The last common patch between this branch and the master.
BRANCH_POINT="$(git merge-base "${UPSTREAM}" "${ORIGIN_NAME}/master")"
if [[ -z "${BRANCH_POINT}" ]]; then
echo "Failed to determine cros/master branch point" >&2
exit 1
fi
# Derive tag base string from the upstream branch name as described above.
TAG_BASE="$(sed 's/.*-// # drop everything up to including the last -
s/\./_/g # replace dots and dashes with underscores
' <<< "${UPSTREAM}" )"
if [[ "${TAG_BASE}" == "master" ]]; then
echo "Nothing to tag in master branch" >&2
exit 1
fi
TAG="v1.${TAG_BASE}.0"
#SHA1 of the first patch of this branch
BASE_SHA="$(git rev-list --ancestry-path "${BRANCH_POINT}".."${UPSTREAM}" |
tail -1)"
echo "Will run git tag -a -m \"firmware branch ${TAG}\" ${TAG} ${BASE_SHA}"
if git tag -a -m "firmware branch ${TAG}" "${TAG}" "${BASE_SHA}"; then
cat <<EOF
A new tag '$TAG' has been set. Use the following command
to push it to the server
git push --tags ${ORIGIN} ${TAG}
Or if you want to delete it:
git tag -d $TAG
EOF
fi