Skip to content

Commit 6ae2246

Browse files
committed
fix(release): permit an empty authoritative fragment set
1 parent 69a292d commit 6ae2246

1 file changed

Lines changed: 10 additions & 5 deletions

File tree

scripts/render_changelog_fragments.py

100644100755
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def render_unreleased(paths: Iterable[Path] | None = None) -> str:
7373
"""Render all fragments as one deterministic ``Unreleased`` Markdown block."""
7474
selected = fragment_paths() if paths is None else tuple(paths)
7575
if not selected:
76-
raise ValueError("at least one changelog fragment is required")
76+
return "## Unreleased\n"
7777

7878
grouped: dict[str, list[tuple[str, tuple[str, ...]]]] = defaultdict(list)
7979
for path in selected:
@@ -94,10 +94,15 @@ def render_unreleased(paths: Iterable[Path] | None = None) -> str:
9494

9595
def _managed_block(rendered: str) -> str:
9696
"""Return the marker-delimited fragment body embedded under Unreleased."""
97-
heading, separator, body = rendered.partition("\n\n")
98-
if heading != "## Unreleased" or not separator or not body.strip():
99-
raise ValueError("rendered changelog must contain one non-empty Unreleased block")
100-
return f"{BEGIN_MARKER}\n{body.rstrip()}\n{END_MARKER}\n"
97+
if rendered == "## Unreleased\n":
98+
return f"{BEGIN_MARKER}\n{END_MARKER}\n"
99+
prefix = "## Unreleased\n\n"
100+
if not rendered.startswith(prefix):
101+
raise ValueError("rendered changelog must contain one Unreleased block")
102+
body = rendered[len(prefix) :].rstrip()
103+
if not body:
104+
raise ValueError("rendered changelog has an invalid empty fragment body")
105+
return f"{BEGIN_MARKER}\n{body}\n{END_MARKER}\n"
101106

102107

103108
def synchronize_text(changelog: str, rendered: str) -> str:

0 commit comments

Comments
 (0)