diff options
Diffstat (limited to 'hugolib/site.go')
-rw-r--r-- | hugolib/site.go | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/hugolib/site.go b/hugolib/site.go index e58dd39b2..761d4a6bd 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -956,7 +956,7 @@ func (s *Site) handleDataFile(r source.ReadableFile) error { higherPrecedentMap := higherPrecedentData.(map[string]interface{}) for key, value := range data.(map[string]interface{}) { if _, exists := higherPrecedentMap[key]; exists { - s.Log.WARN.Printf("Data for key '%s' in path '%s' is overridden higher precedence data already in the data tree", key, r.Path()) + s.Log.WARN.Printf("Data for key '%s' in path '%s' is overridden by higher precedence data already in the data tree", key, r.Path()) } else { higherPrecedentMap[key] = value } @@ -1759,24 +1759,49 @@ func (s *Site) renderAndWritePage(statCounter *uint64, name string, targetPath s return s.publisher.Publish(pd) } +var infoOnMissingLayout = map[string]bool{ + // The 404 layout is very much optional in Hugo, but we do look for it. + "404": true, +} + func (s *Site) renderForLayouts(name string, d interface{}, w io.Writer, layouts ...string) (err error) { var templ tpl.Template templ = s.findFirstTemplate(layouts...) if templ == nil { - s.Log.WARN.Printf("[%s] Unable to locate layout for %q: %s\n", s.Language.Lang, name, layouts) + log := s.Log.WARN + if infoOnMissingLayout[name] { + log = s.Log.INFO + } + + if p, ok := d.(*PageOutput); ok { + log.Printf("Found no layout for %q, language %q, output format %q: create a template below /layouts with one of these filenames: %s\n", name, s.Language.Lang, p.outputFormat.Name, layoutsLogFormat(layouts)) + } else { + log.Printf("Found no layout for %q, language %q: create a template below /layouts with one of these filenames: %s\n", name, s.Language.Lang, layoutsLogFormat(layouts)) + } return nil } if err = templ.Execute(w, d); err != nil { - if p, ok := d.(*PageOutput); ok { - return p.errorf(err, "render of %q failed", name) - } return _errors.Wrapf(err, "render of %q failed", name) } return } +func layoutsLogFormat(layouts []string) string { + var filtered []string + for _, l := range layouts { + // This is a technical prefix of no interest to the user. + lt := strings.TrimPrefix(l, "_text/") + // We have this in the lookup path for historical reasons. + lt = strings.TrimPrefix(lt, "page/") + filtered = append(filtered, lt) + } + + filtered = helpers.UniqueStrings(filtered) + return strings.Join(filtered, ", ") +} + func (s *Site) findFirstTemplate(layouts ...string) tpl.Template { for _, layout := range layouts { if templ, found := s.Tmpl.Lookup(layout); found { |