#!/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/ # - 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--XXXXXX # - the current branch was cut off of /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 <