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}