Skip to content

Commit

Permalink
Fix Name for nested resourced fetched in resources.ByName and similar
Browse files Browse the repository at this point in the history
Fixes #12214
  • Loading branch information
bep committed Mar 13, 2024
1 parent dc6a292 commit 9e9b1f1
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 13 deletions.
2 changes: 1 addition & 1 deletion hugolib/mount_filters_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,6 @@ Template: false
Resource1: /js/include.js:END
Resource2: :END
Resource3: :END
Resources: [include.js]
Resources: [/js/include.js]
`)
}
22 changes: 12 additions & 10 deletions resources/resource/resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"fmt"
"strings"

"github.com/gohugoio/hugo/common/paths"
"github.com/gohugoio/hugo/hugofs/glob"
"github.com/spf13/cast"
)
Expand Down Expand Up @@ -61,21 +62,22 @@ func (r Resources) Get(name any) Resource {
if err != nil {
panic(err)
}
namestr = strings.ToLower(namestr)

namestr = paths.AddLeadingSlash(namestr)

// First check the Name.
// Note that this can be modified by the user in the front matter,
// also, it does not contain any language code.
for _, resource := range r {
if strings.EqualFold(namestr, resource.Name()) {
if strings.EqualFold(namestr, paths.AddLeadingSlash(resource.Name())) {
return resource
}
}

// Finally, check the normalized name.
for _, resource := range r {
if nop, ok := resource.(NameNormalizedProvider); ok {
if strings.EqualFold(namestr, nop.NameNormalized()) {
if strings.EqualFold(namestr, paths.AddLeadingSlash(nop.NameNormalized())) {
return resource
}
}
Expand All @@ -92,21 +94,21 @@ func (r Resources) GetMatch(pattern any) Resource {
panic(err)
}

g, err := glob.GetGlob(patternstr)
g, err := glob.GetGlob(paths.AddLeadingSlash(patternstr))
if err != nil {
panic(err)
}

for _, resource := range r {
if g.Match(resource.Name()) {
if g.Match(paths.AddLeadingSlash(resource.Name())) {
return resource
}
}

// Finally, check the original name.
// Finally, check the normalized name.
for _, resource := range r {
if nop, ok := resource.(NameNormalizedProvider); ok {
if g.Match(nop.NameNormalized()) {
if g.Match(paths.AddLeadingSlash(nop.NameNormalized())) {
return resource
}
}
Expand All @@ -130,22 +132,22 @@ func (r Resources) Match(pattern any) Resources {
panic(err)
}

g, err := glob.GetGlob(patternstr)
g, err := glob.GetGlob(paths.AddLeadingSlash(patternstr))
if err != nil {
panic(err)
}

var matches Resources
for _, resource := range r {
if g.Match(resource.Name()) {
if g.Match(paths.AddLeadingSlash(resource.Name())) {
matches = append(matches, resource)
}
}
if len(matches) == 0 {
// Fall back to the normalized name.
for _, resource := range r {
if nop, ok := resource.(NameNormalizedProvider); ok {
if g.Match(nop.NameNormalized()) {
if g.Match(paths.AddLeadingSlash(nop.NameNormalized())) {
matches = append(matches, resource)
}
}
Expand Down
4 changes: 2 additions & 2 deletions resources/resource_factories/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,8 @@ func (c *Client) match(name, pattern string, matchFunc func(r resource.Resource)
OpenReadSeekCloser: func() (hugio.ReadSeekCloser, error) {
return meta.Open()
},
NameNormalized: meta.PathInfo.Name(),
NameOriginal: meta.PathInfo.Unnormalized().Name(),
NameNormalized: meta.PathInfo.Path(),
NameOriginal: meta.PathInfo.Unnormalized().Path(),
GroupIdentity: meta.PathInfo,
TargetPath: meta.PathInfo.Unnormalized().Path(),
})
Expand Down
67 changes: 67 additions & 0 deletions tpl/resources/resources_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,3 +171,70 @@ Home.
b.AssertFileExists("public/a.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")
}

0 comments on commit 9e9b1f1

Please sign in to comment.