authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-10-14 14:12:00-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-10-14 17:42:15-07:00
log5b4e91bc391b7c0f537e3eaeda3beb60b8813ad9
tree0afe07eac56224399358bc26b90d0404ba2a6e0d
parent35c2541cf9924cdcccf666afb173320fd610e9ef

Maker: --print-tree supports paths and forks


2 files changed, 46 insertions(+), 12 deletions(-)

lib/compiler/Maker.zig+43-9
......@@ -1385,7 +1385,7 @@ fn configure(graph: *Graph, options: ConfigureOptions) !ScannedConfig {
13851385 printPkgTree(.{
13861386 .writer = initStdoutWriter(io),
13871387 .mode = try .detect(io, .stdout(), NO_COLOR, CLICOLOR_FORCE),
1388 }, arena, &job_queue, &fetch) catch |err| switch (err) {
1388 }, arena, graph.global_cache_root, &job_queue, &fetch, &fork_set) catch |err| switch (err) {
13891389 error.WriteFailed => return stdout_writer_allocation.err.?,
13901390 else => |e| return e,
13911391 };
......@@ -1469,7 +1469,7 @@ fn configure(graph: *Graph, options: ConfigureOptions) !ScannedConfig {
14691469 const man = &f.manifest;
14701470 const dep_names = man.dependencies.keys();
14711471 try mod.deps.ensureUnusedCapacity(arena, @intCast(dep_names.len));
1472 for (dep_names, man.dependencies.values()) |name, dep| {
1472 for (dep_names, man.dependencies.values()) |name, *dep| {
14731473 const dep_digest = Package.Fetch.depDigest(
14741474 f.package_root,
14751475 graph.global_cache_root,
......@@ -1804,8 +1804,10 @@ fn validateFingerprints(
18041804fn printPkgTree(
18051805 terminal: Io.Terminal,
18061806 arena: Allocator,
1807 global_cache_root: Cache.Directory,
18071808 job_queue: *const Fetch.JobQueue,
18081809 root_fetch: *const Fetch,
1810 fork_set: *const Package.Fetch.JobQueue.ForkSet,
18091811) !void {
18101812 if (!root_fetch.have_manifest) return;
18111813 const names = root_fetch.manifest.dependencies.keys();
......@@ -1814,37 +1816,49 @@ fn printPkgTree(
18141816 .parent = null,
18151817 .last = i == names.len - 1,
18161818 };
1817 try printPkgTreeChild(terminal, arena, job_queue, &print_node, name, dep.hash);
1819 switch (dep.location) {
1820 .url => {
1821 const child_hash = if (dep.hash) |h| Package.Hash.fromSlice(h) else null;
1822 try printPkgTreeChild(terminal, arena, global_cache_root, job_queue, &print_node, name, child_hash, fork_set);
1823 },
1824 .path => {
1825 const child_hash = Package.Fetch.depDigest(root_fetch.package_root, global_cache_root, dep);
1826 try printPkgTreeChild(terminal, arena, global_cache_root, job_queue, &print_node, name, child_hash, fork_set);
1827 },
1828 }
18181829 }
18191830}
18201831
18211832fn printPkgTreeChild(
18221833 terminal: Io.Terminal,
18231834 arena: Allocator,
1835 global_cache_root: Cache.Directory,
18241836 job_queue: *const Fetch.JobQueue,
18251837 parent_print_node: *const PrintNode,
18261838 dep_name: []const u8,
1827 opt_hash: ?[]const u8,
1839 opt_pkg_hash: ?Package.Hash,
1840 fork_set: *const Package.Fetch.JobQueue.ForkSet,
18281841) !void {
18291842 const w = terminal.writer;
18301843 try parent_print_node.printPrefixedChild(w, terminal.mode);
18311844 try w.writeAll(dep_name);
18321845
1833 const hash = opt_hash orelse {
1846 const pkg_hash = opt_pkg_hash orelse {
18341847 try terminal.setColor(.red);
18351848 try w.writeAll(" (missing hash)\n");
18361849 try terminal.setColor(.reset);
18371850 return;
18381851 };
18391852 try terminal.setColor(.dim);
1840 try w.print(" {s}", .{hash});
1853 try w.print(" {s}", .{pkg_hash.toSlice()});
18411854 try terminal.setColor(.reset);
1842 const child_fetch = job_queue.table.get(.fromSlice(hash)) orelse {
1855 const child_fetch = job_queue.table.get(pkg_hash) orelse {
18431856 try terminal.setColor(.red);
18441857 try w.writeAll(" (fetch failed)\n");
18451858 try terminal.setColor(.reset);
18461859 return;
18471860 };
1861
18481862 switch (child_fetch.lazy_status) {
18491863 .eager, .available => {},
18501864 .unavailable => {
......@@ -1854,8 +1868,19 @@ fn printPkgTreeChild(
18541868 return;
18551869 },
18561870 }
1871 if (!child_fetch.have_manifest) {
1872 try w.writeByte('\n');
1873 return;
1874 }
1875
1876 const project_id: Package.ProjectId = .init(child_fetch.manifest.name, child_fetch.manifest.id);
1877 if (fork_set.getKeyPtrAdapted(project_id, @as(Fetch.JobQueue.Fork.Adapter, .{}))) |fork| {
1878 try terminal.setColor(.yellow);
1879 try w.print(" (fork: {f})", .{fork.path});
1880 try terminal.setColor(.reset);
1881 }
1882
18571883 try w.writeByte('\n');
1858 if (!child_fetch.have_manifest) return;
18591884
18601885 const names = child_fetch.manifest.dependencies.keys();
18611886 for (names, child_fetch.manifest.dependencies.values(), 0..) |name, *dep, i| {
......@@ -1863,7 +1888,16 @@ fn printPkgTreeChild(
18631888 .parent = parent_print_node,
18641889 .last = i == names.len - 1,
18651890 };
1866 try printPkgTreeChild(terminal, arena, job_queue, &print_node, name, dep.hash);
1891 switch (dep.location) {
1892 .url => {
1893 const child_hash = if (dep.hash) |h| Package.Hash.fromSlice(h) else null;
1894 try printPkgTreeChild(terminal, arena, global_cache_root, job_queue, &print_node, name, child_hash, fork_set);
1895 },
1896 .path => {
1897 const child_hash = Package.Fetch.depDigest(child_fetch.package_root, global_cache_root, dep);
1898 try printPkgTreeChild(terminal, arena, global_cache_root, job_queue, &print_node, name, child_hash, fork_set);
1899 },
1900 }
18671901 }
18681902}
18691903
lib/compiler/Maker/Fetch.zig+3-3
......@@ -302,7 +302,7 @@ pub const JobQueue = struct {
302302 \\ pub const deps: []const struct { []const u8, []const u8 } = &.{
303303 \\
304304 );
305 for (manifest.dependencies.keys(), manifest.dependencies.values()) |name, dep| {
305 for (manifest.dependencies.keys(), manifest.dependencies.values()) |name, *dep| {
306306 const h = depDigest(fetch.package_root, jq.global_cache, dep) orelse continue;
307307 try w.print(
308308 " .{{ \"{f}\", \"{f}\" }},\n",
......@@ -335,7 +335,7 @@ pub const JobQueue = struct {
335335 assert(root_fetch.have_manifest);
336336 const root_manifest = &root_fetch.manifest;
337337
338 for (root_manifest.dependencies.keys(), root_manifest.dependencies.values()) |name, dep| {
338 for (root_manifest.dependencies.keys(), root_manifest.dependencies.values()) |name, *dep| {
339339 const h = depDigest(root_fetch.package_root, jq.global_cache, dep) orelse continue;
340340 try w.print(
341341 " .{{ \"{f}\", \"{f}\" }},\n",
......@@ -2033,7 +2033,7 @@ const Filter = struct {
20332033 }
20342034};
20352035
2036pub fn depDigest(pkg_root: Path, cache_root: Directory, dep: Manifest.Dependency) ?Package.Hash {
2036pub fn depDigest(pkg_root: Path, cache_root: Directory, dep: *const Manifest.Dependency) ?Package.Hash {
20372037 if (dep.hash) |h| return .fromSlice(h);
20382038
20392039 switch (dep.location) {