diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-11-14 12:06:46 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-11-14 23:14:51 +0100 |
commit | 3c29c5af8ee865ef20741f576088e031e940c3d2 (patch) | |
tree | 4e05740a9e4f99360aa843da2a4d82d943c825b1 /hugolib/prune_resources.go | |
parent | 33502667fbacf57167ede66df8f13e308a4a9aec (diff) |
cache/filecache: Add a cache prune func
Fixes #5439
Diffstat (limited to 'hugolib/prune_resources.go')
-rw-r--r-- | hugolib/prune_resources.go | 88 |
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() } |