diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-07-17 11:18:29 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-07-18 00:07:20 +0200 |
commit | 3eb313fef495a39731dafa6bddbf77760090230d (patch) | |
tree | aa93e04123fa299e27b4d701b81d7976865d299c /cache | |
parent | b93417aa1d3d38a9e56bad25937e0e638a113faf (diff) |
Simplify .Site.GetPage etc.
This commit is a follow up to a recent overhaul of the GetPage/ref/relref implemenation.
The most important change in this commit is the update to `.Site.GetPage`:
* To reduce the amount of breakage in the wild to its minimum, I have reworked .Site.GetPage with some rules:
* We cannot support more than 2 arguments, i.e. .Site.GetPage "page" "posts" "mypage.md" will now throw an error. I think this is the most uncommon syntax and should be OK. It is an easy fix to change the above to .Site.GetPage "/posts/mypage.md" or similar.
* .Site.GetPage "home", .Site.GetPage "home" "" and .Site.GetPage "home" "/" will give you the home page. This means that if you have page in root with the name home.md you need to do .Site.GetPage "/home.md" or similar
This commit also fixes some multilingual issues, most notable it is now possible to do cross-language ref/relref lookups by prepending the language code to the path, e.g. `/jp/posts/mypage.md`.
This commit also reverts the site building tests related to this to "Hugo 0.44 state", to get better control of the changes made.
Closes #4147
Closes #4727
Closes #4728
Closes #4728
Closes #4726
Closes #4652
Diffstat (limited to 'cache')
-rw-r--r-- | cache/partitioned_lazy_cache.go | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/cache/partitioned_lazy_cache.go b/cache/partitioned_lazy_cache.go index 9baf0377d..31e66e127 100644 --- a/cache/partitioned_lazy_cache.go +++ b/cache/partitioned_lazy_cache.go @@ -24,34 +24,52 @@ type Partition struct { Load func() (map[string]interface{}, error) } -type lazyPartition struct { +// Lazy represents a lazily loaded cache. +type Lazy struct { initSync sync.Once + initErr error cache map[string]interface{} load func() (map[string]interface{}, error) } -func (l *lazyPartition) init() error { - var err error +// NewLazy creates a lazy cache with the given load func. +func NewLazy(load func() (map[string]interface{}, error)) *Lazy { + return &Lazy{load: load} +} + +func (l *Lazy) init() error { l.initSync.Do(func() { - var c map[string]interface{} - c, err = l.load() + c, err := l.load() l.cache = c + l.initErr = err + }) - return err + return l.initErr +} + +// Get initializes the cache if not already initialized, then looks up the +// given key. +func (l *Lazy) Get(key string) (interface{}, bool, error) { + l.init() + if l.initErr != nil { + return nil, false, l.initErr + } + v, found := l.cache[key] + return v, found, nil } // PartitionedLazyCache is a lazily loaded cache paritioned by a supplied string key. type PartitionedLazyCache struct { - partitions map[string]*lazyPartition + partitions map[string]*Lazy } // NewPartitionedLazyCache creates a new NewPartitionedLazyCache with the supplied // partitions. func NewPartitionedLazyCache(partitions ...Partition) *PartitionedLazyCache { - lazyPartitions := make(map[string]*lazyPartition, len(partitions)) + lazyPartitions := make(map[string]*Lazy, len(partitions)) for _, partition := range partitions { - lazyPartitions[partition.Key] = &lazyPartition{load: partition.Load} + lazyPartitions[partition.Key] = NewLazy(partition.Load) } cache := &PartitionedLazyCache{partitions: lazyPartitions} @@ -67,11 +85,12 @@ func (c *PartitionedLazyCache) Get(partition, key string) (interface{}, error) { return nil, nil } - if err := p.init(); err != nil { + v, found, err := p.Get(key) + if err != nil { return nil, err } - if v, found := p.cache[key]; found { + if found { return v, nil } |