From b195a94aebee840314f16313e34a5438137adab6 Mon Sep 17 00:00:00 2001 From: Tim Culverhouse Date: Wed, 14 May 2025 10:59:18 -0800 Subject: [PATCH] opts: allow files as args Fixes: https://tangled.sh/@rockorager.dev/lsr/issues/3 --- build.zig.zon | 4 ++-- src/main.zig | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index ebbf308..89cfde1 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -7,8 +7,8 @@ .dependencies = .{ .ourio = .{ - .url = "git+https://github.com/rockorager/ourio#54c1a1ed8d0994636770e5185ecdb59fe6d8535e", - .hash = "ourio-0.0.0-_s-z0asOAgAhpi7gSpLLvWGj_4XURez4W9TWN6SGs5BP", + .url = "git+https://github.com/rockorager/ourio#17280493cff33a4713d7df39933557792789f002", + .hash = "ourio-0.0.0-_s-z0fsOAgBBgWaFDe0-yxAFdOJYN0ySemeXbEghPUh9", }, .zeit = .{ .url = "git+https://github.com/rockorager/zeit#4496d1c40b2223c22a1341e175fc2ecd94cc0de9", diff --git a/src/main.zig b/src/main.zig index 0132fab..fbd2531 100644 --- a/src/main.zig +++ b/src/main.zig @@ -43,6 +43,7 @@ const Options = struct { reverse_sort: bool = false, directory: [:0]const u8 = ".", + file: ?[]const u8 = null, winsize: ?posix.winsize = null, colors: Colors = .none, @@ -775,7 +776,32 @@ fn onCompletion(io: *ourio.Ring, task: ourio.Task) anyerror!void { switch (msg) { .cwd => { - const fd = try result.open; + const fd = result.open catch |err| { + switch (err) { + error.NotDir => { + // Guard against infinite recursion + if (cmd.opts.file != null) return err; + + // if the user specified a file (or something that couldn't be opened as a + // directory), then we open it's parent and apply a filter + const dirname = std.fs.path.dirname(cmd.opts.directory) orelse "."; + cmd.opts.file = std.fs.path.basename(cmd.opts.directory); + cmd.opts.directory = try cmd.arena.dupeZ(u8, dirname); + _ = try io.open( + cmd.opts.directory, + .{ .DIRECTORY = true, .CLOEXEC = true }, + 0, + .{ + .ptr = cmd, + .cb = onCompletion, + .msg = @intFromEnum(Msg.cwd), + }, + ); + return; + }, + else => return err, + } + }; // we are async, no need to defer! _ = try io.close(fd, .{}); const dir: std.fs.Dir = .{ .fd = fd }; @@ -806,6 +832,16 @@ fn onCompletion(io: *ourio.Ring, task: ourio.Task) anyerror!void { var iter = dir.iterate(); while (try iter.next()) |dirent| { if (!cmd.opts.showDotfiles() and std.mem.startsWith(u8, dirent.name, ".")) continue; + if (cmd.opts.file) |file| { + if (eql(file, dirent.name)) { + const nameZ = try cmd.arena.dupeZ(u8, dirent.name); + try temp_results.append(cmd.arena, .{ + .name = nameZ, + .kind = dirent.kind, + }); + } + continue; + } const nameZ = try cmd.arena.dupeZ(u8, dirent.name); try temp_results.append(cmd.arena, .{ .name = nameZ, -- 2.51.2