From 34a86e13f63c1a527e45b5de95696c6937c2043e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 8 Mar 2023 09:28:46 +0100 Subject: [PATCH] Don't fail when calling Paginate with an empty pages.PagesGroup Fixes #10802 --- hugolib/paginator_test.go | 26 ++++++++++++++++++++++++++ resources/page/pagegroup.go | 14 +++++++------- resources/page/pagination.go | 4 ++-- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/hugolib/paginator_test.go b/hugolib/paginator_test.go index a8d8ac8df..fd2321413 100644 --- a/hugolib/paginator_test.go +++ b/hugolib/paginator_test.go @@ -136,3 +136,29 @@ weight: %d b.Assert(b.CheckExists("public/page/1/index.json"), qt.Equals, false) b.AssertFileContent("public/page/2/index.json", `JSON: 22: |/p11/index.json|/p12/index.json`) } + +// Issue 10802 +func TestPaginatorEmptyPageGroups(t *testing.T) { + t.Parallel() + + files := ` +-- config.toml -- +baseURL = "https://example.com/" +-- content/p1.md -- +-- content/p2.md -- +-- layouts/index.html -- +{{ $empty := site.RegularPages | complement site.RegularPages }} +Len: {{ len $empty }}: Type: {{ printf "%T" $empty }} +{{ $pgs := $empty.GroupByPublishDate "January 2006" }} +{{ $pag := .Paginate $pgs }} +Len Pag: {{ len $pag.Pages }} +` + b := NewIntegrationTestBuilder( + IntegrationTestConfig{ + T: t, + TxtarString: files, + }, + ).Build() + + b.AssertFileContent("public/index.html", "Len: 0", "Len Pag: 0") +} diff --git a/resources/page/pagegroup.go b/resources/page/pagegroup.go index 99f1af3ff..d091c6bef 100644 --- a/resources/page/pagegroup.go +++ b/resources/page/pagegroup.go @@ -430,14 +430,14 @@ func (psg PagesGroup) ProbablyEq(other any) bool { } // ToPagesGroup tries to convert seq into a PagesGroup. -func ToPagesGroup(seq any) (PagesGroup, error) { +func ToPagesGroup(seq any) (PagesGroup, bool, error) { switch v := seq.(type) { case nil: - return nil, nil + return nil, true, nil case PagesGroup: - return v, nil + return v, true, nil case []PageGroup: - return PagesGroup(v), nil + return PagesGroup(v), true, nil case []any: l := len(v) if l == 0 { @@ -450,12 +450,12 @@ func ToPagesGroup(seq any) (PagesGroup, error) { if pg, ok := ipg.(PageGroup); ok { pagesGroup[i] = pg } else { - return nil, fmt.Errorf("unsupported type in paginate from slice, got %T instead of PageGroup", ipg) + return nil, false, fmt.Errorf("unsupported type in paginate from slice, got %T instead of PageGroup", ipg) } } - return pagesGroup, nil + return pagesGroup, true, nil } } - return nil, nil + return nil, false, nil } diff --git a/resources/page/pagination.go b/resources/page/pagination.go index 46d9fda82..ddede792f 100644 --- a/resources/page/pagination.go +++ b/resources/page/pagination.go @@ -277,11 +277,11 @@ func Paginate(td TargetPathDescriptor, seq any, pagerSize int) (*Paginator, erro var paginator *Paginator - groups, err := ToPagesGroup(seq) + groups, ok, err := ToPagesGroup(seq) if err != nil { return nil, err } - if groups != nil { + if ok { paginator, _ = newPaginatorFromPageGroups(groups, pagerSize, urlFactory) } else { pages, err := ToPages(seq)