Now watching a dir works and will delay the build based on a configurable amount of time.

master
Zed A. Shaw 3 weeks ago
parent 3ef2a31622
commit 415b01c78d
  1. 1
      config/loader.go
  2. 1
      example/pages/test.md
  3. 1
      example/ssgod.toml
  4. 21
      main.go

@ -9,6 +9,7 @@ type config struct {
Views string `toml:"views"` Views string `toml:"views"`
Layout string `toml:"layout"` Layout string `toml:"layout"`
Target string `toml:"target"` Target string `toml:"target"`
WatchDelay string `toml:"watch_delay"`
} }
var Settings config var Settings config

@ -11,4 +11,3 @@ Hi, I am a test file.
* sdf * sdf
* sa * sa
* fs * fs
* a

@ -1,3 +1,4 @@
views = "pages" views = "pages"
layout = "pages/layouts/main.html" layout = "pages/layouts/main.html"
target = "public" target = "public"
watch_delay = "1s"

@ -10,6 +10,7 @@ import (
"path/filepath" "path/filepath"
"os" "os"
"flag" "flag"
"time"
"text/template" "text/template"
"zedshaw.games/ssgod/config" "zedshaw.games/ssgod/config"
"github.com/yuin/goldmark" "github.com/yuin/goldmark"
@ -160,21 +161,37 @@ func RenderPages() {
if err != nil { log.Fatalf("can't walk content") } if err != nil { log.Fatalf("can't walk content") }
} }
func WatchMatches(name string) bool {
return filepath.Ext(name) == ".html" || filepath.Ext(name) == ".md"
}
func WatchDir() { func WatchDir() {
watcher, err := fsnotify.NewWatcher() watcher, err := fsnotify.NewWatcher()
if err != nil { log.Fatal(err) } if err != nil { log.Fatal(err) }
defer watcher.Close() defer watcher.Close()
wait_time, err := time.ParseDuration(config.Settings.WatchDelay)
if err != nil { log.Fatal(err) }
doit := time.NewTimer(wait_time)
doit.Stop()
log.Println("WATCHING directory", config.Settings.Views)
go func() { go func() {
for { for {
select { select {
case event, ok := <-watcher.Events: case event, ok := <-watcher.Events:
if !ok { return } if !ok { return }
log.Println("event: ", event) log.Println("event: ", event)
if event.Has(fsnotify.Write) {
if WatchMatches(event.Name) {
log.Println("modified file: ", event.Name) log.Println("modified file: ", event.Name)
RenderPages() doit.Reset(wait_time)
} }
case <-doit.C:
RenderPages()
case err, ok := <-watcher.Errors: case err, ok := <-watcher.Errors:
if !ok { return } if !ok { return }
log.Println("error: ", err) log.Println("error: ", err)

Loading…
Cancel
Save