aboutsummaryrefslogtreecommitdiff
path: root/internal/engine/apply.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/engine/apply.go')
-rw-r--r--internal/engine/apply.go11
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 {