package generator import ( "encoding/xml" "os" "path/filepath" "mokhan.ca/xlgmokha/gitmal/internal/git" ) type AtomFeed struct { XMLName xml.Name `xml:"feed"` XMLNS string `xml:"xmlns,attr"` ID string `xml:"id"` Title string `xml:"title"` Updated string `xml:"updated"` Link []AtomLink `xml:"link"` Entries []AtomEntry `xml:"entry"` } type AtomLink struct { Rel string `xml:"rel,attr"` Type string `xml:"type,attr"` Href string `xml:"href,attr"` } type AtomEntry struct { ID string `xml:"id"` Title string `xml:"title"` Updated string `xml:"updated"` Author AtomAuthor `xml:"author"` Content string `xml:"content"` Link AtomLink `xml:"link"` } type AtomAuthor struct { Name string `xml:"name"` Email string `xml:"email,omitempty"` } func GenerateCommitsAtom(commits []git.Commit, params Params) error { outDir := filepath.Join(params.OutputDir, "commits") if err := os.MkdirAll(outDir, 0o755); err != nil { return err } var updated string if len(commits) > 0 { updated = commits[0].Date.Format("2006-01-02T15:04:05Z") } entries := make([]AtomEntry, len(commits)) for i, c := range commits { content := c.Subject if c.Body != "" { content = c.Subject + "\n\n" + c.Body } entries[i] = AtomEntry{ ID: "urn:sha:" + c.Hash, Title: c.Subject, Updated: c.Date.Format("2006-01-02T15:04:05Z"), Author: AtomAuthor{Name: c.Author, Email: c.Email}, Content: content, Link: AtomLink{ Rel: "alternate", Type: "text/html", Href: "commit/" + c.Hash + ".html", }, } } feed := AtomFeed{ XMLNS: "http://www.w3.org/2005/Atom", ID: "urn:gitmal:" + params.Name + ":" + params.Ref.String(), Title: params.Name + " commits on " + params.Ref.String(), Updated: updated, Link: []AtomLink{ {Rel: "self", Type: "application/atom+xml", Href: "commits/" + params.Ref.DirName() + ".atom"}, }, Entries: entries, } outPath := filepath.Join(outDir, params.Ref.DirName()+".atom") f, err := os.Create(outPath) if err != nil { return err } defer f.Close() if _, err := f.WriteString(xml.Header); err != nil { return err } encoder := xml.NewEncoder(f) encoder.Indent("", " ") return encoder.Encode(feed) }