hugo

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

git clone git://git.shimmy1996.com/hugo.git
commit cad2d8cc70f25ca5e5107dd963c95b7b7c6840d1
parent b80853de90b10171155b8f3fde47d64ec7bfa0dd
Author: Joe Mooring <joe.mooring@veriphor.com>
Date:   Sun, 20 Mar 2022 10:55:02 -0700

resources/images: Require width and height for Crop, Fill, and Fit

Closes #9696

Diffstat:
Mresources/images/config.go | 13+++++++++++--
Mresources/images/config_test.go | 32++++++++++++++++++++------------
2 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/resources/images/config.go b/resources/images/config.go
@@ -253,8 +253,17 @@ func DecodeImageConfig(action, config string, defaults ImagingConfig, sourceForm
 		}
 	}
 
-	if c.Width == 0 && c.Height == 0 {
-		return c, errors.New("must provide Width or Height")
+	switch c.Action {
+	case "crop", "fill", "fit":
+		if c.Width == 0 || c.Height == 0 {
+			return c, errors.New("must provide Width and Height")
+		}
+	case "resize":
+		if c.Width == 0 && c.Height == 0 {
+			return c, errors.New("must provide Width or Height")
+		}
+	default:
+		return c, errors.Errorf("BUG: unknown action %q encountered while decoding image configuration", c.Action)
 	}
 
 	if c.FilterStr == "" {
diff --git a/resources/images/config_test.go b/resources/images/config_test.go
@@ -80,25 +80,33 @@ func TestDecodeConfig(t *testing.T) {
 
 func TestDecodeImageConfig(t *testing.T) {
 	for i, this := range []struct {
+		action string
 		in     string
 		expect any
 	}{
-		{"300x400", newImageConfig(300, 400, 75, 0, "box", "smart", "")},
-		{"300x400 #fff", newImageConfig(300, 400, 75, 0, "box", "smart", "fff")},
-		{"100x200 bottomRight", newImageConfig(100, 200, 75, 0, "box", "BottomRight", "")},
-		{"10x20 topleft Lanczos", newImageConfig(10, 20, 75, 0, "Lanczos", "topleft", "")},
-		{"linear left 10x r180", newImageConfig(10, 0, 75, 180, "linear", "left", "")},
-		{"x20 riGht Cosine q95", newImageConfig(0, 20, 95, 0, "cosine", "right", "")},
-
-		{"", false},
-		{"foo", false},
+		{"resize", "300x400", newImageConfig("resize", 300, 400, 75, 0, "box", "smart", "")},
+		{"resize", "300x400 #fff", newImageConfig("resize", 300, 400, 75, 0, "box", "smart", "fff")},
+		{"resize", "100x200 bottomRight", newImageConfig("resize", 100, 200, 75, 0, "box", "BottomRight", "")},
+		{"resize", "10x20 topleft Lanczos", newImageConfig("resize", 10, 20, 75, 0, "Lanczos", "topleft", "")},
+		{"resize", "linear left 10x r180", newImageConfig("resize", 10, 0, 75, 180, "linear", "left", "")},
+		{"resize", "x20 riGht Cosine q95", newImageConfig("resize", 0, 20, 95, 0, "cosine", "right", "")},
+		{"crop", "300x400", newImageConfig("crop", 300, 400, 75, 0, "box", "smart", "")},
+		{"fill", "300x400", newImageConfig("fill", 300, 400, 75, 0, "box", "smart", "")},
+		{"fit", "300x400", newImageConfig("fit", 300, 400, 75, 0, "box", "smart", "")},
+
+		{"resize", "", false},
+		{"resize", "foo", false},
+		{"crop", "100x", false},
+		{"fill", "100x", false},
+		{"fit", "100x", false},
+		{"foo", "100x", false},
 	} {
 
 		cfg, err := DecodeConfig(nil)
 		if err != nil {
 			t.Fatal(err)
 		}
-		result, err := DecodeImageConfig("resize", this.in, cfg, PNG)
+		result, err := DecodeImageConfig(this.action, this.in, cfg, PNG)
 		if b, ok := this.expect.(bool); ok && !b {
 			if err == nil {
 				t.Errorf("[%d] parseImageConfig didn't return an expected error", i)
@@ -114,8 +122,8 @@ func TestDecodeImageConfig(t *testing.T) {
 	}
 }
 
-func newImageConfig(width, height, quality, rotate int, filter, anchor, bgColor string) ImageConfig {
-	var c ImageConfig = GetDefaultImageConfig("resize", ImagingConfig{})
+func newImageConfig(action string, width, height, quality, rotate int, filter, anchor, bgColor string) ImageConfig {
+	var c ImageConfig = GetDefaultImageConfig(action, ImagingConfig{})
 	c.TargetFormat = PNG
 	c.Hint = 2
 	c.Width = width