embed.go
1package main
2
3import (
4 "embed"
5 "io/fs"
6 "os"
7 "path/filepath"
8)
9
10//go:embed templates static
11var embeddedAssets embed.FS
12
13// materializeAssets writes the embedded templates/static dirs to a temp
14// directory and returns their paths. Used when the config leaves
15// dirs.templates / dirs.static unset, so the binary is self-contained.
16func materializeAssets() (templates string, static string, err error) {
17 root, err := os.MkdirTemp("", "git-preview-assets-")
18 if err != nil {
19 return "", "", err
20 }
21
22 err = fs.WalkDir(embeddedAssets, ".", func(p string, d fs.DirEntry, err error) error {
23 if err != nil {
24 return err
25 }
26 dest := filepath.Join(root, filepath.FromSlash(p))
27 if d.IsDir() {
28 return os.MkdirAll(dest, 0755)
29 }
30 b, err := embeddedAssets.ReadFile(p)
31 if err != nil {
32 return err
33 }
34 return os.WriteFile(dest, b, 0644)
35 })
36 if err != nil {
37 return "", "", err
38 }
39
40 return filepath.Join(root, "templates"), filepath.Join(root, "static"), nil
41}