From fdf544b39041853da69731329fedcce0d3c6d937 Mon Sep 17 00:00:00 2001 From: codex-bot-andresmgsl <304681515+codex-bot-andresmgsl@users.noreply.github.com> Date: Fri, 24 Jul 2026 16:14:35 +0000 Subject: [PATCH] feat: enforce changelog shape in guard and assembler --- actions/changelog-armed/changelog-armed.sh | 5 ++ bin/changelog-assemble | 4 ++ test/changelog-armed.test.sh | 60 ++++++++++++++++++++++ test/changelog-assemble.test.sh | 38 ++++++++++++-- 4 files changed, 102 insertions(+), 5 deletions(-) diff --git a/actions/changelog-armed/changelog-armed.sh b/actions/changelog-armed/changelog-armed.sh index 0e4b0ba..258bb45 100644 --- a/actions/changelog-armed/changelog-armed.sh +++ b/actions/changelog-armed/changelog-armed.sh @@ -96,6 +96,11 @@ if [ -d "$fragments_dir" ]; then fi done <<<"$fragments" + if ! diagnosis="$(changelog_shape_problem "$changelog" "$fragments_dir")"; then + printf 'changelog-armed: %s\n' "$diagnosis" >&2 + exit 1 + fi + if version_is_dev "$ver"; then echo "changelog-armed: version '$ver' agrees with fragment mode ($fragments_dir)" exit 0 diff --git a/bin/changelog-assemble b/bin/changelog-assemble index 7f09db8..746f085 100755 --- a/bin/changelog-assemble +++ b/bin/changelog-assemble @@ -76,6 +76,10 @@ done fragments="$(changelog_fragments "$dir")" [ -n "$fragments" ] || refuse "zero fragments in '$dir' — a release publishes prose; refusing to publish an empty release" +if ! diagnosis="$(changelog_shape_problem "$changelog" "$dir")"; then + refuse "$diagnosis" +fi + if ! body="$(changelog_assemble "$dir")"; then refuse "$body" fi diff --git a/test/changelog-armed.test.sh b/test/changelog-armed.test.sh index 2fd7320..07124a2 100644 --- a/test/changelog-armed.test.sh +++ b/test/changelog-armed.test.sh @@ -296,6 +296,66 @@ EOF check "fragment -dev + well-formed grouped fragment passes" 0 "fragment mode" \ in_tree fragments-dev-grouped +fragment_tree fragments-dev-mixed 1.2.4-dev <<'EOF' +# Changelog + +## 1.2.3 — 2026-07-20 + +- The shipped entry. +EOF +printf '%s\n' "- Flat fragment." >"$TMP/fragments-dev-mixed/changelog.d/114.md" +cat >"$TMP/fragments-dev-mixed/changelog.d/115.md" <<'EOF' +### Fixed + +- Grouped fragment. +EOF +check "fragment mode refuses mixed shapes with the shared assembler diagnosis" 1 \ + "fragment 'changelog.d/115.md' is grouped but fragment 'changelog.d/114.md' is not" \ + in_tree fragments-dev-mixed + +fragment_tree fragments-dev-all-grouped-over-flat 1.2.4-dev <<'EOF' +# Changelog + +## 1.2.3 — 2026-07-20 + +- The shipped entry. +EOF +cat >"$TMP/fragments-dev-all-grouped-over-flat/changelog.d/115.md" <<'EOF' +### Fixed + +- Grouped fragment. +EOF +check "fragment mode refuses an all-grouped set over a flat published section" 1 \ + "changelog.d/115.md' is grouped but newest published section '1.2.3'" \ + in_tree fragments-dev-all-grouped-over-flat + +fragment_tree fragments-dev-flat-over-grouped 1.2.4-dev <<'EOF' +# Changelog + +## 1.2.3 — 2026-07-20 + +### Fixed + +- The shipped entry. +EOF +printf '%s\n' "- Flat fragment." >"$TMP/fragments-dev-flat-over-grouped/changelog.d/115.md" +check "fragment mode refuses a flat set over a grouped published section" 1 \ + "changelog.d/115.md' is flat but newest published section '1.2.3'" \ + in_tree fragments-dev-flat-over-grouped + +fragment_tree fragments-dev-no-published 1.2.4-dev <<'EOF' +# Changelog + +Preamble only. +EOF +cat >"$TMP/fragments-dev-no-published/changelog.d/115.md" <<'EOF' +### Fixed + +- Grouped fragment. +EOF +check "fragment mode accepts a consistent set with no published section" 0 \ + "fragment mode" in_tree fragments-dev-no-published + fragment_tree fragments-unreleased 1.2.4-dev <<'EOF' # Changelog diff --git a/test/changelog-assemble.test.sh b/test/changelog-assemble.test.sh index c21fc1a..34f625b 100644 --- a/test/changelog-assemble.test.sh +++ b/test/changelog-assemble.test.sh @@ -99,8 +99,16 @@ check "flat: numeric-descending order (10.md before 9.md), cross-repo name besid # --- grouped write: canonical order, unnamed group appended ------------------ -tree grouped <