From adf1725737a81508227afb5f51d227654938f6cf Mon Sep 17 00:00:00 2001 From: Yhya Ibrahim Date: Mon, 2 Sep 2024 20:21:20 +0300 Subject: [PATCH 1/4] feat: in `list_languages` write a checkmark behind an executable and x if not an executable --- src/list_languages.zig | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/list_languages.zig b/src/list_languages.zig index 4ee50a2..c115c59 100644 --- a/src/list_languages.zig +++ b/src/list_languages.zig @@ -1,6 +1,7 @@ +const std = @import("std"); const syntax = @import("syntax"); -pub fn list(writer: anytype) !void { +pub fn list(allocator: std.mem.Allocator, writer: anytype) !void { var max_language_len: usize = 0; var max_langserver_len: usize = 0; var max_formatter_len: usize = 0; @@ -19,10 +20,25 @@ pub fn list(writer: anytype) !void { try write_string(writer, "Formatter", max_formatter_len); try writer.writeAll("\n"); + const bin_paths = std.process.getEnvVarOwned(allocator, "PATH") catch |err| switch (err) { + error.OutOfMemory => return error.OutOfMemory, + error.EnvironmentVariableNotFound, error.InvalidWtf8 => &.{}, + }; + + defer allocator.free(bin_paths); + for (syntax.FileType.file_types) |file_type| { try write_string(writer, file_type.name, max_language_len + 1); try write_segmented(writer, file_type.extensions, ",", max_extensions_len + 1); + + if (file_type.language_server) |language_server| + try write_checkmark(writer, try can_execute(allocator, bin_paths, language_server[0])); + try write_segmented(writer, file_type.language_server, " ", max_langserver_len + 1); + + if (file_type.formatter) |formatter| + try write_checkmark(writer, try can_execute(allocator, bin_paths, formatter[0])); + try write_segmented(writer, file_type.formatter, " ", max_formatter_len); try writer.writeAll("\n"); } @@ -44,6 +60,11 @@ fn write_string(writer: anytype, string: []const u8, pad: usize) !void { try write_padding(writer, string.len, pad); } +fn write_checkmark(writer: anytype, value: bool) !void { + if (value) try writer.writeAll("✓") else try writer.writeAll("✘"); + try writer.writeAll(" "); +} + fn write_segmented(writer: anytype, args_: ?[]const []const u8, sep: []const u8, pad: usize) !void { const args = args_ orelse return; var len: usize = 0; @@ -63,3 +84,19 @@ fn write_padding(writer: anytype, len: usize, pad_len: usize) !void { for (0..pad_len - len) |_| try writer.writeAll(" "); } +fn can_execute(allocator: std.mem.Allocator, bin_paths: []const u8, file_path: []const u8) std.mem.Allocator.Error!bool { + if (!std.process.can_spawn) return false; + + var bin_path_iterator = std.mem.splitAny(u8, bin_paths, ":"); + + while (bin_path_iterator.next()) |bin_path| { + const resolved_file_path = try std.fs.path.resolve(allocator, &.{ bin_path, file_path }); + defer allocator.free(resolved_file_path); + + std.posix.access(resolved_file_path, std.posix.X_OK) catch continue; + + return true; + } + + return false; +} From 7fad128304f45bb51e1e0015643b66a329bbd64a Mon Sep 17 00:00:00 2001 From: Yhya Ibrahim Date: Mon, 2 Sep 2024 20:33:46 +0300 Subject: [PATCH 2/4] fix: pass `allocator` to `list_languages.list` --- src/main.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.zig b/src/main.zig index 87247d5..733acb1 100644 --- a/src/main.zig +++ b/src/main.zig @@ -89,7 +89,7 @@ pub fn main() anyerror!void { return std.io.getStdOut().writeAll(@embedFile("version_info")); if (res.args.@"list-languages" != 0) - return list_languages.list(std.io.getStdOut().writer()); + return list_languages.list(a, std.io.getStdOut().writer()); if (builtin.os.tag != .windows) if (std.posix.getenv("JITDEBUG")) |_| thespian.install_debugger(); From 0e19fbdd75a39c35e8ccf7d0f8289aa2b6a32472 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 2 Sep 2024 21:02:34 +0200 Subject: [PATCH 3/4] fix: avoid list_languages.write_checkmark on windows until support is added --- src/list_languages.zig | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/list_languages.zig b/src/list_languages.zig index c115c59..1327f77 100644 --- a/src/list_languages.zig +++ b/src/list_languages.zig @@ -1,5 +1,6 @@ const std = @import("std"); const syntax = @import("syntax"); +const builtin = @import("builtin"); pub fn list(allocator: std.mem.Allocator, writer: anytype) !void { var max_language_len: usize = 0; @@ -31,13 +32,15 @@ pub fn list(allocator: std.mem.Allocator, writer: anytype) !void { try write_string(writer, file_type.name, max_language_len + 1); try write_segmented(writer, file_type.extensions, ",", max_extensions_len + 1); - if (file_type.language_server) |language_server| - try write_checkmark(writer, try can_execute(allocator, bin_paths, language_server[0])); + if (builtin.os.tag != .windows) + if (file_type.language_server) |language_server| + try write_checkmark(writer, try can_execute(allocator, bin_paths, language_server[0])); try write_segmented(writer, file_type.language_server, " ", max_langserver_len + 1); - if (file_type.formatter) |formatter| - try write_checkmark(writer, try can_execute(allocator, bin_paths, formatter[0])); + if (builtin.os.tag != .windows) + if (file_type.formatter) |formatter| + try write_checkmark(writer, try can_execute(allocator, bin_paths, formatter[0])); try write_segmented(writer, file_type.formatter, " ", max_formatter_len); try writer.writeAll("\n"); From 8810048f916ea369db0ab784de0991e0dcaecb2e Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 2 Sep 2024 21:11:27 +0200 Subject: [PATCH 4/4] fix: adjust list_languages column header alignment --- src/list_languages.zig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/list_languages.zig b/src/list_languages.zig index 1327f77..47c8b2e 100644 --- a/src/list_languages.zig +++ b/src/list_languages.zig @@ -15,9 +15,11 @@ pub fn list(allocator: std.mem.Allocator, writer: anytype) !void { max_extensions_len = @max(max_extensions_len, args_string_length(file_type.extensions)); } + const checkmark_width = if (builtin.os.tag != .windows) 2 else 0; + try write_string(writer, "Language", max_language_len + 1); - try write_string(writer, "Extensions", max_extensions_len + 1); - try write_string(writer, "Language Server", max_langserver_len + 1); + try write_string(writer, "Extensions", max_extensions_len + 1 + checkmark_width); + try write_string(writer, "Language Server", max_langserver_len + 1 + checkmark_width); try write_string(writer, "Formatter", max_formatter_len); try writer.writeAll("\n");