srctree

Loris Cro parent f13401ac 5cd7fef1
build runner: add --summary new

new only prints summary nodes that were not cached.Useful for build.zig authors to check if rebuilds happen exactly onlywhen expected.

inlinesplit
lib/build_runner.zig added: 34, removed: 14, total 20
@@ -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) {