tpl/compare: Fix nil compare in eq/ne for interface values

Fixes #5905
This commit is contained in:
Bjørn Erik Pedersen 2019-04-29 10:48:36 +02:00
parent 4f93f8c670
commit 66b143a01d
2 changed files with 28 additions and 2 deletions

View file

@ -20,6 +20,8 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/gohugoio/hugo/common/types"
"github.com/gohugoio/hugo/compare" "github.com/gohugoio/hugo/compare"
) )
@ -88,7 +90,6 @@ func (*Namespace) Default(dflt interface{}, given ...interface{}) (interface{},
// Eq returns the boolean truth of arg1 == arg2. // Eq returns the boolean truth of arg1 == arg2.
func (*Namespace) Eq(x, y interface{}) bool { func (*Namespace) Eq(x, y interface{}) bool {
if e, ok := x.(compare.Eqer); ok { if e, ok := x.(compare.Eqer); ok {
return e.Eq(y) return e.Eq(y)
} }
@ -98,6 +99,9 @@ func (*Namespace) Eq(x, y interface{}) bool {
} }
normalize := func(v interface{}) interface{} { normalize := func(v interface{}) interface{} {
if types.IsNil(v) {
return nil
}
vv := reflect.ValueOf(v) vv := reflect.ValueOf(v)
switch vv.Kind() { switch vv.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:

View file

@ -27,6 +27,23 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
type T struct {
NonEmptyInterfaceNil I
NonEmptyInterfaceTypedNil I
}
type I interface {
Foo() string
}
func (t *T) Foo() string {
return "foo"
}
var testT = &T{
NonEmptyInterfaceTypedNil: (*T)(nil),
}
type tstEqerType1 string type tstEqerType1 string
type tstEqerType2 string type tstEqerType2 string
@ -183,7 +200,12 @@ func doTestCompare(t *testing.T, tp tstCompareType, funcUnderTest func(a, b inte
{"0.37-DEV", hugo.MustParseVersion("0.37").Version(), -1}, {"0.37-DEV", hugo.MustParseVersion("0.37").Version(), -1},
{"0.36", hugo.MustParseVersion("0.37-DEV").Version(), -1}, {"0.36", hugo.MustParseVersion("0.37-DEV").Version(), -1},
{"0.37-DEV", hugo.MustParseVersion("0.37-DEV").Version(), 0}, {"0.37-DEV", hugo.MustParseVersion("0.37-DEV").Version(), 0},
// https://github.com/gohugoio/hugo/issues/5905
{nil, nil, 0},
{testT.NonEmptyInterfaceNil, nil, 0},
{testT.NonEmptyInterfaceTypedNil, nil, 0},
} { } {
result := funcUnderTest(test.left, test.right) result := funcUnderTest(test.left, test.right)
success := false success := false
@ -206,7 +228,7 @@ func doTestCompare(t *testing.T, tp tstCompareType, funcUnderTest func(a, b inte
} }
if !success { if !success {
t.Errorf("[%d][%s] %v compared to %v: %t", i, path.Base(runtime.FuncForPC(reflect.ValueOf(funcUnderTest).Pointer()).Name()), test.left, test.right, result) t.Fatalf("[%d][%s] %v compared to %v: %t", i, path.Base(runtime.FuncForPC(reflect.ValueOf(funcUnderTest).Pointer()).Name()), test.left, test.right, result)
} }
} }
} }