The publish job now opens a Gitea release for the tag, using the matching Keep-a-Changelog section as the body via scripts/release-notes.sh. It runs before npm publish so a broken page fails CI without burning an npm version; npm publish stays the last step. Uses the first-party gitea-release-action (the older actions/release-action is deprecated and requires asset files) and contents: write for the run's automatic token.
65 lines
1.8 KiB
Bash
Executable File
65 lines
1.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -eu
|
|
|
|
# Print the Keep-a-Changelog section for a release tag, so CI can use it as the
|
|
# body of the Gitea release page without re-implementing CHANGELOG parsing.
|
|
#
|
|
# Run as `scripts/release-notes.sh <tag>`. A leading `v` is tolerated so both
|
|
# `v1.2.3` and `1.2.3` match the `## [1.2.3]` heading. Prints to stdout and
|
|
# exits non-zero when the tag has no section, so a release can never publish
|
|
# with an empty body.
|
|
|
|
TAG="${1:-}"
|
|
CHANGELOG="${CHANGELOG:-CHANGELOG.md}"
|
|
|
|
if [ -z "${TAG}" ]; then
|
|
echo "Error: usage: $0 <tag>" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "${CHANGELOG}" ]; then
|
|
echo "Error: ${CHANGELOG} not found." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# `v1.2.3` and `1.2.3` are the same release; the heading only ever uses the
|
|
# bare version.
|
|
VERSION="${TAG#v}"
|
|
|
|
awk -v version="${VERSION}" '
|
|
# A new section ends the one we are printing (or is the one we want).
|
|
/^## \[/ {
|
|
if (found) exit
|
|
heading = $0
|
|
sub(/^## \[/, "", heading)
|
|
sub(/\].*$/, "", heading)
|
|
if (heading == version) found = 1
|
|
next
|
|
}
|
|
|
|
# Link-reference definitions live at the bottom of the file and are never
|
|
# part of the section body. Stopping here keeps the last release notes
|
|
# from picking them up (there is no following heading to stop at).
|
|
/^\[[^]]+\]:/ { exit }
|
|
|
|
found {
|
|
if ($0 ~ /^[[:space:]]*$/) {
|
|
# Buffer blank lines so trailing ones at the end of the section
|
|
# are dropped instead of leaking into the release body.
|
|
if (started) pending = pending $0 "\n"
|
|
} else {
|
|
printf "%s%s\n", pending, $0
|
|
pending = ""
|
|
started = 1
|
|
}
|
|
}
|
|
|
|
END {
|
|
if (!found) {
|
|
printf "Error: no CHANGELOG section for [%s].\n", version > "/dev/stderr"
|
|
exit 1
|
|
}
|
|
}
|
|
' "${CHANGELOG}"
|