2024-08-31 15:23:21 +02:00
|
|
|
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
|
|
|
"html/template"
|
|
|
|
|
"log"
|
2024-08-31 22:23:01 +02:00
|
|
|
"log/slog"
|
2024-07-12 15:56:50 +02:00
|
|
|
|
2024-08-31 15:23:21 +02:00
|
|
|
"github.com/apricote/releaser-pleaser/internal/commitparser"
|
2024-08-31 22:23:01 +02:00
|
|
|
"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)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-22 14:00:30 +02:00
|
|
|
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
|
|
|
}
|
2024-09-22 14:00:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Formatting struct {
|
|
|
|
|
HideVersionTitle bool
|
|
|
|
|
}
|
2024-07-12 15:56:50 +02:00
|
|
|
|
2024-09-22 14:00:30 +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
|
2024-09-22 14:00:30 +02:00
|
|
|
err := tpl.Execute(&changelog, map[string]any{
|
|
|
|
|
"Data": data,
|
|
|
|
|
"Formatting": formatting,
|
2024-07-12 15:56:50 +02:00
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-31 22:23:01 +02:00
|
|
|
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
|
|
|
}
|