From bb59a7ed979db459275e5fac96f80a51ff3b5674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 5 May 2024 10:44:35 +0200 Subject: [PATCH] Fix one more resource change eviction logic issue This is how we should have fixed #1239. Fixes #12456 --- hugolib/hugo_sites_build.go | 47 +------------- .../tocss/scss/scss_integration_test.go | 61 ++++++++++++++++++- resources/transform.go | 5 ++ 3 files changed, 67 insertions(+), 46 deletions(-) diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index c96629cd6..6a9afee99 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -23,11 +23,9 @@ import ( "path" "path/filepath" "strings" - "sync" "time" "github.com/bep/logg" - "github.com/gohugoio/hugo/cache/dynacache" "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/hugofs/files" @@ -47,7 +45,6 @@ import ( "github.com/gohugoio/hugo/resources/page" "github.com/gohugoio/hugo/resources/page/siteidentities" "github.com/gohugoio/hugo/resources/postpub" - "github.com/gohugoio/hugo/resources/resource" "github.com/spf13/afero" @@ -764,48 +761,8 @@ func (h *HugoSites) processPartial(ctx context.Context, l logg.LevelLogger, conf } } case files.ComponentFolderAssets: - p := pathInfo.Path() - logger.Println("Asset changed", p) - - var matches []any - var mu sync.Mutex - - h.MemCache.ClearMatching( - func(k string, pm dynacache.PartitionManager) bool { - // Avoid going through everything. - return strings.HasPrefix(k, "/res") - }, - func(k, v any) bool { - if strings.Contains(k.(string), p) { - mu.Lock() - defer mu.Unlock() - switch vv := v.(type) { - case resource.Resources: - // GetMatch/Match. - for _, r := range vv { - matches = append(matches, r) - } - return true - default: - matches = append(matches, vv) - return true - - } - } - return false - }) - - var hasID bool - for _, r := range matches { - identity.WalkIdentitiesShallow(r, func(level int, rid identity.Identity) bool { - hasID = true - changes = append(changes, rid) - return false - }) - } - if !hasID { - changes = append(changes, pathInfo) - } + logger.Println("Asset changed", pathInfo.Path()) + changes = append(changes, pathInfo) case files.ComponentFolderData: logger.Println("Data changed", pathInfo.Path()) diff --git a/resources/resource_transformers/tocss/scss/scss_integration_test.go b/resources/resource_transformers/tocss/scss/scss_integration_test.go index 02e2b9200..469463872 100644 --- a/resources/resource_transformers/tocss/scss/scss_integration_test.go +++ b/resources/resource_transformers/tocss/scss/scss_integration_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Hugo Authors. All rights reserved. +// Copyright 2024 The Hugo Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -328,6 +328,7 @@ Styles: {{ $r.RelPermalink }} b.AssertFileContent("public/index.html", "Styles: /scss/main.css") } +// Issue #1239. func TestRebuildAssetGetMatch(t *testing.T) { t.Parallel() if !scss.Supports() { @@ -358,3 +359,61 @@ T1: {{ $r.Content }} b.AssertFileContent("public/index.html", `color: blue`) } + +func TestRebuildAssetMatchIssue12456(t *testing.T) { + t.Parallel() + if !scss.Supports() { + t.Skip() + } + + files := ` +-- hugo.toml -- +disableKinds = ["term", "taxonomy", "section", "page"] +disableLiveReload = true +-- assets/a.scss -- +h1 { + color: red; +} +-- assets/dir/b.scss -- +h2 { + color: blue; +} +-- assets/dir/c.scss -- +h3 { + color: green; +} +-- layouts/index.html -- +{{ $a := slice (resources.Get "a.scss") }} +{{ $b := resources.Match "dir/*.scss" }} + +{{/* Add styles in a specific order. */}} +{{ $styles := slice $a $b }} + +{{ $stylesheets := slice }} + {{ range $styles }} + {{ $stylesheets = $stylesheets | collections.Append . }} +{{ end }} + + +{{ range $stylesheets }} + {{ with . | resources.ToCSS | fingerprint }} + + {{ end }} +{{ end }} + ` + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + NeedsOsFS: true, + Running: true, + // LogLevel: logg.LevelTrace, + }).Build() + + b.AssertFileContent("public/index.html", `b.60a9f3bdc189ee8a857afd5b7e1b93ad1644de0873761a7c9bc84f781a821942.css`) + + b.EditFiles("assets/dir/b.scss", `h2 { color: orange; }`).Build() + + b.AssertFileContent("public/index.html", `b.46b2d77c7ffe37ee191678f72df991ecb1319f849957151654362f09b0ef467f.css`) +} diff --git a/resources/transform.go b/resources/transform.go index b498924f5..9adec38cc 100644 --- a/resources/transform.go +++ b/resources/transform.go @@ -49,6 +49,7 @@ var ( _ resource.ReadSeekCloserResource = (*resourceAdapter)(nil) _ resource.Resource = (*resourceAdapter)(nil) _ resource.Staler = (*resourceAdapterInner)(nil) + _ identity.IdentityGroupProvider = (*resourceAdapterInner)(nil) _ resource.Source = (*resourceAdapter)(nil) _ resource.Identifier = (*resourceAdapter)(nil) _ resource.ResourceNameTitleProvider = (*resourceAdapter)(nil) @@ -657,6 +658,10 @@ type resourceAdapterInner struct { *publishOnce } +func (r *resourceAdapterInner) GetIdentityGroup() identity.Identity { + return r.target.GetIdentityGroup() +} + func (r *resourceAdapterInner) StaleVersion() uint32 { // Both of these are incremented on change. return r.Staler.StaleVersion() + r.target.StaleVersion()