summaryrefslogtreecommitdiffstats
path: root/hugolib/prune_resources.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-11-14 12:06:46 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-11-14 23:14:51 +0100
commit3c29c5af8ee865ef20741f576088e031e940c3d2 (patch)
tree4e05740a9e4f99360aa843da2a4d82d943c825b1 /hugolib/prune_resources.go
parent33502667fbacf57167ede66df8f13e308a4a9aec (diff)
cache/filecache: Add a cache prune func
Fixes #5439
Diffstat (limited to 'hugolib/prune_resources.go')
-rw-r--r--hugolib/prune_resources.go88
1 files changed, 3 insertions, 85 deletions
diff --git a/hugolib/prune_resources.go b/hugolib/prune_resources.go
index 63623d75d..bf5a1ef2f 100644
--- a/hugolib/prune_resources.go
+++ b/hugolib/prune_resources.go
@@ -1,4 +1,4 @@
-// Copyright 2017-present The Hugo Authors. All rights reserved.
+// Copyright 2018 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.
@@ -13,89 +13,7 @@
package hugolib
-import (
- "io"
- "os"
- "strings"
-
- "github.com/gohugoio/hugo/helpers"
-
- "github.com/spf13/afero"
-)
-
-// GC requires a build first.
+// GC requires a build first and must run on it's own. It is not thread safe.
func (h *HugoSites) GC() (int, error) {
- s := h.Sites[0]
- assetsCacheFs := h.Deps.FileCaches.AssetsCache().Fs
- imageCacheFs := h.Deps.FileCaches.ImageCache().Fs
-
- isImageInUse := func(name string) bool {
- for _, site := range h.Sites {
- if site.ResourceSpec.IsInImageCache(name) {
- return true
- }
- }
-
- return false
- }
-
- isAssetInUse := func(name string) bool {
- // These assets are stored in tuplets with an added extension to the key.
- key := strings.TrimSuffix(name, helpers.Ext(name))
- for _, site := range h.Sites {
- if site.ResourceSpec.ResourceCache.Contains(key) {
- return true
- }
- }
-
- return false
- }
-
- walker := func(fs afero.Fs, dirname string, inUse func(filename string) bool) (int, error) {
- counter := 0
- err := afero.Walk(fs, dirname, func(path string, info os.FileInfo, err error) error {
- if info == nil {
- return nil
- }
-
- if info.IsDir() {
- f, err := fs.Open(path)
- if err != nil {
- return nil
- }
- defer f.Close()
- _, err = f.Readdirnames(1)
- if err == io.EOF {
- // Empty dir.
- s.Fs.Source.Remove(path)
- }
-
- return nil
- }
-
- inUse := inUse(path)
- if !inUse {
- err := fs.Remove(path)
- if err != nil && !os.IsNotExist(err) {
- s.Log.ERROR.Printf("Failed to remove %q: %s", path, err)
- } else {
- counter++
- }
- }
- return nil
- })
-
- return counter, err
- }
-
- imageCounter, err1 := walker(imageCacheFs, "", isImageInUse)
- assetsCounter, err2 := walker(assetsCacheFs, "", isAssetInUse)
- totalCount := imageCounter + assetsCounter
-
- if err1 != nil {
- return totalCount, err1
- }
-
- return totalCount, err2
-
+ return h.Deps.FileCaches.Prune()
}