From c94a3d0d668b616e01a17dbc3635c44ff27febee Mon Sep 17 00:00:00 2001 From: Songmu Date: Thu, 18 Aug 2022 13:48:18 +0900 Subject: [PATCH] create as many changelogs as possible if missing --- changelog.go | 11 ++++++++--- rcpr.go | 23 ++++++++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/changelog.go b/changelog.go index 694599a..f9f1b7d 100644 --- a/changelog.go +++ b/changelog.go @@ -12,7 +12,7 @@ import ( ) var ( - versionLinkReg = regexp.MustCompile(`\*\*Full Changelog\*\*: (https://.*)$`) + versionLinkReg = regexp.MustCompile(`\n\*\*Full Changelog\*\*: (https://.*)$`) semverFromLinkReg = regexp.MustCompile(`.*[./](v?[0-9]+\.[0-9]+\.[0-9]+)`) newContribReg = regexp.MustCompile(`(?ms)## New Contributors.*\z`) ) @@ -45,9 +45,14 @@ func exists(filename string) bool { return err == nil } -func insertNewChangelog(orig []byte, section string) string { +var changelogReg = regexp.MustCompile(`(?i)^# Change\s?log`) + +func insertNewChangelog(orig string, section string) string { + orig = strings.TrimSpace(orig) + "\n" + section = strings.TrimSpace(section) + "\n" + var bf bytes.Buffer - lineSnr := bufio.NewScanner(bytes.NewReader(orig)) + lineSnr := bufio.NewScanner(strings.NewReader(orig)) inserted := false for lineSnr.Scan() { line := lineSnr.Text() diff --git a/rcpr.go b/rcpr.go index 4d683f2..11b403f 100644 --- a/rcpr.go +++ b/rcpr.go @@ -326,16 +326,33 @@ func Run(ctx context.Context, argv []string, outStream, errStream io.Writer) err changelog := convertKeepAChangelogFormat(releases.Body) changelogMd := "CHANGELOG.md" + var content string if exists(changelogMd) { byt, err := os.ReadFile(changelogMd) if err != nil { return err } - content = insertNewChangelog(byt, changelog) - } else { - content = "# Changelog\n\n" + changelog + content = strings.TrimSpace(string(byt)) + "\n" } + + // If the changelog is not in "keep a changelog" format, or if the file does not exist, re-create everything. Is it rough...? + if !changelogReg.MatchString(content) { + // We are concerned that depending on the release history, API requests may become more frequent. + vers := (&gitsemvers.Semvers{}).VersionStrings() + logs := []string{"# Changelog\n"} + for i := len(vers) - 1; i >= 0 || len(vers)-i < 10; i-- { // Up to 10 most recent versions + ver := vers[i] + releases, _, _ := rp.gh.Repositories.GenerateReleaseNotes( + ctx, rp.owner, rp.repo, &github.GenerateNotesOptions{ + TagName: ver, + }) + logs = append(logs, strings.TrimSpace(convertKeepAChangelogFormat(releases.Body))+"\n") + } + content = strings.Join(logs, "\n") + } + + content = insertNewChangelog(content, changelog) if err := os.WriteFile(changelogMd, []byte(content), 0644); err != nil { return err }