From e74f354e907595f8839d500d4620ec60b17df29f Mon Sep 17 00:00:00 2001 From: drakezhang Date: Tue, 8 Sep 2026 20:38:17 +0800 Subject: [PATCH] fix(release): support changelogs without unreleased section --- CHANGELOG.md | 2 -- scripts/release.mjs | 12 +++++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d625d9a..4669d4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/). Starting from 0.2.0, CLI / Extension / DSH Plugin share the same version number. -## [Unreleased] - ## [0.2.1] - 2026-09-09 ### Changed diff --git a/scripts/release.mjs b/scripts/release.mjs index f7a6e95..6459524 100755 --- a/scripts/release.mjs +++ b/scripts/release.mjs @@ -174,16 +174,22 @@ function updateChangelog(version) { const today = new Date().toISOString().slice(0, 10); const escapedVer = version.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const versionHeading = new RegExp(`^## \\[${escapedVer}\\](?:\\s|$)`, "m"); // First: fill in any date-placeholder line for this version (e.g. "## [0.2.0] - 2026-09-XX") const versionPlaceholder = new RegExp(`^## \\[${escapedVer}\\]\\s*-\\s*\\d{4}-\\d{2}-XX`, "m"); if (versionPlaceholder.test(content)) { content = content.replace(versionPlaceholder, `## [${version}] - ${today}`); - } else { - // Otherwise: insert a new section after [Unreleased] + } else if (!versionHeading.test(content)) { + // Preserve prepared release entries; new versions go before the release history. + const heading = `## [${version}] - ${today}`; const unreleased = /^## \[Unreleased\]/m; if (unreleased.test(content)) { - content = content.replace(unreleased, `## [Unreleased]\n\n## [${version}] - ${today}`); + content = content.replace(unreleased, `## [Unreleased]\n\n${heading}`); + } else if (/^## /m.test(content)) { + content = content.replace(/^## /m, `${heading}\n\n## `); + } else { + content = `${content.trimEnd()}\n\n${heading}\n`; } }