From 9032ab2eecb2ba8aeb749782d9564ff34b6ffa53 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 2 Jul 2017 15:58:03 +0200 Subject: [PATCH] local/sftp: Create dirs on open() --- src/restic/backend/local/local.go | 26 ++++++++------------------ src/restic/backend/sftp/sftp.go | 9 +++++++++ 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/restic/backend/local/local.go b/src/restic/backend/local/local.go index 4d58b187d..fef16f704 100644 --- a/src/restic/backend/local/local.go +++ b/src/restic/backend/local/local.go @@ -35,6 +35,14 @@ func Open(cfg Config) (*Local, error) { be := &Local{Config: cfg, Layout: l} + // create paths for data and refs. MkdirAll does nothing if the directory already exists. + for _, d := range be.Paths() { + err := fs.MkdirAll(d, backend.Modes.Dir) + if err != nil { + return nil, errors.Wrap(err, "MkdirAll") + } + } + return be, nil } @@ -89,26 +97,8 @@ func (b *Local) Save(ctx context.Context, h restic.Handle, rd io.Reader) (err er filename := b.Filename(h) - // create directories if necessary, ignore errors - if h.Type == restic.DataFile { - err = fs.MkdirAll(filepath.Dir(filename), backend.Modes.Dir) - if err != nil { - return errors.Wrap(err, "MkdirAll") - } - } - // create new file f, err := fs.OpenFile(filename, os.O_CREATE|os.O_EXCL|os.O_WRONLY, backend.Modes.File) - if os.IsNotExist(errors.Cause(err)) { - // create the locks dir, then try again - err = fs.MkdirAll(b.Dirname(h), backend.Modes.Dir) - if err != nil { - return errors.Wrap(err, "MkdirAll") - } - - return b.Save(ctx, h, rd) - } - if err != nil { return errors.Wrap(err, "OpenFile") } diff --git a/src/restic/backend/sftp/sftp.go b/src/restic/backend/sftp/sftp.go index f871da324..ae2d8f8c2 100644 --- a/src/restic/backend/sftp/sftp.go +++ b/src/restic/backend/sftp/sftp.go @@ -126,6 +126,15 @@ func Open(cfg Config) (*SFTP, error) { debug.Log("layout: %v\n", sftp.Layout) + // create paths for data and refs. mkdirAll does nothing if the paths already exist. + for _, d := range sftp.Paths() { + err = sftp.mkdirAll(d, backend.Modes.Dir) + debug.Log("mkdirAll %v -> %v", d, err) + if err != nil { + return nil, err + } + } + sftp.Config = cfg sftp.p = cfg.Path return sftp, nil