diff options
| author | Xe Iaso <me@xeiaso.net> | 2023-10-27 12:41:18 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2023-10-27 12:41:18 -0400 |
| commit | 86b731239d9e016950ba28fbcfeddf4076188a2f (patch) | |
| tree | 47fd4ab9c9191b32bafa60e911f7abe190836e6f /cmd/xesite | |
| parent | 190d4c6bbd9de7f811a9717d9e03aa970e7c481d (diff) | |
| download | xesite-86b731239d9e016950ba28fbcfeddf4076188a2f.tar.xz xesite-86b731239d9e016950ba28fbcfeddf4076188a2f.zip | |
cmd/xesite: automatic rebuilding in development mode
Whenever changes are made to the website and development mode, automatically rebuild it for you.
This should save me a lot of time.
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd/xesite')
| -rw-r--r-- | cmd/xesite/devel.go | 95 | ||||
| -rw-r--r-- | cmd/xesite/main.go | 4 |
2 files changed, 99 insertions, 0 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) } |
