diff options
| -rw-r--r-- | cmd/xesite/devel.go | 95 | ||||
| -rw-r--r-- | cmd/xesite/main.go | 4 | ||||
| -rw-r--r-- | go.mod | 2 | ||||
| -rw-r--r-- | go.sum | 4 | ||||
| -rw-r--r-- | gomod2nix.toml | 3 | ||||
| -rw-r--r-- | internal/lume/lume.go | 4 |
6 files changed, 110 insertions, 2 deletions
diff --git a/cmd/xesite/devel.go b/cmd/xesite/devel.go new file mode 100644 index 0000000..7bfb72e --- /dev/null +++ b/cmd/xesite/devel.go @@ -0,0 +1,95 @@ +package main + +import ( + "context" + "log" + "log/slog" + "os" + "path/filepath" + "strings" + + "gopkg.in/fsnotify.v1" + "xeiaso.net/v4/internal/lume" +) + +var ( + ignoredDirs = []string{"_site", "_data", "_bin"} +) + +func findDirectories(root string) ([]string, error) { + var dirs []string + + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() { + dirs = append(dirs, path) + } + + return nil + }) + + if err != nil { + return nil, err + } + + return dirs, nil +} + +func filterDirectory(dir string, filterRules []string) bool { + for _, rule := range filterRules { + if strings.Contains(dir, rule) { + return true + } + } + + return false +} + +func rebuildOnChange(fs *lume.FS) { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + if err = watcher.Add("./lume"); err != nil { + log.Fatal(err) + } + + dirs, err := findDirectories("./lume") + if err != nil { + log.Fatal(err) + } + + for _, dir := range dirs { + if filterDirectory(dir, ignoredDirs) { + continue + } + + slog.Debug("adding dir", "dir", dir) + if err = watcher.Add(dir); err != nil { + log.Fatal(err) + } + } + + for { + select { + case event := <-watcher.Events: + if filterDirectory(event.Name, ignoredDirs) { + continue + } + + slog.Debug("got event", "fname", event.Name, "op", event.Op.String()) + + slog.Info("reloading") + if err := fs.Update(context.Background()); err != nil { + slog.Error("reload failed", "err", err) + } + case err := <-watcher.Errors: + log.Fatal(err) + } + } +} diff --git a/cmd/xesite/main.go b/cmd/xesite/main.go index bf01514..5806dd7 100644 --- a/cmd/xesite/main.go +++ b/cmd/xesite/main.go @@ -87,6 +87,10 @@ func main() { defer fs.Close() + if *devel { + go rebuildOnChange(fs) + } + if err != nil { log.Fatal(err) } @@ -78,6 +78,7 @@ require ( github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect + github.com/sigma/go-inotify v0.0.0-20181102212354-c87b6cf5033d // indirect github.com/skeema/knownhosts v1.2.0 // indirect github.com/tailscale/certstore v0.1.1-0.20220316223106-78d6e1c49d8d // indirect github.com/tailscale/golang-x-crypto v0.0.0-20230713185742-f0b76a10a08e // indirect @@ -106,6 +107,7 @@ require ( golang.zx2c4.com/wireguard/windows v0.5.3 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/fsnotify.v1 v1.4.7 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gvisor.dev/gvisor v0.0.0-20230504175454-7b0a1988a28f // indirect inet.af/peercred v0.0.0-20210906144145-0893ea02156a // indirect @@ -231,6 +231,8 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sigma/go-inotify v0.0.0-20181102212354-c87b6cf5033d h1:G1nNtZVTzcCvVKMwcG0Vispo3bhc15EbjO5uamiLikI= +github.com/sigma/go-inotify v0.0.0-20181102212354-c87b6cf5033d/go.mod h1:stlh9OsqBQSdwxTxX73mu41BBtRbIpZLQ7flcAoxAfo= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= @@ -372,6 +374,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/mxpv/patreon-go.v1 v1.0.0-20171031001022-1d2f253ac700 h1:ymnLBRNALxuok6al+nlPJxfSa3yc2SZc5N21svHQtys= gopkg.in/mxpv/patreon-go.v1 v1.0.0-20171031001022-1d2f253ac700/go.mod h1:IZaw6NfbSsGszLfPbo9LLlxLIx17eMHWe4cxpM8wUMk= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= diff --git a/gomod2nix.toml b/gomod2nix.toml index 90967cb..aa85457 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -205,6 +205,9 @@ schema = 3 [mod."github.com/sergi/go-diff"] version = "v1.3.1" hash = "sha256-XLA/BLIPuUU76yikXqIeRSXr7T7A3Uz6I27+mDxGj7w=" + [mod."github.com/sigma/go-inotify"] + version = "v0.0.0-20181102212354-c87b6cf5033d" + hash = "sha256-rdWhvNBGz1xelg8ivrmXhEldwXnJV7mas6yQaAcBc+4=" [mod."github.com/skeema/knownhosts"] version = "v1.2.0" hash = "sha256-D5xB9lLablPhYUqTbdu8Ub366n//+JTgK3jcnMHlwYs=" diff --git a/internal/lume/lume.go b/internal/lume/lume.go index 40eafd9..f40450f 100644 --- a/internal/lume/lume.go +++ b/internal/lume/lume.go @@ -320,7 +320,7 @@ func (f *FS) writePatrons(dataDir string) error { func (f *FS) writeConfig(siteCommit string) error { dataDir := filepath.Join(f.repoDir, f.opt.StaticSiteDir, "src", "_data") - + os.WriteFile(filepath.Join(dataDir, "patrons.json"), []byte(`{"included": {"Items": []}}`), 0o644) if f.opt.PatreonClient != nil { @@ -438,7 +438,7 @@ func (f *FS) buildResume(ctx context.Context) error { return fmt.Errorf("failed to build resume: %w", err) } - if err := os.MkdirAll(filepath.Join(f.repoDir, f.opt.StaticSiteDir, "static", "resume"), 0o755); err != nil { + if err := os.MkdirAll(filepath.Join(f.repoDir, f.opt.StaticSiteDir, "src", "static", "resume"), 0o755); err != nil { return fmt.Errorf("failed to create resume dir: %w", err) } |
