diff --git a/src/Project.zig b/src/Project.zig index 798ced0..1a7bd8b 100644 --- a/src/Project.zig +++ b/src/Project.zig @@ -20,6 +20,7 @@ open_time: i64, language_servers: std.StringHashMap(LSP), file_language_server: std.StringHashMap(LSP), tasks: std.ArrayList(Task), +persistent: bool = false, const Self = @This(); @@ -130,6 +131,7 @@ pub fn restore_state(self: *Self, data: []const u8) !void { error.InvalidType => return self.restore_state_v0(data), else => return tp.trace(tp.channel.debug, .{ "restore_state", "unknown format", data }), }; + self.persistent = true; return self.restore_state_v1(data); } diff --git a/src/main.zig b/src/main.zig index 7ae0a2a..acf34d4 100644 --- a/src/main.zig +++ b/src/main.zig @@ -53,6 +53,7 @@ pub fn main() anyerror!void { pub const descriptions = .{ .project = "Set project directory (default: cwd)", + .no_persist = "Do not persist new projects", .frame_rate = "Set target frame rate (default: 60)", .debug_wait = "Wait for key press before starting UI", .debug_dump_on_error = "Dump stack traces on errors", @@ -76,6 +77,7 @@ pub fn main() anyerror!void { pub const switches = .{ .project = 'p', + .no_persist = 'N', .frame_rate = 'f', .trace_level = 't', .language = 'l', @@ -85,6 +87,7 @@ pub fn main() anyerror!void { }; project: ?[]const u8, + no_persist: bool, frame_rate: ?usize, debug_wait: bool, debug_dump_on_error: bool, @@ -202,6 +205,7 @@ pub fn main() anyerror!void { log.set_std_log_pid(log_proc.ref()); defer log.set_std_log_pid(null); + env.set("no-persist", args.no_persist); env.set("restore-session", args.restore_session); env.set("no-alternate", args.no_alternate); env.set("show-input", args.show_input); diff --git a/src/project_manager.zig b/src/project_manager.zig index 2795012..b749397 100644 --- a/src/project_manager.zig +++ b/src/project_manager.zig @@ -423,6 +423,7 @@ const Process = struct { fn close(self: *Process, project_directory: []const u8) error{}!void { if (self.projects.fetchRemove(project_directory)) |kv| { self.allocator.free(kv.key); + self.persist_project(kv.value) catch {}; kv.value.deinit(); self.allocator.destroy(kv.value); self.logger.print("closed: {s}", .{project_directory}); @@ -629,6 +630,8 @@ const Process = struct { } fn persist_project(self: *Process, project: *Project) !void { + const no_persist = tp.env.get().is("no-persist"); + if (no_persist and !project.persistent) return; tp.trace(tp.channel.debug, .{ "persist_project", project.name }); self.logger.print("saving: {s}", .{project.name}); const file_name = try get_project_state_file_path(self.allocator, project);