aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-01-04 19:57:14 -0800
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-01-04 19:57:14 -0800
commit0ac9c4276fe78134fedf8d8a2285d67577d15931 (patch)
tree3beb25c42e7b44aeb8355e396ba58b1cad4a05ea
parent0edf6fd1e4fed378328ef58c0d872631efc9e9d1 (diff)
downloadbun-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.zig3
-rw-r--r--src/global.zig70
-rw-r--r--src/install/install.zig4
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();
}