mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-07 20:30:36 -05:00
common/collections: Fix append regression to allow appending nil
Closes #11180
This commit is contained in:
parent
793e38f5ce
commit
b74b8d6478
3 changed files with 72 additions and 1 deletions
|
@ -66,6 +66,10 @@ func Append(to any, from ...any) (any, error) {
|
||||||
|
|
||||||
if len(from) == 1 {
|
if len(from) == 1 {
|
||||||
fromv := reflect.ValueOf(from[0])
|
fromv := reflect.ValueOf(from[0])
|
||||||
|
if !fromv.IsValid() {
|
||||||
|
// from[0] is nil
|
||||||
|
return appendToInterfaceSliceFromValues(tov, fromv)
|
||||||
|
}
|
||||||
fromt := fromv.Type()
|
fromt := fromv.Type()
|
||||||
if fromt.Kind() == reflect.Slice {
|
if fromt.Kind() == reflect.Slice {
|
||||||
fromt = fromt.Elem()
|
fromt = fromt.Elem()
|
||||||
|
@ -94,7 +98,7 @@ func Append(to any, from ...any) (any, error) {
|
||||||
|
|
||||||
for _, f := range from {
|
for _, f := range from {
|
||||||
fv := reflect.ValueOf(f)
|
fv := reflect.ValueOf(f)
|
||||||
if !fv.Type().AssignableTo(tot) {
|
if !fv.IsValid() || !fv.Type().AssignableTo(tot) {
|
||||||
// Fall back to a []interface{} slice.
|
// Fall back to a []interface{} slice.
|
||||||
tov, _ := indirect(reflect.ValueOf(to))
|
tov, _ := indirect(reflect.ValueOf(to))
|
||||||
return appendToInterfaceSlice(tov, from...)
|
return appendToInterfaceSlice(tov, from...)
|
||||||
|
@ -109,6 +113,10 @@ func appendToInterfaceSliceFromValues(slice1, slice2 reflect.Value) ([]any, erro
|
||||||
var tos []any
|
var tos []any
|
||||||
|
|
||||||
for _, slice := range []reflect.Value{slice1, slice2} {
|
for _, slice := range []reflect.Value{slice1, slice2} {
|
||||||
|
if !slice.IsValid() {
|
||||||
|
tos = append(tos, nil)
|
||||||
|
continue
|
||||||
|
}
|
||||||
for i := 0; i < slice.Len(); i++ {
|
for i := 0; i < slice.Len(); i++ {
|
||||||
tos = append(tos, slice.Index(i).Interface())
|
tos = append(tos, slice.Index(i).Interface())
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,9 @@ func TestAppend(t *testing.T) {
|
||||||
[]any{"c"},
|
[]any{"c"},
|
||||||
false,
|
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...)
|
result, err := Append(test.start, test.addend...)
|
||||||
|
|
|
@ -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 <nil>]")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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 <nil> c <nil>]")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue