summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkhayyam <ksaleem@digitalocean.com>2023-06-28 03:41:36 -0400
committerGitHub <noreply@github.com>2023-06-28 09:41:36 +0200
commitb74b8d6478c7ad68c8f3fec6597b336f55ea0a94 (patch)
treeb395bbbd97a78ee55622d1feabd2f0cf5ee4f90f
parent793e38f5ce69c7eb3e70e377b21019f3eec912cb (diff)
common/collections: Fix append regression to allow appending nil
Closes #11180
-rw-r--r--common/collections/append.go10
-rw-r--r--common/collections/append_test.go3
-rw-r--r--tpl/collections/integration_test.go60
3 files changed, 72 insertions, 1 deletions
diff --git a/common/collections/append.go b/common/collections/append.go
index 91abc46d3..8f1e21ea3 100644
--- a/common/collections/append.go
+++ b/common/collections/append.go
@@ -66,6 +66,10 @@ func Append(to any, from ...any) (any, error) {
if len(from) == 1 {
fromv := reflect.ValueOf(from[0])
+ if !fromv.IsValid() {
+ // from[0] is nil
+ return appendToInterfaceSliceFromValues(tov, fromv)
+ }
fromt := fromv.Type()
if fromt.Kind() == reflect.Slice {
fromt = fromt.Elem()
@@ -94,7 +98,7 @@ func Append(to any, from ...any) (any, error) {
for _, f := range from {
fv := reflect.ValueOf(f)
- if !fv.Type().AssignableTo(tot) {
+ if !fv.IsValid() || !fv.Type().AssignableTo(tot) {
// Fall back to a []interface{} slice.
tov, _ := indirect(reflect.ValueOf(to))
return appendToInterfaceSlice(tov, from...)
@@ -109,6 +113,10 @@ func appendToInterfaceSliceFromValues(slice1, slice2 reflect.Value) ([]any, erro
var tos []any
for _, slice := range []reflect.Value{slice1, slice2} {
+ if !slice.IsValid() {
+ tos = append(tos, nil)
+ continue
+ }
for i := 0; i < slice.Len(); i++ {
tos = append(tos, slice.Index(i).Interface())
}
diff --git a/common/collections/append_test.go b/common/collections/append_test.go
index 415eb2f25..3c2aab2db 100644
--- a/common/collections/append_test.go
+++ b/common/collections/append_test.go
@@ -74,6 +74,9 @@ func TestAppend(t *testing.T) {
[]any{"c"},
false,
},
+ {[]string{"a", "b"}, []any{nil}, []any{"a", "b", nil}},
+ {[]string{"a", "b"}, []any{nil, "d", nil}, []any{"a", "b", nil, "d", nil}},
+ {[]any{"a", nil, "c"}, []any{"d", nil, "f"}, []any{"a", nil, "c", "d", nil, "f"}},
} {
result, err := Append(test.start, test.addend...)
diff --git a/tpl/collections/integration_test.go b/tpl/collections/integration_test.go
index da1d6e488..829aee355 100644
--- a/tpl/collections/integration_test.go
+++ b/tpl/collections/integration_test.go
@@ -104,3 +104,63 @@ func TestAppendSliceToASliceOfSlices(t *testing.T) {
}
}
+
+func TestAppendNilToSlice(t *testing.T) {
+
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+-- layouts/index.html --
+{{ $obj := (slice "a") }}
+{{ $obj = $obj | append nil }}
+
+{{ $obj }}
+
+
+ `
+
+ for i := 0; i < 4; i++ {
+
+ b := hugolib.NewIntegrationTestBuilder(
+ hugolib.IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).Build()
+
+ b.AssertFileContent("public/index.html", "[a &lt;nil&gt;]")
+
+ }
+
+}
+
+func TestAppendNilsToSliceWithNils(t *testing.T) {
+
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+-- layouts/index.html --
+{{ $obj := (slice "a" nil "c") }}
+{{ $obj = $obj | append nil }}
+
+{{ $obj }}
+
+
+ `
+
+ for i := 0; i < 4; i++ {
+
+ b := hugolib.NewIntegrationTestBuilder(
+ hugolib.IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ },
+ ).Build()
+
+ b.AssertFileContent("public/index.html", "[a &lt;nil&gt; c &lt;nil&gt;]")
+
+ }
+
+}