╭ changed ───╮ │src/fork.zig│ ╰────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────────────╮ │429 } │ │430 } │ │431 │ │432 -// delete first so a failed tombstone can be retried safely│ │432 +// tombstone first so a missing fork never remains visible │ │433 pub fn remove( │ │434 io: std.Io, │ │435 allocator: std.mem.Allocator, │ ╰────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │445 const moment = try evt.currentMoment(evt.admin_repo_opts, admin_repo); │ │446 const record = (try evt.Fork.readById(evt.AdminDB, evt.admin_repo_opts.hash, moment, &arena, &fork_id)) orelse return error.InvalidPatchDraft;│ │447 if (!std.mem.eql(u8, record.event.user_id, user_id)) return error.InvalidPatchDraft; │ │448 + if (!record.removed) try evt.remove(.admin, .xit, evt.admin_repo_opts, io, allocator, admin_repo, &fork_id, .fork, author); │ │449 │ │450 const path = try forkPath(allocator, repo_root_path, id); │ │451 defer allocator.free(path); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │452 try std.Io.Dir.cwd().deleteTree(io, path); │ │452 - if (!record.removed) try evt.remove(.admin, .xit, evt.admin_repo_opts, io, allocator, admin_repo, &fork_id, .fork, author);│ │453 } │ │454 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯