Parcourir la source

Fix changelog generation (#3856)

Chris Estreich il y a 7 mois
Parent
commit
45e22637b5

+ 5 - 0
.changeset/cold-donuts-clean.md

@@ -0,0 +1,5 @@
+---
+"roo-cline": patch
+---
+
+Fix changelog generation

+ 82 - 0
.github/scripts/overwrite_changeset_changelog.py

@@ -0,0 +1,82 @@
+"""
+This script updates a specific version's release notes section in CHANGELOG.md with new content
+or reformats existing content.
+
+The script:
+1. Takes a version number, changelog path, and optionally new content as input from environment variables
+2. Finds the section in the changelog for the specified version
+3. Either:
+   a) Replaces the content with new content if provided, or
+   b) Reformats existing content by:
+      - Removing the first two lines of the changeset format
+      - Ensuring version numbers are wrapped in square brackets
+4. Writes the updated changelog back to the file
+
+Environment Variables:
+    CHANGELOG_PATH: Path to the changelog file (defaults to 'CHANGELOG.md')
+    VERSION: The version number to update/format
+    PREV_VERSION: The previous version number (used to locate section boundaries)
+    NEW_CONTENT: Optional new content to insert for this version
+"""
+
+#!/usr/bin/env python3
+
+import os
+
+CHANGELOG_PATH = os.environ.get("CHANGELOG_PATH", "CHANGELOG.md")
+VERSION = os.environ["VERSION"]
+PREV_VERSION = os.environ.get("PREV_VERSION", "")
+NEW_CONTENT = os.environ.get("NEW_CONTENT", "")
+
+
+def overwrite_changelog_section(changelog_text: str, new_content: str):
+    # Find the section for the specified version
+    version_pattern = f"## {VERSION}\n"
+    prev_version_pattern = f"## [{PREV_VERSION}]\n"
+    print(f"latest version: {VERSION}")
+    print(f"prev_version: {PREV_VERSION}")
+
+    notes_start_index = changelog_text.find(version_pattern) + len(version_pattern)
+    notes_end_index = (
+        changelog_text.find(prev_version_pattern, notes_start_index)
+        if PREV_VERSION and prev_version_pattern in changelog_text
+        else len(changelog_text)
+    )
+
+    if new_content:
+        return (
+            changelog_text[:notes_start_index]
+            + f"{new_content}\n"
+            + changelog_text[notes_end_index:]
+        )
+    else:
+        changeset_lines = changelog_text[notes_start_index:notes_end_index].split("\n")
+        # Remove the first two lines from the regular changeset format, ex: \n### Patch Changes
+        parsed_lines = "\n".join(changeset_lines[2:])
+        updated_changelog = (
+            changelog_text[:notes_start_index]
+            + parsed_lines
+            + changelog_text[notes_end_index:]
+        )
+        updated_changelog = updated_changelog.replace(
+            f"## {VERSION}", f"## [{VERSION}]"
+        )
+        return updated_changelog
+
+
+with open(CHANGELOG_PATH, "r") as f:
+    changelog_content = f.read()
+
+new_changelog = overwrite_changelog_section(changelog_content, NEW_CONTENT)
+print(
+    "----------------------------------------------------------------------------------"
+)
+print(new_changelog)
+print(
+    "----------------------------------------------------------------------------------"
+)
+# Write back to CHANGELOG.md
+with open(CHANGELOG_PATH, "w") as f:
+    f.write(new_changelog)
+
+print(f"{CHANGELOG_PATH} updated successfully!")