summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-02-21 20:16:02 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-02-22 15:36:27 +0100
commit16406d9d77cb4861bba9df8ca39e7dadfe41eb45 (patch)
treef32a3921081e40a748613bd87eba7940d6b975db
parente75784930dca9e367019ce498fd15076a63edb34 (diff)
Fix regression on handling of overlapping file mounts
But note that the overlay file system is set up horizontally (project -> module1 -> module2), so I would not recommend too complex overlapping mount setups within the same module. But this worked in v0.122.0, so we should fix it. Fixes #12103
-rw-r--r--helpers/general.go9
-rw-r--r--hugofs/rootmapping_fs.go39
-rw-r--r--hugolib/filesystems/basefs_test.go42
-rw-r--r--hugolib/integrationtest_builder.go6
-rw-r--r--testscripts/commands/hugo__static_composite.txt27
5 files changed, 111 insertions, 12 deletions
diff --git a/helpers/general.go b/helpers/general.go
index c7d9fcd85..af854041d 100644
--- a/helpers/general.go
+++ b/helpers/general.go
@@ -328,7 +328,14 @@ func PrintFs(fs afero.Fs, path string, w io.Writer) {
}
afero.Walk(fs, path, func(path string, info os.FileInfo, err error) error {
- fmt.Fprintln(w, filepath.ToSlash(path))
+ if err != nil {
+ panic(fmt.Sprintf("error: path %q: %s", path, err))
+ }
+ path = filepath.ToSlash(path)
+ if path == "" {
+ path = "."
+ }
+ fmt.Fprintln(w, path, info.IsDir())
return nil
})
}
diff --git a/hugofs/rootmapping_fs.go b/hugofs/rootmapping_fs.go
index 1efb8ee5f..ce4243fbb 100644
--- a/hugofs/rootmapping_fs.go
+++ b/hugofs/rootmapping_fs.go
@@ -323,7 +323,6 @@ func (fs *RootMappingFs) Stat(name string) (os.FileInfo, error) {
if err != nil {
return nil, err
}
-
return fis[0], nil
}
@@ -403,16 +402,42 @@ func (fs *RootMappingFs) getRoot(key string) []RootMapping {
}
func (fs *RootMappingFs) getRoots(key string) (string, []RootMapping) {
- return fs.getRootsIn(key, fs.rootMapToReal)
-}
+ tree := fs.rootMapToReal
+ levels := strings.Count(key, filepathSeparator)
+ seen := make(map[RootMapping]bool)
-func (fs *RootMappingFs) getRootsReverse(key string) (string, []RootMapping) {
- return fs.getRootsIn(key, fs.realMapToRoot)
+ var roots []RootMapping
+ var s string
+
+ for {
+ var found bool
+ ss, vv, found := tree.LongestPrefix(key)
+ if !found || (levels < 2 && ss == key) {
+ break
+ }
+
+ for _, rm := range vv.([]RootMapping) {
+ if !seen[rm] {
+ seen[rm] = true
+ roots = append(roots, rm)
+ }
+ }
+ s = ss
+
+ // We may have more than one root for this key, so walk up.
+ oldKey := key
+ key = filepath.Dir(key)
+ if key == oldKey {
+ break
+ }
+ }
+
+ return s, roots
}
-func (fs *RootMappingFs) getRootsIn(key string, tree *radix.Tree) (string, []RootMapping) {
+func (fs *RootMappingFs) getRootsReverse(key string) (string, []RootMapping) {
+ tree := fs.realMapToRoot
s, v, found := tree.LongestPrefix(key)
-
if !found {
return "", nil
}
diff --git a/hugolib/filesystems/basefs_test.go b/hugolib/filesystems/basefs_test.go
index ebbb378d3..f5b7b6170 100644
--- a/hugolib/filesystems/basefs_test.go
+++ b/hugolib/filesystems/basefs_test.go
@@ -478,11 +478,47 @@ Home.
_ = stat("blog/b1.md")
}
+func TestStaticComposite(t *testing.T) {
+ files := `
+-- hugo.toml --
+disableKinds = ["taxonomy", "term"]
+[module]
+[[module.mounts]]
+source = "myfiles/f1.txt"
+target = "static/files/f1.txt"
+[[module.mounts]]
+source = "f3.txt"
+target = "static/f3.txt"
+[[module.mounts]]
+source = "static"
+target = "static"
+-- static/files/f2.txt --
+f2
+-- myfiles/f1.txt --
+f1
+-- f3.txt --
+f3
+-- layouts/home.html --
+Home.
+
+`
+ b := hugolib.Test(t, files)
+
+ b.AssertFs(b.H.BaseFs.StaticFs(""), `
+. true
+f3.txt false
+files true
+files/f1.txt false
+files/f2.txt false
+`)
+}
+
func checkFileCount(fs afero.Fs, dirname string, c *qt.C, expected int) {
c.Helper()
- count, _, err := countFilesAndGetFilenames(fs, dirname)
- c.Assert(err, qt.IsNil)
- c.Assert(count, qt.Equals, expected)
+ count, names, err := countFilesAndGetFilenames(fs, dirname)
+ namesComment := qt.Commentf("filenames: %v", names)
+ c.Assert(err, qt.IsNil, namesComment)
+ c.Assert(count, qt.Equals, expected, namesComment)
}
func checkFileContent(fs afero.Fs, filename string, c *qt.C, expected ...string) {
diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go
index 194b79c68..8c7017a87 100644
--- a/hugolib/integrationtest_builder.go
+++ b/hugolib/integrationtest_builder.go
@@ -275,9 +275,13 @@ func (s *IntegrationTestBuilder) AssertFileContentExact(filename string, matches
}
func (s *IntegrationTestBuilder) AssertPublishDir(matches ...string) {
+ s.AssertFs(s.fs.PublishDir, matches...)
+}
+
+func (s *IntegrationTestBuilder) AssertFs(fs afero.Fs, matches ...string) {
s.Helper()
var buff bytes.Buffer
- helpers.PrintFs(s.H.Fs.PublishDir, "", &buff)
+ helpers.PrintFs(fs, "", &buff)
printFsLines := strings.Split(buff.String(), "\n")
sort.Strings(printFsLines)
content := strings.TrimSpace((strings.Join(printFsLines, "\n")))
diff --git a/testscripts/commands/hugo__static_composite.txt b/testscripts/commands/hugo__static_composite.txt
new file mode 100644
index 000000000..bf73f6abb
--- /dev/null
+++ b/testscripts/commands/hugo__static_composite.txt
@@ -0,0 +1,27 @@
+hugo
+ls public/files
+checkfile public/files/f1.txt
+checkfile public/files/f2.txt
+checkfile public/f3.txt
+
+-- hugo.toml --
+disableKinds = ["taxonomy", "term"]
+[module]
+[[module.mounts]]
+source = "myfiles/f1.txt"
+target = "static/files/f1.txt"
+[[module.mounts]]
+source = "f3.txt"
+target = "static/f3.txt"
+[[module.mounts]]
+source = "static"
+target = "static"
+-- static/files/f2.txt --
+f2
+-- myfiles/f1.txt --
+f1
+-- f3.txt --
+f3
+-- layouts/home.html --
+Home.
+