"errors"
+ "github.com/bep/overlayfs"
"github.com/gohugoio/hugo/resources/images"
// Importing image codecs for image.DecodeConfig
_ "golang.org/x/image/webp"
"github.com/gohugoio/hugo/deps"
+ "github.com/spf13/afero"
"github.com/spf13/cast"
)
// New returns a new instance of the images-namespaced template functions.
-func New(deps *deps.Deps) *Namespace {
+func New(d *deps.Deps) *Namespace {
+ var readFileFs afero.Fs
+
+ // The docshelper script does not have or need all the dependencies set up.
+ if d.PathSpec != nil {
+ readFileFs = overlayfs.New(overlayfs.Options{
+ Fss: []afero.Fs{
+ d.PathSpec.BaseFs.Work,
+ d.PathSpec.BaseFs.Content.Fs,
+ },
+ })
+ }
+
return &Namespace{
- Filters: &images.Filters{},
- cache: map[string]image.Config{},
- deps: deps,
+ readFileFs: readFileFs,
+ Filters: &images.Filters{},
+ cache: map[string]image.Config{},
+ deps: d,
}
}
// Namespace provides template functions for the "images" namespace.
type Namespace struct {
*images.Filters
- cacheMu sync.RWMutex
- cache map[string]image.Config
+ readFileFs afero.Fs
+ cacheMu sync.RWMutex
+ cache map[string]image.Config
deps *deps.Deps
}
return config, nil
}
- f, err := ns.deps.Fs.WorkingDirReadOnly.Open(filename)
+ f, err := ns.readFileFs.Open(filename)
if err != nil {
return image.Config{}, err
}
qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/config/testconfig"
- "github.com/gohugoio/hugo/deps"
- "github.com/gohugoio/hugo/hugofs"
"github.com/spf13/afero"
"github.com/spf13/cast"
)
afs := afero.NewMemMapFs()
v := config.New()
v.Set("workingDir", "/a/b")
- conf := testconfig.GetTestConfig(afs, v)
- bcfg := conf.BaseConfig()
- fs := hugofs.NewFrom(afs, bcfg)
+ d := testconfig.GetTestDeps(afs, v)
+ bcfg := d.Conf
- ns := New(&deps.Deps{Fs: fs, Conf: conf})
+ ns := New(d)
for _, test := range configTests {
// cast path to string for afero.WriteFile
sp, err := cast.ToStringE(test.path)
c.Assert(err, qt.IsNil)
- afero.WriteFile(ns.deps.Fs.Source, filepath.Join(bcfg.WorkingDir, sp), test.input, 0755)
+ afero.WriteFile(ns.deps.Fs.Source, filepath.Join(bcfg.WorkingDir(), sp), test.input, 0755)
result, err := ns.Config(test.path)
--- /dev/null
+// Copyright 2023 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 images_test
+
+import (
+ "testing"
+
+ "github.com/gohugoio/hugo/hugolib"
+)
+
+func TestImageConfigFromModule(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+baseURL = 'http://example.com/'
+theme = ["mytheme"]
+-- static/images/pixel1.png --
+iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==
+-- themes/mytheme/static/images/pixel2.png --
+iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==
+-- layouts/index.html --
+{{ $path := "static/images/pixel1.png" }}
+fileExists OK: {{ fileExists $path }}|
+imageConfig OK: {{ (imageConfig $path).Width }}|
+{{ $path2 := "static/images/pixel2.png" }}
+fileExists2 OK: {{ fileExists $path2 }}|
+imageConfig2 OK: {{ (imageConfig $path2).Width }}|
+
+ `
+
+ b := hugolib.NewIntegrationTestBuilder(
+ hugolib.IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).Build()
+
+ b.AssertFileContent("public/index.html", `
+fileExists OK: true|
+imageConfig OK: 1|
+fileExists2 OK: true|
+imageConfig2 OK: 1|
+`)
+}