aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2023-01-04 16:54:46 +0200
committerGitHub <noreply@github.com>2023-01-04 16:54:46 +0200
commit83fd45d82074eb8e6f914c8bb540927440897d6f (patch)
tree0b2cc180fa12d618ed940ec7a530f159afac26db
parent2b9478ce12a5556a9ef596d98a14347be8daee4a (diff)
parent95fe23f572e30358d037301abf0eb82b6b61bdf8 (diff)
downloadzig-83fd45d82074eb8e6f914c8bb540927440897d6f.tar.gz
zig-83fd45d82074eb8e6f914c8bb540927440897d6f.zip
Merge pull request #13786 from ziglang/tty-detection
stage2: make --color on affect progress bar too
-rw-r--r--doc/docgen.zig66
-rw-r--r--src/Compilation.zig11
2 files changed, 47 insertions, 30 deletions
diff --git a/doc/docgen.zig b/doc/docgen.zig
index 191dada602..4057a52f07 100644
--- a/doc/docgen.zig
+++ b/doc/docgen.zig
@@ -760,17 +760,6 @@ fn writeEscaped(out: anytype, input: []const u8) !void {
//#define VT_BOLD "\x1b[0;1m"
//#define VT_RESET "\x1b[0m"
-const TermState = enum {
- Start,
- Escape,
- LBracket,
- Number,
- AfterNumber,
- Arg,
- ArgNumber,
- ExpectEnd,
-};
-
test "term color" {
const input_bytes = "A\x1b[32;1mgreen\x1b[0mB";
const result = try termColor(std.testing.allocator, input_bytes);
@@ -787,61 +776,80 @@ fn termColor(allocator: Allocator, input: []const u8) ![]u8 {
var first_number: usize = undefined;
var second_number: usize = undefined;
var i: usize = 0;
- var state = TermState.Start;
+ var state: enum {
+ start,
+ escape,
+ lbracket,
+ number,
+ after_number,
+ arg,
+ arg_number,
+ expect_end,
+ } = .start;
+ var last_new_line: usize = 0;
var open_span_count: usize = 0;
while (i < input.len) : (i += 1) {
const c = input[i];
switch (state) {
- TermState.Start => switch (c) {
- '\x1b' => state = TermState.Escape,
+ .start => switch (c) {
+ '\x1b' => state = .escape,
+ '\n' => {
+ try out.writeByte(c);
+ last_new_line = buf.items.len;
+ },
else => try out.writeByte(c),
},
- TermState.Escape => switch (c) {
- '[' => state = TermState.LBracket,
+ .escape => switch (c) {
+ '[' => state = .lbracket,
else => return error.UnsupportedEscape,
},
- TermState.LBracket => switch (c) {
+ .lbracket => switch (c) {
'0'...'9' => {
number_start_index = i;
- state = TermState.Number;
+ state = .number;
},
else => return error.UnsupportedEscape,
},
- TermState.Number => switch (c) {
+ .number => switch (c) {
'0'...'9' => {},
else => {
first_number = std.fmt.parseInt(usize, input[number_start_index..i], 10) catch unreachable;
second_number = 0;
- state = TermState.AfterNumber;
+ state = .after_number;
i -= 1;
},
},
- TermState.AfterNumber => switch (c) {
- ';' => state = TermState.Arg,
+ .after_number => switch (c) {
+ ';' => state = .arg,
+ 'D' => state = .start,
+ 'K' => {
+ buf.items.len = last_new_line;
+ state = .start;
+ },
else => {
- state = TermState.ExpectEnd;
+ state = .expect_end;
i -= 1;
},
},
- TermState.Arg => switch (c) {
+ .arg => switch (c) {
'0'...'9' => {
number_start_index = i;
- state = TermState.ArgNumber;
+ state = .arg_number;
},
else => return error.UnsupportedEscape,
},
- TermState.ArgNumber => switch (c) {
+ .arg_number => switch (c) {
'0'...'9' => {},
else => {
second_number = std.fmt.parseInt(usize, input[number_start_index..i], 10) catch unreachable;
- state = TermState.ExpectEnd;
+ state = .expect_end;
i -= 1;
},
},
- TermState.ExpectEnd => switch (c) {
+ .expect_end => switch (c) {
'm' => {
- state = TermState.Start;
+ state = .start;
while (open_span_count != 0) : (open_span_count -= 1) {
try out.writeAll("</span>");
}
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 3aa9663ed5..8249a8e9db 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -2358,7 +2358,16 @@ pub fn update(comp: *Compilation) !void {
var progress: std.Progress = .{ .dont_print_on_dumb = true };
const main_progress_node = progress.start("", 0);
defer main_progress_node.end();
- if (comp.color == .off) progress.terminal = null;
+ switch (comp.color) {
+ .off => {
+ progress.terminal = null;
+ },
+ .on => {
+ progress.terminal = std.io.getStdErr();
+ progress.supports_ansi_escape_codes = true;
+ },
+ .auto => {},
+ }
try comp.performAllTheWork(main_progress_node);