releaser-pleaser/changelog.go

120 lines
2.2 KiB
Go
Raw Normal View History

2024-07-12 15:56:50 +02:00
package rp
import (
"bytes"
2024-07-15 16:45:03 +02:00
_ "embed"
"fmt"
2024-07-12 15:56:50 +02:00
"html/template"
2024-07-15 16:45:03 +02:00
"io"
2024-07-12 15:56:50 +02:00
"log"
2024-07-15 16:45:03 +02:00
"os"
"regexp"
2024-07-12 15:56:50 +02:00
"github.com/go-git/go-git/v5"
)
2024-07-15 16:45:03 +02:00
const (
ChangelogFile = "CHANGELOG.md"
ChangelogFileBuffer = "CHANGELOG.md.tmp"
ChangelogHeader = "# Changelog"
)
2024-07-12 15:56:50 +02:00
var (
changelogTemplate *template.Template
2024-07-15 16:45:03 +02:00
headerRegex = regexp.MustCompile(`^# Changelog\n`)
2024-07-12 15:56:50 +02:00
)
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-07-15 16:45:03 +02:00
func UpdateChangelogFile(wt *git.Worktree, newEntry string) error {
file, err := wt.Filesystem.OpenFile(ChangelogFile, os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
return err
}
defer file.Close()
content, err := io.ReadAll(file)
if err != nil {
return err
}
headerIndex := headerRegex.FindIndex(content)
if headerIndex == nil && len(content) != 0 {
return fmt.Errorf("unexpected format of CHANGELOG.md, header does not match")
}
if headerIndex != nil {
// Remove the header from the content
content = content[headerIndex[1]:]
}
err = file.Truncate(0)
if err != nil {
return err
}
_, err = file.Seek(0, io.SeekStart)
if err != nil {
return err
}
_, err = file.Write([]byte(ChangelogHeader + "\n\n" + newEntry))
if err != nil {
return err
}
_, err = file.Write(content)
if err != nil {
return err
}
// Close file to make sure it is written to disk.
err = file.Close()
if err != nil {
return err
}
_, err = wt.Add(ChangelogFile)
if err != nil {
return err
}
2024-07-12 15:56:50 +02:00
return nil
}
2024-07-15 16:45:03 +02:00
func NewChangelogEntry(commits []AnalyzedCommit, version, link string) (string, error) {
2024-07-12 15:56:50 +02:00
features := make([]AnalyzedCommit, 0)
fixes := make([]AnalyzedCommit, 0)
for _, commit := range commits {
switch commit.Type {
case "feat":
features = append(features, commit)
case "fix":
fixes = append(fixes, commit)
}
}
var changelog bytes.Buffer
err := changelogTemplate.Execute(&changelog, map[string]any{
"Features": features,
"Fixes": fixes,
"Version": version,
"VersionLink": link,
})
if err != nil {
return "", err
}
return changelog.String(), nil
}