diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2021-10-16 17:24:49 +0300 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2021-10-20 06:00:17 +0300 |
commit | 471ed91c60cd36645794925cb4892cc820eae626 (patch) | |
tree | b78ae6d931e7dd39ccd35a1ed3ff8440f9ef7900 /hugolib | |
parent | 94a5bac5b29bbba1ca4809752fe3fd04a58547b6 (diff) |
hugofs: Add includeFiles and excludeFiles to mount configuration
Fixes #9042
Diffstat (limited to 'hugolib')
-rw-r--r-- | hugolib/filesystems/basefs.go | 21 | ||||
-rw-r--r-- | hugolib/mount_filters_test.go | 119 |
2 files changed, 136 insertions, 4 deletions
diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go index 0a2c31240..cfbd295ba 100644 --- a/hugolib/filesystems/basefs.go +++ b/hugolib/filesystems/basefs.go @@ -25,6 +25,9 @@ import ( "sync" "github.com/gohugoio/hugo/htesting" + "github.com/gohugoio/hugo/hugofs/glob" + + "github.com/gohugoio/hugo/common/types" "github.com/gohugoio/hugo/common/loggers" "github.com/rogpeppe/go-internal/lockedfile" @@ -127,7 +130,8 @@ func (b *BaseFs) RelContentDir(filename string) string { return filename } -// AbsProjectContentDir tries to create a TODO1 +// AbsProjectContentDir tries to construct a filename below the most +// relevant content directory. func (b *BaseFs) AbsProjectContentDir(filename string) (string, string) { isAbs := filepath.IsAbs(filename) for _, dir := range b.SourceFilesystems.Content.Dirs { @@ -623,6 +627,14 @@ func (b *sourceFilesystemsBuilder) createModFs( mountWeight++ } + inclusionFilter, err := glob.NewFilenameFilter( + types.ToStringSlicePreserveString(mount.IncludeFiles), + types.ToStringSlicePreserveString(mount.ExcludeFiles), + ) + if err != nil { + return err + } + base, filename := absPathify(mount.Source) rm := hugofs.RootMapping{ @@ -631,9 +643,10 @@ func (b *sourceFilesystemsBuilder) createModFs( ToBasedir: base, Module: md.Module.Path(), Meta: &hugofs.FileMeta{ - Watch: md.Watch(), - Weight: mountWeight, - Classifier: files.ContentClassContent, + Watch: md.Watch(), + Weight: mountWeight, + Classifier: files.ContentClassContent, + InclusionFilter: inclusionFilter, }, } diff --git a/hugolib/mount_filters_test.go b/hugolib/mount_filters_test.go new file mode 100644 index 000000000..5e409fcaa --- /dev/null +++ b/hugolib/mount_filters_test.go @@ -0,0 +1,119 @@ +// Copyright 2021 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 hugolib + +import ( + "fmt" + "os" + "path/filepath" + "testing" + + "github.com/gohugoio/hugo/common/loggers" + + "github.com/gohugoio/hugo/hugofs/files" + + "github.com/gohugoio/hugo/htesting" + "github.com/gohugoio/hugo/hugofs" + + qt "github.com/frankban/quicktest" +) + +func TestMountFilters(t *testing.T) { + t.Parallel() + b := newTestSitesBuilder(t) + workingDir, clean, err := htesting.CreateTempDir(hugofs.Os, "hugo-test-mountfilters") + b.Assert(err, qt.IsNil) + defer clean() + + for _, component := range files.ComponentFolders { + b.Assert(os.MkdirAll(filepath.Join(workingDir, component), 0777), qt.IsNil) + } + b.WithWorkingDir(workingDir).WithLogger(loggers.NewInfoLogger()) + b.WithConfigFile("toml", fmt.Sprintf(` +workingDir = %q + +[module] +[[module.mounts]] +source = 'content' +target = 'content' +excludeFiles = "/a/c/**" +[[module.mounts]] +source = 'static' +target = 'static' +[[module.mounts]] +source = 'layouts' +target = 'layouts' +excludeFiles = "/**/foo.html" +[[module.mounts]] +source = 'data' +target = 'data' +includeFiles = "/mydata/**" +[[module.mounts]] +source = 'assets' +target = 'assets' +excludeFiles = "/**exclude.*" +[[module.mounts]] +source = 'i18n' +target = 'i18n' +[[module.mounts]] +source = 'archetypes' +target = 'archetypes' + + +`, workingDir)) + + b.WithContent("/a/b/p1.md", "---\ntitle: Include\n---") + b.WithContent("/a/c/p2.md", "---\ntitle: Exclude\n---") + + b.WithSourceFile( + "data/mydata/b.toml", `b1='bval'`, + "data/nodata/c.toml", `c1='bval'`, + "layouts/partials/foo.html", `foo`, + "assets/exclude.txt", `foo`, + "assets/js/exclude.js", `foo`, + "assets/js/include.js", `foo`, + "assets/js/exclude.js", `foo`, + ) + + b.WithTemplatesAdded("index.html", ` + +Data: {{ site.Data }}:END + +Template: {{ templates.Exists "partials/foo.html" }}:END +Resource1: {{ resources.Get "js/include.js" }}:END +Resource2: {{ resources.Get "js/exclude.js" }}:END +Resource3: {{ resources.Get "exclude.txt" }}:END +Resources: {{ resources.Match "**.js" }} +`) + + b.Build(BuildCfg{}) + + assertExists := func(name string, shouldExist bool) { + b.Helper() + b.Assert(b.CheckExists(filepath.Join(workingDir, name)), qt.Equals, shouldExist) + } + + assertExists("public/a/b/p1/index.html", true) + assertExists("public/a/c/p2/index.html", false) + + b.AssertFileContent(filepath.Join(workingDir, "public", "index.html"), ` +Data: map[mydata:map[b:map[b1:bval]]]:END +Template: false +Resource1: js/include.js:END +Resource2: :END +Resource3: :END +Resources: [js/include.js] +`) + +} |