diff options
| author | Robert Günzler <r@gnzler.io> | 2025-10-05 18:32:28 +0200 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2025-10-06 14:32:30 +0200 |
| commit | 802203b9bb43d74cdf0f3ae25fb850c922aa3ccd (patch) | |
| tree | ac3e581fd9062a14a425c56ddd13d12c50e0fe05 /src/fs.zig | |
| parent | 99647725d1f347135282d883fdc40bf633200ffc (diff) | |
| download | site-802203b9bb43d74cdf0f3ae25fb850c922aa3ccd.tar.gz | |
FileSwapper: support undo
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to 'src/fs.zig')
| -rw-r--r-- | src/fs.zig | 30 |
1 files changed, 26 insertions, 4 deletions
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) { |