From 1c0e7c1ae1eb9cd47fbe030ebddbf89df04fe667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 20 Mar 2022 11:24:44 +0100 Subject: Make sure file mounts higher up wins Fixes #9693 --- hugolib/filesystems/basefs.go | 12 ++-- hugolib/language_content_dir_test.go | 121 +++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 5 deletions(-) (limited to 'hugolib') diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go index 2e32932c6..6e3f88a4b 100644 --- a/hugolib/filesystems/basefs.go +++ b/hugolib/filesystems/basefs.go @@ -602,6 +602,7 @@ func (b *sourceFilesystemsBuilder) createMainOverlayFs(p *paths.Paths) (*filesys Module: mod, dir: dir, isMainProject: isMainProject, + ordinal: j, } j++ } @@ -635,12 +636,12 @@ func (b *sourceFilesystemsBuilder) createModFs( return md.dir, paths.AbsPathify(md.dir, path) } - for _, mount := range md.Mounts() { + for i, mount := range md.Mounts() { - mountWeight := 1 - if md.isMainProject { - mountWeight++ - } + // Add more weight to early mounts. + // When two mounts contain the same filename, + // the first entry wins. + mountWeight := (10 + md.ordinal) * (len(md.Mounts()) - i) inclusionFilter, err := glob.NewFilenameFilter( types.ToStringSlicePreserveString(mount.IncludeFiles), @@ -829,6 +830,7 @@ type mountsDescriptor struct { modules.Module dir string isMainProject bool + ordinal int } func (b *sourceFilesystemsBuilder) createOverlayFs(collector *filesystemsCollector, mounts []mountsDescriptor) error { diff --git a/hugolib/language_content_dir_test.go b/hugolib/language_content_dir_test.go index 682531566..541878220 100644 --- a/hugolib/language_content_dir_test.go +++ b/hugolib/language_content_dir_test.go @@ -403,3 +403,124 @@ Page: /fr/event/page2/|ev-fr2 Page: /fr/other/page1/|other-fr1 Page: /fr/other/page2/|other-fr2`) } + +// Issue 9693 +func TestContentMountMerge(t *testing.T) { + t.Parallel() + + files := ` +-- config.toml -- +baseURL = 'https://example.org/' +languageCode = 'en-us' +title = 'Hugo Forum Topic #37225' +theme = 'mytheme' + +disableKinds = ['sitemap','RSS','taxonomy','term'] +defaultContentLanguage = 'en' +defaultContentLanguageInSubdir = true + +[languages.en] +languageName = 'English' +weight = 1 +[languages.de] +languageName = 'Deutsch' +weight = 2 +[languages.nl] +languageName = 'Nederlands' +weight = 3 + +# EN content +[[module.mounts]] +source = 'content/en' +target = 'content' +lang = 'en' + +# DE content +[[module.mounts]] +source = 'content/de' +target = 'content' +lang = 'de' + +# This fills in the gaps in DE content with EN content +[[module.mounts]] +source = 'content/en' +target = 'content' +lang = 'de' + +# NL content +[[module.mounts]] +source = 'content/nl' +target = 'content' +lang = 'nl' + +# This should fill in the gaps in NL content with EN content +[[module.mounts]] +source = 'content/en' +target = 'content' +lang = 'nl' + +-- content/de/_index.md -- +--- +title: "home (de)" +--- +-- content/de/p1.md -- +--- +title: "p1 (de)" +--- +-- content/en/_index.md -- +--- +title: "home (en)" +--- +-- content/en/p1.md -- +--- +title: "p1 (en)" +--- +-- content/en/p2.md -- +--- +title: "p2 (en)" +--- +-- content/en/p3.md -- +--- +title: "p3 (en)" +--- +-- content/nl/_index.md -- +--- +title: "home (nl)" +--- +-- content/nl/p1.md -- +--- +title: "p1 (nl)" +--- +-- content/nl/p3.md -- +--- +title: "p3 (nl)" +--- +-- layouts/home.html -- +{{ .Title }}: {{ site.Language.Lang }}: {{ range site.RegularPages }}{{ .Title }}|{{ end }}:END +-- themes/mytheme/config.toml -- +[[module.mounts]] +source = 'content/nlt' +target = 'content' +lang = 'nl' +-- themes/mytheme/content/nlt/p3.md -- +--- +title: "p3 theme (nl)" +--- +-- themes/mytheme/content/nlt/p4.md -- +--- +title: "p4 theme (nl)" +--- +` + + b := NewIntegrationTestBuilder( + IntegrationTestConfig{ + T: t, + TxtarString: files, + }, + ).Build() + + b.AssertFileContent("public/nl/index.html", `home (nl): nl: p1 (nl)|p2 (en)|p3 (nl)|p4 theme (nl)|:END`) + b.AssertFileContent("public/de/index.html", `home (de): de: p1 (de)|p2 (en)|p3 (en)|:END`) + b.AssertFileContent("public/en/index.html", `home (en): en: p1 (en)|p2 (en)|p3 (en)|:END`) + +} -- cgit v1.2.3