From 8731d8822216dd3c7587769e3cf5d98690717b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 22 Jun 2024 18:41:18 +0200 Subject: [PATCH] Fix Erroridf/Warnidf mixed case issue Fixes #12617 --- common/loggers/logger.go | 2 + config/allconfig/allconfig.go | 6 ++- hugolib/cascade_test.go | 4 +- hugolib/integrationtest_builder.go | 42 +++++++++++++------ hugolib/menu_test.go | 2 +- .../pagesfromgotmpl_integration_test.go | 4 +- tpl/fmt/fmt_integration_test.go | 16 +++++-- 7 files changed, 53 insertions(+), 23 deletions(-) diff --git a/common/loggers/logger.go b/common/loggers/logger.go index f851513b3..5b49e2b17 100644 --- a/common/loggers/logger.go +++ b/common/loggers/logger.go @@ -323,11 +323,13 @@ func (l *logAdapter) Errors() string { } func (l *logAdapter) Erroridf(id, format string, v ...any) { + id = strings.ToLower(id) format += l.idfInfoStatement("error", id, format) l.errorl.WithField(FieldNameStatementID, id).Logf(format, v...) } func (l *logAdapter) Warnidf(id, format string, v ...any) { + id = strings.ToLower(id) format += l.idfInfoStatement("warning", id, format) l.warnl.WithField(FieldNameStatementID, id).Logf(format, v...) } diff --git a/config/allconfig/allconfig.go b/config/allconfig/allconfig.go index 9f899939b..afa72fb11 100644 --- a/config/allconfig/allconfig.go +++ b/config/allconfig/allconfig.go @@ -315,9 +315,13 @@ func (c *Config) CompileConfig(logger loggers.Logger) error { } } + for i, s := range c.IgnoreLogs { + c.IgnoreLogs[i] = strings.ToLower(s) + } + ignoredLogIDs := make(map[string]bool) for _, err := range c.IgnoreLogs { - ignoredLogIDs[strings.ToLower(err)] = true + ignoredLogIDs[err] = true } baseURL, err := urls.NewBaseURLFromString(c.BaseURL) diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go index 7a4b6e6be..cbceaaed5 100644 --- a/hugolib/cascade_test.go +++ b/hugolib/cascade_test.go @@ -779,7 +779,7 @@ title: "Post 1" {{ .Title }}|{{ .Params.foo }}$ ` b := Test(t, files) - b.AssertLogNotContains(`looks like a path with an extension`) + b.AssertLogContains(`! looks like a path with an extension`) } func TestCascadConfigExtensionInPath(t *testing.T) { @@ -813,7 +813,7 @@ foo = 'bar' path = '/p1.md' ` b := Test(t, files) - b.AssertLogNotContains(`looks like a path with an extension`) + b.AssertLogContains(`! looks like a path with an extension`) } func TestCascadeIssue12172(t *testing.T) { diff --git a/hugolib/integrationtest_builder.go b/hugolib/integrationtest_builder.go index 7495d3341..758fc4ec9 100644 --- a/hugolib/integrationtest_builder.go +++ b/hugolib/integrationtest_builder.go @@ -206,24 +206,34 @@ func (b *lockingBuffer) Write(p []byte) (n int, err error) { return } +// AssertLogContains asserts that the last build log contains the given strings. +// Each string can be negated with a "! " prefix. func (s *IntegrationTestBuilder) AssertLogContains(els ...string) { s.Helper() for _, el := range els { - s.Assert(s.lastBuildLog, qt.Contains, el) - } -} - -func (s *IntegrationTestBuilder) AssertLogNotContains(els ...string) { - s.Helper() - for _, el := range els { - s.Assert(s.lastBuildLog, qt.Not(qt.Contains), el) + var negate bool + el, negate = s.negate(el) + check := qt.Contains + if negate { + check = qt.Not(qt.Contains) + } + s.Assert(s.lastBuildLog, check, el) } } +// AssertLogNotContains asserts that the last build log does matches the given regular expressions. +// The regular expressions can be negated with a "! " prefix. func (s *IntegrationTestBuilder) AssertLogMatches(expression string) { s.Helper() + var negate bool + expression, negate = s.negate(expression) re := regexp.MustCompile(expression) - s.Assert(re.MatchString(s.lastBuildLog), qt.IsTrue, qt.Commentf(s.lastBuildLog)) + checker := qt.IsTrue + if negate { + checker = qt.IsFalse + } + + s.Assert(re.MatchString(s.lastBuildLog), checker, qt.Commentf(s.lastBuildLog)) } func (s *IntegrationTestBuilder) AssertBuildCountData(count int) { @@ -258,6 +268,15 @@ func (s *IntegrationTestBuilder) AssertFileCount(dirname string, expected int) { s.Assert(count, qt.Equals, expected) } +func (s *IntegrationTestBuilder) negate(match string) (string, bool) { + var negate bool + if strings.HasPrefix(match, "! ") { + negate = true + match = strings.TrimPrefix(match, "! ") + } + return match, negate +} + func (s *IntegrationTestBuilder) AssertFileContent(filename string, matches ...string) { s.Helper() content := strings.TrimSpace(s.FileContent(filename)) @@ -270,10 +289,7 @@ func (s *IntegrationTestBuilder) AssertFileContent(filename string, matches ...s continue } var negate bool - if strings.HasPrefix(match, "! ") { - negate = true - match = strings.TrimPrefix(match, "! ") - } + match, negate = s.negate(match) if negate { s.Assert(content, qt.Not(qt.Contains), match, cm) continue diff --git a/hugolib/menu_test.go b/hugolib/menu_test.go index 9e73a8dc3..304b4fbf4 100644 --- a/hugolib/menu_test.go +++ b/hugolib/menu_test.go @@ -674,7 +674,7 @@ menu: main b.AssertFileContent("public/en/index.html", `p1p2`) b.AssertFileContent("public/fr/index.html", `p1`) - b.AssertLogNotContains("WARN") + b.AssertLogContains("! WARN") } func TestSectionPagesIssue12399(t *testing.T) { diff --git a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go index 3c50f87f7..709d6db7b 100644 --- a/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go +++ b/hugolib/pagesfromdata/pagesfromgotmpl_integration_test.go @@ -562,7 +562,7 @@ title: "p1" b = hugolib.Test(t, files, hugolib.TestOptWarn()) - b.AssertLogNotContains("WARN") + b.AssertLogContains("! WARN") } func TestPagesFromGoTmplPathWarningsPathResource(t *testing.T) { @@ -597,7 +597,7 @@ value: data1 b = hugolib.Test(t, files, hugolib.TestOptWarn()) - b.AssertLogNotContains("WARN") + b.AssertLogContains("! WARN") } func TestPagesFromGoTmplShortcodeNoPreceddingCharacterIssue12544(t *testing.T) { diff --git a/tpl/fmt/fmt_integration_test.go b/tpl/fmt/fmt_integration_test.go index 74322770e..87a89943c 100644 --- a/tpl/fmt/fmt_integration_test.go +++ b/tpl/fmt/fmt_integration_test.go @@ -27,16 +27,22 @@ func TestErroridf(t *testing.T) { files := ` -- hugo.toml -- disableKinds = ['page','rss','section','sitemap','taxonomy','term'] -ignoreErrors = ['error-b'] +ignoreErrors = ['error-b','error-C'] -- layouts/index.html -- {{ erroridf "error-a" "%s" "a"}} {{ erroridf "error-b" "%s" "b"}} +{{ erroridf "error-C" "%s" "C"}} +{{ erroridf "error-c" "%s" "c"}} + {{ erroridf "error-d" "%s" "D"}} ` b, err := hugolib.TestE(t, files) 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$`) + b.AssertLogMatches(`ERROR a\nYou can suppress this error by adding the following to your site configuration:\nignoreLogs = \['error-a'\]`) + b.AssertLogMatches(`ERROR D`) + b.AssertLogMatches(`! ERROR C`) + b.AssertLogMatches(`! ERROR c`) } func TestWarnidf(t *testing.T) { @@ -45,13 +51,15 @@ func TestWarnidf(t *testing.T) { files := ` -- hugo.toml -- disableKinds = ['page','rss','section','sitemap','taxonomy','term'] -ignoreLogs = ['warning-b'] +ignoreLogs = ['warning-b', 'WarniNg-C'] -- layouts/index.html -- {{ warnidf "warning-a" "%s" "a"}} {{ warnidf "warning-b" "%s" "b"}} +{{ warnidf "warNing-C" "%s" "c"}} ` b := hugolib.Test(t, files, hugolib.TestOptWarn()) b.AssertLogContains("WARN a", "You can suppress this warning", "ignoreLogs", "['warning-a']") - b.AssertLogNotContains("['warning-b']") + b.AssertLogContains("! ['warning-b']") + b.AssertLogContains("! ['warning-c']") }