#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=common.sh source "${SCRIPT_DIR}/common.sh" VERSION="${1:-}" SUMMARY="${2:-}" PREV_TAG="${3:-}" DATE="${4:-$(date -u +%Y-%m-%d)}" CHANGELOG="CHANGELOG.md" if [[ -z "$VERSION" ]]; then echo "Usage: update-changelog.sh [date]" >&2 exit 1 fi if [[ -f "$CHANGELOG" ]] && grep -qF "## [${VERSION}]" "$CHANGELOG"; then echo "CHANGELOG already contains version ${VERSION}; skipping." >&2 exit 0 fi if [[ -n "$SUMMARY" ]]; then SUMMARY_TEXT=$(strip_bump_prefix "$SUMMARY") else SUMMARY_TEXT="Automated release v${VERSION}." fi COMMITS=$(commits_since "$PREV_TAG") SECTION=$(changelog_section "$VERSION" "$DATE" "$SUMMARY_TEXT" "$COMMITS") if [[ ! -f "$CHANGELOG" ]]; then changelog_header > "$CHANGELOG" printf '\n%s\n' "$SECTION" >> "$CHANGELOG" else UNRELEASED_MARKER='## [Unreleased]' if ! grep -qF "$UNRELEASED_MARKER" "$CHANGELOG"; then echo "CHANGELOG.md exists but is missing ${UNRELEASED_MARKER}" >&2 exit 1 fi TMP=$(mktemp) SECTION_FILE=$(mktemp) printf '%s\n' "$SECTION" > "$SECTION_FILE" awk -v section_file="$SECTION_FILE" ' /^## \[Unreleased\]/ { print print "" while ((getline line < section_file) > 0) { print line } close(section_file) next } { print } ' "$CHANGELOG" > "$TMP" rm -f "$SECTION_FILE" mv "$TMP" "$CHANGELOG" fi echo "Updated ${CHANGELOG} with version ${VERSION}." >&2