tpl/os: Revert readDir in theme behaviour

Fixes #9599
This commit is contained in:
Bjørn Erik Pedersen 2022-03-04 07:07:11 +01:00
parent e46e9ceb29
commit 673cde1eb1
4 changed files with 60 additions and 2 deletions

View file

@ -41,6 +41,7 @@ type Fs struct {
// WorkingDir is a read-only file system // WorkingDir is a read-only file system
// restricted to the project working dir. // restricted to the project working dir.
// TODO(bep) get rid of this (se BaseFs)
WorkingDir *afero.BasePathFs WorkingDir *afero.BasePathFs
} }

View file

@ -68,6 +68,9 @@ type BaseFs struct {
// This usually maps to /my-project/public. // This usually maps to /my-project/public.
PublishFs afero.Fs PublishFs afero.Fs
// A read-only filesystem from the project workDir (no theme here).
WorkDir afero.Fs
theBigFs *filesystemsCollector theBigFs *filesystemsCollector
// Locks. // Locks.
@ -202,7 +205,7 @@ type SourceFilesystems struct {
// with any sub module's resource fs layered below. // with any sub module's resource fs layered below.
ResourcesCache afero.Fs ResourcesCache afero.Fs
// The project folder. // The work folder (may be a composite of project and theme components).
Work afero.Fs Work afero.Fs
// When in multihost we have one static filesystem per language. The sync // When in multihost we have one static filesystem per language. The sync
@ -435,9 +438,11 @@ func NewBase(p *paths.Paths, logger loggers.Logger, options ...func(*BaseFs) err
publishFs := hugofs.NewBaseFileDecorator(afero.NewBasePathFs(fs.Destination, p.AbsPublishDir)) publishFs := hugofs.NewBaseFileDecorator(afero.NewBasePathFs(fs.Destination, p.AbsPublishDir))
sourceFs := hugofs.NewBaseFileDecorator(afero.NewBasePathFs(fs.Source, p.WorkingDir)) sourceFs := hugofs.NewBaseFileDecorator(afero.NewBasePathFs(fs.Source, p.WorkingDir))
workDir := hugofs.NewBaseFileDecorator(afero.NewBasePathFs(afero.NewReadOnlyFs(fs.Source), p.WorkingDir))
b := &BaseFs{ b := &BaseFs{
SourceFs: sourceFs, SourceFs: sourceFs,
WorkDir: workDir,
PublishFs: publishFs, PublishFs: publishFs,
buildMu: lockedfile.MutexAt(filepath.Join(p.WorkingDir, lockFileBuild)), buildMu: lockedfile.MutexAt(filepath.Join(p.WorkingDir, lockFileBuild)),
} }

View file

@ -0,0 +1,51 @@
// 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 os_test
import (
"testing"
"github.com/gohugoio/hugo/hugolib"
)
// Issue 9599
func TestReadDirWorkDir(t *testing.T) {
t.Parallel()
files := `
-- config.toml --
theme = "mytheme"
-- myproject.txt --
Hello project!
-- themes/mytheme/mytheme.txt --
Hello theme!
-- layouts/index.html --
{{ $entries := (readDir ".") }}
START:|{{ range $entry := $entries }}{{ if not $entry.IsDir }}{{ $entry.Name }}|{{ end }}{{ end }}:END:
`
b := hugolib.NewIntegrationTestBuilder(
hugolib.IntegrationTestConfig{
T: t,
TxtarString: files,
NeedsOsFS: true,
},
).Build()
b.AssertFileContent("public/index.html", `
START:|config.toml|myproject.txt|:END:
`)
}

View file

@ -33,7 +33,8 @@ func New(d *deps.Deps) *Namespace {
// The docshelper script does not have or need all the dependencies set up. // The docshelper script does not have or need all the dependencies set up.
if d.PathSpec != nil { if d.PathSpec != nil {
readFileFs = afero.NewReadOnlyFs(afero.NewCopyOnWriteFs(d.PathSpec.BaseFs.Content.Fs, d.PathSpec.BaseFs.Work)) readFileFs = afero.NewReadOnlyFs(afero.NewCopyOnWriteFs(d.PathSpec.BaseFs.Content.Fs, d.PathSpec.BaseFs.Work))
workFs = d.PathSpec.BaseFs.Work // See #9599
workFs = d.PathSpec.BaseFs.WorkDir
} }
return &Namespace{ return &Namespace{