Flush partialCached cache on rebuilds

Fixes #4931
This commit is contained in:
Bjørn Erik Pedersen 2018-07-11 19:23:22 +02:00
parent d96f2a460f
commit 6b6dcb44a0
4 changed files with 51 additions and 3 deletions

29
deps/deps.go vendored
View file

@ -1,6 +1,7 @@
package deps package deps
import ( import (
"sync"
"time" "time"
"github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/common/loggers"
@ -22,6 +23,7 @@ import (
// There will be normally only one instance of deps in play // There will be normally only one instance of deps in play
// at a given time, i.e. one per Site built. // at a given time, i.e. one per Site built.
type Deps struct { type Deps struct {
// The logger to use. // The logger to use.
Log *jww.Notepad `json:"-"` Log *jww.Notepad `json:"-"`
@ -69,6 +71,30 @@ type Deps struct {
// Timeout is configurable in site config. // Timeout is configurable in site config.
Timeout time.Duration Timeout time.Duration
// BuildStartListeners will be notified before a build starts.
BuildStartListeners *Listeners
}
type Listeners struct {
sync.Mutex
// A list of funcs to be notified about an event.
listeners []func()
}
func (b *Listeners) Add(f func()) {
b.Lock()
defer b.Unlock()
b.listeners = append(b.listeners, f)
}
func (b *Listeners) Notify() {
b.Lock()
defer b.Unlock()
for _, notify := range b.listeners {
notify()
}
} }
// ResourceProvider is used to create and refresh, and clone resources needed. // ResourceProvider is used to create and refresh, and clone resources needed.
@ -168,6 +194,7 @@ func New(cfg DepsCfg) (*Deps, error) {
ResourceSpec: resourceSpec, ResourceSpec: resourceSpec,
Cfg: cfg.Language, Cfg: cfg.Language,
Language: cfg.Language, Language: cfg.Language,
BuildStartListeners: &Listeners{},
Timeout: time.Duration(timeoutms) * time.Millisecond, Timeout: time.Duration(timeoutms) * time.Millisecond,
} }
@ -210,6 +237,8 @@ func (d Deps) ForLanguage(cfg DepsCfg) (*Deps, error) {
return nil, err return nil, err
} }
d.BuildStartListeners = &Listeners{}
return &d, nil return &d, nil
} }

View file

@ -28,6 +28,7 @@ import (
// Build builds all sites. If filesystem events are provided, // Build builds all sites. If filesystem events are provided,
// this is considered to be a potential partial rebuild. // this is considered to be a potential partial rebuild.
func (h *HugoSites) Build(config BuildCfg, events ...fsnotify.Event) error { func (h *HugoSites) Build(config BuildCfg, events ...fsnotify.Event) error {
if h.Metrics != nil { if h.Metrics != nil {
h.Metrics.Reset() h.Metrics.Reset()
} }
@ -42,6 +43,10 @@ func (h *HugoSites) Build(config BuildCfg, events ...fsnotify.Event) error {
conf.whatChanged = &whatChanged{source: true, other: true} conf.whatChanged = &whatChanged{source: true, other: true}
} }
for _, s := range h.Sites {
s.Deps.BuildStartListeners.Notify()
}
if len(events) > 0 { if len(events) > 0 {
// Rebuild // Rebuild
if err := h.initRebuild(conf); err != nil { if err := h.initRebuild(conf); err != nil {

View file

@ -26,7 +26,9 @@ func TestInit(t *testing.T) {
var ns *internal.TemplateFuncsNamespace var ns *internal.TemplateFuncsNamespace
for _, nsf := range internal.TemplateFuncsNamespaceRegistry { for _, nsf := range internal.TemplateFuncsNamespaceRegistry {
ns = nsf(&deps.Deps{}) ns = nsf(&deps.Deps{
BuildStartListeners: &deps.Listeners{},
})
if ns.Name == name { if ns.Name == name {
found = true found = true
break break

View file

@ -34,18 +34,30 @@ type partialCache struct {
p map[string]interface{} p map[string]interface{}
} }
func (p *partialCache) clear() {
p.Lock()
defer p.Unlock()
p.p = make(map[string]interface{})
}
// New returns a new instance of the templates-namespaced template functions. // New returns a new instance of the templates-namespaced template functions.
func New(deps *deps.Deps) *Namespace { func New(deps *deps.Deps) *Namespace {
cache := &partialCache{p: make(map[string]interface{})}
deps.BuildStartListeners.Add(
func() {
cache.clear()
})
return &Namespace{ return &Namespace{
deps: deps, deps: deps,
cachedPartials: partialCache{p: make(map[string]interface{})}, cachedPartials: cache,
} }
} }
// Namespace provides template functions for the "templates" namespace. // Namespace provides template functions for the "templates" namespace.
type Namespace struct { type Namespace struct {
deps *deps.Deps deps *deps.Deps
cachedPartials partialCache cachedPartials *partialCache
} }
// Include executes the named partial and returns either a string, // Include executes the named partial and returns either a string,