Skip to content

Commit fbbc024

Browse files
committed
dep-hash: handle local deps in subdep chains
1 parent ff60eb2 commit fbbc024

File tree

1 file changed

+86
-71
lines changed

1 file changed

+86
-71
lines changed

lib/compiler/dep-hash.zig

+86-71
Original file line numberDiff line numberDiff line change
@@ -113,99 +113,114 @@ pub fn main() !void {
113113
try dep_name.appendSlice(package);
114114

115115
for (subdeps.items) |p| {
116-
if (dep.hash) |hash| {
117-
var package_dir = global_cache.openDir(hash, .{}) catch |e| switch (e) {
118-
error.FileNotFound => fatal("{s} is not in the global cache (hash: {s})", .{
119-
dep_name.items, hash,
120-
}),
121-
else => |err| return err,
122-
};
123-
defer package_dir.close();
124-
125-
const sub_manifest, _ = try std.zig.loadManifest(arena, arena, .{
126-
.root_name = null,
127-
.dir = package_dir,
128-
.color = color,
129-
});
116+
var package_dir = try getDepDir(
117+
dep,
118+
dep_name.items,
119+
global_cache,
120+
build_root,
121+
);
122+
defer package_dir.close();
130123

131-
dep = sub_manifest.dependencies.get(p) orelse {
132-
fatal("{s} has no dependency named '{s}' in its manifest", .{
133-
dep_name.items, p,
134-
});
135-
};
136-
try dep_name.append('.');
137-
try dep_name.appendSlice(p);
138-
} else switch (dep.location) {
139-
.url => fatal("the hash for {s} is missing from the manifest.", .{
140-
dep_name.items,
141-
}),
142-
.path => |path| fatal("{s} is a local dependency located at {s}", .{
143-
dep_name.items, path,
144-
}),
145-
}
124+
const sub_manifest, _ = try std.zig.loadManifest(arena, arena, .{
125+
.root_name = null,
126+
.dir = package_dir,
127+
.color = color,
128+
});
129+
130+
dep = sub_manifest.dependencies.get(p) orelse {
131+
fatal("{s} has no dependency named '{s}' in its manifest", .{
132+
dep_name.items, p,
133+
});
134+
};
135+
try dep_name.append('.');
136+
try dep_name.appendSlice(p);
146137
}
147138

148139
break :dep dep;
149140
};
150141

151142
const stdout = std.io.getStdOut().writer();
152143

153-
if (dep.hash) |hash| {
154-
if (list) {
155-
var package_dir = global_cache.openDir(hash, .{}) catch |e| switch (e) {
156-
error.FileNotFound => fatal("{s} is not in the global cache (hash: {s})", .{
157-
dep_name.items, hash,
158-
}),
159-
else => |err| return err,
160-
};
161-
defer package_dir.close();
144+
if (list) {
145+
var package_dir = try getDepDir(
146+
dep,
147+
dep_name.items,
148+
global_cache,
149+
build_root,
150+
);
151+
defer package_dir.close();
152+
153+
var sub_manifest, var sub_ast = std.zig.loadManifest(gpa, arena, .{
154+
.root_name = null,
155+
.dir = package_dir,
156+
.color = color,
157+
}) catch |err| switch (err) {
158+
error.FileNotFound => fatal("no manifest found in build root", .{}),
159+
else => |e| return e,
160+
};
161+
defer {
162+
sub_manifest.deinit(gpa);
163+
sub_ast.deinit(gpa);
164+
}
162165

163-
var sub_manifest, var sub_ast = std.zig.loadManifest(gpa, arena, .{
164-
.root_name = null,
165-
.dir = package_dir,
166-
.color = color,
167-
}) catch |err| switch (err) {
168-
error.FileNotFound => fatal("no manifest found in build root", .{}),
169-
else => |e| return e,
170-
};
171-
defer {
172-
sub_manifest.deinit(gpa);
173-
sub_ast.deinit(gpa);
166+
const prefix = prefix: {
167+
var prefix_len: usize = package.len + 1;
168+
for (subdeps.items) |subdep| {
169+
prefix_len += subdep.len + 1;
174170
}
175171

176-
const prefix = prefix: {
177-
var prefix_len: usize = package.len + 1;
178-
for (subdeps.items) |subdep| {
179-
prefix_len += subdep.len + 1;
180-
}
181-
182-
const buffer = try arena.alloc(u8, prefix_len);
172+
const buffer = try arena.alloc(u8, prefix_len);
183173

184-
@memcpy(buffer[0..package.len], package);
185-
buffer[package.len] = '.';
174+
@memcpy(buffer[0..package.len], package);
175+
buffer[package.len] = '.';
186176

187-
var i: usize = package.len + 1;
188-
for (subdeps.items) |subdep| {
189-
@memcpy(buffer[i..][0..subdep.len], subdep);
190-
buffer[i + subdep.len] = '.';
191-
i += subdep.len + 1;
192-
}
193-
break :prefix buffer;
194-
};
177+
var i: usize = package.len + 1;
178+
for (subdeps.items) |subdep| {
179+
@memcpy(buffer[i..][0..subdep.len], subdep);
180+
buffer[i + subdep.len] = '.';
181+
i += subdep.len + 1;
182+
}
183+
break :prefix buffer;
184+
};
195185

196-
try listDepHashes(prefix, sub_manifest);
197-
} else {
186+
try listDepHashes(prefix, sub_manifest);
187+
} else {
188+
if (dep.hash) |hash| {
198189
try stdout.print("{s}\n", .{hash});
190+
} else switch (dep.location) {
191+
.url => fatal("the hash for {s} is missing from the manifest", .{dep_name.items}),
192+
.path => fatal("{s} is a local dependency", .{dep_name.items}),
199193
}
200-
} else switch (dep.location) {
201-
.url => fatal("the hash for {s} is missing from the manifest.", .{package}),
202-
.path => |path| fatal("{s} is a local dependency located at {s}", .{ package, path }),
203194
}
204195
} else {
205196
try listDepHashes("", manifest);
206197
}
207198
}
208199

200+
fn getDepDir(
201+
dep: std.zig.Manifest.Dependency,
202+
dep_name: []const u8,
203+
global_cache_package_directory: std.fs.Dir,
204+
build_root: std.zig.BuildRoot,
205+
) !std.fs.Dir {
206+
if (dep.hash) |hash| {
207+
return global_cache_package_directory.openDir(hash, .{}) catch |e| switch (e) {
208+
error.FileNotFound => fatal("{s} is not in the global cache (hash: {s})", .{
209+
dep_name, hash,
210+
}),
211+
else => |err| return err,
212+
};
213+
} else switch (dep.location) {
214+
.url => fatal("the hash for {s} is missing from the manifest.\n", .{
215+
dep_name,
216+
}),
217+
.path => |path| return build_root.directory.handle.openDir(path, .{}) catch |e| switch (e) {
218+
error.FileNotFound => fatal("local dependency {s} does not exist", .{dep_name}),
219+
else => |err| return err,
220+
},
221+
}
222+
}
223+
209224
fn listDepHashes(parent_prefix: []const u8, manifest: std.zig.Manifest) !void {
210225
assert(parent_prefix.len != 1);
211226
if (manifest.dependencies.count() == 0) {

0 commit comments

Comments
 (0)