Files
install-action/tools/publish.sh

146 lines
4.4 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
2023-06-05 22:58:32 +09:00
# SPDX-License-Identifier: Apache-2.0 OR MIT
2021-12-30 17:33:20 +09:00
set -euo pipefail
IFS=$'\n\t'
2022-02-06 10:00:55 +09:00
cd "$(dirname "$0")"/..
2021-12-30 17:33:20 +09:00
2022-12-09 22:03:48 +09:00
# shellcheck disable=SC2154
2023-06-05 12:41:49 +09:00
trap 's=$?; echo >&2 "$0: error on line "${LINENO}": ${BASH_COMMAND}"; exit ${s}' ERR
2022-12-09 22:03:48 +09:00
2021-12-30 17:33:20 +09:00
# Publish a new release.
#
# USAGE:
# ./tools/publish.sh <VERSION>
#
2022-12-02 03:19:40 +09:00
# Note: This script requires the following tools:
# - parse-changelog <https://github.com/taiki-e/parse-changelog>
2021-12-30 17:33:20 +09:00
bail() {
echo >&2 "error: $*"
exit 1
}
version="${1:?}"
version="${version#v}"
2023-01-15 18:33:24 +09:00
tag_prefix="v"
tag="${tag_prefix}${version}"
changelog="CHANGELOG.md"
2021-12-30 17:33:20 +09:00
if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$ ]]; then
2021-12-30 21:55:24 +09:00
bail "invalid version format '${version}'"
2021-12-30 17:33:20 +09:00
fi
if [[ $# -gt 1 ]]; then
2021-12-30 21:55:24 +09:00
bail "invalid argument '$2'"
2021-12-30 17:33:20 +09:00
fi
2021-12-30 21:55:24 +09:00
# Make sure there is no uncommitted change.
git diff --exit-code
git diff --exit-code --staged
2021-12-30 17:33:20 +09:00
2022-02-08 12:17:41 +09:00
# Make sure the same release has not been created in the past.
2022-03-02 12:17:34 +09:00
if gh release view "${tag}" &>/dev/null; then
2022-02-08 12:17:41 +09:00
bail "tag '${tag}' has already been created and pushed"
fi
2023-01-15 18:33:24 +09:00
if ! git branch | grep -q '\* main$'; then
2022-05-06 07:52:13 +09:00
bail "current branch is not 'main'"
fi
2023-01-15 18:33:24 +09:00
release_date=$(date -u '+%Y-%m-%d')
tags=$(git --no-pager tag | (grep -E "^${tag_prefix}[0-9]+" || true))
2022-03-02 12:17:34 +09:00
if [[ -n "${tags}" ]]; then
2023-01-15 18:33:24 +09:00
# Make sure the same release does not exist in changelog.
if grep -Eq "^## \\[${version//./\\.}\\]" "${changelog}"; then
bail "release ${version} already exist in ${changelog}"
2022-03-02 12:17:34 +09:00
fi
2023-01-15 18:33:24 +09:00
if grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "link to ${version} already exist in ${changelog}"
2022-03-02 12:17:34 +09:00
fi
# Update changelog.
2023-01-15 18:33:24 +09:00
remote_url=$(grep -E '^\[Unreleased\]: https://' "${changelog}" | sed 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//')
2022-12-28 21:18:38 +09:00
before_tag="${remote_url#*/compare/}"
remote_url="${remote_url%/compare/*}"
2023-01-15 18:33:24 +09:00
sed -i "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" "${changelog}"
sed -i "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/${tag}...HEAD\\n[${version}]: ${remote_url}/compare/${before_tag}...${tag}#" "${changelog}"
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
bail "failed to update ${changelog}"
fi
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "failed to update ${changelog}"
2022-03-02 12:17:34 +09:00
fi
2023-01-15 18:33:24 +09:00
else
# Make sure the release exists in changelog.
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
bail "release ${version} does not exist in ${changelog} or has wrong release date"
fi
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "link to ${version} does not exist in ${changelog}"
2022-03-02 12:17:34 +09:00
fi
2022-02-08 12:17:41 +09:00
fi
2021-12-30 17:33:20 +09:00
# Make sure that a valid release note for this version exists.
# https://github.com/taiki-e/parse-changelog
2023-01-15 18:33:24 +09:00
changes=$(parse-changelog "${changelog}" "${version}")
if [[ -z "${changes}" ]]; then
bail "changelog for ${version} has no body"
fi
2021-12-30 17:33:20 +09:00
echo "============== CHANGELOG =============="
2023-01-15 18:33:24 +09:00
echo "${changes}"
2021-12-30 17:33:20 +09:00
echo "======================================="
2022-03-02 12:17:34 +09:00
if [[ -n "${tags}" ]]; then
# Create a release commit.
git add "${changelog}"
git commit -m "Release ${version}"
2022-03-02 12:17:34 +09:00
fi
2021-12-30 17:33:20 +09:00
tools=()
for tool in tools/codegen/base/*.json; do
tools+=("$(basename "${tool%.*}")")
done
# Aliases
tools+=(nextest)
2023-06-10 18:03:24 +09:00
# Not manifest-based
tools+=(valgrind)
(
set -x
git tag "${tag}"
git push origin main
git push origin --tags
major_version_tag="v${version%%.*}"
git checkout -b "${major_version_tag}"
git push origin refs/heads/"${major_version_tag}"
if git --no-pager tag | grep -Eq "^${major_version_tag}$"; then
git tag -d "${major_version_tag}"
git push --delete origin refs/tags/"${major_version_tag}"
fi
git tag "${major_version_tag}"
git checkout main
git branch -d "${major_version_tag}"
)
for tool in "${tools[@]}"; do
(
set -x
git checkout -b "${tool}"
sed -i -e "s/required: true/required: false/g" action.yml
sed -i -e "s/# default: #publish:tool/default: ${tool}/g" action.yml
git add action.yml
git commit -m "${tool}"
git push origin -f refs/heads/"${tool}"
if git --no-pager tag | grep -Eq "^${tool}$"; then
git tag -d "${tool}"
git push --delete origin refs/tags/"${tool}"
fi
git tag "${tool}"
git checkout main
git branch -D "${tool}"
)
done
set -x
git push origin --tags