You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
2.3 KiB
Plaintext

#!/usr/bin/env bash
# Bash script to prepare a release using git-cliff.
# Inspired by https://github.com/orhun/git-cliff/blob/main/release.sh
# Check if a version tag is provided.
if [ "$#" -eq 1 ]; then
VERSION_TAG=$1
else
# After git-cliff version 1.4.0 it should be possible to run `git cliff --bumped-version`.
suggested_version=$(git cliff --unreleased --bump --context | jq -r .[0].version)
echo -n "No version tag provided. git-cliff suggests $suggested_version. Proceed? [Y/n] "
read user_input
# Check if input is empty or a variation of "yes".
if [[ -z "$user_input" || "$user_input" =~ ^[Yy](es)?$ ]]; then
echo "Proceeding with version $suggested_version."
VERSION_TAG=$suggested_version
else
echo "Release preparation cancelled."
exit 1
fi
fi
# Update CHANGELOG.
git cliff --tag "$VERSION_TAG" -o CHANGELOG.md
# Add all changes and commit.
git add -A
git commit -m "🔖 chore(release): prepare for $VERSION_TAG"
# Template for the tag description.
export GIT_CLIFF_TEMPLATE="\
{%- set breaking_header_shown = false -%}
{% for commit in commits -%}
{%- if commit.breaking and not breaking_header_shown %}
💥 BREAKING CHANGES 💥
{% set_global breaking_header_shown = true -%}
{%- endif %}
{%- if commit.breaking %}
- {{ commit.message | upper_first }} ({{ commit.id | truncate(length=7, end=\"\") }})\
{% endif -%}
{% endfor %}
{% for group, group_commits in commits | group_by(attribute=\"group\") %}
{{ group | striptags | trim | upper_first }}
{% for commit in group_commits %}
- {% if commit.breaking %}[**‼BREAKING‼**] {% endif %}{{ commit.message | upper_first }} ({{ commit.id | truncate(length=7, end=\"\") }})\
{%- endfor %}
{% endfor %}"
# Generate the tag description.
changelog=$(git cliff --tag "$VERSION_TAG" --unreleased --strip all)
# Create a signed and annotated tag.
git tag -s -a "$VERSION_TAG" -m "Release $VERSION_TAG" -m "$changelog"
echo "Most recent commit:"
git log -1
echo
echo "Information for tag $VERSION_TAG:"
git show $VERSION_TAG
echo
echo "Release $VERSION_TAG is ready. Don't forget to push the changes and the tag:"
echo "git push && git push --tags"