master
 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}