forked from heavy-duty/stoke
73 lines
1.9 KiB
Bash
Executable file
73 lines
1.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Vendored from heavy-duty/ceremony 0.6.3:
|
|
# lib/changelog.sh (changelog_section + changelog_section_problem)
|
|
# bin/changelog-section
|
|
|
|
set -euo pipefail
|
|
|
|
changelog_section() {
|
|
awk -v ver="$2" '
|
|
/^## / { if (found) exit; found = ($2 == ver); next }
|
|
found && !body && /^[[:space:]]*$/ { next }
|
|
found { body = 1; print }
|
|
' "$1"
|
|
}
|
|
|
|
changelog_section_problem() {
|
|
local file="$1" ver="$2" notes problem
|
|
|
|
if ! awk -v ver="$ver" '/^## / && $2 == ver { found = 1; exit } END { exit !found }' "$file"; then
|
|
printf "no section for '%s'\n" "$ver"
|
|
return 1
|
|
fi
|
|
|
|
[ "$ver" = "Unreleased" ] && return 0
|
|
|
|
notes="$(changelog_section "$file" "$ver")"
|
|
if ! printf '%s\n' "$notes" | awk '/^[[:space:]]*[-*][[:space:]]/ { found = 1; exit } END { exit !found }'; then
|
|
printf "section '%s' has no entries — a heading is not an entry\n" "$ver"
|
|
return 1
|
|
fi
|
|
|
|
problem="$(
|
|
printf '%s\n' "$notes" | awk '
|
|
/^### / {
|
|
if (heading != "" && !entry) {
|
|
reported = 1
|
|
print heading
|
|
exit
|
|
}
|
|
heading = $0
|
|
entry = 0
|
|
next
|
|
}
|
|
heading != "" && /^[[:space:]]*[-*][[:space:]]/ { entry = 1 }
|
|
END {
|
|
if (!reported && heading != "" && !entry) print heading
|
|
}
|
|
'
|
|
)"
|
|
if [ -n "$problem" ]; then
|
|
printf "section '%s' has an empty heading: '%s'\n" "$ver" "$problem"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
ver="${1:-}"
|
|
changelog="${2:-CHANGELOG.md}"
|
|
if [ -z "$ver" ]; then
|
|
echo "usage: changelog-section.sh <version> [<changelog>]" >&2
|
|
exit 2
|
|
fi
|
|
[ -f "$changelog" ] || {
|
|
echo "changelog-section: no such file: $changelog" >&2
|
|
exit 1
|
|
}
|
|
|
|
if ! diagnosis="$(changelog_section_problem "$changelog" "$ver")"; then
|
|
echo "changelog-section: $changelog has no publishable section for '$ver'" >&2
|
|
printf 'changelog-section: %s\n' "$diagnosis" >&2
|
|
exit 1
|
|
fi
|
|
notes="$(changelog_section "$changelog" "$ver")"
|
|
printf '%s\n' "$notes"
|