summaryrefslogtreecommitdiff
path: root/internal/generator/commits_json.go
blob: aaa4f017f2175a804f007378afd49613a56f684a (plain)
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
package generator

import (
	"encoding/json"
	"os"
	"path/filepath"

	"mokhan.ca/xlgmokha/gitmal/internal/git"
)

type CommitJSON struct {
	SHA     string       `json:"sha"`
	Commit  CommitDetail `json:"commit"`
	Parents []ParentRef  `json:"parents"`
}

type CommitDetail struct {
	Author    PersonInfo `json:"author"`
	Committer PersonInfo `json:"committer"`
	Message   string     `json:"message"`
}

type PersonInfo struct {
	Name  string `json:"name"`
	Email string `json:"email"`
	Date  string `json:"date"`
}

type ParentRef struct {
	SHA string `json:"sha"`
}

func toCommitJSON(c git.Commit) CommitJSON {
	message := c.Subject
	if c.Body != "" {
		message = c.Subject + "\n\n" + c.Body
	}
	parents := make([]ParentRef, len(c.Parents))
	for i, p := range c.Parents {
		parents[i] = ParentRef{SHA: p}
	}
	return CommitJSON{
		SHA: c.Hash,
		Commit: CommitDetail{
			Author:    PersonInfo{Name: c.Author, Email: c.Email, Date: c.Date.Format("2006-01-02T15:04:05Z")},
			Committer: PersonInfo{Name: c.CommitterName, Email: c.CommitterEmail, Date: c.CommitterDate.Format("2006-01-02T15:04:05Z")},
			Message:   message,
		},
		Parents: parents,
	}
}

func GenerateCommitsJSON(commits []git.Commit, params Params) error {
	outDir := filepath.Join(params.OutputDir, "commits")
	if err := os.MkdirAll(outDir, 0o755); err != nil {
		return err
	}
	list := make([]CommitJSON, len(commits))
	for i, c := range commits {
		list[i] = toCommitJSON(c)
	}
	outPath := filepath.Join(outDir, params.Ref.DirName()+".json")
	f, err := os.Create(outPath)
	if err != nil {
		return err
	}
	defer f.Close()
	encoder := json.NewEncoder(f)
	encoder.SetIndent("", "  ")
	return encoder.Encode(list)
}