packaging/linux/deb/template_changelog.go (81 lines of code) (raw):

package deb import ( "bytes" _ "embed" "fmt" "io" "path/filepath" "strings" "text/template" "time" "github.com/Azure/dalec" "github.com/moby/buildkit/client/llb" "golang.org/x/exp/slices" ) const distroVersionIDSeparator = "u" func Changelog(spec *dalec.Spec, in llb.State, target, dir, distroVersionID string) (llb.State, error) { buf := bytes.NewBuffer(nil) if dir == "" { dir = "debian" } if err := WriteChangelog(buf, spec, target, distroVersionID); err != nil { return llb.Scratch(), err } return in. File(llb.Mkdir(dir, 0o755, llb.WithParents(true))). File(llb.Mkfile(filepath.Join(dir, "changelog"), 0o644, buf.Bytes())), nil } func WriteChangelog(w io.Writer, spec *dalec.Spec, target, distroID string) error { return changelogTmpl.Execute(w, &changelogWrapper{ Spec: spec, Target: target, DistroID: distroID, }) } type changelogWrapper struct { *dalec.Spec Target string DistroID string } var dummyChangelogEntry = dalec.ChangelogEntry{ Date: time.Unix(0, 0), Author: "Dalec Dummy Changelog <>", Changes: []string{ "Dummy changelog entry", }, } func (w *changelogWrapper) DistroVersionID() string { if w.DistroID == "" { return "" } return w.DistroID } func (w *changelogWrapper) DistroVersionSeparator() string { if w.DistroID == "" { return "" } return distroVersionIDSeparator } func (w *changelogWrapper) Change() string { entries := slices.Clone(w.Spec.Changelog) // Get the most recent changelog entry only // TODO: this could be better... but it's not worth the effort right now // Where "better" means list all changelog entries // Where "not worth the effort" means the changelog entry type needs updating to include extra details like the version a change was made in // Really the changelog model in debian does not line up well with the dalec model because it also wants distribution information as well. // Sort so newest entry (by change date) is on top. slices.SortFunc(entries, func(i, j dalec.ChangelogEntry) int { return i.Date.Compare(j.Date) }) var entry dalec.ChangelogEntry if len(entries) == 0 { entry = dummyChangelogEntry } else { entry = entries[0] } buf := &strings.Builder{} for _, change := range entry.Changes { fmt.Fprintln(buf, " *", change) } fmt.Fprintf(buf, " -- %s %s", entry.Author, entry.Date.Format("Mon, 02 Jan 2006 15:04:05 -0700")) return buf.String() } var ( //go:embed templates/debian_changelog.tmpl changelogTmplContent []byte changelogTmpl = template.Must(template.New("dummy-changelog-entry").Parse(string(changelogTmplContent))) )