diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index e5c9a6856..58e751892 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -2,6 +2,7 @@ package hugolib import ( "bytes" + "encoding/base64" "fmt" "io" "os" @@ -40,12 +41,13 @@ func NewIntegrationTestBuilder(conf IntegrationTestConfig) *IntegrationTestBuild } if conf.NeedsOsFS { - doClean := true tempDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-integration-test") c.Assert(err, qt.IsNil) conf.WorkingDir = filepath.Join(tempDir, conf.WorkingDir) - if doClean { + if !conf.PrintAndKeepTempDir { c.Cleanup(clean) + } else { + fmt.Println("\nUsing WorkingDir dir:", conf.WorkingDir) } } else if conf.WorkingDir == "" { conf.WorkingDir = helpers.FilePathSeparator @@ -278,10 +280,19 @@ func (s *IntegrationTestBuilder) initBuilder() { logger := loggers.NewBasicLoggerForWriter(s.Cfg.LogLevel, &s.logBuff) + isBinaryRe := regexp.MustCompile(`^(.*)(\.png|\.jpg)$`) + for _, f := range s.data.Files { 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(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( @@ -297,6 +308,8 @@ func (s *IntegrationTestBuilder) initBuilder() { }, ) + s.Assert(err, qt.IsNil) + cfg.Set("workingDir", s.Cfg.WorkingDir) 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). NeedsOsFS bool + // Do not remove the temp dir after the test. + PrintAndKeepTempDir bool + // Whether to run npm install before Build. NeedsNpmInstall bool diff --git a/resources/image_cache.go b/resources/image_cache.go index b5832f740..ca651fd5c 100644 --- a/resources/image_cache.go +++ b/resources/image_cache.go @@ -95,6 +95,7 @@ func (c *imageCache) getOrCreate( rp := img.getResourcePaths() rp.relTargetDirFile.file = relTarget.file img.setSourceFilename(info.Name) + img.setMediaType(conf.TargetFormat.MediaType()) if err := img.InitConfig(r); err != nil { return err diff --git a/resources/integration_test.go b/resources/integration_test.go new file mode 100644 index 000000000..19cf8c198 --- /dev/null +++ b/resources/integration_test.go @@ -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() + +}