From 5b852fdb3dfb81e33f54b1b337a1490d067ec680 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Wed, 13 Aug 2025 12:08:24 +0200 Subject: [PATCH] fix: prevent crash on invalid project directory --- src/project_manager.zig | 3 ++- src/tui/MessageFilter.zig | 1 + src/tui/mainview.zig | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/project_manager.zig b/src/project_manager.zig index 1c4d6e5..925294a 100644 --- a/src/project_manager.zig +++ b/src/project_manager.zig @@ -27,7 +27,7 @@ const OutOfMemoryError = error{OutOfMemory}; const FileSystemError = error{FileSystem}; const SetCwdError = if (builtin.os.tag == .windows) error{UnrecognizedVolume} else error{}; const CallError = tp.CallError; -const ProjectManagerError = (SpawnError || error{ProjectManagerFailed}); +const ProjectManagerError = (SpawnError || error{ ProjectManagerFailed, InvalidProjectDirectory }); pub fn get() SpawnError!Self { const pid = tp.env.get().proc(module_name); @@ -63,6 +63,7 @@ pub fn open(rel_project_directory: []const u8) (ProjectManagerError || FileSyste const project_directory = std.fs.cwd().realpath(rel_project_directory, &path_buf) catch "(none)"; const current_project = tp.env.get().str("project"); if (std.mem.eql(u8, current_project, project_directory)) return; + if (!root.is_directory(project_directory)) return error.InvalidProjectDirectory; var dir = try std.fs.openDirAbsolute(project_directory, .{}); try dir.setAsCwd(); dir.close(); diff --git a/src/tui/MessageFilter.zig b/src/tui/MessageFilter.zig index afc1a37..6676e12 100644 --- a/src/tui/MessageFilter.zig +++ b/src/tui/MessageFilter.zig @@ -14,6 +14,7 @@ pub const Error = (cbor.Error || cbor.JsonEncodeError || error{ ThespianSpawnFailed, NoProject, ProjectManagerFailed, + InvalidProjectDirectory, SendFailed, }); diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index c726c6f..197fbcf 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -322,6 +322,7 @@ const cmds = struct { if (!try ctx.args.match(.{tp.extract(&project_dir)})) return; try self.check_all_not_dirty(); + try project_manager.open(project_dir); for (self.editors.items) |editor| { editor.clear_diagnostics(); try editor.close_file(.{}); @@ -332,7 +333,6 @@ const cmds = struct { try self.toggle_panel_view(filelist_view, false); self.buffer_manager.deinit(); self.buffer_manager = Buffer.Manager.init(self.allocator); - try project_manager.open(project_dir); const project = tp.env.get().str("project"); tui.rdr().set_terminal_working_directory(project); if (self.top_bar) |bar| _ = try bar.msg(.{ "PRJ", "open" });