]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
common/collections: Fix append regression to allow appending nil
authorkhayyam <ksaleem@digitalocean.com>
Wed, 28 Jun 2023 07:41:36 +0000 (03:41 -0400)
committerGitHub <noreply@github.com>
Wed, 28 Jun 2023 07:41:36 +0000 (09:41 +0200)
Closes #11180

common/collections/append.go
common/collections/append_test.go
tpl/collections/integration_test.go

index 91abc46d348db66fcd591a7455aab55ea2cffb72..8f1e21ea31561cb5a67a4461578b849d83e7797c 100644 (file)
@@ -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())
                }
index 415eb2f257e77c1cf513e89744adf977b4d57044..3c2aab2db99b138989f76ac2f7bb95b7e438d7d9 100644 (file)
@@ -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...)
index da1d6e488a628f2e5f29a10a541d9156320f03b3..829aee355b4b569d15fad944676b5797a2a832a5 100644 (file)
@@ -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;]")
+
+       }
+
+}