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