From ac0584606275751d8a78f3808a61726c1639703e Mon Sep 17 00:00:00 2001 From: jillianwilson Date: Mon, 12 Apr 2021 14:40:40 -0300 Subject: [PATCH] Adding script to prepare release --- scripts/prepare-release.sh | 104 +++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 scripts/prepare-release.sh diff --git a/scripts/prepare-release.sh b/scripts/prepare-release.sh new file mode 100644 index 0000000..9271428 --- /dev/null +++ b/scripts/prepare-release.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +# +# prepare-release.sh +# (Note: This should be called by `make release/prepare` because it depends +# on several variables set by the Makefile) +# +# Performs release preparation tasks: +# - Creates a release branch +# - Renames "LATEST" section to the new version number +# - Adds new "LATEST" entry to the changelog +# +############################################## +set -Eeuo pipefail + +if [[ -z "${NEW_VERSION:-}" ]]; then + echo "[ERROR] NEW_VERSION environment variable not defined." >&2 + exit 1 +fi + +# Script called from within a git repo? +if [[ $(git rev-parse --is-inside-work-tree &>/dev/null) -ne 0 ]]; then + echo "[ERROR] Current directory (${SRCDIR}) is not a git repository" >&2 + exit 1 +fi + +REPO_ROOT=$(git rev-parse --show-toplevel) +CHANGELOG_FILENAME=${CHANGELOG:-"CHANGELOG.md"} + +# normalize version by removing `v` prefix +VERSION_NUM=${NEW_VERSION/#v/} +RELEASE_BRANCH=$(printf "release/v%s" "${VERSION_NUM}") + +function updateChangelog() { + local tmpfile + + trap '[ -e "${tmpfile}" ] && rm "${tmpfile}"' RETURN + + local changelogFile + changelogFile=$(printf "%s/%s" "${REPO_ROOT}" "${CHANGELOG_FILENAME}") + + # create Changelog file if not exists + if ! [[ -f "${REPO_ROOT}/${CHANGELOG_FILENAME}" ]]; then + touch "${REPO_ROOT}/${CHANGELOG_FILENAME}" && \ + git add "${REPO_ROOT}/${CHANGELOG_FILENAME}" + fi + + tmpfile=$(mktemp) + + # Replace "Latest" in the top-most changelog block with new version + # Then push a new "latest" block to top of the changelog + awk 'NR==1, /---/{ sub(/START\/LATEST/, "START/v'${VERSION_NUM}'"); sub(/# Latest/, "# v'${VERSION_NUM}'") } {print}' \ + "${changelogFile}" > "${tmpfile}" + + # Inserts "Latest" changelog HEREDOC at the top of the file + cat - "${tmpfile}" << EOF > "${REPO_ROOT}/${CHANGELOG_FILENAME}" +[//]: # (START/LATEST) +# Latest + +## Features + * A user-friendly description of a new feature. {issue-number} + +## Fixes + * A user-friendly description of a fix. {issue-number} + +## Security + * A user-friendly description of a security fix. {issue-number} + +--- + +EOF +} + +function _main() { + + # Stash version changes + git stash push &>/dev/null + + if ! git checkout -b "${RELEASE_BRANCH}" origin/"${MAIN_BRANCH:-main}"; then + echo "[ERROR] Could not check out release branch." >&2 + git stash pop &>/dev/null + exit 1 + fi + + # Add the version changes to release branch + git stash pop &>/dev/null + + updateChangelog + + cat << EOF + +[SUCCESS] Changelog updated & release branch created: + New Version: ${NEW_VERSION} + Release Branch: ${RELEASE_BRANCH} + +Next steps: + 1. Edit the changelog notes in ${CHANGELOG_FILENAME} + 2. Commit changes to the release branch + 3. Push changes to remote => git push origin ${RELEASE_BRANCH} + +EOF + exit 0 +} + +_main