diff options
author | Bjørn Erik Pedersen <[email protected]> | 2024-02-21 20:16:02 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2024-02-22 15:36:27 +0100 |
commit | 16406d9d77cb4861bba9df8ca39e7dadfe41eb45 (patch) | |
tree | f32a3921081e40a748613bd87eba7940d6b975db | |
parent | e75784930dca9e367019ce498fd15076a63edb34 (diff) | |
download | hugo-16406d9d77cb4861bba9df8ca39e7dadfe41eb45.tar.gz hugo-16406d9d77cb4861bba9df8ca39e7dadfe41eb45.zip |
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.go | 9 | ||||
-rw-r--r-- | hugofs/rootmapping_fs.go | 39 | ||||
-rw-r--r-- | hugolib/filesystems/basefs_test.go | 42 | ||||
-rw-r--r-- | hugolib/integrationtest_builder.go | 6 | ||||
-rw-r--r-- | testscripts/commands/hugo__static_composite.txt | 27 |
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. + |