diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-03-25 18:18:34 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-03-26 10:20:40 +0100 |
commit | 4dae52af680e6ff2c8cdeb4ce1f219330b27001c (patch) | |
tree | db157b09fc15b25a07512581fbd80536fe8e18ee /resources | |
parent | 794d4052b87c98943588b35e1cfecc06e6a0c7f2 (diff) |
Avoid nilpointer on no File on Page
Fixes #5781
Diffstat (limited to 'resources')
-rw-r--r-- | resources/page/page_generate/generate_page_wrappers.go | 66 | ||||
-rw-r--r-- | resources/page/pages_sort.go | 6 | ||||
-rw-r--r-- | resources/page/zero_file.autogen.go | 88 |
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 +} |