From 9b5f786df8fde5e5bd6311f210b95c85ff21eeea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 10 Feb 2025 18:50:56 +0100 Subject: [PATCH] Deprecate kind, lang, and path from front matter These were added to the page meta object when we implemented "pages from data", but were not meant to be used in front matter. That is not supported, so we might as well add validation. Fixes #12484 --- commands/commandeer.go | 2 +- common/hugo/hugo.go | 9 ++++++++ common/loggers/loggerglobal.go | 12 ++++++++-- config/allconfig/load.go | 2 +- config/privacy/privacyConfig_test.go | 8 ++----- hugolib/page__meta.go | 7 ++++++ hugolib/page_test.go | 26 ++++++++++++++++++++++ hugolib/testhelpers_test.go | 2 -- tpl/tplimpl/shortcodes_integration_test.go | 2 +- 9 files changed, 57 insertions(+), 13 deletions(-) diff --git a/commands/commandeer.go b/commands/commandeer.go index c53235cef..697ece1f0 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -448,7 +448,7 @@ func (r *rootCommand) PreRun(cd, runner *simplecobra.Commandeer) error { return err } // Set up the global logger early to allow info deprecations during config load. - loggers.InitGlobalLogger(r.logger.Level(), false) + loggers.SetGlobalLogger(r.logger) r.changesFromBuild = make(chan []identity.Identity, 10) diff --git a/common/hugo/hugo.go b/common/hugo/hugo.go index 8b32432db..815c25fa7 100644 --- a/common/hugo/hugo.go +++ b/common/hugo/hugo.go @@ -414,6 +414,15 @@ func Deprecate(item, alternative string, version string) { DeprecateLevel(item, alternative, version, level) } +// DeprecateLevelMin informs about a deprecation starting at the given version, but with a minimum log level. +func DeprecateLevelMin(item, alternative string, version string, minLevel logg.Level) { + level := deprecationLogLevelFromVersion(version) + if level < minLevel { + level = minLevel + } + DeprecateLevel(item, alternative, version, level) +} + // DeprecateLevel informs about a deprecation logging at the given level. func DeprecateLevel(item, alternative, version string, level logg.Level) { var msg string diff --git a/common/loggers/loggerglobal.go b/common/loggers/loggerglobal.go index c3e2970d0..b8c9a6931 100644 --- a/common/loggers/loggerglobal.go +++ b/common/loggers/loggerglobal.go @@ -21,7 +21,15 @@ import ( "github.com/bep/logg" ) -func InitGlobalLogger(level logg.Level, panicOnWarnings bool) { +// SetGlobalLogger sets the global logger. +// This is used in a few places in Hugo, e.g. deprecated functions. +func SetGlobalLogger(logger Logger) { + logMu.Lock() + defer logMu.Unlock() + log = logger +} + +func initGlobalLogger(level logg.Level, panicOnWarnings bool) { logMu.Lock() defer logMu.Unlock() var logHookLast func(e *logg.Entry) error @@ -50,5 +58,5 @@ func Log() Logger { var log Logger func init() { - InitGlobalLogger(logg.LevelWarn, false) + initGlobalLogger(logg.LevelWarn, false) } diff --git a/config/allconfig/load.go b/config/allconfig/load.go index 999e03645..9e9c7a42a 100644 --- a/config/allconfig/load.go +++ b/config/allconfig/load.go @@ -91,7 +91,7 @@ func LoadConfig(d ConfigSourceDescriptor) (*Configs, error) { return nil, fmt.Errorf("failed to init config: %w", err) } - loggers.InitGlobalLogger(d.Logger.Level(), configs.Base.PanicOnWarning) + loggers.SetGlobalLogger(d.Logger) return configs, nil } diff --git a/config/privacy/privacyConfig_test.go b/config/privacy/privacyConfig_test.go index 6cde91165..1dd20215b 100644 --- a/config/privacy/privacyConfig_test.go +++ b/config/privacy/privacyConfig_test.go @@ -36,10 +36,6 @@ respectDoNotTrack = true [privacy.instagram] disable = true simple = true -[privacy.twitter] -disable = true -enableDNT = true -simple = true [privacy.x] disable = true enableDNT = true @@ -63,8 +59,8 @@ simple = true got := []bool{ pc.Disqus.Disable, pc.GoogleAnalytics.Disable, pc.GoogleAnalytics.RespectDoNotTrack, pc.Instagram.Disable, - pc.Instagram.Simple, pc.Twitter.Disable, pc.Twitter.EnableDNT, - pc.Twitter.Simple, pc.Vimeo.Disable, pc.Vimeo.EnableDNT, pc.Vimeo.Simple, + pc.Instagram.Simple, + pc.Vimeo.Disable, pc.Vimeo.EnableDNT, pc.Vimeo.Simple, pc.YouTube.PrivacyEnhanced, pc.YouTube.Disable, pc.X.Disable, pc.X.EnableDNT, pc.X.Simple, } diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go index 38fe6db56..20ce1aa59 100644 --- a/hugolib/page__meta.go +++ b/hugolib/page__meta.go @@ -21,6 +21,7 @@ import ( "strings" "time" + "github.com/bep/logg" "github.com/gobuffalo/flect" "github.com/gohugoio/hugo/langs" "github.com/gohugoio/hugo/markup/converter" @@ -32,6 +33,7 @@ import ( "github.com/gohugoio/hugo/common/constants" "github.com/gohugoio/hugo/common/hashing" + "github.com/gohugoio/hugo/common/hugo" "github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/paths" @@ -486,6 +488,11 @@ params: continue } + if loki == "path" || loki == "kind" || loki == "lang" { + // See issue 12484. + hugo.DeprecateLevelMin(loki+" in front matter", "", "v0.144.0", logg.LevelWarn) + } + switch loki { case "title": pcfg.Title = cast.ToString(v) diff --git a/hugolib/page_test.go b/hugolib/page_test.go index 39a16d948..0fec397e0 100644 --- a/hugolib/page_test.go +++ b/hugolib/page_test.go @@ -1942,3 +1942,29 @@ Hugo: h-Home| `, ) } + +// See #12484 +func TestPageFrontMatterDeprecatePathKindLang(t *testing.T) { + // This cannot be parallel as it depends on output from the global logger. + + files := ` +-- hugo.toml -- +disableKinds = ["taxonomy", "term", "home", "section"] +-- content/p1.md -- +--- +title: "p1" +kind: "page" +lang: "en" +path: "mypath" +--- +-- layouts/_default/single.html -- +Title: {{ .Title }} +` + b := Test(t, files, TestOptWarn()) + b.AssertFileContent("public/mypath/index.html", "p1") + b.AssertLogContains( + "deprecated: kind in front matter was deprecated", + "deprecated: lang in front matter was deprecated", + "deprecated: path in front matter was deprecated", + ) +} diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go index 9fdb63238..2007b658d 100644 --- a/hugolib/testhelpers_test.go +++ b/hugolib/testhelpers_test.go @@ -260,8 +260,6 @@ disable = false respectDoNotTrack = true [privacy.instagram] simple = true -[privacy.twitter] -enableDNT = true [privacy.x] enableDNT = true [privacy.vimeo] diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go index 0578e2d8b..b8a4ad833 100644 --- a/tpl/tplimpl/shortcodes_integration_test.go +++ b/tpl/tplimpl/shortcodes_integration_test.go @@ -22,7 +22,7 @@ import ( ) func TestCommentShortcode(t *testing.T) { - t.Parallel() + // This cannot be parallel as it depends on output from the global logger. files := ` -- hugo.toml --