]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Fix intersect and similar for term entry page collections
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 15 Mar 2024 12:12:25 +0000 (13:12 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 15 Mar 2024 15:45:53 +0000 (16:45 +0100)
Fixes #12254

common/types/types.go
hugolib/page.go
tpl/collections/collections.go
tpl/collections/collections_integration_test.go
tpl/collections/reflect_helpers.go

index 801c511a0fd237b2224a18521727a41b0a6f4abd..e3850ddac8875583dc305b93ed9cc0cedfc6b816 100644 (file)
@@ -99,6 +99,14 @@ type Unwrapper interface {
        Unwrapv() any
 }
 
+// Unwrap returns the underlying value of v if it implements Unwrapper, otherwise v is returned.
+func Unwrapv(v any) any {
+       if u, ok := v.(Unwrapper); ok {
+               return u.Unwrapv()
+       }
+       return v
+}
+
 // LowHigh is typically used to represent a slice boundary.
 type LowHigh struct {
        Low  int
index c743d42823d1c00b7b846f4077f2bf99f52b702f..0622a15fe5ecd9205ae3b260554c80e3d121cac0 100644 (file)
@@ -36,6 +36,7 @@ import (
 
        "github.com/gohugoio/hugo/common/herrors"
        "github.com/gohugoio/hugo/common/maps"
+       "github.com/gohugoio/hugo/common/types"
 
        "github.com/gohugoio/hugo/source"
 
@@ -731,3 +732,9 @@ func (p pageWithWeight0) Weight0() int {
 func (p pageWithWeight0) page() page.Page {
        return p.pageState
 }
+
+var _ types.Unwrapper = (*pageWithWeight0)(nil)
+
+func (p pageWithWeight0) Unwrapv() any {
+       return p.pageState
+}
index 2107cf5a0eb58f00abeec0c8d670cc702df177e5..edec536ef407ebbc408a703dc36c3028cb1786c2 100644 (file)
@@ -617,10 +617,10 @@ type intersector struct {
 }
 
 func (i *intersector) appendIfNotSeen(v reflect.Value) {
-       vi := v.Interface()
-       if !i.seen[vi] {
+       k := normalize(v)
+       if !i.seen[k] {
                i.r = reflect.Append(i.r, v)
-               i.seen[vi] = true
+               i.seen[k] = true
        }
 }
 
@@ -638,7 +638,7 @@ func (i *intersector) handleValuePair(l1vv, l2vv reflect.Value) {
                        i.appendIfNotSeen(l1vv)
                }
        case kind == reflect.Ptr, kind == reflect.Struct:
-               if l1vv.Interface() == l2vv.Interface() {
+               if types.Unwrapv(l1vv.Interface()) == types.Unwrapv(l2vv.Interface()) {
                        i.appendIfNotSeen(l1vv)
                }
        case kind == reflect.Interface:
index 1bcabb447ab9a388e79b5eadc5905ec6b589d991..3bcd4effbd0beb94507074c42f7fb6a59bd0e9a8 100644 (file)
@@ -230,3 +230,51 @@ boolf = false
                "false",
        )
 }
+
+func TestTermEntriesCollectionsIssue12254(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- hugo.toml --
+capitalizeListTitles = false
+disableKinds = ['rss','sitemap']
+-- content/p1.md --
+---
+title: p1
+categories: [cat-a]
+tags: ['tag-b','tag-a','tag-c']
+---
+-- content/p2.md --
+---
+title: p2
+categories: [cat-a]
+tags: ['tag-b','tag-a']
+---
+-- content/p3.md --
+---
+title: p3
+categories: [cat-a]
+tags: ['tag-b']
+---
+-- layouts/_default/term.html --
+{{ $list1 := .Pages }}
+{{ range $i, $e := site.Taxonomies.tags.ByCount }}
+{{ $list2 := .Pages }}
+{{ $i }}: List1: {{ len $list1 }}|
+{{ $i }}: List2: {{ len $list2 }}|
+{{ $i }}: Intersect: {{ intersect $.Pages .Pages | len }}|
+{{ $i }}: Union: {{ union $.Pages .Pages | len }}|
+{{ $i }}: SymDiff: {{ symdiff $.Pages .Pages | len }}|
+{{ $i }}: Uniq: {{ append $.Pages .Pages | uniq | len }}|
+{{ end }}
+
+
+`
+       b := hugolib.Test(t, files)
+
+       b.AssertFileContent("public/categories/cat-a/index.html",
+               "0: List1: 3|\n0: List2: 3|\n0: Intersect: 3|\n0: Union: 3|\n0: SymDiff: 0|\n0: Uniq: 3|\n\n\n1: List1: 3|",
+               "1: List2: 2|\n1: Intersect: 2|\n1: Union: 3|\n1: SymDiff: 1|\n1: Uniq: 3|\n\n\n2: List1: 3|\n2: List2: 1|",
+               "2: Intersect: 1|\n2: Union: 3|\n2: SymDiff: 2|\n2: Uniq: 3|",
+       )
+}
index 56909d30e208ed5898131c3c7441b8eb1e5639b9..4687acdde573687cef741f7577d2f7135c8bb9c8 100644 (file)
@@ -18,6 +18,7 @@ import (
        "fmt"
        "reflect"
 
+       "github.com/gohugoio/hugo/common/types"
        "github.com/mitchellh/hashstructure"
 )
 
@@ -60,7 +61,7 @@ func normalize(v reflect.Value) any {
                        return f
                }
        }
-       return v.Interface()
+       return types.Unwrapv(v.Interface())
 }
 
 // collects identities from the slices in seqs into a set. Numeric values are normalized,