From 6d53e767d54e4f563a2fdfe17d09b3a858b6e9b0 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Tue, 28 Aug 2018 22:03:47 +0200 Subject: [PATCH] cache: Print message when new cache is created Sometimes, users run restic without retaining the local cache directories. This was reported several times in the past. Restic will now print a message whenever a new cache directory is created from scratch (i.e. it did not exist before), so users have a chance to recognize when the cache is not kept between different runs of restic. --- cmd/restic/global.go | 4 ++++ internal/cache/cache.go | 17 ++++++++++++----- internal/cache/dir.go | 16 +++++++++++----- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/cmd/restic/global.go b/cmd/restic/global.go index 7f830927c..08b27ae4a 100644 --- a/cmd/restic/global.go +++ b/cmd/restic/global.go @@ -376,6 +376,10 @@ func OpenRepository(opts GlobalOptions) (*repository.Repository, error) { return s, nil } + if c.Created && !opts.JSON { + Verbosef("created new cache in %v\n", c.Base) + } + // start using the cache s.UseCache(c) diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 7dc5d916a..fd5743b94 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -19,6 +19,7 @@ import ( type Cache struct { Path string Base string + Created bool PerformReadahead func(restic.Handle) bool } @@ -98,7 +99,7 @@ func New(id string, basedir string) (c *Cache, err error) { } } - err = mkdirCacheDir(basedir) + created, err := mkdirCacheDir(basedir) if err != nil { return nil, err } @@ -121,8 +122,13 @@ func New(id string, basedir string) (c *Cache, err error) { } // create the repo cache dir if it does not exist yet - if err = fs.MkdirAll(cachedir, dirMode); err != nil { - return nil, err + _, err = fs.Lstat(cachedir) + if os.IsNotExist(err) { + err = fs.MkdirAll(cachedir, dirMode) + if err != nil { + return nil, err + } + created = true } // update the timestamp so that we can detect old cache dirs @@ -145,8 +151,9 @@ func New(id string, basedir string) (c *Cache, err error) { } c = &Cache{ - Path: cachedir, - Base: basedir, + Path: cachedir, + Base: basedir, + Created: created, PerformReadahead: func(restic.Handle) bool { // do not perform readahead by default return false diff --git a/internal/cache/dir.go b/internal/cache/dir.go index 398e806ca..c4af67d44 100644 --- a/internal/cache/dir.go +++ b/internal/cache/dir.go @@ -68,25 +68,31 @@ func DefaultDir() (cachedir string, err error) { return cachedir, nil } -func mkdirCacheDir(cachedir string) error { +// mkdirCacheDir ensures that the cache directory exists. It it didn't, created +// is set to true. +func mkdirCacheDir(cachedir string) (created bool, err error) { + var newCacheDir bool + fi, err := fs.Stat(cachedir) if os.IsNotExist(errors.Cause(err)) { err = fs.MkdirAll(cachedir, 0700) if err != nil { - return errors.Wrap(err, "MkdirAll") + return true, errors.Wrap(err, "MkdirAll") } fi, err = fs.Stat(cachedir) debug.Log("create cache dir %v", cachedir) + + newCacheDir = true } if err != nil { - return errors.Wrap(err, "Stat") + return newCacheDir, errors.Wrap(err, "Stat") } if !fi.IsDir() { - return errors.Errorf("cache dir %v is not a directory", cachedir) + return newCacheDir, errors.Errorf("cache dir %v is not a directory", cachedir) } - return nil + return newCacheDir, nil }