summaryrefslogtreecommitdiffstats
path: root/resources
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2019-03-25 18:18:34 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2019-03-26 10:20:40 +0100
commit4dae52af680e6ff2c8cdeb4ce1f219330b27001c (patch)
treedb157b09fc15b25a07512581fbd80536fe8e18ee /resources
parent794d4052b87c98943588b35e1cfecc06e6a0c7f2 (diff)
Avoid nilpointer on no File on Page
Fixes #5781
Diffstat (limited to 'resources')
-rw-r--r--resources/page/page_generate/generate_page_wrappers.go66
-rw-r--r--resources/page/pages_sort.go6
-rw-r--r--resources/page/zero_file.autogen.go88
3 files changed, 157 insertions, 3 deletions
diff --git a/resources/page/page_generate/generate_page_wrappers.go b/resources/page/page_generate/generate_page_wrappers.go
index 54e1f272e..739d7a00e 100644
--- a/resources/page/page_generate/generate_page_wrappers.go
+++ b/resources/page/page_generate/generate_page_wrappers.go
@@ -63,6 +63,10 @@ func Generate(c *codegen.Inspector) error {
return errors.Wrap(err, "failed to generate deprecate wrappers")
}
+ if err := generateFileIsZeroWrappers(c); err != nil {
+ return errors.Wrap(err, "failed to generate file wrappers")
+ }
+
return nil
}
@@ -199,6 +203,68 @@ type pageDeprecated struct {
return nil
}
+func generateFileIsZeroWrappers(c *codegen.Inspector) error {
+ filename := filepath.Join(c.ProjectRootDir, packageDir, "zero_file.autogen.go")
+ f, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ // Generate warnings for zero file access
+
+ warning := func(name string, tp reflect.Type) string {
+ msg := fmt.Sprintf(".File.%s on zero object. Wrap it in if or with: {{ with .File }}{{ .%s }}{{ end }}", name, name)
+
+ return fmt.Sprintf("z.log.Println(%q)", msg)
+ }
+
+ var buff bytes.Buffer
+
+ methods := c.MethodsFromTypes([]reflect.Type{reflect.TypeOf((*source.File)(nil)).Elem()}, nil)
+
+ for _, m := range methods {
+ if m.Name == "IsZero" {
+ continue
+ }
+ fmt.Fprint(&buff, m.DeclarationNamed("zeroFile"))
+ fmt.Fprintln(&buff, " {")
+ fmt.Fprintf(&buff, "\t%s\n", warning(m.Name, m.Owner))
+ if len(m.Out) > 0 {
+ fmt.Fprintln(&buff, "\treturn")
+ }
+ fmt.Fprintln(&buff, "}")
+
+ }
+
+ pkgImports := append(methods.Imports(), "github.com/gohugoio/hugo/helpers", "github.com/gohugoio/hugo/source")
+
+ fmt.Fprintf(f, `%s
+
+package page
+
+%s
+
+// ZeroFile represents a zero value of source.File with warnings if invoked.
+type zeroFile struct {
+ log *helpers.DistinctLogger
+}
+
+func NewZeroFile(log *helpers.DistinctLogger) source.File {
+ return zeroFile{log: log}
+}
+
+func (zeroFile) IsZero() bool {
+ return true
+}
+
+%s
+
+`, header, importsString(pkgImports), buff.String())
+
+ return nil
+}
+
func importsString(imps []string) string {
if len(imps) == 0 {
return ""
diff --git a/resources/page/pages_sort.go b/resources/page/pages_sort.go
index eb3a28247..7b2a34a6a 100644
--- a/resources/page/pages_sort.go
+++ b/resources/page/pages_sort.go
@@ -51,8 +51,8 @@ var DefaultPageSort = func(p1, p2 Page) bool {
if p1.Weight() == p2.Weight() {
if p1.Date().Unix() == p2.Date().Unix() {
if p1.LinkTitle() == p2.LinkTitle() {
- if p1.File() == nil || p2.File() == nil {
- return p1.File() == nil
+ if p1.File().IsZero() || p2.File().IsZero() {
+ return p1.File().IsZero()
}
return p1.File().Filename() < p2.File().Filename()
}
@@ -77,7 +77,7 @@ var languagePageSort = func(p1, p2 Page) bool {
if p1.Language().Weight == p2.Language().Weight {
if p1.Date().Unix() == p2.Date().Unix() {
if p1.LinkTitle() == p2.LinkTitle() {
- if p1.File() != nil && p2.File() != nil {
+ if !p1.File().IsZero() && !p2.File().IsZero() {
return p1.File().Filename() < p2.File().Filename()
}
}
diff --git a/resources/page/zero_file.autogen.go b/resources/page/zero_file.autogen.go
new file mode 100644
index 000000000..eec1dd66d
--- /dev/null
+++ b/resources/page/zero_file.autogen.go
@@ -0,0 +1,88 @@
+// Copyright 2019 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This file is autogenerated.
+
+package page
+
+import (
+ "github.com/gohugoio/hugo/helpers"
+ "github.com/gohugoio/hugo/source"
+ "os"
+)
+
+// ZeroFile represents a zero value of source.File with warnings if invoked.
+type zeroFile struct {
+ log *helpers.DistinctLogger
+}
+
+func NewZeroFile(log *helpers.DistinctLogger) source.File {
+ return zeroFile{log: log}
+}
+
+func (zeroFile) IsZero() bool {
+ return true
+}
+
+func (z zeroFile) Path() (o0 string) {
+ z.log.Println(".File.Path on zero object. Wrap it in if or with: {{ with .File }}{{ .Path }}{{ end }}")
+ return
+}
+func (z zeroFile) Section() (o0 string) {
+ z.log.Println(".File.Section on zero object. Wrap it in if or with: {{ with .File }}{{ .Section }}{{ end }}")
+ return
+}
+func (z zeroFile) Lang() (o0 string) {
+ z.log.Println(".File.Lang on zero object. Wrap it in if or with: {{ with .File }}{{ .Lang }}{{ end }}")
+ return
+}
+func (z zeroFile) Filename() (o0 string) {
+ z.log.Println(".File.Filename on zero object. Wrap it in if or with: {{ with .File }}{{ .Filename }}{{ end }}")
+ return
+}
+func (z zeroFile) Dir() (o0 string) {
+ z.log.Println(".File.Dir on zero object. Wrap it in if or with: {{ with .File }}{{ .Dir }}{{ end }}")
+ return
+}
+func (z zeroFile) Extension() (o0 string) {
+ z.log.Println(".File.Extension on zero object. Wrap it in if or with: {{ with .File }}{{ .Extension }}{{ end }}")
+ return
+}
+func (z zeroFile) Ext() (o0 string) {
+ z.log.Println(".File.Ext on zero object. Wrap it in if or with: {{ with .File }}{{ .Ext }}{{ end }}")
+ return
+}
+func (z zeroFile) LogicalName() (o0 string) {
+ z.log.Println(".File.LogicalName on zero object. Wrap it in if or with: {{ with .File }}{{ .LogicalName }}{{ end }}")
+ return
+}
+func (z zeroFile) BaseFileName() (o0 string) {
+ z.log.Println(".File.BaseFileName on zero object. Wrap it in if or with: {{ with .File }}{{ .BaseFileName }}{{ end }}")
+ return
+}
+func (z zeroFile) TranslationBaseName() (o0 string) {
+ z.log.Println(".File.TranslationBaseName on zero object. Wrap it in if or with: {{ with .File }}{{ .TranslationBaseName }}{{ end }}")
+ return
+}
+func (z zeroFile) ContentBaseName() (o0 string) {
+ z.log.Println(".File.ContentBaseName on zero object. Wrap it in if or with: {{ with .File }}{{ .ContentBaseName }}{{ end }}")
+ return
+}
+func (z zeroFile) UniqueID() (o0 string) {
+ z.log.Println(".File.UniqueID on zero object. Wrap it in if or with: {{ with .File }}{{ .UniqueID }}{{ end }}")
+ return
+}
+func (z zeroFile) FileInfo() (o0 os.FileInfo) {
+ z.log.Println(".File.FileInfo on zero object. Wrap it in if or with: {{ with .File }}{{ .FileInfo }}{{ end }}")
+ return
+}