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}