main
1package generator
2
3import (
4 "encoding/json"
5 "os"
6 "path/filepath"
7
8 "mokhan.ca/xlgmokha/gitmal/internal/git"
9)
10
11type CommitJSON struct {
12 SHA string `json:"sha"`
13 Commit CommitDetail `json:"commit"`
14 Parents []ParentRef `json:"parents"`
15}
16
17type CommitDetail struct {
18 Author PersonInfo `json:"author"`
19 Committer PersonInfo `json:"committer"`
20 Message string `json:"message"`
21}
22
23type PersonInfo struct {
24 Name string `json:"name"`
25 Email string `json:"email"`
26 Date string `json:"date"`
27}
28
29type ParentRef struct {
30 SHA string `json:"sha"`
31}
32
33func toCommitJSON(c git.Commit) CommitJSON {
34 message := c.Subject
35 if c.Body != "" {
36 message = c.Subject + "\n\n" + c.Body
37 }
38 parents := make([]ParentRef, len(c.Parents))
39 for i, p := range c.Parents {
40 parents[i] = ParentRef{SHA: p}
41 }
42 return CommitJSON{
43 SHA: c.Hash,
44 Commit: CommitDetail{
45 Author: PersonInfo{Name: c.Author, Email: c.Email, Date: c.Date.Format("2006-01-02T15:04:05Z")},
46 Committer: PersonInfo{Name: c.CommitterName, Email: c.CommitterEmail, Date: c.CommitterDate.Format("2006-01-02T15:04:05Z")},
47 Message: message,
48 },
49 Parents: parents,
50 }
51}
52
53func GenerateCommitsJSON(commits []git.Commit, params Params) error {
54 outDir := filepath.Join(params.OutputDir, "commits")
55 if err := os.MkdirAll(outDir, 0o755); err != nil {
56 return err
57 }
58 list := make([]CommitJSON, len(commits))
59 for i, c := range commits {
60 list[i] = toCommitJSON(c)
61 }
62 outPath := filepath.Join(outDir, params.Ref.DirName()+".json")
63 f, err := os.Create(outPath)
64 if err != nil {
65 return err
66 }
67 defer f.Close()
68 encoder := json.NewEncoder(f)
69 encoder.SetIndent("", " ")
70 return encoder.Encode(list)
71}