about summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/fs.zig30
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) {