feat/multi-repo
1package main
2
3import (
4 "fmt"
5 "os"
6 "os/exec"
7 "path/filepath"
8 "strings"
9 "time"
10
11 "github.com/antonmedv/gitmal/pkg/templates"
12)
13
14func generateMultiRepoIndex(repos []RepoEntry, siteName string, params Params) error {
15 entries := make([]templates.RepoIndexEntry, 0, len(repos))
16
17 for _, repo := range repos {
18 lastTime := lastCommitTime(repo.Path, repo.DefaultBranch)
19 entries = append(entries, templates.RepoIndexEntry{
20 Name: repo.Name,
21 Slug: repo.Slug,
22 Href: filepath.ToSlash(filepath.Join(repo.Slug, "index.html")),
23 Description: repo.Description,
24 LastUpdated: lastTime,
25 })
26 }
27
28 outDir := params.OutputDir
29 if err := os.MkdirAll(outDir, 0o755); err != nil {
30 return err
31 }
32
33 f, err := os.Create(filepath.Join(outDir, "index.html"))
34 if err != nil {
35 return err
36 }
37 defer f.Close()
38
39 err = templates.MultiRepoIndexTemplate.ExecuteTemplate(f, "layout.gohtml", templates.MultiRepoIndexParams{
40 LayoutParams: templates.LayoutParams{
41 Title: siteName,
42 Name: siteName,
43 SiteName: siteName,
44 Dark: params.Dark,
45 RootHref: "./",
46 RepoHref: "./",
47 Selected: "",
48 InlineStyles: params.InlineStyles,
49 IsMultiRepoIndex: true,
50 },
51 Title: siteName,
52 Repos: entries,
53 })
54 if err != nil {
55 return fmt.Errorf("render multi-repo index: %w", err)
56 }
57
58 return nil
59}
60
61func lastCommitTime(repoPath, defaultBranch string) time.Time {
62 cmd := exec.Command("git", "log", "-1", "--format=%ct", defaultBranch)
63 cmd.Dir = repoPath
64 out, err := cmd.Output()
65 if err != nil {
66 return time.Time{}
67 }
68 ts := strings.TrimSpace(string(out))
69 if ts == "" {
70 return time.Time{}
71 }
72 var unix int64
73 if _, err := fmt.Sscanf(ts, "%d", &unix); err != nil {
74 return time.Time{}
75 }
76 return time.Unix(unix, 0)
77}