From 1533ec29931632bc1f057de08b385762fe553077 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Sun, 23 Jun 2024 21:27:54 +0200 Subject: [PATCH] feat: allow opening project directories on the command line --- src/main.zig | 36 ++++++++++++++++++++++++++++++++++-- src/project_manager.zig | 3 +++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/main.zig b/src/main.zig index cf6c96f..054b924 100644 --- a/src/main.zig +++ b/src/main.zig @@ -38,7 +38,7 @@ pub fn main() anyerror!void { \\--show-input Open the input view on start. \\--show-log Open the log view on start. \\-l, --language Force the language of the file to be opened. - \\... File to open. + \\... File or directory to open. \\ Add + to the command line or append \\ :LINE or :LINE:COL to the file name to jump \\ to a location in the file. @@ -195,8 +195,28 @@ pub fn main() anyerror!void { } } + var have_project = false; + var files = std.ArrayList(Dest).init(a); + defer files.deinit(); for (dests.items) |dest| { if (dest.file.len == 0) continue; + if (try is_directory(dest.file)) { + if (have_project) { + std.debug.print("more than one directory is not allowed\n", .{}); + exit(1); + } + try tui_proc.send(.{ "cmd", "open_project_dir", .{dest.file} }); + + have_project = true; + } else { + const curr = try files.addOne(); + curr.* = dest; + } + } + + for (files.items) |dest| { + if (dest.file.len == 0) continue; + if (dest.line) |l| { if (dest.column) |col| { try tui_proc.send(.{ "cmd", "navigate", .{ .file = dest.file, .line = l, .column = col } }); @@ -209,7 +229,8 @@ pub fn main() anyerror!void { try tui_proc.send(.{ "cmd", "navigate", .{ .file = dest.file } }); } } else { - try tui_proc.send(.{ "cmd", "open_project_cwd" }); + if (!have_project) + try tui_proc.send(.{ "cmd", "open_project_cwd" }); try tui_proc.send(.{ "cmd", "show_home" }); } ctx.run(); @@ -536,3 +557,14 @@ fn restart() noreturn { std.io.getStdErr().writer().print("\nrestart failed: {d}", .{ret}) catch {}; exit(234); } + +pub fn is_directory(rel_path: []const u8) !bool { + var path_buf: [std.fs.max_path_bytes]u8 = undefined; + const abs_path = try std.fs.cwd().realpath(rel_path, &path_buf); + var dir = std.fs.openDirAbsolute(abs_path, .{}) catch |e| switch (e) { + error.NotDir => return false, + else => return e, + }; + dir.close(); + return true; +} diff --git a/src/project_manager.zig b/src/project_manager.zig index bbdded7..5d093f6 100644 --- a/src/project_manager.zig +++ b/src/project_manager.zig @@ -41,6 +41,9 @@ pub fn open_cwd() tp.result { pub fn open(rel_project_directory: []const u8) tp.result { var path_buf: [std.fs.max_path_bytes]u8 = undefined; const project_directory = std.fs.cwd().realpath(rel_project_directory, &path_buf) catch "(none)"; + var dir = std.fs.openDirAbsolute(project_directory, .{}) catch |e| return tp.exit_error(e); + dir.setAsCwd() catch |e| return tp.exit_error(e); + dir.close(); tp.env.get().str_set("project", project_directory); return (try get()).pid.send(.{ "open", project_directory }); }