Update version_branch.yml

This commit is contained in:
2025-12-23 18:31:32 -06:00
parent 0e6036c622
commit ad92989f22

View File

@@ -464,7 +464,8 @@ jobs:
stamp = datetime.now(timezone.utc).strftime("%Y-%m-%d") stamp = datetime.now(timezone.utc).strftime("%Y-%m-%d")
p = Path("CHANGELOG.md") p = Path("CHANGELOG.md")
lines = p.read_text(encoding="utf-8", errors="replace").splitlines(True) raw = p.read_text(encoding="utf-8", errors="replace")
lines = raw.splitlines(True)
def is_h2(line: str) -> bool: def is_h2(line: str) -> bool:
return line.lstrip().startswith("## ") return line.lstrip().startswith("## ")
@@ -472,40 +473,37 @@ jobs:
def norm(line: str) -> str: def norm(line: str) -> str:
return line.strip().lower() return line.strip().lower()
unreleased_idx = None def find_idx(predicate):
for i, line in enumerate(lines): for i, ln in enumerate(lines):
if norm(line) == "## [unreleased]": if predicate(ln):
unreleased_idx = i return i
break return None
version_idx = None unreleased_idx = find_idx(lambda ln: norm(ln) == "## [unreleased]")
for i, line in enumerate(lines): version_idx = find_idx(lambda ln: ln.lstrip().startswith(f"## [{new_version}]") )
if line.lstrip().startswith(f"## [{new_version}]"):
version_idx = i def version_header() -> list[str]:
break return ["
", f"## [{new_version}] - {stamp}
", "
"]
if unreleased_idx is None: if unreleased_idx is None:
if version_idx is None: if version_idx is None:
# Insert new version entry after top H1 if present, else at start.
insert_at = 0 insert_at = 0
for i, line in enumerate(lines): for i, ln in enumerate(lines):
if line.lstrip().startswith("# "): if ln.lstrip().startswith("# "):
insert_at = i + 1 insert_at = i + 1
while insert_at < len(lines) and lines[insert_at].strip() == "": while insert_at < len(lines) and lines[insert_at].strip() == "":
insert_at += 1 insert_at += 1
break break
entry = version_header() + ["- No changes recorded.
entry = ["
", f"## [{new_version}] - {stamp}
", "
", "- No changes recorded.
", " ", "
"] "]
lines[insert_at:insert_at] = entry lines[insert_at:insert_at] = entry
p.write_text("".join(lines), encoding="utf-8") p.write_text("".join(lines), encoding="utf-8")
raise SystemExit(0) raise SystemExit(0)
# Find Unreleased body range.
u_start = unreleased_idx + 1 u_start = unreleased_idx + 1
u_end = len(lines) u_end = len(lines)
for j in range(u_start, len(lines)): for j in range(u_start, len(lines)):
@@ -515,45 +513,27 @@ jobs:
unreleased_body = "".join(lines[u_start:u_end]).strip() unreleased_body = "".join(lines[u_start:u_end]).strip()
# Ensure version header exists. If not, create immediately after Unreleased header.
if version_idx is None: if version_idx is None:
insert_at = u_end lines[u_end:u_end] = version_header()
header = ["
", f"## [{new_version}] - {stamp} version_idx = find_idx(lambda ln: ln.lstrip().startswith(f"## [{new_version}]") )
", " if version_idx is None:
"] raise SystemExit("[FATAL] Failed to locate version header after insertion")
lines[insert_at:insert_at] = header
version_idx = insert_at + 1
# If we created the header, version_idx points to the header line.
# Insert moved body after version header line.
if unreleased_body: if unreleased_body:
# Recompute version header index safely after any insertions.
for i, line in enumerate(lines):
if line.lstrip().startswith(f"## [{new_version}]"):
version_idx = i
break
insert_at = version_idx + 1 insert_at = version_idx + 1
while insert_at < len(lines) and lines[insert_at].strip() == "": while insert_at < len(lines) and lines[insert_at].strip() == "":
insert_at += 1 insert_at += 1
body_lines = [" moved = ["
"] + [x + (" "] + [ln + "
" if not x.endswith(" " for ln in unreleased_body.split("
") else "") for x in unreleased_body.split(" ") if ln != ""] + ["
")] + ["
"] "]
lines[insert_at:insert_at] = body_lines lines[insert_at:insert_at] = moved
# Clear Unreleased body. # Clear Unreleased body.
# Recompute Unreleased indices after modifications. unreleased_idx = find_idx(lambda ln: norm(ln) == "## [unreleased]")
unreleased_idx = None
for i, line in enumerate(lines):
if norm(line) == "## [unreleased]":
unreleased_idx = i
break
if unreleased_idx is not None: if unreleased_idx is not None:
u_start = unreleased_idx + 1 u_start = unreleased_idx + 1
u_end = len(lines) u_end = len(lines)
@@ -561,8 +541,6 @@ jobs:
if is_h2(lines[j]): if is_h2(lines[j]):
u_end = j u_end = j
break break
# Replace body with exactly one blank line.
lines[u_start:u_end] = [" lines[u_start:u_end] = ["
"] "]