aboutsummaryrefslogtreecommitdiff
path: root/cmd/xesite
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-10-27 12:41:18 -0400
committerXe Iaso <me@xeiaso.net>2023-10-27 12:41:18 -0400
commit86b731239d9e016950ba28fbcfeddf4076188a2f (patch)
tree47fd4ab9c9191b32bafa60e911f7abe190836e6f /cmd/xesite
parent190d4c6bbd9de7f811a9717d9e03aa970e7c481d (diff)
downloadxesite-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.go95
-rw-r--r--cmd/xesite/main.go4
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)
}