mirror of
https://github.com/gohugoio/hugo.git
synced 2025-04-26 13:40:38 +03:00
Fix Name for nested resourced fetched in resources.ByName and similar
Fixes #12214
This commit is contained in:
parent
dc6a292133
commit
9e9b1f110c
4 changed files with 82 additions and 13 deletions
|
@ -112,6 +112,6 @@ Template: false
|
||||||
Resource1: /js/include.js:END
|
Resource1: /js/include.js:END
|
||||||
Resource2: :END
|
Resource2: :END
|
||||||
Resource3: :END
|
Resource3: :END
|
||||||
Resources: [include.js]
|
Resources: [/js/include.js]
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gohugoio/hugo/common/paths"
|
||||||
"github.com/gohugoio/hugo/hugofs/glob"
|
"github.com/gohugoio/hugo/hugofs/glob"
|
||||||
"github.com/spf13/cast"
|
"github.com/spf13/cast"
|
||||||
)
|
)
|
||||||
|
@ -61,13 +62,14 @@ func (r Resources) Get(name any) Resource {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
namestr = strings.ToLower(namestr)
|
|
||||||
|
namestr = paths.AddLeadingSlash(namestr)
|
||||||
|
|
||||||
// First check the Name.
|
// First check the Name.
|
||||||
// Note that this can be modified by the user in the front matter,
|
// Note that this can be modified by the user in the front matter,
|
||||||
// also, it does not contain any language code.
|
// also, it does not contain any language code.
|
||||||
for _, resource := range r {
|
for _, resource := range r {
|
||||||
if strings.EqualFold(namestr, resource.Name()) {
|
if strings.EqualFold(namestr, paths.AddLeadingSlash(resource.Name())) {
|
||||||
return resource
|
return resource
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,7 +77,7 @@ func (r Resources) Get(name any) Resource {
|
||||||
// Finally, check the normalized name.
|
// Finally, check the normalized name.
|
||||||
for _, resource := range r {
|
for _, resource := range r {
|
||||||
if nop, ok := resource.(NameNormalizedProvider); ok {
|
if nop, ok := resource.(NameNormalizedProvider); ok {
|
||||||
if strings.EqualFold(namestr, nop.NameNormalized()) {
|
if strings.EqualFold(namestr, paths.AddLeadingSlash(nop.NameNormalized())) {
|
||||||
return resource
|
return resource
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,21 +94,21 @@ func (r Resources) GetMatch(pattern any) Resource {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
g, err := glob.GetGlob(patternstr)
|
g, err := glob.GetGlob(paths.AddLeadingSlash(patternstr))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, resource := range r {
|
for _, resource := range r {
|
||||||
if g.Match(resource.Name()) {
|
if g.Match(paths.AddLeadingSlash(resource.Name())) {
|
||||||
return resource
|
return resource
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally, check the original name.
|
// Finally, check the normalized name.
|
||||||
for _, resource := range r {
|
for _, resource := range r {
|
||||||
if nop, ok := resource.(NameNormalizedProvider); ok {
|
if nop, ok := resource.(NameNormalizedProvider); ok {
|
||||||
if g.Match(nop.NameNormalized()) {
|
if g.Match(paths.AddLeadingSlash(nop.NameNormalized())) {
|
||||||
return resource
|
return resource
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,14 +132,14 @@ func (r Resources) Match(pattern any) Resources {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
g, err := glob.GetGlob(patternstr)
|
g, err := glob.GetGlob(paths.AddLeadingSlash(patternstr))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var matches Resources
|
var matches Resources
|
||||||
for _, resource := range r {
|
for _, resource := range r {
|
||||||
if g.Match(resource.Name()) {
|
if g.Match(paths.AddLeadingSlash(resource.Name())) {
|
||||||
matches = append(matches, resource)
|
matches = append(matches, resource)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,7 +147,7 @@ func (r Resources) Match(pattern any) Resources {
|
||||||
// Fall back to the normalized name.
|
// Fall back to the normalized name.
|
||||||
for _, resource := range r {
|
for _, resource := range r {
|
||||||
if nop, ok := resource.(NameNormalizedProvider); ok {
|
if nop, ok := resource.(NameNormalizedProvider); ok {
|
||||||
if g.Match(nop.NameNormalized()) {
|
if g.Match(paths.AddLeadingSlash(nop.NameNormalized())) {
|
||||||
matches = append(matches, resource)
|
matches = append(matches, resource)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,8 +134,8 @@ func (c *Client) match(name, pattern string, matchFunc func(r resource.Resource)
|
||||||
OpenReadSeekCloser: func() (hugio.ReadSeekCloser, error) {
|
OpenReadSeekCloser: func() (hugio.ReadSeekCloser, error) {
|
||||||
return meta.Open()
|
return meta.Open()
|
||||||
},
|
},
|
||||||
NameNormalized: meta.PathInfo.Name(),
|
NameNormalized: meta.PathInfo.Path(),
|
||||||
NameOriginal: meta.PathInfo.Unnormalized().Name(),
|
NameOriginal: meta.PathInfo.Unnormalized().Path(),
|
||||||
GroupIdentity: meta.PathInfo,
|
GroupIdentity: meta.PathInfo,
|
||||||
TargetPath: meta.PathInfo.Unnormalized().Path(),
|
TargetPath: meta.PathInfo.Unnormalized().Path(),
|
||||||
})
|
})
|
||||||
|
|
|
@ -171,3 +171,70 @@ Home.
|
||||||
b.AssertFileExists("public/a.txt", true) // failing test
|
b.AssertFileExists("public/a.txt", true) // failing test
|
||||||
b.AssertFileExists("public/b.txt", true) // failing test
|
b.AssertFileExists("public/b.txt", true) // failing test
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGlobalResourcesNotPublishedRegressionIssue12214(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
files := `
|
||||||
|
-- hugo.toml --
|
||||||
|
disableKinds = ['page','rss','section','sitemap','taxonomy','term']
|
||||||
|
-- assets/files/a.txt --
|
||||||
|
I am a.txt
|
||||||
|
-- assets/files/b.txt --
|
||||||
|
I am b.txt
|
||||||
|
-- assets/files/c.txt --
|
||||||
|
I am c.txt
|
||||||
|
-- assets/files/C.txt --
|
||||||
|
I am C.txt
|
||||||
|
-- layouts/index.html --
|
||||||
|
Home.
|
||||||
|
{{ with resources.ByType "text" }}
|
||||||
|
{{ with .Get "files/a.txt" }}
|
||||||
|
{{ .Publish }}
|
||||||
|
files/a.txt: {{ .Name }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with .Get "/files/a.txt" }}
|
||||||
|
/files/a.txt: {{ .Name }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with .GetMatch "files/*b*" }}
|
||||||
|
{{ .Publish }}
|
||||||
|
files/*b*: {{ .Name }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with .GetMatch "files/C*" }}
|
||||||
|
{{ .Publish }}
|
||||||
|
files/C*: {{ .Name }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with .GetMatch "files/c*" }}
|
||||||
|
{{ .Publish }}
|
||||||
|
files/c*: {{ .Name }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with .GetMatch "/files/c*" }}
|
||||||
|
/files/c*: {{ .Name }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with .Match "files/C*" }}
|
||||||
|
match files/C*: {{ len . }}|
|
||||||
|
{{ end }}
|
||||||
|
{{ with .Match "/files/C*" }}
|
||||||
|
match /files/C*: {{ len . }}|
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
`
|
||||||
|
|
||||||
|
b := hugolib.Test(t, files)
|
||||||
|
|
||||||
|
b.AssertFileContent("public/index.html", `
|
||||||
|
files/a.txt: /files/a.txt
|
||||||
|
# There are both C.txt and c.txt in the assets, but the Glob matching is case insensitive, so GetMatch returns the first.
|
||||||
|
files/C*: /files/C.txt
|
||||||
|
files/c*: /files/C.txt
|
||||||
|
files/*b*: /files/b.txt
|
||||||
|
/files/c*: /files/C.txt
|
||||||
|
/files/a.txt: /files/a.txt
|
||||||
|
match files/C*: 2|
|
||||||
|
match /files/C*: 2|
|
||||||
|
`)
|
||||||
|
|
||||||
|
b.AssertFileContent("public/files/a.txt", "I am a.txt")
|
||||||
|
b.AssertFileContent("public/files/b.txt", "I am b.txt")
|
||||||
|
b.AssertFileContent("public/files/C.txt", "I am C.txt")
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue