@@ -181,7 +181,7 @@ pub fn main() !void {
};
} else if (mem.eql(u8, arg, "--summary")) {
const next_arg = nextArg(args, &arg_idx) orelse
fatalWithHint("expected [all|failures|none] after '{s}'", .{arg});
fatalWithHint("expected [all|new|failures|none] after '{s}'", .{arg});
summary = std.meta.stringToEnum(Summary, next_arg) orelse {
fatalWithHint("expected [all|failures|none] after '{s}', found '{s}'", .{
arg, next_arg,
@@ -534,7 +534,8 @@ 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.summary != Summary.all) return cleanExit();
const failures_only = run.summary != .all and run.summary != .new;
if (failure_count == 0 and failures_only) return cleanExit();
const ttyconf = run.ttyconf;
const stderr = run.stderr;
@@ -559,26 +560,31 @@ fn runStepNames(
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, run, stderr, ttyconf, &print_node, &step_stack, failures_only) catch {};
printTreeStep(b, b.default_step, run, stderr, ttyconf, &print_node, &step_stack) catch {};
} else {
const last_index = if (!failures_only) b.top_level_steps.count() else blk: {
const last_index = if (run.summary == .all) 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;
const step = b.top_level_steps.get(step_names[i]).?.step;
const found = switch (run.summary orelse .failures) {
.all, .none => unreachable,
.failures => step.state != .success,
.new => !step.result_cached,
};
if (found) 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 == last_index;
printTreeStep(b, &tls.step, run, stderr, ttyconf, &print_node, &step_stack, failures_only) catch {};
printTreeStep(b, &tls.step, run, stderr, ttyconf, &print_node, &step_stack) catch {};
}
}
}
@@ -770,10 +776,16 @@ 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;
const summary = run.summary orelse .failures;
const skip = switch (summary) {
.none => unreachable,
.all => false,
.new => s.result_cached,
.failures => s.state == .success,
};
if (skip) return;
try printPrefix(parent_node, stderr, ttyconf);
if (!first) try ttyconf.setColor(stderr, .dim);
@@ -794,11 +806,18 @@ fn printTreeStep(
if (first) {
try printStepStatus(s, stderr, ttyconf, run);
const last_index = if (!failures_only) s.dependencies.items.len -| 1 else blk: {
const last_index = if (summary == .all) 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;
const step = s.dependencies.items[i];
const found = switch (summary) {
.all, .none => unreachable,
.failures => step.state != .success,
.new => !step.result_cached,
};
if (found) break :blk i;
}
break :blk s.dependencies.items.len -| 1;
};
@@ -807,7 +826,7 @@ fn printTreeStep(
.parent = parent_node,
.last = i == last_index,
};
try printTreeStep(b, dep, run, stderr, ttyconf, &print_node, step_stack, failures_only);
try printTreeStep(b, dep, run, stderr, ttyconf, &print_node, step_stack);
}
} else {
if (s.dependencies.items.len == 0) {
@@ -1113,6 +1132,7 @@ fn usage(b: *std.Build, out_stream: anytype) !void {
\\ --prominent-compile-errors Buffer compile errors and display at end
\\ --summary [mode] Control the printing of the build summary
\\ all Print the build summary in its entirety
\\ new Omit cached steps
\\ 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)
@@ -1225,7 +1245,7 @@ fn cleanExit() void {
}
const Color = enum { auto, off, on };
const Summary = enum { all, failures, none };
const Summary = enum { all, new, failures, none };
fn get_tty_conf(color: Color, stderr: File) std.io.tty.Config {
return switch (color) {