85 lines
2.8 KiB
Bash
Executable File
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
|