Repository: gohugoio/hugo (language: go)

Issue:
Don't fail when calling Paginate with an empty pages.PagesGroup
See https://discourse.gohugo.io/t/error-calling-paginate-cannot-convert-type-page-pagesgroup-to-pages/43310/3


Discussion / hints:

Fix patch:
diff --git a/resources/page/pagegroup.go b/resources/page/pagegroup.go
index 99f1af3ff7e..d091c6bef05 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 46d9fda82a9..ddede792fe5 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)


Test patch:
diff --git a/hugolib/paginator_test.go b/hugolib/paginator_test.go
index a8d8ac8dfb9..fd2321413fc 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")
+}