diff --git a/src/restic/node.go b/src/restic/node.go index 81f3ef8d5..e17215125 100644 --- a/src/restic/node.go +++ b/src/restic/node.go @@ -184,7 +184,7 @@ func (node Node) RestoreTimestamps(path string) error { func (node Node) createDirAt(path string) error { err := fs.Mkdir(path, node.Mode) - if err != nil { + if err != nil && !os.IsExist(err) { return errors.Wrap(err, "Mkdir") } diff --git a/src/restic/node_test.go b/src/restic/node_test.go index a2e175b14..e219d8926 100644 --- a/src/restic/node_test.go +++ b/src/restic/node_test.go @@ -137,6 +137,31 @@ var nodeTests = []restic.Node{ AccessTime: parseTime("2015-05-14 21:07:24.222"), ChangeTime: parseTime("2015-05-14 21:07:25.333"), }, + + // include "testFile" and "testDir" again with slightly different + // metadata, so we can test if CreateAt works with pre-existing files. + restic.Node{ + Name: "testFile", + Type: "file", + Content: restic.IDs{}, + UID: uint32(os.Getuid()), + GID: uint32(os.Getgid()), + Mode: 0604, + ModTime: parseTime("2005-05-14 21:07:03.111"), + AccessTime: parseTime("2005-05-14 21:07:04.222"), + ChangeTime: parseTime("2005-05-14 21:07:05.333"), + }, + restic.Node{ + Name: "testDir", + Type: "dir", + Subtree: nil, + UID: uint32(os.Getuid()), + GID: uint32(os.Getgid()), + Mode: 0750 | os.ModeDir, + ModTime: parseTime("2005-05-14 21:07:03.111"), + AccessTime: parseTime("2005-05-14 21:07:04.222"), + ChangeTime: parseTime("2005-05-14 21:07:05.333"), + }, } func TestNodeRestoreAt(t *testing.T) {