1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
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)
}
|