forked from heavy-duty/box
On a bare X.Y.Z tag push (the 0.6.0 tag set the no-'v' precedent), release.yml asserts the tag names the tree's own VERSION — a mismatch fails loudly and creates NOTHING — then publishes the GitHub release with that version's CHANGELOG.md section as the body: the curated prose, not the generated PR list. No assets, because for a pure-bash tree GitHub's source tarball for the tag IS the package. The extraction lives in .github/scripts/release-notes.sh, a file of its own so test/release.sh drives the same code against fixtures and the real changelog — it refuses a missing or empty section, so a tag whose release ritual was skipped fails before anything is created. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
30 lines
1.5 KiB
Bash
30 lines
1.5 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# release-notes.sh <version> [<changelog>] — print exactly <version>'s
|
|
# section of the changelog: every line between its '## <version> — <date>'
|
|
# header and the next '## '. This is what release.yml hands to
|
|
# 'gh release create', so the release notes are the curated prose we wrote,
|
|
# not the PR list GitHub would generate (#83). Fails loudly when the section
|
|
# is missing or empty — a tag without its changelog section is a release
|
|
# ritual skipped, and an empty release body would paper over it.
|
|
#
|
|
# A file of its own (not inlined in release.yml) so test/release.sh drives
|
|
# the same extraction against fixtures and the real CHANGELOG.md.
|
|
|
|
ver="${1:-}"
|
|
changelog="${2:-CHANGELOG.md}"
|
|
[ -n "$ver" ] || { echo "usage: release-notes.sh <version> [<changelog>]" >&2; exit 2; }
|
|
[ -f "$changelog" ] || { echo "release-notes: no such file: $changelog" >&2; exit 1; }
|
|
|
|
# $2 of a section header ('## 0.6.0 — 2026-07-18') is the bare version —
|
|
# compared WHOLE, so 0.6.0 can never match a 0.6.0-rc1 section (or vice
|
|
# versa), and no regex-escaping of dots. sed drops the blank padding under
|
|
# the header; the command substitution eats the trailing blanks.
|
|
notes="$(awk -v ver="$ver" '
|
|
/^## / { grab = ($2 == ver); next }
|
|
grab { print }
|
|
' "$changelog" | sed '/./,$!d')"
|
|
|
|
[ -n "$notes" ] || { echo "release-notes: $changelog has no section for '$ver' — the release PR stamps the Unreleased section with version + date BEFORE the tag (#83)" >&2; exit 1; }
|
|
printf '%s\n' "$notes"
|