feat: enforce changelog shape in guard and assembler

This commit is contained in:
codex-bot-andresmgsl 2026-07-24 16:14:35 +00:00
parent ef658f52a4
commit fdf544b390
4 changed files with 102 additions and 5 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 <<EOF
$BASE_CHANGELOG
tree grouped <<'EOF'
# Changelog
Preamble prose belongs to no section.
## 0.1.0 — 2026-07-01
### Fixed
- The shipped entry.
EOF
frag grouped 21.md <<'EOF'
### Fixed
@ -133,7 +141,7 @@ check "grouped: write mode assembles the same section" 0 "consumed 3 fragment" \
in_tree grouped 0.2.0 2026-07-24
check "grouped: the written file is exact" 0 "" \
assert_file "$TMP/grouped/CHANGELOG.md" \
$'# Changelog\n\nPreamble prose belongs to no section.\n\n## 0.2.0 — 2026-07-24\n\n'"$GROUPED_BODY"$'\n\n## 0.1.0 — 2026-07-01\n\n- The shipped entry.'
$'# Changelog\n\nPreamble prose belongs to no section.\n\n## 0.2.0 — 2026-07-24\n\n'"$GROUPED_BODY"$'\n\n## 0.1.0 — 2026-07-01\n\n### Fixed\n\n- The shipped entry.'
# --- a changelog holding only its preamble -----------------------------------
@ -281,6 +289,18 @@ check "grouped + flat mixed refuses, both files named" 1 "6.md" \
check "the mixed refusal names the flat side too" 1 "5.md" \
in_tree mixed 0.2.0
tree grouped-over-flat <<EOF
$BASE_CHANGELOG
EOF
frag grouped-over-flat 6.md <<'EOF'
### Added
- Grouped six.
EOF
check "an all-grouped set over a flat published section refuses before assembly" 1 \
"fragment 'changelog.d/6.md' is grouped but newest published section '0.1.0'" \
in_tree grouped-over-flat 0.2.0
tree already <<'EOF'
# Changelog
@ -324,8 +344,16 @@ check "--dir without a value is a usage error" 2 "usage:" in_tree flat-one 0.2.0
# --- round trip: the publisher and the assembler agree by test ---------------
tree round-trip <<EOF
$BASE_CHANGELOG
tree round-trip <<'EOF'
# Changelog
Preamble prose belongs to no section.
## 0.1.0 — 2026-07-01
### Fixed
- The shipped entry.
EOF
frag round-trip 30.md <<'EOF'
### Added