From 802203b9bb43d74cdf0f3ae25fb850c922aa3ccd Mon Sep 17 00:00:00 2001 From: Robert Günzler Date: Sun, 5 Oct 2025 18:32:28 +0200 Subject: FileSwapper: support undo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Robert Günzler --- src/fs.zig | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/fs.zig b/src/fs.zig index eb8c3e0..819b8d2 100644 --- a/src/fs.zig +++ b/src/fs.zig @@ -43,13 +43,31 @@ pub const FileSwapper = struct { return self.tmp.writer(); } - fn target_exists(self: FileSwapper) !bool { - var found = true; + pub fn diff(self: FileSwapper) !bool { + var target_found = true; std.fs.cwd().access(self.target_path, .{}) catch |e| switch (e) { - error.FileNotFound => found = false, + error.FileNotFound => target_found = false, else => |err| return err, }; - return found; + + // exit early if target_path was not found + if (!target_found) return error.TargetNotFound; + + var p = std.process.Child.init(&.{ + "diff", + "-q", + self.tmp_path, + self.target_path, + }, std.heap.page_allocator); + try p.spawn(); + switch (try p.wait()) { + .Exited => |exit_code| switch (exit_code) { + 0 => return false, + 1 => return true, + else => return error.UnknownDiffError, + }, + else => return error.UnknownDiffError, + } } pub fn swap(self: FileSwapper) !void { @@ -69,6 +87,10 @@ pub const FileSwapper = struct { ); } + pub fn undo(self: FileSwapper) !void { + try std.posix.unlink(self.tmp_path); + } + pub fn close(self: FileSwapper) void { var found = true; std.fs.cwd().access(self.tmp_path, .{}) catch |e| switch (e) { -- cgit 1.4.1