hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit da00e7714e0233d5cba73bc3c4cf7331304ccb20
parent ed9aa374dd5e18fbfb207a0a10cde2362061c8ca
Author: Cathrine Paulsen <c.r.paulsen@student.tudelft.nl>
Date:   Tue,  5 Apr 2022 07:41:24 +0000

Add environment as a new filter to _cascade.target

Fixes #9612
Diffstat:
Mdocs/content/en/content-management/front-matter.md | 3+++
Mhugolib/cascade_test.go | 26++++++++++++++++++++++++++
Mresources/page/page_matcher.go | 10++++++++++
Mresources/page/page_matcher_test.go | 18+++++++++++++++++-
Mresources/page/testhelpers_test.go | 3++-
5 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/docs/content/en/content-management/front-matter.md b/docs/content/en/content-management/front-matter.md
@@ -189,6 +189,9 @@ kind
 lang
 : A Glob pattern matching the Page's language, e.g. "{en,sv}".
 
+environment
+: A Glob pattern matching the build environment, e.g. "{production,development}"
+
 Any of the above can be omitted. 
 
 ### Example
diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go
@@ -550,6 +550,32 @@ S1|p1:|p2:p2|
 `)
 	})
 
+	c.Run("slice with environment _target", func(c *qt.C) {
+		b := newBuilder(c)
+
+		b.WithContent("_index.md", `+++
+title = "Home"
+[[cascade]]
+p1 = "p1"
+[cascade._target]
+path="**p1**"
+environment="testing"
+[[cascade]]
+p2 = "p2"
+[cascade._target]
+kind="section"
+environment="production"
++++
+`)
+
+		b.Build(BuildCfg{})
+
+		b.AssertFileContent("public/index.html", `
+P1|p1:|p2:|
+S1|p1:|p2:p2|
+`)
+	})
+
 	c.Run("slice with yaml _target", func(c *qt.C) {
 		b := newBuilder(c)
 
diff --git a/resources/page/page_matcher.go b/resources/page/page_matcher.go
@@ -37,6 +37,9 @@ type PageMatcher struct {
 
 	// A Glob pattern matching the Page's language, e.g. "{en,sv}".
 	Lang string
+
+	// A Glob pattern matching the Page's Environment, e.g. "{production,development}".
+	Environment string
 }
 
 // Matches returns whether p matches this matcher.
@@ -67,6 +70,13 @@ func (m PageMatcher) Matches(p Page) bool {
 		}
 	}
 
+	if m.Environment != "" {
+		g, err := glob.GetGlob(m.Environment)
+		if err == nil && !g.Match(p.Site().Hugo().Environment) {
+			return false
+		}
+	}
+
 	return true
 }
 
diff --git a/resources/page/page_matcher_test.go b/resources/page/page_matcher_test.go
@@ -14,6 +14,7 @@
 package page
 
 import (
+	"github.com/gohugoio/hugo/common/hugo"
 	"path/filepath"
 	"testing"
 
@@ -22,8 +23,13 @@ import (
 
 func TestPageMatcher(t *testing.T) {
 	c := qt.New(t)
+	developmentTestSite := testSite{h: hugo.NewInfo("development", nil)}
+	productionTestSite := testSite{h: hugo.NewInfo("production", nil)}
 
-	p1, p2, p3 := &testPage{path: "/p1", kind: "section", lang: "en"}, &testPage{path: "p2", kind: "page", lang: "no"}, &testPage{path: "p3", kind: "page", lang: "en"}
+	p1, p2, p3 :=
+		&testPage{path: "/p1", kind: "section", lang: "en", site: developmentTestSite},
+		&testPage{path: "p2", kind: "page", lang: "no", site: productionTestSite},
+		&testPage{path: "p3", kind: "page", lang: "en"}
 
 	c.Run("Matches", func(c *qt.C) {
 		m := PageMatcher{Kind: "section"}
@@ -50,6 +56,16 @@ func TestPageMatcher(t *testing.T) {
 		c.Assert(m.Matches(p1), qt.Equals, true)
 		c.Assert(m.Matches(p2), qt.Equals, false)
 		c.Assert(m.Matches(p3), qt.Equals, true)
+
+		m = PageMatcher{Environment: "development"}
+		c.Assert(m.Matches(p1), qt.Equals, true)
+		c.Assert(m.Matches(p2), qt.Equals, false)
+		c.Assert(m.Matches(p3), qt.Equals, false)
+
+		m = PageMatcher{Environment: "production"}
+		c.Assert(m.Matches(p1), qt.Equals, false)
+		c.Assert(m.Matches(p2), qt.Equals, true)
+		c.Assert(m.Matches(p3), qt.Equals, false)
 	})
 
 	c.Run("Decode", func(c *qt.C) {
diff --git a/resources/page/testhelpers_test.go b/resources/page/testhelpers_test.go
@@ -94,6 +94,7 @@ type testPage struct {
 	linkTitle   string
 	lang        string
 	section     string
+	site        testSite
 
 	content string
 
@@ -532,7 +533,7 @@ func (p *testPage) SectionsPath() string {
 }
 
 func (p *testPage) Site() Site {
-	panic("not implemented")
+	return p.site
 }
 
 func (p *testPage) Sites() Sites {