Debugln(v ...any)
Error() logg.LevelLogger
Errorf(format string, v ...any)
+ Erroridf(id, format string, v ...any)
Errorln(v ...any)
Errors() string
- Errorsf(id, format string, v ...any)
Info() logg.LevelLogger
InfoCommand(command string) logg.LevelLogger
Infof(format string, v ...any)
Warn() logg.LevelLogger
WarnCommand(command string) logg.LevelLogger
Warnf(format string, v ...any)
+ Warnidf(id, format string, v ...any)
Warnln(v ...any)
Deprecatef(fail bool, format string, v ...any)
Trace(s logg.StringFunc)
return l.errors.String()
}
-func (l *logAdapter) Errorsf(id, format string, v ...any) {
+func (l *logAdapter) Erroridf(id, format string, v ...any) {
+ format += l.idfInfoStatement("error", id, format)
l.errorl.WithField(FieldNameStatementID, id).Logf(format, v...)
}
+func (l *logAdapter) Warnidf(id, format string, v ...any) {
+ format += l.idfInfoStatement("warning", id, format)
+ l.warnl.WithField(FieldNameStatementID, id).Logf(format, v...)
+}
+
+func (l *logAdapter) idfInfoStatement(what, id, format string) string {
+ return fmt.Sprintf("\nYou can suppress this %s by adding the following to your site configuration:\nignoreLogs = ['%s']", what, id)
+}
+
func (l *logAdapter) Trace(s logg.StringFunc) {
l.tracel.Log(s)
}
x.DisableKinds = copyStringSlice(x.DisableKinds)
x.DisableLanguages = copyStringSlice(x.DisableLanguages)
x.MainSections = copyStringSlice(x.MainSections)
- x.IgnoreErrors = copyStringSlice(x.IgnoreErrors)
+ x.IgnoreLogs = copyStringSlice(x.IgnoreLogs)
x.IgnoreFiles = copyStringSlice(x.IgnoreFiles)
x.Theme = copyStringSlice(x.Theme)
}
}
- ignoredErrors := make(map[string]bool)
- for _, err := range c.IgnoreErrors {
- ignoredErrors[strings.ToLower(err)] = true
+ ignoredLogIDs := make(map[string]bool)
+ for _, err := range c.IgnoreLogs {
+ ignoredLogIDs[strings.ToLower(err)] = true
}
baseURL, err := urls.NewBaseURLFromString(c.BaseURL)
BaseURLLiveReload: baseURL,
DisabledKinds: disabledKinds,
DisabledLanguages: disabledLangs,
- IgnoredErrors: ignoredErrors,
+ IgnoredLogs: ignoredLogIDs,
KindOutputFormats: kindOutputFormats,
CreateTitle: helpers.GetTitleFunc(c.TitleCaseStyle),
IsUglyURLSection: isUglyURL,
KindOutputFormats map[string]output.Formats
DisabledKinds map[string]bool
DisabledLanguages map[string]bool
- IgnoredErrors map[string]bool
+ IgnoredLogs map[string]bool
CreateTitle func(s string) string
IsUglyURLSection func(section string) bool
IgnoreFile func(filename string) bool
// Enable to disable the build lock file.
NoBuildLock bool
- // A list of error IDs to ignore.
- IgnoreErrors []string
+ // A list of log IDs to ignore.
+ IgnoreLogs []string
// A list of regexps that match paths to ignore.
// Deprecated: Use the settings on module imports.
return c.config.C.DisabledLanguages[lang]
}
-func (c ConfigLanguage) IgnoredErrors() map[string]bool {
- return c.config.C.IgnoredErrors
+func (c ConfigLanguage) IgnoredLogs() map[string]bool {
+ return c.config.C.IgnoredLogs
}
func (c ConfigLanguage) NoBuildLock() bool {
{Key: "indexes", Value: "taxonomies"},
{Key: "logI18nWarnings", Value: "printI18nWarnings"},
{Key: "logPathWarnings", Value: "printPathWarnings"},
+ {Key: "ignoreErrors", Value: "ignoreLogs"},
}
for _, alias := range aliases {
NewContentEditor() string
Timeout() time.Duration
StaticDirs() []string
- IgnoredErrors() map[string]bool
+ IgnoredLogs() map[string]bool
WorkingDir() string
EnableEmoji() bool
}
}
}
+// TestOptWarn will enable warn logging in integration tests.
+func TestOptWarn() TestOpt {
+ return func(c *IntegrationTestConfig) {
+ c.LogLevel = logg.LevelWarn
+ }
+}
+
// TestOptWithNFDOnDarwin will normalize the Unicode filenames to NFD on Darwin.
func TestOptWithNFDOnDarwin() TestOpt {
return func(c *IntegrationTestConfig) {
return
}
-func (s *IntegrationTestBuilder) AssertLogContains(text string) {
+func (s *IntegrationTestBuilder) AssertLogContains(els ...string) {
s.Helper()
- s.Assert(s.logBuff.String(), qt.Contains, text)
+ for _, el := range els {
+ s.Assert(s.logBuff.String(), qt.Contains, el)
+ }
+}
+
+func (s *IntegrationTestBuilder) AssertLogNotContains(els ...string) {
+ s.Helper()
+ for _, el := range els {
+ s.Assert(s.logBuff.String(), qt.Not(qt.Contains), el)
+ }
}
func (s *IntegrationTestBuilder) AssertLogMatches(expression string) {
Stdout: cfg.LogOut,
Stderr: cfg.LogOut,
StoreErrors: conf.Running(),
- SuppressStatements: conf.IgnoredErrors(),
+ SuppressStatements: conf.IgnoredLogs(),
}
logger = loggers.New(logOpts)
}
if security.IsAccessDenied(err) {
return nil, err
}
- ns.deps.Log.Errorsf(constants.ErrRemoteGetCSV, "Failed to get CSV resource %q: %s", url, err)
+ ns.deps.Log.Erroridf(constants.ErrRemoteGetCSV, "Failed to get CSV resource %q: %s", url, err)
return nil, nil
}
if security.IsAccessDenied(err) {
return nil, err
}
- ns.deps.Log.Errorsf(constants.ErrRemoteGetJSON, "Failed to get JSON resource %q: %s", url, err)
+ ns.deps.Log.Erroridf(constants.ErrRemoteGetJSON, "Failed to get JSON resource %q: %s", url, err)
return nil, nil
}
// an information text that the error with the given id can be suppressed in config.
// It returns an empty string.
func (ns *Namespace) Erroridf(id, format string, args ...any) string {
- format += "\nYou can suppress this error by adding the following to your site configuration:\nignoreErrors = ['%s']"
- args = append(args, id)
- ns.logger.Errorsf(id, format, args...)
+ ns.logger.Erroridf(id, format, args...)
return ""
}
return ""
}
+// Warnidf formats args according to a format specifier and logs an WARNING and
+// an information text that the warning with the given id can be suppressed in config.
+// It returns an empty string.
+func (ns *Namespace) Warnidf(id, format string, args ...any) string {
+ ns.logger.Warnidf(id, format, args...)
+ return ""
+}
+
// Warnmf is epxermimental and subject to change at any time.
func (ns *Namespace) Warnmf(m any, format string, args ...any) string {
return ns.logmf(ns.logger.Warn(), m, format, args...)
import (
"testing"
+ qt "github.com/frankban/quicktest"
"github.com/gohugoio/hugo/hugolib"
)
{{ erroridf "error-b" "%s" "b"}}
`
- b := hugolib.NewIntegrationTestBuilder(
- hugolib.IntegrationTestConfig{
- T: t,
- TxtarString: files,
- },
- )
+ b, err := hugolib.TestE(t, files)
- b.BuildE()
- b.AssertLogMatches(`^ERROR a\nYou can suppress this error by adding the following to your site configuration:\nignoreErrors = \['error-a'\]\n$`)
+ b.Assert(err, qt.IsNotNil)
+ b.AssertLogMatches(`^ERROR a\nYou can suppress this error by adding the following to your site configuration:\nignoreLogs = \['error-a'\]\n$`)
+}
+
+func TestWarnidf(t *testing.T) {
+ t.Parallel()
+
+ files := `
+-- hugo.toml --
+disableKinds = ['page','rss','section','sitemap','taxonomy','term']
+ignoreLogs = ['warning-b']
+-- layouts/index.html --
+{{ warnidf "warning-a" "%s" "a"}}
+{{ warnidf "warning-b" "%s" "b"}}
+ `
+
+ b := hugolib.Test(t, files, hugolib.TestOptWarn())
+ b.AssertLogContains("WARN a", "You can suppress this warning", "ignoreLogs", "['warning-a']")
+ b.AssertLogNotContains("['warning-b']")
}
},
)
+ ns.AddMethodMapping(ctx.Warnidf,
+ []string{"warnidf"},
+ [][2]string{
+ {`{{ warnidf "my-warn-id" "%s." "warning" }}`, ``},
+ },
+ )
+
ns.AddMethodMapping(ctx.Warnf,
[]string{"warnf"},
[][2]string{