mirror of
https://github.com/octoleo/restic.git
synced 2024-11-18 11:05:18 +00:00
Merge pull request #941 from restic/improve-mkdir
local/sftp: Auto create directories if needed
This commit is contained in:
commit
46e6e8984d
@ -93,6 +93,16 @@ func (b *Local) Save(h restic.Handle, rd io.Reader) (err error) {
|
|||||||
|
|
||||||
// create new file
|
// create new file
|
||||||
f, err := fs.OpenFile(filename, os.O_CREATE|os.O_EXCL|os.O_WRONLY, backend.Modes.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(h, rd)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "OpenFile")
|
return errors.Wrap(err, "OpenFile")
|
||||||
}
|
}
|
||||||
@ -215,6 +225,10 @@ func (b *Local) List(t restic.FileType, done <-chan struct{}) <-chan string {
|
|||||||
defer close(ch)
|
defer close(ch)
|
||||||
|
|
||||||
fs.Walk(b.Basedir(t), func(path string, fi os.FileInfo, err error) error {
|
fs.Walk(b.Basedir(t), func(path string, fi os.FileInfo, err error) error {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if !isFile(fi) {
|
if !isFile(fi) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -143,6 +143,10 @@ func (r *SFTP) ReadDir(dir string) ([]os.FileInfo, error) {
|
|||||||
|
|
||||||
// IsNotExist returns true if the error is caused by a not existing file.
|
// IsNotExist returns true if the error is caused by a not existing file.
|
||||||
func (r *SFTP) IsNotExist(err error) bool {
|
func (r *SFTP) IsNotExist(err error) bool {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
statusError, ok := err.(*sftp.StatusError)
|
statusError, ok := err.(*sftp.StatusError)
|
||||||
if !ok {
|
if !ok {
|
||||||
return false
|
return false
|
||||||
@ -271,16 +275,18 @@ func (r *SFTP) Save(h restic.Handle, rd io.Reader) (err error) {
|
|||||||
|
|
||||||
filename := r.Filename(h)
|
filename := r.Filename(h)
|
||||||
|
|
||||||
// create directories if necessary
|
|
||||||
if h.Type == restic.DataFile {
|
|
||||||
err := r.mkdirAll(path.Dir(filename), backend.Modes.Dir)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create new file
|
// create new file
|
||||||
f, err := r.c.OpenFile(filename, os.O_CREATE|os.O_EXCL|os.O_WRONLY)
|
f, err := r.c.OpenFile(filename, os.O_CREATE|os.O_EXCL|os.O_WRONLY)
|
||||||
|
if r.IsNotExist(errors.Cause(err)) {
|
||||||
|
// create the locks dir, then try again
|
||||||
|
err = r.mkdirAll(r.Dirname(h), backend.Modes.Dir)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "MkdirAll")
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.Save(h, rd)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "OpenFile")
|
return errors.Wrap(err, "OpenFile")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user