mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
parent
d96f2a460f
commit
6b6dcb44a0
4 changed files with 51 additions and 3 deletions
29
deps/deps.go
vendored
29
deps/deps.go
vendored
|
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue