feat/multi-repo
  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}