feature. See also
. The project being documented here (as the example) is the Zig library itself.
Fuzz.serveSourcesTar
pub fn serveSourcesTar(fuzz: *Fuzz, req: *std.http.Server.Request) !void
File
Code
pub fn serveSourcesTar(fuzz: *Fuzz, req: *std.http.Server.Request) !void {
assert(fuzz.mode == .forever);
const maker = fuzz.maker;
const gpa = maker.gpa;
const conf = &maker.scanned_config.configuration;
var arena_state: std.heap.ArenaAllocator = .init(gpa);
defer arena_state.deinit();
const arena = arena_state.allocator();
const DedupTable = std.array_hash_map.Custom(Build.Cache.Path, void, Build.Cache.Path.TableAdapter, false);
var dedup_table: DedupTable = .empty;
defer dedup_table.deinit(gpa);
for (fuzz.run_steps) |run_index| {
const conf_run = run_index.ptr(conf).extended.cast(conf, Configuration.Step.Run) orelse continue;
const comp_index = conf_run.producer.value.?;
const comp_step = maker.stepByIndex(comp_index);
const compile_inputs = comp_step.inputs.table;
for (compile_inputs.keys(), compile_inputs.values()) |dir_path, *file_list| {
try dedup_table.ensureUnusedCapacity(gpa, file_list.items.len);
for (file_list.items) |sub_path| {
if (!std.mem.endsWith(u8, sub_path, ".zig")) continue;
const joined_path = try dir_path.join(arena, sub_path);
dedup_table.putAssumeCapacity(joined_path, {});
}
}
}
const deduped_paths = dedup_table.keys();
const SortContext = struct {
pub fn lessThan(this: @This(), lhs: Build.Cache.Path, rhs: Build.Cache.Path) bool {
_ = this;
return switch (std.mem.order(u8, lhs.root_dir.path orelse ".", rhs.root_dir.path orelse ".")) {
.lt => true,
.gt => false,
.eq => std.mem.lessThan(u8, lhs.sub_path, rhs.sub_path),
};
}
};
std.mem.sortUnstable(Build.Cache.Path, deduped_paths, SortContext{}, SortContext.lessThan);
return fuzz.mode.forever.ws.serveTarFile(req, deduped_paths);
}