diff options
| author | Veikka Tuominen <git@vexu.eu> | 2023-06-09 19:15:32 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-16 15:17:59 -0700 |
| commit | 0f5aff34414bcb024443540fe905039f3783803a (patch) | |
| tree | bbdb0dd69fd60c68703ac313c26e2f4ed00da5d3 | |
| parent | 537104fd9d84d94abad3e36d3cd781be4397e299 (diff) | |
| download | zig-0f5aff34414bcb024443540fe905039f3783803a.tar.gz zig-0f5aff34414bcb024443540fe905039f3783803a.zip | |
zig build: add option to only print failed steps
The motivating case for this is that currently when a test fails
the CI log will include ~5k lines of listing steps that succeeded.
| -rw-r--r-- | lib/build_runner.zig | 63 | ||||
| -rw-r--r-- | src/main.zig | 42 |
2 files changed, 67 insertions, 38 deletions
diff --git a/lib/build_runner.zig b/lib/build_runner.zig index a09ec2cf1f..a5abbebe16 100644 --- a/lib/build_runner.zig +++ b/lib/build_runner.zig @@ -90,7 +90,7 @@ pub fn main() !void { var install_prefix: ?[]const u8 = null; var dir_list = std.Build.DirList{}; - var enable_summary: ?bool = null; + var summary: ?Summary = null; var max_rss: usize = 0; var color: Color = .auto; @@ -178,6 +178,15 @@ pub fn main() !void { std.debug.print("Expected [auto|on|off] after {s}, found '{s}'\n\n", .{ arg, next_arg }); usageAndErr(builder, false, stderr_stream); }; + } else if (mem.eql(u8, arg, "--summary")) { + const next_arg = nextArg(args, &arg_idx) orelse { + std.debug.print("Expected [all|failures|none] after {s}\n\n", .{arg}); + usageAndErr(builder, false, stderr_stream); + }; + summary = std.meta.stringToEnum(Summary, next_arg) orelse { + std.debug.print("Expected [all|failures|none] after {s}, found '{s}'\n\n", .{ arg, next_arg }); + usageAndErr(builder, false, stderr_stream); + }; } else if (mem.eql(u8, arg, "--zig-lib-dir")) { builder.zig_lib_dir = nextArg(args, &arg_idx) orelse { std.debug.print("Expected argument after {s}\n\n", .{arg}); @@ -234,10 +243,6 @@ pub fn main() !void { builder.enable_darling = true; } else if (mem.eql(u8, arg, "-fno-darling")) { builder.enable_darling = false; - } else if (mem.eql(u8, arg, "-fsummary")) { - enable_summary = true; - } else if (mem.eql(u8, arg, "-fno-summary")) { - enable_summary = false; } else if (mem.eql(u8, arg, "-freference-trace")) { builder.reference_trace = 256; } else if (mem.startsWith(u8, arg, "-freference-trace=")) { @@ -302,7 +307,7 @@ pub fn main() !void { .memory_blocked_steps = std.ArrayList(*Step).init(arena), .claimed_rss = 0, - .enable_summary = enable_summary, + .summary = summary, .ttyconf = ttyconf, .stderr = stderr, }; @@ -332,7 +337,7 @@ const Run = struct { memory_blocked_steps: std.ArrayList(*Step), claimed_rss: usize, - enable_summary: ?bool, + summary: ?Summary, ttyconf: std.io.tty.Config, stderr: std.fs.File, }; @@ -469,12 +474,12 @@ fn runStepNames( // A proper command line application defaults to silently succeeding. // The user may request verbose mode if they have a different preference. - if (failure_count == 0 and run.enable_summary != true) return cleanExit(); + if (failure_count == 0 and run.summary != Summary.all) return cleanExit(); const ttyconf = run.ttyconf; const stderr = run.stderr; - if (run.enable_summary != false) { + if (run.summary != Summary.none) { const total_count = success_count + failure_count + pending_count + skipped_count; ttyconf.setColor(stderr, .cyan) catch {}; stderr.writeAll("Build Summary:") catch {}; @@ -488,23 +493,32 @@ fn runStepNames( if (test_fail_count > 0) stderr.writer().print("; {d} failed", .{test_fail_count}) catch {}; if (test_leak_count > 0) stderr.writer().print("; {d} leaked", .{test_leak_count}) catch {}; - if (run.enable_summary == null) { + if (run.summary == null) { ttyconf.setColor(stderr, .dim) catch {}; - stderr.writeAll(" (disable with -fno-summary)") catch {}; + stderr.writeAll(" (disable with --summary none)") catch {}; ttyconf.setColor(stderr, .reset) catch {}; } stderr.writeAll("\n") catch {}; + const failures_only = run.summary != Summary.all; // Print a fancy tree with build results. var print_node: PrintNode = .{ .parent = null }; if (step_names.len == 0) { print_node.last = true; - printTreeStep(b, b.default_step, stderr, ttyconf, &print_node, &step_stack) catch {}; + printTreeStep(b, b.default_step, stderr, ttyconf, &print_node, &step_stack, failures_only) catch {}; } else { + const last_index = if (!failures_only) b.top_level_steps.count() else blk: { + var i: usize = step_names.len; + while (i > 0) { + i -= 1; + if (b.top_level_steps.get(step_names[i]).?.step.state != .success) break :blk i; + } + break :blk b.top_level_steps.count(); + }; for (step_names, 0..) |step_name, i| { const tls = b.top_level_steps.get(step_name).?; - print_node.last = i + 1 == b.top_level_steps.count(); - printTreeStep(b, &tls.step, stderr, ttyconf, &print_node, &step_stack) catch {}; + print_node.last = i + 1 == last_index; + printTreeStep(b, &tls.step, stderr, ttyconf, &print_node, &step_stack, failures_only) catch {}; } } } @@ -556,8 +570,10 @@ fn printTreeStep( ttyconf: std.io.tty.Config, parent_node: *PrintNode, step_stack: *std.AutoArrayHashMapUnmanaged(*Step, void), + failures_only: bool, ) !void { const first = step_stack.swapRemove(s); + if (failures_only and s.state == .success) return; try printPrefix(parent_node, stderr, ttyconf); if (!first) try ttyconf.setColor(stderr, .dim); @@ -688,12 +704,20 @@ fn printTreeStep( }, } + const last_index = if (!failures_only) s.dependencies.items.len -| 1 else blk: { + var i: usize = s.dependencies.items.len; + while (i > 0) { + i -= 1; + if (s.dependencies.items[i].state != .success) break :blk i; + } + break :blk s.dependencies.items.len -| 1; + }; for (s.dependencies.items, 0..) |dep, i| { var print_node: PrintNode = .{ .parent = parent_node, - .last = i == s.dependencies.items.len - 1, + .last = i == last_index, }; - try printTreeStep(b, dep, stderr, ttyconf, &print_node, step_stack); + try printTreeStep(b, dep, stderr, ttyconf, &print_node, step_stack, failures_only); } } else { if (s.dependencies.items.len == 0) { @@ -948,8 +972,10 @@ fn usage(builder: *std.Build, already_ran_build: bool, out_stream: anytype) !voi \\ -l, --list-steps Print available steps \\ --verbose Print commands before executing them \\ --color [auto|off|on] Enable or disable colored error messages - \\ -fsummary Print the build summary, even on success - \\ -fno-summary Omit the build summary, even on failure + \\ --summary [mode] Control the printing of the build summary + \\ all Print the build summary in its entirety + \\ failures (Default) Only print failed steps + \\ none Do not print the build summary \\ -j<N> Limit concurrent jobs (default is to use all CPU cores) \\ --maxrss <bytes> Limit memory usage (default is to use available memory) \\ @@ -1025,6 +1051,7 @@ fn cleanExit() void { } const Color = enum { auto, off, on }; +const Summary = enum { all, failures, none }; fn get_tty_conf(color: Color, stderr: std.fs.File) std.io.tty.Config { return switch (color) { diff --git a/src/main.zig b/src/main.zig index aedca80d26..b245b357ca 100644 --- a/src/main.zig +++ b/src/main.zig @@ -4000,8 +4000,8 @@ pub const usage_libc = \\ Parse a libc installation text file and validate it. \\ \\Options: - \\ -h, --help Print this help and exit - \\ -target [name] <arch><sub>-<os>-<abi> see the targets command + \\ -h, --help Print this help and exit + \\ -target [name] <arch><sub>-<os>-<abi> see the targets command \\ ; @@ -4068,7 +4068,7 @@ pub const usage_init = \\ directory. \\ \\Options: - \\ -h, --help Print this help and exit + \\ -h, --help Print this help and exit \\ \\ ; @@ -4166,16 +4166,18 @@ pub const usage_build = \\ Build a project from build.zig. \\ \\Options: - \\ -freference-trace[=num] How many lines of reference trace should be shown per compile error - \\ -fno-reference-trace Disable reference trace - \\ -fsummary Print the build summary, even on success - \\ -fno-summary Omit the build summary, even on failure - \\ --build-file [file] Override path to build.zig - \\ --cache-dir [path] Override path to local Zig cache directory - \\ --global-cache-dir [path] Override path to global Zig cache directory - \\ --zig-lib-dir [arg] Override path to Zig lib directory - \\ --build-runner [file] Override path to build runner - \\ -h, --help Print this help and exit + \\ -freference-trace[=num] How many lines of reference trace should be shown per compile error + \\ -fno-reference-trace Disable reference trace + \\ --summary [mode] Control the printing of the build summary + \\ all Print the build summary in its entirety + \\ failures (Default) Only print failed steps + \\ none Do not print the build summary + \\ --build-file [file] Override path to build.zig + \\ --cache-dir [path] Override path to local Zig cache directory + \\ --global-cache-dir [path] Override path to global Zig cache directory + \\ --zig-lib-dir [arg] Override path to Zig lib directory + \\ --build-runner [file] Override path to build runner + \\ -h, --help Print this help and exit \\ ; @@ -4576,13 +4578,13 @@ pub const usage_fmt = \\ recursively. \\ \\Options: - \\ -h, --help Print this help and exit - \\ --color [auto|off|on] Enable or disable colored error messages - \\ --stdin Format code from stdin; output to stdout - \\ --check List non-conforming files and exit with an error - \\ if the list is non-empty - \\ --ast-check Run zig ast-check on every file - \\ --exclude [file] Exclude file or directory from formatting + \\ -h, --help Print this help and exit + \\ --color [auto|off|on] Enable or disable colored error messages + \\ --stdin Format code from stdin; output to stdout + \\ --check List non-conforming files and exit with an error + \\ if the list is non-empty + \\ --ast-check Run zig ast-check on every file + \\ --exclude [file] Exclude file or directory from formatting \\ \\ ; |
