From e0240a60023841709f8095e475d13d090f17e915 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Sun, 15 Jan 2023 10:44:12 +0100 Subject: [PATCH] remote: support creating files with missing parents in dry-run The actual run worked fine but the dry-run failed because the parent directory does not exist at that point. --- remote/sync/files.go | 8 +++++ remote/sync/files_test.go | 75 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/remote/sync/files.go b/remote/sync/files.go index 20f8505..56c9ff0 100644 --- a/remote/sync/files.go +++ b/remote/sync/files.go @@ -132,6 +132,14 @@ func (s *Sync) syncFile(file *safcm.File, changed *bool) error { parentFd, baseName, err := OpenParentDirectoryNoSymlinks(file.Path) if err != nil { + if os.IsNotExist(err) && s.req.DryRun { + change.Created = true + debugf("will create (parent missing)") + *changed = true + debugf("dry-run, skipping changes") + s.resp.FileChanges = append(s.resp.FileChanges, change) + return nil + } return err } defer unix.Close(parentFd) diff --git a/remote/sync/files_test.go b/remote/sync/files_test.go index bae2597..81efd08 100644 --- a/remote/sync/files_test.go +++ b/remote/sync/files_test.go @@ -1006,6 +1006,44 @@ func TestSyncFile(t *testing.T) { nil, }, + { + "file: create, missing parent (dry-run)", + safcm.MsgSyncReq{ + DryRun: true, + }, + &safcm.File{ + Path: "does-not-exist/file", + Mode: 0644, + Uid: -1, + Gid: -1, + Data: []byte("content\n"), + OrigGroup: "group", + }, + nil, + true, + []ft.File{root}, + safcm.MsgSyncResp{ + FileChanges: []safcm.FileChange{ + { + Path: "does-not-exist/file", + Created: true, + New: safcm.FileChangeInfo{ + Mode: 0644, + User: user, + Uid: uid, + Group: group, + Gid: gid, + }, + }, + }, + }, + []string{ + `4: files: "does-not-exist/file" (group): will create (parent missing)`, + `4: files: "does-not-exist/file" (group): dry-run, skipping changes`, + }, + nil, + }, + { "file: unchanged", safcm.MsgSyncReq{}, @@ -1486,6 +1524,43 @@ func TestSyncFile(t *testing.T) { nil, }, + { + "directory: create, missing parent (dry-run)", + safcm.MsgSyncReq{ + DryRun: true, + }, + &safcm.File{ + Path: "does-not-exist/dir", + Mode: fs.ModeDir | 0755, + Uid: -1, + Gid: -1, + OrigGroup: "group", + }, + nil, + true, + []ft.File{root}, + safcm.MsgSyncResp{ + FileChanges: []safcm.FileChange{ + { + Path: "does-not-exist/dir", + Created: true, + New: safcm.FileChangeInfo{ + Mode: fs.ModeDir | 0755, + User: user, + Uid: uid, + Group: group, + Gid: gid, + }, + }, + }, + }, + []string{ + `4: files: "does-not-exist/dir" (group): will create (parent missing)`, + `4: files: "does-not-exist/dir" (group): dry-run, skipping changes`, + }, + nil, + }, + { "directory: unchanged", safcm.MsgSyncReq{}, -- 2.43.2