From bd66d30295e5454bb076d3108a89f6c3ad9bcde8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 30 Jan 2024 22:26:55 +0100 Subject: [PATCH] Filter out duplicate content resource files We do a slight normalisation of the content paths (lower case, replacing " " with "-") and remove andy language identifier before inserting them into the content tree. This means that, given that that the default content language is `en`: ``` index.md index.html Foo Bar.txt foo-bar.txt foo-bar.en.txt Foo-Bar.txt ``` The bundle above will be reduced to one content file with one resource (`foo-bar.txt`). Before this commit, what version of the `foo-bar.txt` you ended up with was undeterministic. No we pick the first determined by sort order. Note that the sort order is stable, but we recommend avoiding situations like the above. Closes #11946 --- hugofs/component_fs.go | 4 ++-- hugolib/content_map_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/hugofs/component_fs.go b/hugofs/component_fs.go index c55f1595729..62d977ae889 100644 --- a/hugofs/component_fs.go +++ b/hugofs/component_fs.go @@ -147,13 +147,13 @@ func (f *componentFsDir) ReadDir(count int) ([]iofs.DirEntry, error) { }) if f.fs.opts.Component == files.ComponentFolderContent { - // Finally filter out any duplicate content files, e.g. page.md and page.html. + // Finally filter out any duplicate content or resource files, e.g. page.md and page.html. n := 0 seen := map[hstrings.Tuple]bool{} for _, fi := range fis { fim := fi.(FileMetaInfo) pi := fim.Meta().PathInfo - keep := fim.IsDir() || !pi.IsContent() + keep := fim.IsDir() if !keep { baseLang := hstrings.Tuple{First: pi.Base(), Second: fim.Meta().Lang} diff --git a/hugolib/content_map_test.go b/hugolib/content_map_test.go index 7843ad28589..c666e2a45f1 100644 --- a/hugolib/content_map_test.go +++ b/hugolib/content_map_test.go @@ -299,3 +299,30 @@ R: {{ with $r }}{{ .Content }}{{ end }}| b.AssertFileContent("public/index.html", "R: Data.") } + +// Issue #11946. +func TestBundleResourcesGetDuplicateSortOrder(t *testing.T) { + files := ` +-- hugo.toml -- +baseURL = "https://example.com" +-- content/bundle/index.md -- +-- content/bundle/data-1.txt -- +data-1.txt +-- content/bundle/data 1.txt -- +data 1.txt +-- content/bundle/Data 1.txt -- +Data 1.txt +-- content/bundle/Data-1.txt -- +Data-1.txt +-- layouts/index.html -- +{{ $bundle := site.GetPage "bundle" }} +{{ $r := $bundle.Resources.Get "data-1.txt" }} +R: {{ with $r }}{{ .Content }}{{ end }}|Len: {{ len $bundle.Resources }}|$ + +` + + for i := 0; i < 3; i++ { + b := Test(t, files) + b.AssertFileContent("public/index.html", "R: Data 1.txt|", "Len: 1|") + } +}