about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2026-09-23 21:55:49 +0200
committerRobert Günzler <r@gnzler.io>2026-09-23 23:23:41 +0200
commit6919ecf4d05dfadc17cf4483b4ee13931667ff6e (patch)
tree867c433621055682dac1886842a47568190bcf6b /src
parent28ff7b629e2e67d27e1f6fa6e0d951e11ecc903c (diff)
downloadsite-6919ecf4d05dfadc17cf4483b4ee13931667ff6e.tar.gz
open target files with O_TRUNC
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to 'src')
-rw-r--r--src/main.zig39
1 files changed, 20 insertions, 19 deletions
diff --git a/src/main.zig b/src/main.zig
index 80dd1bb..82ea8f9 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -384,22 +384,20 @@ const Builder = struct {
         const target_path = try std.fmt.allocPrint(gpa, "{s}.html", .{source_stem});
         defer gpa.free(target_path);
 
-        // atomic?
-        const target_fd = try self.target_dir.createFile(io, target_path, .{
-            .lock = .exclusive,
-            .read = true,
-            .truncate = false,
-        });
-        defer target_fd.close(io);
-
         // check if we need to do any work
-        if (try targetExists(io, gpa, target_fd, self.root_dir)) {
+        if (try targetExists(io, gpa, self.target_dir, target_path, self.root_dir)) {
             defer log.debug("{s}: done", .{self.source.path});
             return; // skip any further processing
         }
 
         log.debug("{s}: writing", .{self.source.path});
 
+        // atomic?
+        const target_fd = try self.target_dir.createFile(io, target_path, .{
+            .lock = .exclusive,
+        });
+        defer target_fd.close(io);
+
         var writer_buf: [BUFFER_SIZE]u8 = undefined;
         var writer = target_fd.writer(io, &writer_buf);
 
@@ -564,17 +562,15 @@ const Builder = struct {
         log.debug("meta.tilde : {s}", .{source_stem});
 
         const content = std.mem.trim(u8, self.source.mmap.memory, "\n\t\r");
-        const target_name = try std.fmt.allocPrint(gpa, "~{s}", .{source_stem});
-        defer gpa.free(target_name);
+        const target_path = try std.fmt.allocPrint(gpa, "~{s}", .{source_stem});
+        defer gpa.free(target_path);
 
+        if (try targetExists(io, gpa, self.target_dir, target_path, self.root_dir)) return;
         // TODO: allow customizing tilde dir
-        const target_fd = try self.target_dir.createFile(io, target_name, .{
+        const target_fd = try self.target_dir.createFile(io, target_path, .{
             .lock = .exclusive,
-            .read = true,
-            .truncate = false,
         });
         defer target_fd.close(io);
-        if (try targetExists(io, gpa, target_fd, self.root_dir)) return;
 
         var buffer: [BUFFER_SIZE]u8 = undefined;
         var writer = target_fd.writer(io, &buffer);
@@ -615,13 +611,11 @@ const Builder = struct {
         const source_stem = std.fs.path.basename(self.source.path)[5..]; // trim "meta."
         log.debug("meta.feed : {s}", .{source_stem});
 
+        if (try targetExists(io, gpa, self.target_dir, source_stem, self.root_dir)) return;
         const target_fd = try self.target_dir.createFile(io, source_stem, .{
             .lock = .exclusive,
-            .read = true,
-            .truncate = false,
         });
         defer target_fd.close(io);
-        if (try targetExists(io, gpa, target_fd, self.root_dir)) return;
 
         var buffer: [BUFFER_SIZE]u8 = undefined;
         var writer = target_fd.writer(io, &buffer);
@@ -648,9 +642,16 @@ fn formatLink(gpa: Allocator, name: []const u8, offset: ?[]const u8) ![]u8 {
     return link;
 }
 
-fn targetExists(io: Io, gpa: Allocator, target_fd: Io.File, root_dir: Io.Dir) !bool {
+fn targetExists(io: Io, gpa: Allocator, target_dir: Io.Dir, sub_path: []const u8, root_dir: Io.Dir) !bool {
     if (FORCE) return false;
 
+    const target_fd = target_dir.openFile(io, sub_path, .{}) catch |err|
+        switch (err) {
+            error.FileNotFound => return false,
+            else => return err,
+        };
+    defer target_fd.close(io);
+
     const target_parts = try getXattrSourceComponents(gpa, target_fd) orelse return false;
     defer gpa.free(target_parts);
     defer for (target_parts) |p| gpa.free(p);