resource: Avoid processing and storing same image for each language
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 7 Jan 2018 10:29:02 +0000 (11:29 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 7 Jan 2018 10:58:16 +0000 (11:58 +0100)
Fixes #4231

resource/image.go
resource/image_cache.go

index 8a65be1bfe2e8bfe2b47de00b53aea58031de2a7..678a78ad7bc96406dd5cd7dd39cf9fb630459841 100644 (file)
@@ -219,7 +219,7 @@ func (i *Image) doWithImageConfig(action, spec string, f func(src image.Image, c
                }
 
                if conf.Rotate != 0 {
-                       // Rotate it befor any scaling to get the dimensions correct.
+                       // Rotate it before any scaling to get the dimensions correct.
                        src = imaging.Rotate(src, float64(conf.Rotate), color.Transparent)
                }
 
index 14350986e71c165d2066b8d659283b48ea2f8245..c2d5d0ad5e686258db6007d7eecce3f7de27779e 100644 (file)
@@ -51,6 +51,15 @@ func (c *imageCache) deleteByPrefix(prefix string) {
 
 func (c *imageCache) getOrCreate(
        spec *Spec, key string, create func(resourceCacheFilename string) (*Image, error)) (*Image, error) {
+
+       relTargetFilename := key
+
+       if c.pathSpec.Language != nil {
+               // Avoid do and store more work than needed. The language versions will in
+               // most cases be duplicates of the same image files.
+               key = strings.TrimPrefix(key, "/"+c.pathSpec.Language.Lang)
+       }
+
        // First check the in-memory store, then the disk.
        c.mu.RLock()
        img, found := c.store[key]
@@ -68,7 +77,7 @@ func (c *imageCache) getOrCreate(
        //  but the count of processed image variations for this site.
        c.pathSpec.ProcessingStats.Incr(&c.pathSpec.ProcessingStats.ProcessedImages)
 
-       r, err := spec.NewResourceFromFilename(nil, c.absPublishDir, cacheFilename, key)
+       r, err := spec.NewResourceFromFilename(nil, c.absPublishDir, cacheFilename, relTargetFilename)
        notFound := err != nil && os.IsNotExist(err)
        if err != nil && !os.IsNotExist(err) {
                return nil, err