From 49ea29a66254cc23265025a912a73c3e5b0c6ae5 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Mon, 14 Sep 2026 21:46:08 +0200 Subject: plan 9: property test compares directories and refuses to pass vacuously; undo tracks directories trash restores recreate --- internal/engine/apply.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'internal/engine/apply.go') 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 { -- cgit v1.3