Skip to content

Commit 2c60894

Browse files
committed
dep-hash: specify sub-deps via multiple arguments
Specifying sub-dependencies with a period-separated syntax does not work as dependency names can include a period.
1 parent e3a9ac1 commit 2c60894

File tree

1 file changed

+47
-21
lines changed

1 file changed

+47
-21
lines changed

lib/compiler/dep-hash.zig

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const usage_dep_hash =
2-
\\Usage: zig dep-hash [--list] [dep-name]
2+
\\Usage: zig dep-hash [--list] [dep-name] [subdep...]
33
\\
44
\\ List the hashes of packages in the build.zig.zon manifest.
55
\\
@@ -12,6 +12,10 @@ const usage_dep_hash =
1212
\\
1313
;
1414

15+
pub const std_options: std.Options = .{
16+
.log_level = .debug,
17+
};
18+
1519
pub fn main() !void {
1620
var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
1721
defer arena_instance.deinit();
@@ -24,6 +28,7 @@ pub fn main() !void {
2428
var package_opt: ?[]const u8 = null;
2529
var build_root_path: ?[]const u8 = null;
2630
var override_global_cache_dir: ?[]const u8 = try std.zig.EnvVar.ZIG_GLOBAL_CACHE_DIR.get(arena);
31+
var subdeps = std.ArrayList([]const u8).init(arena);
2732

2833
assert(args.len > 0);
2934

@@ -50,7 +55,7 @@ pub fn main() !void {
5055
fatal("unrecognized parameter: '{s}'", .{arg});
5156
}
5257
} else if (package_opt != null) {
53-
fatal("unexpected extra parameter: '{s}'", .{arg});
58+
try subdeps.append(arg);
5459
} else {
5560
package_opt = arg;
5661
}
@@ -86,24 +91,25 @@ pub fn main() !void {
8691
ast.deinit(gpa);
8792
}
8893

94+
var dep_name = std.ArrayList(u8).init(gpa);
95+
defer dep_name.deinit();
96+
8997
if (package_opt) |package| {
9098
if (package.len == 0) {
9199
fatal("package name must not be empty", .{});
92100
}
93101
const dep: std.zig.Manifest.Dependency = dep: {
94-
var iter = std.mem.tokenizeScalar(u8, package, '.');
95-
96-
var dep = manifest.dependencies.get(iter.next().?) orelse {
102+
var dep = manifest.dependencies.get(package) orelse {
97103
fatal("there is no dependency named '{s}' in the manifest\n", .{package});
98104
};
99105

100-
var dep_name = iter.buffer[0 .. iter.index - 1];
106+
try dep_name.appendSlice(package);
101107

102-
while (iter.next()) |p| {
108+
for (subdeps.items) |p| {
103109
if (dep.hash) |hash| {
104110
var package_dir = global_cache_package_directory.openDir(hash, .{}) catch |e| switch (e) {
105111
error.FileNotFound => fatal("{s} is not in the global cache (hash: {s})", .{
106-
dep_name, hash,
112+
dep_name.items, hash,
107113
}),
108114
else => |err| return err,
109115
};
@@ -116,15 +122,18 @@ pub fn main() !void {
116122
});
117123

118124
dep = sub_manifest.dependencies.get(p) orelse {
119-
fatal("{s} has no dependency named '{s}' in its manifest", .{ dep_name, package });
125+
fatal("{s} has no dependency named '{s}' in its manifest", .{
126+
dep_name.items, p,
127+
});
120128
};
121-
dep_name = iter.buffer[0 .. iter.index - 1];
129+
try dep_name.append('.');
130+
try dep_name.appendSlice(p);
122131
} else switch (dep.location) {
123132
.url => fatal("the hash for {s} is missing from the manifest.\n", .{
124-
dep_name,
133+
dep_name.items,
125134
}),
126135
.path => |path| fatal("{s} is a local dependency located at {s}\n", .{
127-
dep_name, path,
136+
dep_name.items, path,
128137
}),
129138
}
130139
}
@@ -138,7 +147,7 @@ pub fn main() !void {
138147
if (list) {
139148
var package_dir = global_cache_package_directory.openDir(hash, .{}) catch |e| switch (e) {
140149
error.FileNotFound => fatal("{s} is not in the global cache (hash: {s})", .{
141-
package, hash,
150+
dep_name.items, hash,
142151
}),
143152
else => |err| return err,
144153
};
@@ -158,9 +167,22 @@ pub fn main() !void {
158167
}
159168

160169
const prefix = prefix: {
161-
const buffer = try arena.alloc(u8, package.len + 1);
170+
var prefix_len: usize = package.len + 1;
171+
for (subdeps.items) |subdep| {
172+
prefix_len += subdep.len + 1;
173+
}
174+
175+
const buffer = try arena.alloc(u8, prefix_len);
176+
162177
@memcpy(buffer[0..package.len], package);
163-
buffer[buffer.len - 1] = '.';
178+
buffer[package.len] = '.';
179+
180+
var i: usize = package.len + 1;
181+
for (subdeps.items) |subdep| {
182+
@memcpy(buffer[i..][0..subdep.len], subdep);
183+
buffer[i + subdep.len] = '.';
184+
i += subdep.len + 1;
185+
}
164186
break :prefix buffer;
165187
};
166188

@@ -198,12 +220,16 @@ fn listDepHashes(parent_prefix: []const u8, manifest: std.zig.Manifest) !void {
198220
try stdout.print("{s}{s} {s}\n", .{ parent_prefix, name, hash });
199221
} else {
200222
switch (entry.value_ptr.location) {
201-
.url => try stdout.print("{s}{s} {s}\n", .{
202-
parent_prefix, name, "(missing)",
203-
}),
204-
.path => |p| try stdout.print("{s}{s} {s} (local)\n", .{
205-
parent_prefix, name, p,
206-
}),
223+
.url => {
224+
try stdout.print("{s}{s} ", .{ parent_prefix, name });
225+
try stdout.writeByteNTimes(' ', longest_name - name.len);
226+
try stdout.writeAll("(missing)");
227+
},
228+
.path => |p| {
229+
try stdout.print("{s}{s} ", .{ parent_prefix, name });
230+
try stdout.writeByteNTimes(' ', longest_name - name.len);
231+
try stdout.print("{s} (local)\n", .{p});
232+
},
207233
}
208234
}
209235
}

0 commit comments

Comments
 (0)