Repository: gohugoio/hugo (language: go)

Issue:
Improve error message when attempting to paginate from a single page template
Paginating from a single page template is not supported. 

In v0.54.0 and earlier the associated error message was:

> error calling Paginate: Paginators not supported for pages of type "page".

In v0.54.1 and later the associated error message is: 

> runtime error: invalid memory address or nil pointer dereference

Obviously the prior error message was a bit more useful.


Discussion / hints:

Fix patch:
diff --git a/hugolib/page__output.go b/hugolib/page__output.go
index 6fae10740e9..02956e87c68 100644
--- a/hugolib/page__output.go
+++ b/hugolib/page__output.go
@@ -14,6 +14,8 @@
 package hugolib
 
 import (
+	"fmt"
+
 	"github.com/gohugoio/hugo/identity"
 	"github.com/gohugoio/hugo/output"
 	"github.com/gohugoio/hugo/resources/page"
@@ -37,12 +39,16 @@ func newPageOutput(
 	targetPathsProvider = ft
 	linksProvider = ft
 
-	var paginatorProvider page.PaginatorProvider = page.NopPage
+	var paginatorProvider page.PaginatorProvider
 	var pag *pagePaginator
 
 	if render && ps.IsNode() {
 		pag = newPagePaginator(ps)
 		paginatorProvider = pag
+	} else {
+		paginatorProvider = page.PaginatorNotSupportedFunc(func() error {
+			return fmt.Errorf("pagination not supported for pages of kind %q", ps.Kind())
+		})
 	}
 
 	var dependencyManager identity.Manager = identity.NopManager
diff --git a/resources/page/pagination.go b/resources/page/pagination.go
index 9113b606220..4beb96e5094 100644
--- a/resources/page/pagination.go
+++ b/resources/page/pagination.go
@@ -32,6 +32,18 @@ type PaginatorProvider interface {
 	Paginate(pages any, options ...any) (*Pager, error)
 }
 
+var _ PaginatorProvider = (*PaginatorNotSupportedFunc)(nil)
+
+type PaginatorNotSupportedFunc func() error
+
+func (f PaginatorNotSupportedFunc) Paginate(pages any, options ...any) (*Pager, error) {
+	return nil, f()
+}
+
+func (f PaginatorNotSupportedFunc) Paginator(options ...any) (*Pager, error) {
+	return nil, f()
+}
+
 // Pager represents one of the elements in a paginator.
 // The number, starting on 1, represents its place.
 type Pager struct {


Test patch:
diff --git a/hugolib/paginator_test.go b/hugolib/paginator_test.go
index 98b67bca513..919f532cac8 100644
--- a/hugolib/paginator_test.go
+++ b/hugolib/paginator_test.go
@@ -157,3 +157,16 @@ Len Pag: {{ len $pag.Pages }}
 
 	b.AssertFileContent("public/index.html", "Len: 0", "Len Pag: 0")
 }
+
+func TestPaginatorNodePagesOnly(t *testing.T) {
+	files := `
+-- hugo.toml --
+paginate = 1
+-- content/p1.md --
+-- layouts/_default/single.html --
+Paginator: {{ .Paginator }}	
+`
+	b, err := TestE(t, files)
+	b.Assert(err, qt.IsNotNil)
+	b.Assert(err.Error(), qt.Contains, `error calling Paginator: pagination not supported for pages of kind "page"`)
+}