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
"github.com/gohugoio/hugo/common/herrors"
"github.com/gohugoio/hugo/common/maps"
+ "github.com/gohugoio/hugo/common/types"
"github.com/gohugoio/hugo/source"
func (p pageWithWeight0) page() page.Page {
return p.pageState
}
+
+var _ types.Unwrapper = (*pageWithWeight0)(nil)
+
+func (p pageWithWeight0) Unwrapv() any {
+ return p.pageState
+}
}
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
}
}
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:
"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|",
+ )
+}
"fmt"
"reflect"
+ "github.com/gohugoio/hugo/common/types"
"github.com/mitchellh/hashstructure"
)
return f
}
}
- return v.Interface()
+ return types.Unwrapv(v.Interface())
}
// collects identities from the slices in seqs into a set. Numeric values are normalized,