1
1
const usage_dep_hash =
2
- \\Usage: zig dep-hash [--list] [dep-name]
2
+ \\Usage: zig dep-hash [--list] [dep-name] [subdep...]
3
3
\\
4
4
\\ List the hashes of packages in the build.zig.zon manifest.
5
5
\\
@@ -12,6 +12,10 @@ const usage_dep_hash =
12
12
\\
13
13
;
14
14
15
+ pub const std_options : std.Options = .{
16
+ .log_level = .debug ,
17
+ };
18
+
15
19
pub fn main () ! void {
16
20
var arena_instance = std .heap .ArenaAllocator .init (std .heap .page_allocator );
17
21
defer arena_instance .deinit ();
@@ -24,6 +28,7 @@ pub fn main() !void {
24
28
var package_opt : ? []const u8 = null ;
25
29
var build_root_path : ? []const u8 = null ;
26
30
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 );
27
32
28
33
assert (args .len > 0 );
29
34
@@ -50,7 +55,7 @@ pub fn main() !void {
50
55
fatal ("unrecognized parameter: '{s}'" , .{arg });
51
56
}
52
57
} else if (package_opt != null ) {
53
- fatal ( "unexpected extra parameter: '{s}'" , .{ arg } );
58
+ try subdeps . append ( arg );
54
59
} else {
55
60
package_opt = arg ;
56
61
}
@@ -86,24 +91,25 @@ pub fn main() !void {
86
91
ast .deinit (gpa );
87
92
}
88
93
94
+ var dep_name = std .ArrayList (u8 ).init (gpa );
95
+ defer dep_name .deinit ();
96
+
89
97
if (package_opt ) | package | {
90
98
if (package .len == 0 ) {
91
99
fatal ("package name must not be empty" , .{});
92
100
}
93
101
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 {
97
103
fatal ("there is no dependency named '{s}' in the manifest\n " , .{package });
98
104
};
99
105
100
- var dep_name = iter . buffer [ 0 .. iter . index - 1 ] ;
106
+ try dep_name . appendSlice ( package ) ;
101
107
102
- while ( iter . next () ) | p | {
108
+ for ( subdeps . items ) | p | {
103
109
if (dep .hash ) | hash | {
104
110
var package_dir = global_cache_package_directory .openDir (hash , .{}) catch | e | switch (e ) {
105
111
error .FileNotFound = > fatal ("{s} is not in the global cache (hash: {s})" , .{
106
- dep_name , hash ,
112
+ dep_name . items , hash ,
107
113
}),
108
114
else = > | err | return err ,
109
115
};
@@ -116,15 +122,18 @@ pub fn main() !void {
116
122
});
117
123
118
124
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
+ });
120
128
};
121
- dep_name = iter .buffer [0 .. iter .index - 1 ];
129
+ try dep_name .append ('.' );
130
+ try dep_name .appendSlice (p );
122
131
} else switch (dep .location ) {
123
132
.url = > fatal ("the hash for {s} is missing from the manifest.\n " , .{
124
- dep_name ,
133
+ dep_name . items ,
125
134
}),
126
135
.path = > | path | fatal ("{s} is a local dependency located at {s}\n " , .{
127
- dep_name , path ,
136
+ dep_name . items , path ,
128
137
}),
129
138
}
130
139
}
@@ -138,7 +147,7 @@ pub fn main() !void {
138
147
if (list ) {
139
148
var package_dir = global_cache_package_directory .openDir (hash , .{}) catch | e | switch (e ) {
140
149
error .FileNotFound = > fatal ("{s} is not in the global cache (hash: {s})" , .{
141
- package , hash ,
150
+ dep_name . items , hash ,
142
151
}),
143
152
else = > | err | return err ,
144
153
};
@@ -158,9 +167,22 @@ pub fn main() !void {
158
167
}
159
168
160
169
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
+
162
177
@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
+ }
164
186
break :prefix buffer ;
165
187
};
166
188
@@ -198,12 +220,16 @@ fn listDepHashes(parent_prefix: []const u8, manifest: std.zig.Manifest) !void {
198
220
try stdout .print ("{s}{s} {s}\n " , .{ parent_prefix , name , hash });
199
221
} else {
200
222
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
+ },
207
233
}
208
234
}
209
235
}
0 commit comments