Make sure CSS is rebuilt when postcss.config.js or tailwind.config.js changes
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 20 Sep 2020 11:34:45 +0000 (13:34 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 20 Sep 2020 11:35:41 +0000 (13:35 +0200)
Fixes #7715

hugolib/site.go
resources/resource_cache.go

index b06d5176ba22d978d4ccdd112ff311c3a9daccd3..43fbbe50e901e8585cacfe232f1abde295f4aef5 100644 (file)
@@ -23,6 +23,7 @@ import (
        "os"
        "path"
        "path/filepath"
+       "regexp"
        "sort"
        "strconv"
        "strings"
@@ -1027,11 +1028,20 @@ func (s *Site) processPartial(config *BuildCfg, init func(config *BuildCfg) erro
                logger = helpers.NewDistinctFeedbackLogger()
        )
 
+       var isCSSConfigRe = regexp.MustCompile(`(postcss|tailwind)\.config\.js`)
+       var isCSSFileRe = regexp.MustCompile(`\.(css|scss|sass)`)
+
        var cachePartitions []string
+       // Special case
+       // TODO(bep) I have a ongoing branch where I have redone the cache. Consider this there.
+       var isCSSChange bool
 
        for _, ev := range events {
                if assetsFilename := s.BaseFs.Assets.MakePathRelative(ev.Name); assetsFilename != "" {
                        cachePartitions = append(cachePartitions, resources.ResourceKeyPartitions(assetsFilename)...)
+                       if !isCSSChange {
+                               isCSSChange = isCSSFileRe.MatchString(assetsFilename) || isCSSConfigRe.MatchString(assetsFilename)
+                       }
                }
 
                id, found := s.eventToIdentity(ev)
@@ -1078,6 +1088,9 @@ func (s *Site) processPartial(config *BuildCfg, init func(config *BuildCfg) erro
        // These in memory resource caches will be rebuilt on demand.
        for _, s := range s.h.Sites {
                s.ResourceSpec.ResourceCache.DeletePartitions(cachePartitions...)
+               if isCSSChange {
+                       s.ResourceSpec.ResourceCache.DeleteContains("css", "scss", "sass")
+               }
        }
 
        if tmplChanged || i18nChanged {
index 47822a7f506345a9a7ab63309218eba903544429..feaa94f5cf0723d36bfae3f79238ae2afd7332f8 100644 (file)
@@ -295,3 +295,22 @@ func (c *ResourceCache) DeletePartitions(partitions ...string) {
        }
 
 }
+
+func (c *ResourceCache) DeleteContains(parts ...string) {
+       c.Lock()
+       defer c.Unlock()
+
+       for k := range c.cache {
+               clear := false
+               for _, part := range parts {
+                       if strings.Contains(k, part) {
+                               clear = true
+                               break
+                       }
+               }
+               if clear {
+                       delete(c.cache, k)
+               }
+       }
+
+}