Fix MediaType when reading images from cache

Fixes #8931
This commit is contained in:
Bjørn Erik Pedersen 2022-04-16 10:40:21 +02:00
parent 0093eaa683
commit 397fce5603
No known key found for this signature in database
GPG key ID: 330E6E2BD4859D8F
3 changed files with 89 additions and 3 deletions

View file

@ -2,6 +2,7 @@ package hugolib
import ( import (
"bytes" "bytes"
"encoding/base64"
"fmt" "fmt"
"io" "io"
"os" "os"
@ -40,12 +41,13 @@ func NewIntegrationTestBuilder(conf IntegrationTestConfig) *IntegrationTestBuild
} }
if conf.NeedsOsFS { if conf.NeedsOsFS {
doClean := true
tempDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-integration-test") tempDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-integration-test")
c.Assert(err, qt.IsNil) c.Assert(err, qt.IsNil)
conf.WorkingDir = filepath.Join(tempDir, conf.WorkingDir) conf.WorkingDir = filepath.Join(tempDir, conf.WorkingDir)
if doClean { if !conf.PrintAndKeepTempDir {
c.Cleanup(clean) c.Cleanup(clean)
} else {
fmt.Println("\nUsing WorkingDir dir:", conf.WorkingDir)
} }
} else if conf.WorkingDir == "" { } else if conf.WorkingDir == "" {
conf.WorkingDir = helpers.FilePathSeparator conf.WorkingDir = helpers.FilePathSeparator
@ -278,10 +280,19 @@ func (s *IntegrationTestBuilder) initBuilder() {
logger := loggers.NewBasicLoggerForWriter(s.Cfg.LogLevel, &s.logBuff) logger := loggers.NewBasicLoggerForWriter(s.Cfg.LogLevel, &s.logBuff)
isBinaryRe := regexp.MustCompile(`^(.*)(\.png|\.jpg)$`)
for _, f := range s.data.Files { for _, f := range s.data.Files {
filename := filepath.Join(s.Cfg.WorkingDir, f.Name) filename := filepath.Join(s.Cfg.WorkingDir, f.Name)
data := bytes.TrimSuffix(f.Data, []byte("\n"))
if isBinaryRe.MatchString(filename) {
var err error
data, err = base64.StdEncoding.DecodeString(string(data))
s.Assert(err, qt.IsNil)
}
s.Assert(afs.MkdirAll(filepath.Dir(filename), 0777), qt.IsNil) s.Assert(afs.MkdirAll(filepath.Dir(filename), 0777), qt.IsNil)
s.Assert(afero.WriteFile(afs, filename, bytes.TrimSuffix(f.Data, []byte("\n")), 0666), qt.IsNil) s.Assert(afero.WriteFile(afs, filename, data, 0666), qt.IsNil)
} }
cfg, _, err := LoadConfig( cfg, _, err := LoadConfig(
@ -297,6 +308,8 @@ func (s *IntegrationTestBuilder) initBuilder() {
}, },
) )
s.Assert(err, qt.IsNil)
cfg.Set("workingDir", s.Cfg.WorkingDir) cfg.Set("workingDir", s.Cfg.WorkingDir)
fs := hugofs.NewFrom(afs, cfg) fs := hugofs.NewFrom(afs, cfg)
@ -457,6 +470,9 @@ type IntegrationTestConfig struct {
// Whether it needs the real file system (e.g. for js.Build tests). // Whether it needs the real file system (e.g. for js.Build tests).
NeedsOsFS bool NeedsOsFS bool
// Do not remove the temp dir after the test.
PrintAndKeepTempDir bool
// Whether to run npm install before Build. // Whether to run npm install before Build.
NeedsNpmInstall bool NeedsNpmInstall bool

View file

@ -95,6 +95,7 @@ func (c *imageCache) getOrCreate(
rp := img.getResourcePaths() rp := img.getResourcePaths()
rp.relTargetDirFile.file = relTarget.file rp.relTargetDirFile.file = relTarget.file
img.setSourceFilename(info.Name) img.setSourceFilename(info.Name)
img.setMediaType(conf.TargetFormat.MediaType())
if err := img.InitConfig(r); err != nil { if err := img.InitConfig(r); err != nil {
return err return err

View file

@ -0,0 +1,69 @@
// Copyright 2022 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package resources_test
import (
"strings"
"testing"
"github.com/gohugoio/hugo/hugolib"
)
// Issue 8931
func TestImageCache(t *testing.T) {
files := `
-- config.toml --
baseURL = "https://example.org"
-- content/mybundle/index.md --
---
title: "My Bundle"
---
-- content/mybundle/pixel.png --
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==
-- layouts/foo.html --
-- layouts/index.html --
{{ $p := site.GetPage "mybundle"}}
{{ $img := $p.Resources.Get "pixel.png" }}
{{ $gif := $img.Resize "1x1 gif" }}
{{ $bmp := $img.Resize "1x1 bmp" }}
gif: {{ $gif.RelPermalink }}|{{ $gif.MediaType }}|
bmp: {{ $bmp.RelPermalink }}|{{ $bmp.MediaType }}|
`
b := hugolib.NewIntegrationTestBuilder(
hugolib.IntegrationTestConfig{
T: t,
TxtarString: files,
NeedsOsFS: true,
Running: true,
}).Build()
assertImages := func() {
b.AssertFileContent("public/index.html", `
gif: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_1x1_resize_box_3.gif|image/gif|
bmp: /mybundle/pixel_hu8aa3346827e49d756ff4e630147c42b5_70_1x1_resize_box_3.bmp|image/bmp|
`)
}
assertImages()
b.EditFileReplace("content/mybundle/index.md", func(s string) string { return strings.ReplaceAll(s, "Bundle", "BUNDLE") })
b.Build()
assertImages()
}