this repo has no description

opts: allow files as args

Fixes: https://tangled.sh/@rockorager.dev/lsr/issues/3

rockorager.dev b195a94a 87b0c6bd

verified
+39 -3
+2 -2
build.zig.zon
··· 7 7 8 8 .dependencies = .{ 9 9 .ourio = .{ 10 - .url = "git+https://github.com/rockorager/ourio#54c1a1ed8d0994636770e5185ecdb59fe6d8535e", 11 - .hash = "ourio-0.0.0-_s-z0asOAgAhpi7gSpLLvWGj_4XURez4W9TWN6SGs5BP", 10 + .url = "git+https://github.com/rockorager/ourio#17280493cff33a4713d7df39933557792789f002", 11 + .hash = "ourio-0.0.0-_s-z0fsOAgBBgWaFDe0-yxAFdOJYN0ySemeXbEghPUh9", 12 12 }, 13 13 .zeit = .{ 14 14 .url = "git+https://github.com/rockorager/zeit#4496d1c40b2223c22a1341e175fc2ecd94cc0de9",
+37 -1
src/main.zig
··· 43 43 reverse_sort: bool = false, 44 44 45 45 directory: [:0]const u8 = ".", 46 + file: ?[]const u8 = null, 46 47 47 48 winsize: ?posix.winsize = null, 48 49 colors: Colors = .none, ··· 775 776 776 777 switch (msg) { 777 778 .cwd => { 778 - const fd = try result.open; 779 + const fd = result.open catch |err| { 780 + switch (err) { 781 + error.NotDir => { 782 + // Guard against infinite recursion 783 + if (cmd.opts.file != null) return err; 784 + 785 + // if the user specified a file (or something that couldn't be opened as a 786 + // directory), then we open it's parent and apply a filter 787 + const dirname = std.fs.path.dirname(cmd.opts.directory) orelse "."; 788 + cmd.opts.file = std.fs.path.basename(cmd.opts.directory); 789 + cmd.opts.directory = try cmd.arena.dupeZ(u8, dirname); 790 + _ = try io.open( 791 + cmd.opts.directory, 792 + .{ .DIRECTORY = true, .CLOEXEC = true }, 793 + 0, 794 + .{ 795 + .ptr = cmd, 796 + .cb = onCompletion, 797 + .msg = @intFromEnum(Msg.cwd), 798 + }, 799 + ); 800 + return; 801 + }, 802 + else => return err, 803 + } 804 + }; 779 805 // we are async, no need to defer! 780 806 _ = try io.close(fd, .{}); 781 807 const dir: std.fs.Dir = .{ .fd = fd }; ··· 806 832 var iter = dir.iterate(); 807 833 while (try iter.next()) |dirent| { 808 834 if (!cmd.opts.showDotfiles() and std.mem.startsWith(u8, dirent.name, ".")) continue; 835 + if (cmd.opts.file) |file| { 836 + if (eql(file, dirent.name)) { 837 + const nameZ = try cmd.arena.dupeZ(u8, dirent.name); 838 + try temp_results.append(cmd.arena, .{ 839 + .name = nameZ, 840 + .kind = dirent.kind, 841 + }); 842 + } 843 + continue; 844 + } 809 845 const nameZ = try cmd.arena.dupeZ(u8, dirent.name); 810 846 try temp_results.append(cmd.arena, .{ 811 847 .name = nameZ,