releaser-pleaser/internal/changelog/changelog.go

73 lines
1.5 KiB
Go
Raw Normal View History

package changelog
2024-07-12 15:56:50 +02:00
import (
"bytes"
2024-07-15 16:45:03 +02:00
_ "embed"
2024-07-12 15:56:50 +02:00
"log"
"log/slog"
"text/template"
2024-07-12 15:56:50 +02:00
"github.com/apricote/releaser-pleaser/internal/commitparser"
"github.com/apricote/releaser-pleaser/internal/markdown"
2024-07-15 16:45:03 +02:00
)
2024-07-12 15:56:50 +02:00
var (
changelogTemplate *template.Template
)
2024-07-15 16:45:03 +02:00
//go:embed changelog.md.tpl
var rawChangelogTemplate string
2024-07-12 15:56:50 +02:00
func init() {
var err error
2024-07-15 16:45:03 +02:00
changelogTemplate, err = template.New("changelog").Parse(rawChangelogTemplate)
2024-07-12 15:56:50 +02:00
if err != nil {
log.Fatalf("failed to parse changelog template: %v", err)
}
}
func DefaultTemplate() *template.Template {
return changelogTemplate
}
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,
2024-07-12 15:56:50 +02:00
}
}
type Formatting struct {
HideVersionTitle bool
}
2024-07-12 15:56:50 +02:00
func Entry(logger *slog.Logger, tpl *template.Template, data Data, formatting Formatting) (string, error) {
2024-07-12 15:56:50 +02:00
var changelog bytes.Buffer
err := tpl.Execute(&changelog, map[string]any{
"Data": data,
"Formatting": formatting,
2024-07-12 15:56:50 +02:00
})
if err != nil {
return "", err
}
formatted, err := markdown.Format(changelog.String())
if err != nil {
logger.Warn("failed to format changelog entry, using unformatted", "error", err)
return changelog.String(), nil
}
return formatted, nil
2024-07-12 15:56:50 +02:00
}