diff options
Diffstat (limited to 'util/tagbranch.sh')
-rwxr-xr-x | util/tagbranch.sh | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/util/tagbranch.sh b/util/tagbranch.sh new file mode 100755 index 0000000000..bcc71a4806 --- /dev/null +++ b/util/tagbranch.sh @@ -0,0 +1,83 @@ +#!/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)" + +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 |