diff options
Diffstat (limited to 'internal/engine/apply.go')
| -rw-r--r-- | internal/engine/apply.go | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/internal/engine/apply.go b/internal/engine/apply.go index e109aaf..09f3aab 100644 --- a/internal/engine/apply.go +++ b/internal/engine/apply.go @@ -1006,12 +1006,19 @@ func runUndoStep(step UndoStep) apply.StepResult { // put it explicitly (fix round 1, item 3) - never re-derived from // Src or Dst's shape, which belong to internal/apply's and this // file's own conventions and must stay free to change independently. + // The directory the file goes back into is created here, tracked, + // rather than silently by trash.Restore, so ApplyUndo removes it again + // when it ends up empty (review undo F6). + made, err := apply.MkdirAllTracked(filepath.Dir(step.Dst)) + if err != nil { + return apply.StepResult{Status: "failed", Detail: err.Error(), Made: made} + } restored, err := trash.Restore(step.Original.Detail) if err != nil { - return apply.StepResult{Status: "failed", Detail: err.Error()} + return apply.StepResult{Status: "failed", Detail: err.Error(), Made: made} } size, mtime := statSizeModTime(restored) - return apply.StepResult{Status: "ok", Dst: restored, Size: size, ModTime: mtime} + return apply.StepResult{Status: "ok", Dst: restored, Size: size, ModTime: mtime, Made: made} case "undo-mkdir": if err := os.Remove(step.Src); err != nil { |
