forked from TrueCloudLab/restic
Merge pull request #4918 from MichaelEischer/restore-dont-delete-target-if-file
restore: do not delete target if it is a file
This commit is contained in:
commit
6010c98b3f
2 changed files with 30 additions and 0 deletions
|
@ -347,6 +347,14 @@ func (res *Restorer) RestoreTo(ctx context.Context, dst string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !res.opts.DryRun {
|
||||||
|
// ensure that the target directory exists and is actually a directory
|
||||||
|
// Using ensureDir is too aggressive here as it also removes unexpected files
|
||||||
|
if err := fs.MkdirAll(dst, 0700); err != nil {
|
||||||
|
return fmt.Errorf("cannot create target directory: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
idx := NewHardlinkIndex[string]()
|
idx := NewHardlinkIndex[string]()
|
||||||
filerestorer := newFileRestorer(dst, res.repo.LoadBlobsFromPack, res.repo.LookupBlob,
|
filerestorer := newFileRestorer(dst, res.repo.LoadBlobsFromPack, res.repo.LookupBlob,
|
||||||
res.repo.Connections(), res.opts.Sparse, res.opts.Delete, res.opts.Progress)
|
res.repo.Connections(), res.opts.Sparse, res.opts.Delete, res.opts.Progress)
|
||||||
|
|
|
@ -1372,3 +1372,25 @@ func TestRestoreDelete(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRestoreToFile(t *testing.T) {
|
||||||
|
snapshot := Snapshot{
|
||||||
|
Nodes: map[string]Node{
|
||||||
|
"foo": File{Data: "content: foo\n"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
repo := repository.TestRepository(t)
|
||||||
|
tempdir := filepath.Join(rtest.TempDir(t), "target")
|
||||||
|
|
||||||
|
// create a file in the place of the target directory
|
||||||
|
rtest.OK(t, os.WriteFile(tempdir, []byte{}, 0o700))
|
||||||
|
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
sn, _ := saveSnapshot(t, repo, snapshot, noopGetGenericAttributes)
|
||||||
|
res := NewRestorer(repo, sn, Options{})
|
||||||
|
err := res.RestoreTo(ctx, tempdir)
|
||||||
|
rtest.Assert(t, strings.Contains(err.Error(), "cannot create target directory"), "unexpected error %v", err)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue