package generator import ( "fmt" "os" "path/filepath" "slices" "mokhan.ca/xlgmokha/gitmal/internal/git" "mokhan.ca/xlgmokha/gitmal/internal/templates" ) const commitsPerPage = 100 func GenerateLogForBranch(allCommits []git.Commit, params Params) error { total := len(allCommits) totalPages := (total + commitsPerPage - 1) / commitsPerPage // RootHref from commits//... => ../../ rootHref := "../../" outBase := filepath.Join(params.OutputDir, "commits", params.Ref.DirName()) if err := os.MkdirAll(outBase, 0o755); err != nil { return err } page := 1 for pageCommits := range slices.Chunk(allCommits, commitsPerPage) { for i := range pageCommits { pageCommits[i].Href = filepath.ToSlash(filepath.Join(rootHref, "commit", pageCommits[i].Hash+".html")) } fileName := "index.html" if page > 1 { fileName = fmt.Sprintf("page-%d.html", page) } outPath := filepath.Join(outBase, fileName) f, err := os.Create(outPath) if err != nil { return err } var prevHref, nextHref, firstHref, lastHref string if page > 1 { if page-1 == 1 { prevHref = "index.html" } else { prevHref = fmt.Sprintf("page-%d.html", page-1) } firstHref = "index.html" } if page < totalPages { nextHref = fmt.Sprintf("page-%d.html", page+1) if totalPages > 1 { lastHref = fmt.Sprintf("page-%d.html", totalPages) } } err = templates.CommitsListTemplate.ExecuteTemplate(f, "layout.gohtml", templates.CommitsListParams{ LayoutParams: templates.LayoutParams{ Title: fmt.Sprintf("Commits %s %s", Dot, params.Name), Name: params.Name, RootHref: rootHref, CurrentRefDir: params.Ref.DirName(), Selected: "commits", }, HeaderParams: templates.HeaderParams{ Header: "Commits", }, Ref: params.Ref, Commits: pageCommits, Page: templates.Pagination{ Page: page, TotalPages: totalPages, PrevHref: prevHref, NextHref: nextHref, FirstHref: firstHref, LastHref: lastHref, }, }) if err != nil { _ = f.Close() return err } if err := f.Close(); err != nil { return err } page++ } return nil }