main
1package generator
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7 "slices"
8
9 "mokhan.ca/xlgmokha/gitmal/internal/git"
10 "mokhan.ca/xlgmokha/gitmal/internal/templates"
11)
12
13const commitsPerPage = 100
14
15func GenerateLogForBranch(allCommits []git.Commit, params Params) error {
16 total := len(allCommits)
17 totalPages := (total + commitsPerPage - 1) / commitsPerPage
18
19 // RootHref from commits/<branch>/... => ../../
20 rootHref := "../../"
21 outBase := filepath.Join(params.OutputDir, "commits", params.Ref.DirName())
22 if err := os.MkdirAll(outBase, 0o755); err != nil {
23 return err
24 }
25
26 page := 1
27 for pageCommits := range slices.Chunk(allCommits, commitsPerPage) {
28 for i := range pageCommits {
29 pageCommits[i].Href = filepath.ToSlash(filepath.Join(rootHref, "commit", pageCommits[i].Hash+".html"))
30 }
31
32 fileName := "index.html"
33 if page > 1 {
34 fileName = fmt.Sprintf("page-%d.html", page)
35 }
36
37 outPath := filepath.Join(outBase, fileName)
38 f, err := os.Create(outPath)
39 if err != nil {
40 return err
41 }
42
43 var prevHref, nextHref, firstHref, lastHref string
44 if page > 1 {
45 if page-1 == 1 {
46 prevHref = "index.html"
47 } else {
48 prevHref = fmt.Sprintf("page-%d.html", page-1)
49 }
50 firstHref = "index.html"
51 }
52
53 if page < totalPages {
54 nextHref = fmt.Sprintf("page-%d.html", page+1)
55 if totalPages > 1 {
56 lastHref = fmt.Sprintf("page-%d.html", totalPages)
57 }
58 }
59
60 err = templates.CommitsListTemplate.ExecuteTemplate(f, "layout.gohtml", templates.CommitsListParams{
61 LayoutParams: templates.LayoutParams{
62 Title: fmt.Sprintf("Commits %s %s", Dot, params.Name),
63 Name: params.Name,
64 RootHref: rootHref,
65 CurrentRefDir: params.Ref.DirName(),
66 Selected: "commits",
67 Year: currentYear(),
68 },
69 HeaderParams: templates.HeaderParams{
70 Header: "Commits",
71 },
72 Ref: params.Ref,
73 Commits: pageCommits,
74 Page: templates.Pagination{
75 Page: page,
76 TotalPages: totalPages,
77 PrevHref: prevHref,
78 NextHref: nextHref,
79 FirstHref: firstHref,
80 LastHref: lastHref,
81 },
82 })
83 if err != nil {
84 _ = f.Close()
85 return err
86 }
87 if err := f.Close(); err != nil {
88 return err
89 }
90
91 page++
92 }
93
94 return nil
95}