|
|
@@ -1,18 +1,22 @@
|
|
|
"""
|
|
|
-This script updates a specific version's release notes section in CHANGELOG.md with new content.
|
|
|
+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 new content as input from environment variables
|
|
|
+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. Replaces the content between the current version header and the next version header
|
|
|
- (or end of file if it's the latest version) with the new content
|
|
|
+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 notes for
|
|
|
- PREV_VERSION: The previous version number (optional)
|
|
|
- NEW_CONTENT: The new content to insert for this version
|
|
|
+ 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
|
|
|
@@ -22,39 +26,37 @@ 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['NEW_CONTENT']
|
|
|
-
|
|
|
-def overwrite_changelog_section(content: str):
|
|
|
- """Replace a specific version section in the changelog content.
|
|
|
-
|
|
|
- Args:
|
|
|
- content: The full changelog content as a string
|
|
|
-
|
|
|
- Returns:
|
|
|
- The updated changelog content with the new section
|
|
|
-
|
|
|
- Example:
|
|
|
- >>> content = "## 1.2.0\\nOld changes\\n## 1.1.0\\nOld changes"
|
|
|
- >>> NEW_CONTENT = "New changes"
|
|
|
- >>> overwrite_changelog_section(content)
|
|
|
- '## 1.2.0\\nNew changes\\n## 1.1.0\\nOld changes'
|
|
|
- """
|
|
|
+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}")
|
|
|
- notes_start_index = content.find(version_pattern) + len(version_pattern)
|
|
|
print(f"prev_version: {PREV_VERSION}")
|
|
|
- prev_version_pattern = f"## {PREV_VERSION}\n"
|
|
|
- notes_end_index = content.find(prev_version_pattern, notes_start_index) if PREV_VERSION and prev_version_pattern in content else len(content)
|
|
|
- return content[:notes_start_index] + f"{NEW_CONTENT}\n" + content[notes_end_index:]
|
|
|
|
|
|
-with open(CHANGELOG_PATH, 'r') as f:
|
|
|
- content = f.read()
|
|
|
+ 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)
|
|
|
|
|
|
-new_changelog = overwrite_changelog_section(content)
|
|
|
+ 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
|
|
|
|
|
|
-print(new_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!")
|