mirror of
https://github.com/gohugoio/hugo.git
synced 2025-03-15 02:13:58 +00:00
cache/filecache: Add a filecache root dir
This is just a safe guard to make sure we don't evict/remove files that do not belong to the cache.
This commit is contained in:
parent
d3489eba5d
commit
33502667fb
5 changed files with 38 additions and 3 deletions
19
cache/filecache/filecache.go
vendored
19
cache/filecache/filecache.go
vendored
|
@ -31,6 +31,10 @@ import (
|
||||||
"github.com/spf13/afero"
|
"github.com/spf13/afero"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
filecacheRootDirname = "filecache"
|
||||||
|
)
|
||||||
|
|
||||||
// Cache caches a set of files in a directory. This is usually a file on
|
// Cache caches a set of files in a directory. This is usually a file on
|
||||||
// disk, but since this is backed by an Afero file system, it can be anything.
|
// disk, but since this is backed by an Afero file system, it can be anything.
|
||||||
type Cache struct {
|
type Cache struct {
|
||||||
|
@ -276,11 +280,24 @@ func NewCachesFromPaths(p *paths.Paths) (Caches, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
genDir := filepath.FromSlash("/_gen")
|
||||||
|
|
||||||
fs := p.Fs.Source
|
fs := p.Fs.Source
|
||||||
|
|
||||||
m := make(Caches)
|
m := make(Caches)
|
||||||
for k, v := range dcfg {
|
for k, v := range dcfg {
|
||||||
baseDir := filepath.Join(v.Dir, k)
|
var baseDir string
|
||||||
|
if !strings.Contains(v.Dir, genDir) {
|
||||||
|
// We do cache eviction (file removes) and since the user can set
|
||||||
|
// his/hers own cache directory, we really want to make sure
|
||||||
|
// we do not delete any files that do not belong to this cache.
|
||||||
|
// We do add the cache name as the root, but this is an extra safe
|
||||||
|
// guard. We skip the files inside /resources/_gen/ because
|
||||||
|
// that would be breaking.
|
||||||
|
baseDir = filepath.Join(v.Dir, filecacheRootDirname, k)
|
||||||
|
} else {
|
||||||
|
baseDir = filepath.Join(v.Dir, k)
|
||||||
|
}
|
||||||
if err = fs.MkdirAll(baseDir, 0777); err != nil {
|
if err = fs.MkdirAll(baseDir, 0777); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
4
cache/filecache/filecache_config.go
vendored
4
cache/filecache/filecache_config.go
vendored
|
@ -157,6 +157,10 @@ func decodeConfig(p *paths.Paths) (cachesConfig, error) {
|
||||||
return c, errors.Errorf("%q must either start with a placeholder (e.g. :cacheDir, :resourceDir) or be absolute", v.Dir)
|
return c, errors.Errorf("%q must either start with a placeholder (e.g. :cacheDir, :resourceDir) or be absolute", v.Dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(v.Dir) < 5 {
|
||||||
|
return c, errors.Errorf("%q is not a valid cache dir", v.Dir)
|
||||||
|
}
|
||||||
|
|
||||||
if disabled {
|
if disabled {
|
||||||
v.MaxAge = 0
|
v.MaxAge = 0
|
||||||
}
|
}
|
||||||
|
|
2
cache/filecache/filecache_config_test.go
vendored
2
cache/filecache/filecache_config_test.go
vendored
|
@ -33,6 +33,7 @@ func TestDecodeConfig(t *testing.T) {
|
||||||
assert := require.New(t)
|
assert := require.New(t)
|
||||||
|
|
||||||
configStr := `
|
configStr := `
|
||||||
|
resourceDir = "myresources"
|
||||||
[caches]
|
[caches]
|
||||||
[caches.getJSON]
|
[caches.getJSON]
|
||||||
maxAge = "10m"
|
maxAge = "10m"
|
||||||
|
@ -72,6 +73,7 @@ func TestDecodeConfigIgnoreCache(t *testing.T) {
|
||||||
assert := require.New(t)
|
assert := require.New(t)
|
||||||
|
|
||||||
configStr := `
|
configStr := `
|
||||||
|
resourceDir = "myresources"
|
||||||
ignoreCache = true
|
ignoreCache = true
|
||||||
[caches]
|
[caches]
|
||||||
[caches.getJSON]
|
[caches.getJSON]
|
||||||
|
|
15
cache/filecache/filecache_test.go
vendored
15
cache/filecache/filecache_test.go
vendored
|
@ -41,6 +41,8 @@ func TestFileCache(t *testing.T) {
|
||||||
for _, cacheDir := range []string{"mycache", ""} {
|
for _, cacheDir := range []string{"mycache", ""} {
|
||||||
|
|
||||||
configStr := `
|
configStr := `
|
||||||
|
workingDir = "/my/work"
|
||||||
|
resourceDir = "resources"
|
||||||
cacheDir = "CACHEDIR"
|
cacheDir = "CACHEDIR"
|
||||||
[caches]
|
[caches]
|
||||||
[caches.getJSON]
|
[caches.getJSON]
|
||||||
|
@ -69,12 +71,20 @@ dir = ":cacheDir/c"
|
||||||
filename, err := bfs.RealPath("key")
|
filename, err := bfs.RealPath("key")
|
||||||
assert.NoError(err)
|
assert.NoError(err)
|
||||||
if cacheDir != "" {
|
if cacheDir != "" {
|
||||||
assert.Equal(filepath.FromSlash(cacheDir+"/c/getjson/key"), filename)
|
assert.Equal(filepath.FromSlash(cacheDir+"/c/"+filecacheRootDirname+"/getjson/key"), filename)
|
||||||
} else {
|
} else {
|
||||||
// Temp dir.
|
// Temp dir.
|
||||||
assert.Regexp(regexp.MustCompile("hugo_cache.*key"), filename)
|
assert.Regexp(regexp.MustCompile(".*hugo_cache.*"+filecacheRootDirname+".*key"), filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c = caches.Get("images")
|
||||||
|
assert.NotNil(c)
|
||||||
|
assert.Equal(time.Duration(-1), c.maxAge)
|
||||||
|
bfs, ok = c.Fs.(*afero.BasePathFs)
|
||||||
|
assert.True(ok)
|
||||||
|
filename, _ = bfs.RealPath("key")
|
||||||
|
assert.Equal(filepath.FromSlash("/my/work/resources/_gen/images/key"), filename)
|
||||||
|
|
||||||
rf := func(s string) func() (io.ReadCloser, error) {
|
rf := func(s string) func() (io.ReadCloser, error) {
|
||||||
return func() (io.ReadCloser, error) {
|
return func() (io.ReadCloser, error) {
|
||||||
return struct {
|
return struct {
|
||||||
|
@ -149,6 +159,7 @@ func TestFileCacheConcurrent(t *testing.T) {
|
||||||
assert := require.New(t)
|
assert := require.New(t)
|
||||||
|
|
||||||
configStr := `
|
configStr := `
|
||||||
|
resourceDir = "myresources"
|
||||||
[caches]
|
[caches]
|
||||||
[caches.getjson]
|
[caches.getjson]
|
||||||
maxAge = "1s"
|
maxAge = "1s"
|
||||||
|
|
|
@ -180,6 +180,7 @@ func TestScpGetRemoteParallel(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDeps(cfg config.Provider) *deps.Deps {
|
func newDeps(cfg config.Provider) *deps.Deps {
|
||||||
|
cfg.Set("resourceDir", "resources")
|
||||||
l := langs.NewLanguage("en", cfg)
|
l := langs.NewLanguage("en", cfg)
|
||||||
l.Set("i18nDir", "i18n")
|
l.Set("i18nDir", "i18n")
|
||||||
cs, err := helpers.NewContentSpec(l)
|
cs, err := helpers.NewContentSpec(l)
|
||||||
|
|
Loading…
Reference in a new issue