hugo

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

git clone git://git.shimmy1996.com/hugo.git
commit dbbc5c4810a04ac06fad7500d88cf5c3bfe0c7fd
parent 7bcc1ce659710f2220b400ce3b76e50d2e48b241
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Sat,  8 Jul 2017 10:31:09 +0200

tpl/collections: Fix union when the first slice is empty

Fixes #3686

Diffstat:
Mtpl/collections/collections.go | 9+++++++++
Mtpl/collections/collections_test.go | 7+++++++
2 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/tpl/collections/collections.go b/tpl/collections/collections.go
@@ -494,6 +494,7 @@ type intersector struct {
 }
 
 func (i *intersector) appendIfNotSeen(v reflect.Value) {
+
 	vi := v.Interface()
 	if !i.seen[vi] {
 		i.r = reflect.Append(i.r, v)
@@ -565,6 +566,14 @@ func (ns *Namespace) Union(l1, l2 interface{}) (interface{}, error) {
 				}
 			}
 
+			if !l1vv.IsValid() {
+				// The first slice may be empty. Pick the first value of the second
+				// to use as a prototype.
+				if l2v.Len() > 0 {
+					l1vv = l2v.Index(0)
+				}
+			}
+
 			for j := 0; j < l2v.Len(); j++ {
 				l2vv := l2v.Index(j)
 
diff --git a/tpl/collections/collections_test.go b/tpl/collections/collections_test.go
@@ -666,6 +666,13 @@ func TestUnion(t *testing.T) {
 		{pagesVals{p1v}, pagesVals{p3v, p3v}, pagesVals{p1v, p3v}, false},
 		{[]interface{}{p1, p4}, []interface{}{p4, p2, p2}, []interface{}{p1, p4, p2}, false},
 		{[]interface{}{p1v}, []interface{}{p3v, p3v}, []interface{}{p1v, p3v}, false},
+		// #3686
+		{[]interface{}{p1v}, []interface{}{}, []interface{}{p1v}, false},
+		{[]interface{}{}, []interface{}{p1v}, []interface{}{p1v}, false},
+		{pagesPtr{p1}, pagesPtr{}, pagesPtr{p1}, false},
+		{pagesVals{p1v}, pagesVals{}, pagesVals{p1v}, false},
+		{pagesPtr{}, pagesPtr{p1}, pagesPtr{p1}, false},
+		{pagesVals{}, pagesVals{p1v}, pagesVals{p1v}, false},
 
 		// errors
 		{"not array or slice", []string{"a"}, false, true},