gshr
git static host repo -- generates static html for repos
git clone https://git.vogt.world/gshr.git
Log | Files | README.md | LICENSE
← All files
name: files.go
-rw-r--r--
1332
 1package main
 2
 3import (
 4	"fmt"
 5	"html/template"
 6	"io/fs"
 7	"os"
 8	"path"
 9	"path/filepath"
10	"strings"
11)
12
13type FileOverview struct {
14	Mode   string
15	Name   string
16	Size   string
17	Origin string
18}
19
20type FilesPage struct {
21	RepoData repoData
22	Files    []FileOverview
23}
24
25func (f *FilesPage) renderPage(t *template.Template) {
26	debug("file page for '%v'", f.RepoData.Name)
27	output, err := os.Create(path.Join(args.OutputDir, f.RepoData.Name, "files.html"))
28	checkErr(err)
29	err = t.Execute(output, f)
30	checkErr(err)
31}
32
33func renderAllFilesPage(data repoData) {
34	t, err := template.ParseFS(htmlTemplates, "template.files.html", "template.partials.html")
35	checkErr(err)
36	files := make([]FileOverview, 0)
37	err = filepath.Walk(data.cloneDir(), func(filename string, info fs.FileInfo, err error) error {
38		if info.IsDir() && info.Name() == ".git" {
39			return filepath.SkipDir
40		}
41
42		if !info.IsDir() {
43			info, err := os.Stat(filename)
44			checkErr(err)
45			Name, _ := strings.CutPrefix(filename, data.cloneDir())
46			Name, _ = strings.CutPrefix(Name, "/")
47			tf := FileOverview{
48				Origin: filename,
49				Name:   Name,
50				Mode:   info.Mode().String(),
51				Size:   fmt.Sprintf("%v", info.Size()),
52			}
53			files = append(files, tf)
54		}
55		return nil
56	})
57	checkErr(err)
58	index := FilesPage{
59		RepoData: data,
60		Files:    files,
61	}
62	index.renderPage(t)
63}