diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.zig | 39 |
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); |