mirror of
https://github.com/gohugoio/hugo.git
synced 2026-08-25 15:58:53 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 35c841e4b3 | |||
| 4dcf38968f | |||
| b1d207700d |
@@ -441,11 +441,11 @@ func (r *rootCommand) createLogger(running bool) (loggers.Logger, error) {
|
||||
}
|
||||
|
||||
optsLogger := loggers.Options{
|
||||
Distinct: true,
|
||||
Level: level,
|
||||
Stdout: r.Out,
|
||||
Stderr: r.Out,
|
||||
StoreErrors: running,
|
||||
DistinctLevel: logg.LevelWarn,
|
||||
Level: level,
|
||||
Stdout: r.Out,
|
||||
Stderr: r.Out,
|
||||
StoreErrors: running,
|
||||
}
|
||||
|
||||
return loggers.New(optsLogger), nil
|
||||
|
||||
+1
-1
@@ -369,7 +369,7 @@ func DeprecateLevel(item, alternative, version string, level logg.Level) {
|
||||
msg = fmt.Sprintf("%s was deprecated in Hugo %s and will be removed in a future release. %s", item, version, alternative)
|
||||
}
|
||||
|
||||
loggers.Log().Logger().WithLevel(level).Logf(msg)
|
||||
loggers.Log().Logger().WithLevel(level).WithField(loggers.FieldNameCmd, "deprecated").Logf(msg)
|
||||
}
|
||||
|
||||
// We ususally do about one minor version a month.
|
||||
|
||||
@@ -40,7 +40,7 @@ type Options struct {
|
||||
Level logg.Level
|
||||
Stdout io.Writer
|
||||
Stderr io.Writer
|
||||
Distinct bool
|
||||
DistinctLevel logg.Level
|
||||
StoreErrors bool
|
||||
HandlerPost func(e *logg.Entry) error
|
||||
SuppressStatements map[string]bool
|
||||
@@ -92,8 +92,8 @@ func New(opts Options) Logger {
|
||||
logHandler = multi.New(handlers...)
|
||||
|
||||
var logOnce *logOnceHandler
|
||||
if opts.Distinct {
|
||||
logOnce = newLogOnceHandler(logg.LevelWarn)
|
||||
if opts.DistinctLevel != 0 {
|
||||
logOnce = newLogOnceHandler(opts.DistinctLevel)
|
||||
logHandler = newStopHandler(logOnce, logHandler)
|
||||
}
|
||||
|
||||
@@ -137,10 +137,10 @@ func New(opts Options) Logger {
|
||||
// NewDefault creates a new logger with the default options.
|
||||
func NewDefault() Logger {
|
||||
opts := Options{
|
||||
Distinct: true,
|
||||
Level: logg.LevelWarn,
|
||||
Stdout: os.Stdout,
|
||||
Stderr: os.Stdout,
|
||||
DistinctLevel: logg.LevelWarn,
|
||||
Level: logg.LevelWarn,
|
||||
Stdout: os.Stdout,
|
||||
Stderr: os.Stdout,
|
||||
}
|
||||
return New(opts)
|
||||
}
|
||||
|
||||
@@ -29,10 +29,10 @@ func TestLogDistinct(t *testing.T) {
|
||||
c := qt.New(t)
|
||||
|
||||
opts := loggers.Options{
|
||||
Distinct: true,
|
||||
StoreErrors: true,
|
||||
Stdout: io.Discard,
|
||||
Stderr: io.Discard,
|
||||
DistinctLevel: logg.LevelWarn,
|
||||
StoreErrors: true,
|
||||
Stdout: io.Discard,
|
||||
Stderr: io.Discard,
|
||||
}
|
||||
|
||||
l := loggers.New(opts)
|
||||
@@ -85,7 +85,6 @@ func TestOptionStoreErrors(t *testing.T) {
|
||||
|
||||
c.Assert(sb.String(), qt.Contains, "error 1")
|
||||
c.Assert(sb.String(), qt.Contains, "ERROR")
|
||||
|
||||
}
|
||||
|
||||
func TestLogCount(t *testing.T) {
|
||||
@@ -124,17 +123,16 @@ func TestSuppressStatements(t *testing.T) {
|
||||
c.Assert(errorsStr, qt.Not(qt.Contains), "error 1")
|
||||
c.Assert(errorsStr, qt.Contains, "error 2")
|
||||
c.Assert(l.LoggCount(logg.LevelError), qt.Equals, 1)
|
||||
|
||||
}
|
||||
|
||||
func TestReset(t *testing.T) {
|
||||
c := qt.New(t)
|
||||
|
||||
opts := loggers.Options{
|
||||
StoreErrors: true,
|
||||
Distinct: true,
|
||||
Stdout: io.Discard,
|
||||
Stderr: io.Discard,
|
||||
StoreErrors: true,
|
||||
DistinctLevel: logg.LevelWarn,
|
||||
Stdout: io.Discard,
|
||||
Stderr: io.Discard,
|
||||
}
|
||||
|
||||
l := loggers.New(opts)
|
||||
|
||||
@@ -31,9 +31,9 @@ func InitGlobalLogger(level logg.Level, panicOnWarnings bool) {
|
||||
|
||||
log = New(
|
||||
Options{
|
||||
Level: level,
|
||||
Distinct: true,
|
||||
HandlerPost: logHookLast,
|
||||
Level: level,
|
||||
DistinctLevel: logg.LevelInfo,
|
||||
HandlerPost: logHookLast,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -394,10 +394,10 @@ func (s *IntegrationTestBuilder) initBuilder() error {
|
||||
|
||||
logger := loggers.New(
|
||||
loggers.Options{
|
||||
Stdout: w,
|
||||
Stderr: w,
|
||||
Level: s.Cfg.LogLevel,
|
||||
Distinct: true,
|
||||
Stdout: w,
|
||||
Stderr: w,
|
||||
Level: s.Cfg.LogLevel,
|
||||
DistinctLevel: logg.LevelWarn,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
+1
-1
@@ -117,7 +117,7 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) {
|
||||
|
||||
logOpts := loggers.Options{
|
||||
Level: cfg.LogLevel,
|
||||
Distinct: true, // This will drop duplicate log warning and errors.
|
||||
DistinctLevel: logg.LevelWarn, // This will drop duplicate log warning and errors.
|
||||
HandlerPost: logHookLast,
|
||||
Stdout: cfg.LogOut,
|
||||
Stderr: cfg.LogOut,
|
||||
|
||||
@@ -339,8 +339,6 @@ type PageWithoutContent interface {
|
||||
// This is currently only triggered with the Related content feature
|
||||
// and the "fragments" type of index.
|
||||
HeadingsFiltered(context.Context) tableofcontents.Headings
|
||||
|
||||
DeprecatedWarningPageMethods
|
||||
}
|
||||
|
||||
// Positioner provides next/prev navigation.
|
||||
@@ -417,7 +415,6 @@ type TableOfContentsProvider interface {
|
||||
|
||||
// TranslationsProvider provides access to any translations.
|
||||
type TranslationsProvider interface {
|
||||
|
||||
// IsTranslated returns whether this content file is translated to
|
||||
// other language(s).
|
||||
IsTranslated() bool
|
||||
@@ -431,7 +428,6 @@ type TranslationsProvider interface {
|
||||
|
||||
// TreeProvider provides section tree navigation.
|
||||
type TreeProvider interface {
|
||||
|
||||
// IsAncestor returns whether the current page is an ancestor of other.
|
||||
// Note that this method is not relevant for taxonomy lists and taxonomy terms pages.
|
||||
IsAncestor(other any) (bool, error)
|
||||
@@ -469,15 +465,6 @@ type TreeProvider interface {
|
||||
Page() Page
|
||||
}
|
||||
|
||||
// DeprecatedWarningPageMethods lists deprecated Page methods that will trigger
|
||||
// a WARNING if invoked.
|
||||
// This was added in Hugo 0.55.
|
||||
type DeprecatedWarningPageMethods any // This was emptied in Hugo 0.93.0.
|
||||
|
||||
// Move here to trigger ERROR instead of WARNING.
|
||||
// TODO(bep) create wrappers and put into the Page once it has some methods.
|
||||
type DeprecatedErrorPageMethods any
|
||||
|
||||
// PageWithContext is a Page with a context.Context.
|
||||
type PageWithContext struct {
|
||||
Page
|
||||
|
||||
@@ -15,13 +15,12 @@ package page_generate
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
|
||||
"errors"
|
||||
|
||||
"github.com/gohugoio/hugo/common/maps"
|
||||
|
||||
"github.com/gohugoio/hugo/codegen"
|
||||
@@ -47,8 +46,7 @@ const header = `// Copyright 2019 The Hugo Authors. All rights reserved.
|
||||
`
|
||||
|
||||
var (
|
||||
pageInterfaceDeprecated = reflect.TypeOf((*page.DeprecatedWarningPageMethods)(nil)).Elem()
|
||||
pageInterface = reflect.TypeOf((*page.Page)(nil)).Elem()
|
||||
pageInterface = reflect.TypeOf((*page.Page)(nil)).Elem()
|
||||
|
||||
packageDir = filepath.FromSlash("resources/page")
|
||||
)
|
||||
@@ -58,10 +56,6 @@ func Generate(c *codegen.Inspector) error {
|
||||
return fmt.Errorf("failed to generate JSON marshaler: %w", err)
|
||||
}
|
||||
|
||||
if err := generateDeprecatedWrappers(c); err != nil {
|
||||
return fmt.Errorf("failed to generate deprecate wrappers: %w", err)
|
||||
}
|
||||
|
||||
if err := generateFileIsZeroWrappers(c); err != nil {
|
||||
return fmt.Errorf("failed to generate file wrappers: %w", err)
|
||||
}
|
||||
@@ -81,10 +75,6 @@ func generateMarshalJSON(c *codegen.Inspector) error {
|
||||
|
||||
// Exclude these methods
|
||||
excludes := []reflect.Type{
|
||||
// We need to evaluate the deprecated vs JSON in the future,
|
||||
// but leave them out for now.
|
||||
pageInterfaceDeprecated,
|
||||
|
||||
// Leave this out for now. We need to revisit the author issue.
|
||||
reflect.TypeOf((*page.AuthorProvider)(nil)).Elem(),
|
||||
|
||||
@@ -133,71 +123,6 @@ package page
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateDeprecatedWrappers(c *codegen.Inspector) error {
|
||||
filename := filepath.Join(c.ProjectRootDir, packageDir, "page_wrappers.autogen.go")
|
||||
f, err := os.Create(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
// Generate a wrapper for deprecated page methods
|
||||
|
||||
reasons := map[string]string{
|
||||
"IsDraft": "Use .Draft.",
|
||||
"Hugo": "Use the global hugo function.",
|
||||
"LanguagePrefix": "Use .Site.LanguagePrefix.",
|
||||
"GetParam": "Use .Param or .Params.myParam.",
|
||||
"RSSLink": `Use the Output Format's link, e.g. something like:
|
||||
{{ with .OutputFormats.Get "RSS" }}{{ .RelPermalink }}{{ end }}`,
|
||||
"URL": "Use .Permalink or .RelPermalink. If what you want is the front matter URL value, use .Params.url",
|
||||
}
|
||||
|
||||
deprecated := func(name string, tp reflect.Type) string {
|
||||
alternative, found := reasons[name]
|
||||
if !found {
|
||||
panic(fmt.Sprintf("no deprecated reason found for %q", name))
|
||||
}
|
||||
|
||||
return fmt.Sprintf("helpers.Deprecated(%q, %q, true)", "Page."+name, alternative)
|
||||
}
|
||||
|
||||
var buff bytes.Buffer
|
||||
|
||||
methods := c.MethodsFromTypes([]reflect.Type{pageInterfaceDeprecated}, nil)
|
||||
|
||||
for _, m := range methods {
|
||||
fmt.Fprint(&buff, m.Declaration("*pageDeprecated"))
|
||||
fmt.Fprintln(&buff, " {")
|
||||
fmt.Fprintf(&buff, "\t%s\n", deprecated(m.Name, m.Owner))
|
||||
fmt.Fprintf(&buff, "\t%s\n}\n", m.Delegate("p", "p"))
|
||||
|
||||
}
|
||||
|
||||
pkgImports := methods.Imports()
|
||||
// pkgImports := append(methods.Imports(), "github.com/gohugoio/hugo/helpers")
|
||||
|
||||
fmt.Fprintf(f, `%s
|
||||
|
||||
package page
|
||||
|
||||
%s
|
||||
// NewDeprecatedWarningPage adds deprecation warnings to the given implementation.
|
||||
func NewDeprecatedWarningPage(p DeprecatedWarningPageMethods) DeprecatedWarningPageMethods {
|
||||
return &pageDeprecated{p: p}
|
||||
}
|
||||
|
||||
type pageDeprecated struct {
|
||||
p DeprecatedWarningPageMethods
|
||||
}
|
||||
|
||||
%s
|
||||
|
||||
`, header, importsString(pkgImports), buff.String())
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateFileIsZeroWrappers(c *codegen.Inspector) error {
|
||||
filename := filepath.Join(c.ProjectRootDir, packageDir, "zero_file.autogen.go")
|
||||
f, err := os.Create(filename)
|
||||
|
||||
@@ -14,12 +14,3 @@
|
||||
// This file is autogenerated.
|
||||
|
||||
package page
|
||||
|
||||
// NewDeprecatedWarningPage adds deprecation warnings to the given implementation.
|
||||
func NewDeprecatedWarningPage(p DeprecatedWarningPageMethods) DeprecatedWarningPageMethods {
|
||||
return &pageDeprecated{p: p}
|
||||
}
|
||||
|
||||
type pageDeprecated struct {
|
||||
p DeprecatedWarningPageMethods
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
|
||||
# Test deprecation logging.
|
||||
hugo -e info --logLevel info
|
||||
stdout 'INFO deprecated: item was deprecated in Hugo'
|
||||
|
||||
hugo -e info --logLevel info
|
||||
stdout 'INFO item was deprecated in Hugo'
|
||||
hugo -e warn --logLevel warn
|
||||
stdout 'WARN deprecated: item was deprecated in Hugo'
|
||||
|
||||
hugo -e warn --logLevel warn
|
||||
stdout 'WARN item was deprecated in Hugo'
|
||||
|
||||
! hugo -e error --logLevel warn
|
||||
stdout 'ERROR item was deprecated in Hugo'
|
||||
! hugo -e error --logLevel warn
|
||||
stdout 'ERROR deprecated: item was deprecated in Hugo'
|
||||
|
||||
-- hugo.toml --
|
||||
baseURL = "https://example.com/"
|
||||
|
||||
Reference in New Issue
Block a user