diff options
author | 2021-11-01 04:27:44 -0700 | |
---|---|---|
committer | 2021-11-01 04:27:44 -0700 | |
commit | 4467167f995707ba5dc1c3fda9bda8836862942a (patch) | |
tree | 172c654325dcc5bd0140a873bb132c4a3fbaf1aa | |
parent | 36ec8bb99bb0ed42088e6d50111e92ed39ca5e24 (diff) | |
download | bun-4467167f995707ba5dc1c3fda9bda8836862942a.tar.gz bun-4467167f995707ba5dc1c3fda9bda8836862942a.tar.zst bun-4467167f995707ba5dc1c3fda9bda8836862942a.zip |
[cli] just open the directory, `access` is dumb
Diffstat (limited to '')
-rw-r--r-- | src/cli.zig | 87 |
1 files changed, 19 insertions, 68 deletions
diff --git a/src/cli.zig b/src/cli.zig index f26bd4b6f..732e16094 100644 --- a/src/cli.zig +++ b/src/cli.zig @@ -642,7 +642,7 @@ pub const Command = struct { } var completions_dir: string = ""; - found: { + var output_dir: std.fs.Dir = found: { var cwd_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; var cwd = std.os.getcwd(&cwd_buf) catch { Output.prettyErrorln("<r><red>error<r>: Could not get current working directory", .{}); @@ -669,13 +669,13 @@ pub const Command = struct { std.os.exit(1); } - std.os.access(completions_dir, std.os.O_DIRECTORY | std.os.O_WRONLY) catch |err| { + break :found std.fs.openDirAbsolute(completions_dir, .{ + .iterate = true, + }) catch |err| { Output.prettyErrorln("<r><red>error:<r> accessing {s} errored {s}", .{ completions_dir, @errorName(err) }); Output.flush(); std.os.exit(1); }; - - break :found; } break; @@ -688,15 +688,9 @@ pub const Command = struct { outer: { var paths = [_]string{ std.mem.span(config_dir), "./fish/completions" }; completions_dir = resolve_path.joinAbsString(cwd, &paths, .auto); - std.os.access(completions_dir, std.os.O_DIRECTORY | std.os.O_WRONLY) catch |err| { - Output.prettyErrorln("<r><red>{s}:<r> accessing {s}, trying next one.", .{ - @errorName(err), - completions_dir, - }); - Output.flush(); + break :found std.fs.openDirAbsolute(completions_dir, .{ .iterate = true }) catch |err| { break :outer; }; - break :found; } } @@ -705,16 +699,9 @@ pub const Command = struct { var paths = [_]string{ std.mem.span(data_dir), "./fish/completions" }; completions_dir = resolve_path.joinAbsString(cwd, &paths, .auto); - std.os.access(completions_dir, std.os.O_DIRECTORY | std.os.O_WRONLY) catch |err| { - Output.prettyErrorln("<r><red>{s}:<r> accessing {s}, trying next one.", .{ - @errorName(err), - completions_dir, - }); - Output.flush(); + break :found std.fs.openDirAbsolute(completions_dir, .{ .iterate = true }) catch |err| { break :outer; }; - - break :found; } } @@ -722,15 +709,9 @@ pub const Command = struct { outer: { var paths = [_]string{ std.mem.span(home_dir), "./.config/fish/completions" }; completions_dir = resolve_path.joinAbsString(cwd, &paths, .auto); - std.os.access(completions_dir, std.os.O_DIRECTORY | std.os.O_WRONLY) catch |err| { - Output.prettyErrorln("<r><red>{s}:<r> accessing {s}, trying next one.", .{ - @errorName(err), - completions_dir, - }); - Output.flush(); + break :found std.fs.openDirAbsolute(completions_dir, .{ .iterate = true }) catch |err| { break :outer; }; - break :found; } } @@ -739,42 +720,22 @@ pub const Command = struct { if (!Environment.isAarch64) { // homebrew fish completions_dir = "/usr/local/share/fish/completions"; - std.os.access(completions_dir, std.os.O_WRONLY | std.os.O_DIRECTORY) catch |err| { - Output.prettyErrorln("<r><red>{s}:<r> accessing {s}, trying next one.", .{ - @errorName(err), - completions_dir, - }); - Output.flush(); + break :found std.fs.openDirAbsoluteZ("/usr/local/share/fish/completions", .{ .iterate = true }) catch |err| { break :outer; }; - break :found; } else { // homebrew fish completions_dir = "/opt/homebrew/share/fish/completions"; - std.os.access(completions_dir, std.os.O_WRONLY | std.os.O_DIRECTORY) catch |err| { - Output.prettyErrorln("<r><red>{s}:<r> accessing {s}, trying next one.", .{ - @errorName(err), - completions_dir, - }); - Output.flush(); + break :found std.fs.openDirAbsoluteZ("/opt/homebrew/share/fish/completions", .{ .iterate = true }) catch |err| { break :outer; }; - break :found; } } } - { + outer: { completions_dir = "/etc/fish/completions"; - std.os.access(completions_dir, std.os.O_WRONLY | std.os.O_DIRECTORY) catch |err| { - Output.prettyErrorln( - "<r><red>error:<r> Could not find a directory to install completions in. Please either pipe \"bun completions > /to/a/file\" or pass a directory in like this:\n bun completions /my/completions/dir", - .{}, - ); - Output.flush(); - std.os.exit(1); - }; - break :found; + break :found std.fs.openDirAbsoluteZ("/etc/fish/completions", .{ .iterate = true }) catch break :outer; } }, .zsh => { @@ -782,27 +743,26 @@ pub const Command = struct { var splitter = std.mem.split(u8, std.mem.span(fpath), " "); while (splitter.next()) |dir| { - std.os.access(dir, std.os.O_DIRECTORY | std.os.O_WRONLY) catch continue; completions_dir = dir; - break :found; + break :found std.fs.openDirAbsolute(dir, .{ .iterate = true }) catch continue; } } }, - .bash => { - Output.prettyErrorln("<r><red>error:<r> Please pass a directory or pipe to a file. Not sure where bash completions go.", .{}); - Output.flush(); - std.os.exit(1); - }, + .bash => {}, else => unreachable, } Output.prettyErrorln( - "<r><red>error:<r> Could not find a directory to install completions in. Please either pipe \"bun completions > /to/a/file\" or pass a directory in like this:\n bun completions /my/completions/dir", + "<r><red>error:<r> Could not find a directory to install completions in.\n", + .{}, + ); + Output.errorLn( + "Please either pipe it:\n bun completions > /to/a/file\n\n Or pass a directory:\n\n bun completions /my/completions/dir\n", .{}, ); Output.flush(); std.os.exit(1); - } + }; const filename = switch (shell) { .fish => "bun.fish", @@ -813,15 +773,6 @@ pub const Command = struct { std.debug.assert(completions_dir.len > 0); - var output_dir = std.fs.openDirAbsolute(completions_dir, .{ .iterate = true }) catch |err| { - Output.prettyErrorln("<r><red>error:<r> Could not open {s} for writing: {s}", .{ - completions_dir, - @errorName(err), - }); - Output.flush(); - std.os.exit(1); - }; - var output_file = output_dir.createFileZ(filename, .{ .truncate = true, }) catch |err| { |