diff --git a/CHANGELOG.md b/CHANGELOG.md index d753e0a..a2c395e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,6 @@ - add support for GitLab repositories (#49) - add shell to container image (#59) - **gitlab**: add CI/CD component (#55) -- **changelog**: omit version heading in forge release notes ### Bug Fixes diff --git a/internal/changelog/changelog.go b/internal/changelog/changelog.go index d6386b8..6004829 100644 --- a/internal/changelog/changelog.go +++ b/internal/changelog/changelog.go @@ -26,37 +26,27 @@ func init() { } } -func DefaultTemplate() *template.Template { - return changelogTemplate -} +func NewChangelogEntry(logger *slog.Logger, commits []commitparser.AnalyzedCommit, version, link, prefix, suffix string) (string, error) { + features := make([]commitparser.AnalyzedCommit, 0) + fixes := make([]commitparser.AnalyzedCommit, 0) -type Data struct { - Commits map[string][]commitparser.AnalyzedCommit - Version string - VersionLink string - Prefix string - Suffix string -} - -func New(commits map[string][]commitparser.AnalyzedCommit, version, versionLink, prefix, suffix string) Data { - return Data{ - Commits: commits, - Version: version, - VersionLink: versionLink, - Prefix: prefix, - Suffix: suffix, + for _, commit := range commits { + switch commit.Type { + case "feat": + features = append(features, commit) + case "fix": + fixes = append(fixes, commit) + } } -} -type Formatting struct { - HideVersionTitle bool -} - -func Entry(logger *slog.Logger, tpl *template.Template, data Data, formatting Formatting) (string, error) { var changelog bytes.Buffer - err := tpl.Execute(&changelog, map[string]any{ - "Data": data, - "Formatting": formatting, + err := changelogTemplate.Execute(&changelog, map[string]any{ + "Features": features, + "Fixes": fixes, + "Version": version, + "VersionLink": link, + "Prefix": prefix, + "Suffix": suffix, }) if err != nil { return "", err diff --git a/internal/changelog/changelog.md.tpl b/internal/changelog/changelog.md.tpl index 50907eb..1f7dd42 100644 --- a/internal/changelog/changelog.md.tpl +++ b/internal/changelog/changelog.md.tpl @@ -1,24 +1,22 @@ -{{define "entry" -}} -- {{ if .Scope }}**{{.Scope}}**: {{end}}{{.Description}} -{{ end }} - -{{- if not .Formatting.HideVersionTitle }} -## [{{.Data.Version}}]({{.Data.VersionLink}}) +## [{{.Version}}]({{.VersionLink}}) +{{- if .Prefix }} +{{ .Prefix }} {{ end -}} -{{- if .Data.Prefix }} -{{ .Data.Prefix }} -{{ end -}} -{{- with .Data.Commits.feat }} +{{- if (gt (len .Features) 0) }} ### Features -{{ range . -}}{{template "entry" .}}{{end}} +{{ range .Features -}} +- {{ if .Scope }}**{{.Scope}}**: {{end}}{{.Description}} +{{ end -}} {{- end -}} -{{- with .Data.Commits.fix }} +{{- if (gt (len .Fixes) 0) }} ### Bug Fixes -{{ range . -}}{{template "entry" .}}{{end}} +{{ range .Fixes -}} +- {{ if .Scope }}**{{.Scope}}**: {{end}}{{.Description}} +{{ end -}} {{- end -}} -{{- if .Data.Suffix }} -{{ .Data.Suffix }} +{{- if .Suffix }} +{{ .Suffix }} {{ end }} diff --git a/internal/changelog/changelog_test.go b/internal/changelog/changelog_test.go index a969730..e6582c7 100644 --- a/internal/changelog/changelog_test.go +++ b/internal/changelog/changelog_test.go @@ -168,8 +168,7 @@ This version is compatible with flux-compensator v2.2 - v2.9. for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - data := New(commitparser.ByType(tt.args.analyzedCommits), tt.args.version, tt.args.link, tt.args.prefix, tt.args.suffix) - got, err := Entry(slog.Default(), DefaultTemplate(), data, Formatting{}) + got, err := NewChangelogEntry(slog.Default(), tt.args.analyzedCommits, tt.args.version, tt.args.link, tt.args.prefix, tt.args.suffix) if !tt.wantErr(t, err) { return } diff --git a/internal/commitparser/commitparser.go b/internal/commitparser/commitparser.go index 023c6b4..484d733 100644 --- a/internal/commitparser/commitparser.go +++ b/internal/commitparser/commitparser.go @@ -15,18 +15,3 @@ type AnalyzedCommit struct { Scope *string BreakingChange bool } - -// ByType groups the Commits by the type field. Used by the Changelog. -func ByType(in []AnalyzedCommit) map[string][]AnalyzedCommit { - out := map[string][]AnalyzedCommit{} - - for _, commit := range in { - if out[commit.Type] == nil { - out[commit.Type] = make([]AnalyzedCommit, 0, 1) - } - - out[commit.Type] = append(out[commit.Type], commit) - } - - return out -} diff --git a/releaserpleaser.go b/releaserpleaser.go index 2b1754f..a69ef9e 100644 --- a/releaserpleaser.go +++ b/releaserpleaser.go @@ -243,9 +243,7 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error { return err } - changelogData := changelog.New(commitparser.ByType(analyzedCommits), nextVersion, rp.forge.ReleaseURL(nextVersion), releaseOverrides.Prefix, releaseOverrides.Suffix) - - changelogEntry, err := changelog.Entry(logger, changelog.DefaultTemplate(), changelogData, changelog.Formatting{}) + changelogEntry, err := changelog.NewChangelogEntry(logger, analyzedCommits, nextVersion, rp.forge.ReleaseURL(nextVersion), releaseOverrides.Prefix, releaseOverrides.Suffix) if err != nil { return fmt.Errorf("failed to build changelog entry: %w", err) } @@ -291,16 +289,9 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error { logger.InfoContext(ctx, "file content is already up-to-date in remote branch, skipping push") } - // We do not need the version title here. In the pull request the version is available from the title, and in the - // release on the Forge its usually in a heading somewhere above the text. - changelogEntryPullRequest, err := changelog.Entry(logger, changelog.DefaultTemplate(), changelogData, changelog.Formatting{HideVersionTitle: true}) - if err != nil { - return fmt.Errorf("failed to build pull request changelog entry: %w", err) - } - // Open/Update PR if pr == nil { - pr, err = releasepr.NewReleasePullRequest(rpBranch, rp.targetBranch, nextVersion, changelogEntryPullRequest) + pr, err = releasepr.NewReleasePullRequest(rpBranch, rp.targetBranch, nextVersion, changelogEntry) if err != nil { return err } @@ -317,7 +308,7 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error { if err != nil { return err } - err = pr.SetDescription(changelogEntryPullRequest, overrides) + err = pr.SetDescription(changelogEntry, overrides) if err != nil { return err }