diff options
author | 2022-01-04 19:57:14 -0800 | |
---|---|---|
committer | 2022-01-04 19:57:14 -0800 | |
commit | 0ac9c4276fe78134fedf8d8a2285d67577d15931 (patch) | |
tree | 3beb25c42e7b44aeb8355e396ba58b1cad4a05ea | |
parent | 0edf6fd1e4fed378328ef58c0d872631efc9e9d1 (diff) | |
download | bun-0ac9c4276fe78134fedf8d8a2285d67577d15931.tar.gz bun-0ac9c4276fe78134fedf8d8a2285d67577d15931.tar.zst bun-0ac9c4276fe78134fedf8d8a2285d67577d15931.zip |
Improve how we detect if terminal colors are supported
Diffstat (limited to '')
-rw-r--r-- | src/cli/create_command.zig | 3 | ||||
-rw-r--r-- | src/global.zig | 70 | ||||
-rw-r--r-- | src/install/install.zig | 4 |
3 files changed, 66 insertions, 11 deletions
diff --git a/src/cli/create_command.zig b/src/cli/create_command.zig index aea498a5b..b653aa4a7 100644 --- a/src/cli/create_command.zig +++ b/src/cli/create_command.zig @@ -377,7 +377,7 @@ pub const CreateCommand = struct { var progress = std.Progress{}; var node = try progress.start(try ProgressBuf.print("Loading {s}", .{template}), 0); - progress.supports_ansi_escape_codes = Output.enable_ansi_colors; + progress.supports_ansi_escape_codes = Output.enable_ansi_colors_stderr; // alacritty is fast if (env_loader.map.get("ALACRITTY_LOG") != null) { @@ -2113,6 +2113,7 @@ pub const CreateListExamplesCommand = struct { const time = std.time.nanoTimestamp(); var progress = std.Progress{}; var node = try progress.start("Fetching manifest", 0); + progress.supports_ansi_escape_codes = Output.enable_ansi_colors_stderr; progress.refresh(); const examples = try Example.fetchAllLocalAndRemote(ctx, node, &env_loader, filesystem); diff --git a/src/global.zig b/src/global.zig index af915d874..772e7b6fe 100644 --- a/src/global.zig +++ b/src/global.zig @@ -91,32 +91,81 @@ pub const Output = struct { } } + fn isForceColor() ?bool { + if (std.os.getenvZ("NO_COLOR") != null) return false; + const force_color_str = std.os.getenvZ("FORCE_COLOR") orelse return null; + return force_color_str.len == 0 or + strings.eqlComptime(force_color_str, "TRUE") or + strings.eqlComptime(force_color_str, "ON") or + strings.eqlComptime(force_color_str, "YES") or + strings.eqlComptime(force_color_str, "1") or + strings.eqlComptime(force_color_str, " "); + } + + fn isColorTerminal() bool { + if (isForceColor()) |val| return val; + if (std.os.getenvZ("COLOR_TERM")) |color_term| return !strings.eqlComptime(color_term, "0"); + + if (std.os.getenvZ("TERM")) |term| { + if (strings.eqlComptime(term, "dumb")) return false; + + return true; + } + + return false; + } + pub fn set(_source: *Source) void { source = _source.*; + source_set = true; if (!stdout_stream_set) { stdout_stream_set = true; - enable_ansi_colors = _source.error_stream.supportsAnsiEscapeCodes(); - - is_stdout_piped = !_source.stream.isTty(); - is_stderr_piped = !_source.error_stream.isTty(); + var is_color_terminal: ?bool = null; + if (_source.stream.isTty()) { + stdout_descriptor_type = OutputStreamDescriptor.terminal; + is_color_terminal = is_color_terminal orelse isColorTerminal(); + enable_ansi_colors_stdout = is_color_terminal.?; + } else if (isForceColor()) |val| { + enable_ansi_colors_stdout = val; + } else { + enable_ansi_colors_stdout = false; + } - if (!is_stderr_piped) { - // _ = std.c.ioctl(source.error_stream.handle, std.os.TIOCGWINSZ, &terminal_size); + if (_source.error_stream.isTty()) { + stderr_descriptor_type = OutputStreamDescriptor.terminal; + is_color_terminal = is_color_terminal orelse isColorTerminal(); + enable_ansi_colors_stderr = is_color_terminal.?; + } else if (isForceColor()) |val| { + enable_ansi_colors_stderr = val; + } else { + enable_ansi_colors_stderr = false; } + enable_ansi_colors = enable_ansi_colors_stderr or enable_ansi_colors_stdout; + stdout_stream = _source.stream; stderr_stream = _source.error_stream; } } }; + pub const OutputStreamDescriptor = enum { + unknown, + // file, + // pipe, + terminal, + }; + pub var enable_ansi_colors = Environment.isNative; + pub var enable_ansi_colors_stderr = Environment.isNative; + pub var enable_ansi_colors_stdout = Environment.isNative; pub var enable_buffering = true; - pub var is_stdout_piped = false; - pub var is_stderr_piped = false; + + pub var stderr_descriptor_type = OutputStreamDescriptor.unknown; + pub var stdout_descriptor_type = OutputStreamDescriptor.unknown; pub inline fn isEmojiEnabled() bool { return enable_ansi_colors and !Environment.isWindows; @@ -390,7 +439,7 @@ pub const Output = struct { if (level == .Error) return; } - if (enable_ansi_colors) { + if (if (comptime l == Level.stdout) enable_ansi_colors_stdout else enable_ansi_colors_stderr) { printer(comptime prettyFmt(fmt, true), args); } else { printer(comptime prettyFmt(fmt, false), args); @@ -406,7 +455,7 @@ pub const Output = struct { } pub fn pretty(comptime fmt: string, args: anytype) void { - prettyWithPrinter(fmt, args, print, .Error); + prettyWithPrinter(fmt, args, print, .stdout); } pub fn prettyln(comptime fmt: string, args: anytype) void { @@ -450,6 +499,7 @@ pub const Output = struct { pub const Level = enum(u8) { Warn, Error, + stdout, }; pub var level = if (Environment.isDebug) Level.Warn else Level.Error; diff --git a/src/install/install.zig b/src/install/install.zig index d30bc22bc..853a4813e 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -6396,6 +6396,7 @@ pub const PackageManager = struct { if (comptime log_level.showProgress()) { root_node = try progress.start("", 0); + progress.supports_ansi_escape_codes = Output.enable_ansi_colors_stderr; download_node = root_node.start(ProgressStrings.download(), 0); install_node = root_node.start(ProgressStrings.install(), lockfile.packages.len); @@ -6839,6 +6840,7 @@ pub const PackageManager = struct { if (manager.pending_tasks > 0) { if (comptime log_level.showProgress()) { manager.downloads_node = try manager.progress.start(ProgressStrings.download(), 0); + manager.progress.supports_ansi_escape_codes = Output.enable_ansi_colors_stderr; manager.setNodeName(manager.downloads_node.?, ProgressStrings.download_no_emoji_, ProgressStrings.download_emoji, true); manager.downloads_node.?.setEstimatedTotalItems(manager.total_tasks + manager.extracted_count); manager.downloads_node.?.setCompletedItems(manager.total_tasks - manager.pending_tasks); @@ -6906,6 +6908,7 @@ pub const PackageManager = struct { if (comptime log_level.showProgress()) { node = try manager.progress.start(ProgressStrings.save(), 0); + manager.progress.supports_ansi_escape_codes = Output.enable_ansi_colors_stderr; node.activate(); manager.progress.refresh(); @@ -6936,6 +6939,7 @@ pub const PackageManager = struct { var node: *Progress.Node = undefined; if (comptime log_level.showProgress()) { node = try manager.progress.start("Saving yarn.lock", 0); + manager.progress.supports_ansi_escape_codes = Output.enable_ansi_colors_stderr; manager.progress.refresh(); } |