mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-23 21:53:09 +02:00
hugofs: Make FileMeta a struct
This commit started out investigating a `concurrent map read write` issue, ending by replacing the map with a struct. This is easier to reason about, and it's more effective: ``` name old time/op new time/op delta SiteNew/Regular_Deep_content_tree-16 71.5ms ± 3% 69.4ms ± 5% ~ (p=0.200 n=4+4) name old alloc/op new alloc/op delta SiteNew/Regular_Deep_content_tree-16 29.7MB ± 0% 27.9MB ± 0% -5.82% (p=0.029 n=4+4) name old allocs/op new allocs/op delta SiteNew/Regular_Deep_content_tree-16 313k ± 0% 303k ± 0% -3.35% (p=0.029 n=4+4) ``` See #8749
This commit is contained in:
@@ -49,27 +49,27 @@ func TestLanguageRootMapping(t *testing.T) {
|
||||
RootMapping{
|
||||
From: "content/blog", // Virtual path, first element is one of content, static, layouts etc.
|
||||
To: "themes/a/mysvblogcontent", // Real path
|
||||
Meta: FileMeta{"lang": "sv"},
|
||||
Meta: &FileMeta{Lang: "sv"},
|
||||
},
|
||||
RootMapping{
|
||||
From: "content/blog",
|
||||
To: "themes/a/myenblogcontent",
|
||||
Meta: FileMeta{"lang": "en"},
|
||||
Meta: &FileMeta{Lang: "en"},
|
||||
},
|
||||
RootMapping{
|
||||
From: "content/blog",
|
||||
To: "content/sv",
|
||||
Meta: FileMeta{"lang": "sv"},
|
||||
Meta: &FileMeta{Lang: "sv"},
|
||||
},
|
||||
RootMapping{
|
||||
From: "content/blog",
|
||||
To: "themes/a/myotherenblogcontent",
|
||||
Meta: FileMeta{"lang": "en"},
|
||||
Meta: &FileMeta{Lang: "en"},
|
||||
},
|
||||
RootMapping{
|
||||
From: "content/docs",
|
||||
To: "themes/a/mysvdocs",
|
||||
Meta: FileMeta{"lang": "sv"},
|
||||
Meta: &FileMeta{Lang: "sv"},
|
||||
},
|
||||
)
|
||||
|
||||
@@ -122,13 +122,13 @@ func TestLanguageRootMapping(t *testing.T) {
|
||||
}
|
||||
|
||||
rfsEn := rfs.Filter(func(rm RootMapping) bool {
|
||||
return rm.Meta.Lang() == "en"
|
||||
return rm.Meta.Lang == "en"
|
||||
})
|
||||
|
||||
c.Assert(getDirnames("content/blog", rfsEn), qt.DeepEquals, []string{"d1", "en-f.txt", "en-f2.txt"})
|
||||
|
||||
rfsSv := rfs.Filter(func(rm RootMapping) bool {
|
||||
return rm.Meta.Lang() == "sv"
|
||||
return rm.Meta.Lang == "sv"
|
||||
})
|
||||
|
||||
c.Assert(getDirnames("content/blog", rfsSv), qt.DeepEquals, []string{"d1", "sv-f.txt", "svdir"})
|
||||
@@ -157,7 +157,7 @@ func TestRootMappingFsDirnames(t *testing.T) {
|
||||
c.Assert(err, qt.IsNil)
|
||||
c.Assert(fif.Name(), qt.Equals, "myfile.txt")
|
||||
fifm := fif.(FileMetaInfo).Meta()
|
||||
c.Assert(fifm.Filename(), qt.Equals, filepath.FromSlash("f2t/myfile.txt"))
|
||||
c.Assert(fifm.Filename, qt.Equals, filepath.FromSlash("f2t/myfile.txt"))
|
||||
|
||||
root, err := rfs.Open("static")
|
||||
c.Assert(err, qt.IsNil)
|
||||
@@ -185,7 +185,7 @@ func TestRootMappingFsFilename(t *testing.T) {
|
||||
fi, err := rfs.Stat(filepath.FromSlash("static/f1/foo/file.txt"))
|
||||
c.Assert(err, qt.IsNil)
|
||||
fim := fi.(FileMetaInfo)
|
||||
c.Assert(fim.Meta().Filename(), qt.Equals, testfilename)
|
||||
c.Assert(fim.Meta().Filename, qt.Equals, testfilename)
|
||||
_, err = rfs.Stat(filepath.FromSlash("static/f1"))
|
||||
c.Assert(err, qt.IsNil)
|
||||
}
|
||||
@@ -209,30 +209,30 @@ func TestRootMappingFsMount(t *testing.T) {
|
||||
{
|
||||
From: "content/blog",
|
||||
To: "mynoblogcontent",
|
||||
Meta: FileMeta{"lang": "no"},
|
||||
Meta: &FileMeta{Lang: "no"},
|
||||
},
|
||||
{
|
||||
From: "content/blog",
|
||||
To: "myenblogcontent",
|
||||
Meta: FileMeta{"lang": "en"},
|
||||
Meta: &FileMeta{Lang: "en"},
|
||||
},
|
||||
{
|
||||
From: "content/blog",
|
||||
To: "mysvblogcontent",
|
||||
Meta: FileMeta{"lang": "sv"},
|
||||
Meta: &FileMeta{Lang: "sv"},
|
||||
},
|
||||
// Files
|
||||
{
|
||||
From: "content/singles/p1.md",
|
||||
To: "singlefiles/no.txt",
|
||||
ToBasedir: "singlefiles",
|
||||
Meta: FileMeta{"lang": "no"},
|
||||
Meta: &FileMeta{Lang: "no"},
|
||||
},
|
||||
{
|
||||
From: "content/singles/p1.md",
|
||||
To: "singlefiles/sv.txt",
|
||||
ToBasedir: "singlefiles",
|
||||
Meta: FileMeta{"lang": "sv"},
|
||||
Meta: &FileMeta{Lang: "sv"},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -243,7 +243,7 @@ func TestRootMappingFsMount(t *testing.T) {
|
||||
c.Assert(err, qt.IsNil)
|
||||
c.Assert(blog.IsDir(), qt.Equals, true)
|
||||
blogm := blog.(FileMetaInfo).Meta()
|
||||
c.Assert(blogm.Lang(), qt.Equals, "no") // First match
|
||||
c.Assert(blogm.Lang, qt.Equals, "no") // First match
|
||||
|
||||
f, err := blogm.Open()
|
||||
c.Assert(err, qt.IsNil)
|
||||
@@ -261,7 +261,7 @@ func TestRootMappingFsMount(t *testing.T) {
|
||||
c.Assert(testfilefi.Name(), qt.Equals, testfile)
|
||||
|
||||
testfilem := testfilefi.(FileMetaInfo).Meta()
|
||||
c.Assert(testfilem.Filename(), qt.Equals, filepath.FromSlash("themes/a/mynoblogcontent/test.txt"))
|
||||
c.Assert(testfilem.Filename, qt.Equals, filepath.FromSlash("themes/a/mynoblogcontent/test.txt"))
|
||||
|
||||
tf, err := testfilem.Open()
|
||||
c.Assert(err, qt.IsNil)
|
||||
@@ -283,7 +283,7 @@ func TestRootMappingFsMount(t *testing.T) {
|
||||
for i, lang := range []string{"no", "sv"} {
|
||||
fi := singles[i].(FileMetaInfo)
|
||||
c.Assert(fi.Meta().PathFile(), qt.Equals, filepath.FromSlash("themes/a/singlefiles/"+lang+".txt"))
|
||||
c.Assert(fi.Meta().Lang(), qt.Equals, lang)
|
||||
c.Assert(fi.Meta().Lang, qt.Equals, lang)
|
||||
c.Assert(fi.Name(), qt.Equals, "p1.md")
|
||||
}
|
||||
}
|
||||
@@ -431,7 +431,7 @@ func TestRootMappingFsOs(t *testing.T) {
|
||||
}
|
||||
i++
|
||||
meta := fi.(FileMetaInfo).Meta()
|
||||
c.Assert(meta.Filename(), qt.Equals, filepath.Join(d, fmt.Sprintf("/d1/d2/d3/f-%d.txt", i)))
|
||||
c.Assert(meta.Filename, qt.Equals, filepath.Join(d, fmt.Sprintf("/d1/d2/d3/f-%d.txt", i)))
|
||||
c.Assert(meta.PathFile(), qt.Equals, filepath.FromSlash(fmt.Sprintf("d1/d2/d3/f-%d.txt", i)))
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user