#!/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 []" >&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"