feat: enforce changelog shape in guard and assembler
This commit is contained in:
parent
ef658f52a4
commit
fdf544b390
4 changed files with 102 additions and 5 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue