diff --git a/resources/page/integration_test.go b/resources/page/integration_test.go index 9dc322b4a..0761de249 100644 --- a/resources/page/integration_test.go +++ b/resources/page/integration_test.go @@ -136,3 +136,42 @@ Sort: [éclair emma xylophone zulu] ByWeight: alpha|émotion|zulu| `) } + +// See #10377 +func TestPermalinkExpansionSectionsRepeated(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ["home", "taxonomy", "taxonomyTerm", "sitemap"] +[outputs] +home = ["HTML"] +page = ["HTML"] +section = ["HTML"] +[outputFormats] +[permalinks] +posts = '/:sections[1]/:sections[last]/:slug' +-- content/posts/_index.md -- +-- content/posts/a/_index.md -- +-- content/posts/a/b/_index.md -- +-- content/posts/a/b/c/_index.md -- +-- content/posts/a/b/c/d.md -- +--- +title: "D" +slug: "d" +--- +D +-- layouts/_default/single.html -- +RelPermalink: {{ .RelPermalink }} + +` + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + }).Build() + + b.AssertFileContent("public/a/c/d/index.html", "RelPermalink: /a/c/d/") + +} diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go index c31d22a3c..dbf10220c 100644 --- a/resources/page/permalinks.go +++ b/resources/page/permalinks.go @@ -176,7 +176,7 @@ func (l PermalinkExpander) parse(patterns map[string]string) (map[string]func(Pa // can return a string to go in that position in the page (or an error) type pageToPermaAttribute func(Page, string) (string, error) -var attributeRegexp = regexp.MustCompile(`:\w+(\[.+\])?`) +var attributeRegexp = regexp.MustCompile(`:\w+(\[.+?\])?`) // validate determines if a PathPattern is well-formed func (l PermalinkExpander) validate(pp string) bool { diff --git a/resources/page/permalinks_test.go b/resources/page/permalinks_test.go index 7baf16503..07333492f 100644 --- a/resources/page/permalinks_test.go +++ b/resources/page/permalinks_test.go @@ -42,6 +42,7 @@ var testdataPermalinks = []struct { {"/:2006_01_02_15_04_05.000", true, "/2012_04_06_03_01_59.000"}, // Complicated custom date format {"/:sections/", true, "/a/b/c/"}, // Sections {"/:sections[last]/", true, "/c/"}, // Sections + {"/:sections[0]/:sections[last]/", true, "/a/c/"}, // Sections // Failures {"/blog/:fred", false, ""},