地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.

fix: broken file writer caused from incorrect 0.14.0 -> 0.15.0 migration

Changed files
+16 -16
src
+11 -15
src/file_logger.zig
··· 24 24 file: ?std.fs.File, 25 25 26 26 pub fn init(dir: std.fs.Dir) FileLogger { 27 - var file: ?std.fs.File = null; 28 - if (!environment.fileExists(dir, LOG_PATH)) { 29 - file = dir.createFile(LOG_PATH, .{}) catch lbl: { 30 - std.log.err("Failed to create log file.", .{}); 31 - break :lbl null; 32 - }; 33 - } else { 34 - file = dir.openFile(LOG_PATH, .{ .mode = .write_only }) catch lbl: { 35 - std.log.err("Failed to open log file.", .{}); 36 - break :lbl null; 37 - }; 38 - } 27 + const file = dir.createFile(LOG_PATH, .{ .truncate = false, .read = true }) catch |err| { 28 + std.log.err("Failed to create/open log file: {s}", .{@errorName(err)}); 29 + return .{ .dir = dir, .file = null }; 30 + }; 39 31 40 32 return .{ .dir = dir, .file = file }; 41 33 } ··· 49 41 50 42 pub fn write(self: FileLogger, msg: []const u8, level: LogLevel) !void { 51 43 const file = if (self.file) |file| file else return error.NoLogFile; 52 - if (try file.tryLock(std.fs.File.Lock.shared)) { 44 + 45 + if (try file.tryLock(.exclusive)) { 53 46 defer file.unlock(); 54 - try file.seekFromEnd(0); 55 47 56 48 var buffer: [1024]u8 = undefined; 57 - var file_writer = file.writer(&buffer).interface; 49 + var file_writer_impl = file.writer(&buffer); 50 + const file_writer = &file_writer_impl.interface; 51 + try file_writer_impl.seekTo(file.getEndPos() catch 0); 52 + 58 53 try file_writer.print( 59 54 "({d}) {s}: {s}\n", 60 55 .{ std.time.timestamp(), LogLevel.toString(level), msg }, 61 56 ); 57 + try file_writer.flush(); 62 58 } 63 59 }
+5 -1
src/main.zig
··· 139 139 }, 140 140 }; 141 141 142 - app.file_logger = if (config.config_dir) |dir| FileLogger.init(dir) else null; 142 + app.file_logger = if (config.config_dir) |dir| FileLogger.init(dir) else logger: { 143 + std.log.err("Failed to initialise file logger - no config directory found", .{}); 144 + break :logger null; 145 + }; 146 + app.notification.loop = &app.loop; 143 147 144 148 try app.run(); 145 149