diff options
| author | Veikka Tuominen <git@vexu.eu> | 2023-01-04 16:54:46 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-04 16:54:46 +0200 |
| commit | 83fd45d82074eb8e6f914c8bb540927440897d6f (patch) | |
| tree | 0b2cc180fa12d618ed940ec7a530f159afac26db | |
| parent | 2b9478ce12a5556a9ef596d98a14347be8daee4a (diff) | |
| parent | 95fe23f572e30358d037301abf0eb82b6b61bdf8 (diff) | |
| download | zig-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.zig | 66 | ||||
| -rw-r--r-- | src/Compilation.zig | 11 |
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); |
