From d71e6273b6acd766eea6c37b8f53ae03cb2bd9f6 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 16 Dec 2023 01:49:06 -0700 Subject: [PATCH] std.fs.Dir.atomicFile: provide an option for make path It's useful for the API to support creating the parent directory. --- lib/std/fs/Dir.zig | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/std/fs/Dir.zig b/lib/std/fs/Dir.zig index b637e664f1..4a45975ccc 100644 --- a/lib/std/fs/Dir.zig +++ b/lib/std/fs/Dir.zig @@ -2416,15 +2416,21 @@ fn copy_file(fd_in: posix.fd_t, fd_out: posix.fd_t, maybe_size: ?u64) CopyFileRa pub const AtomicFileOptions = struct { mode: File.Mode = File.default_mode, + make_path: bool = false, }; -/// Directly access the `.file` field, and then call `AtomicFile.finish` -/// to atomically replace `dest_path` with contents. -/// Always call `AtomicFile.deinit` to clean up, regardless of whether `AtomicFile.finish` succeeded. -/// `dest_path` must remain valid until `AtomicFile.deinit` is called. +/// Directly access the `.file` field, and then call `AtomicFile.finish` to +/// atomically replace `dest_path` with contents. +/// Always call `AtomicFile.deinit` to clean up, regardless of whether +/// `AtomicFile.finish` succeeded. `dest_path` must remain valid until +/// `AtomicFile.deinit` is called. pub fn atomicFile(self: Dir, dest_path: []const u8, options: AtomicFileOptions) !AtomicFile { if (fs.path.dirname(dest_path)) |dirname| { - const dir = try self.openDir(dirname, .{}); + const dir = if (options.make_path) + try self.makeOpenPath(dirname, .{}) + else + try self.openDir(dirname, .{}); + return AtomicFile.init(fs.path.basename(dest_path), options.mode, dir, true); } else { return AtomicFile.init(dest_path, options.mode, self, false);