feat: use reference-style links in changelog instead of inline links
Moves changelog link generation from inline heading format ## [1.1.0](https://...) - date to reference-style definitions at the bottom of the file ## [1.1.0] - date ... [Unreleased]: https://.../src/branch/main [1.1.0]: https://.../releases/tag/v1.1.0 This keeps headings plain, which simplifies changelog parsing (the awk pattern in publish/action.yml now matches without special-casing the inline URL), and follows the canonical Keep a Changelog style.
This commit is contained in:
@@ -25,6 +25,7 @@ var releasedSectionRe = regexp.MustCompile(`(?m)^## \[(\d+\.\d+\.\d+)\] - `)
|
||||
var linkedReleasedSectionRe = regexp.MustCompile(`(?m)^## \[(\d+\.\d+\.\d+)\](?:\([^\n)]*\))? - `)
|
||||
var unreleasedHeadingRe = regexp.MustCompile(`(?m)^## \[Unreleased\](?:\([^\n)]*\))?\n`)
|
||||
var releaseHeadingRe = regexp.MustCompile(`(?m)^## \[(\d+\.\d+\.\d+)\](?:\([^\n)]*\))? - `)
|
||||
var refLinkLineRe = regexp.MustCompile(`^\[[^\]]+\]: \S`)
|
||||
|
||||
type Options struct {
|
||||
// VersionFile is the path to the file that stores the current version,
|
||||
@@ -412,19 +413,38 @@ func addChangelogLinks(text, repoURL string) string {
|
||||
return text
|
||||
}
|
||||
|
||||
mainURL := repoURL + "/src/branch/main"
|
||||
text = unreleasedHeadingRe.ReplaceAllString(text, fmt.Sprintf("## [Unreleased](%s)\n", mainURL))
|
||||
|
||||
// Normalize headings to plain format, stripping any existing inline links.
|
||||
text = unreleasedHeadingRe.ReplaceAllString(text, "## [Unreleased]\n")
|
||||
text = releaseHeadingRe.ReplaceAllStringFunc(text, func(match string) string {
|
||||
parts := releaseHeadingRe.FindStringSubmatch(match)
|
||||
if len(parts) < 2 {
|
||||
return match
|
||||
}
|
||||
version := parts[1]
|
||||
return fmt.Sprintf("## [%s](%s/releases/tag/v%s) - ", version, repoURL, version)
|
||||
return fmt.Sprintf("## [%s] - ", version)
|
||||
})
|
||||
|
||||
return text
|
||||
// Strip any trailing reference link block (blank lines followed by ref link lines).
|
||||
lines := strings.Split(strings.TrimRight(text, "\n"), "\n")
|
||||
cutAt := len(lines)
|
||||
for i := len(lines) - 1; i >= 0; i-- {
|
||||
if strings.TrimSpace(lines[i]) == "" || refLinkLineRe.MatchString(lines[i]) {
|
||||
cutAt = i
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
text = strings.Join(lines[:cutAt], "\n") + "\n"
|
||||
|
||||
// Build and append reference link definitions.
|
||||
linkDefs := []string{fmt.Sprintf("[Unreleased]: %s/src/branch/main", repoURL)}
|
||||
for _, match := range releasedSectionRe.FindAllStringSubmatch(text, -1) {
|
||||
if len(match) >= 2 {
|
||||
linkDefs = append(linkDefs, fmt.Sprintf("[%s]: %s/releases/tag/v%s", match[1], repoURL, match[1]))
|
||||
}
|
||||
}
|
||||
|
||||
return strings.TrimRight(text, "\n") + "\n\n" + strings.Join(linkDefs, "\n") + "\n"
|
||||
}
|
||||
|
||||
func parseSemver(version string) (semver, error) {
|
||||
|
||||
Reference in New Issue
Block a user