]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Fix regression on handling of overlapping file mounts
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 21 Feb 2024 19:16:02 +0000 (20:16 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 22 Feb 2024 14:36:27 +0000 (15:36 +0100)
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

helpers/general.go
hugofs/rootmapping_fs.go
hugolib/filesystems/basefs_test.go
hugolib/integrationtest_builder.go
testscripts/commands/hugo__static_composite.txt [new file with mode: 0644]

index c7d9fcd85ed1d177c158b820822893acbb7f06d5..af854041ddf2ce8906cb2f4352fa67ed78d7b213 100644 (file)
@@ -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
        })
 }
index 1efb8ee5fa1ca80a955b97623f5a884bfc509af8..ce4243fbb0e229ecc3bc66ff3e6b23d8ccb16373 100644 (file)
@@ -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
        }
index ebbb378d31729f5f62a369df13727b26adaf6de0..f5b7b6170e5e501dffc34bd18fd43c8b49048a44 100644 (file)
@@ -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) {
index 194b79c6871e74dbcdb38828e638f3fc71c1d8f1..8c7017a872373b589c5d43f6b1f52710dca2314f 100644 (file)
@@ -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 (file)
index 0000000..bf73f6a
--- /dev/null
@@ -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.
+