1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-12-03 13:27:50 +01:00
gojekyll/server/watcher.go
2017-07-17 12:22:56 -04:00

56 lines
1.1 KiB
Go

package server
import (
"fmt"
"os"
"time"
"github.com/osteele/gojekyll/site"
)
// Create a goroutine that rebuilds the site when files change
func (s *Server) watchAndReload() error {
site := s.Site
changes, err := site.WatchFiles()
if err != nil {
return err
}
go func() {
for change := range changes {
// Resolves filenames to URLS *before* reloading the site, in case the latter
// changes the url -> filename routes.
urls := map[string]bool{}
for _, rel := range change.Paths {
url, ok := site.FilenameURLPath(rel)
if ok {
urls[url] = true
}
}
s.reload(change)
for url := range urls {
s.lr.Reload(url)
}
}
}()
return nil
}
func (s *Server) reload(change site.FilesEvent) {
s.Lock()
defer s.Unlock()
// DRY w/ site.WatchRebuild
start := time.Now()
fmt.Printf("Re-reading: %v...", change)
site, err := s.Site.Reloaded()
if err != nil {
fmt.Println()
fmt.Fprintln(os.Stderr, err.Error())
s.lr.Alert(fmt.Sprintf("Error reading site configuration: %s", err))
return
}
s.Site = site
s.Site.SetAbsoluteURL("")
fmt.Printf("done (%.2fs)\n", time.Since(start).Seconds())
}