]> ruderich.org/simon Gitweb - safcm/safcm.git/commitdiff
remote: support creating files with missing parents in dry-run
authorSimon Ruderich <simon@ruderich.org>
Sun, 15 Jan 2023 09:44:12 +0000 (10:44 +0100)
committerSimon Ruderich <simon@ruderich.org>
Sun, 15 Jan 2023 09:44:12 +0000 (10:44 +0100)
The actual run worked fine but the dry-run failed because the parent
directory does not exist at that point.

remote/sync/files.go
remote/sync/files_test.go

index 20f8505c0fff92a27f638575bda6a0c611ce2ad5..56c9ff0003af3c35d9153ba471655479bbc33efe 100644 (file)
@@ -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)
index bae25972b251a673bbf4870e2d453e0a0a75cd4c..81efd0801890727629cdffb896e2d7fc49a76195 100644 (file)
@@ -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{},