Skip to content

Commit e33e20e

Browse files
committed
implement build root output
1 parent c4d6c64 commit e33e20e

2 files changed

Lines changed: 83 additions & 27 deletions

File tree

src/pkg-extractor.zig

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ const std = @import("std");
22
const tar = std.tar;
33
const TempFile = @import("TempFile.zig");
44
const flate = @import("flate/flate.zig");
5-
const tar_prefix = "build/p/";
5+
const tar_package_prefix = "build/p/";
6+
const tar_root_prefix = "build/root/";
7+
68
pub fn main() !void {
79
var gpa_alloc = std.heap.GeneralPurposeAllocator(.{}){};
810
const gpa = gpa_alloc.allocator();
@@ -32,6 +34,7 @@ pub const Options = struct {
3234
gpa: std.mem.Allocator,
3335
zig_exe: []const u8,
3436
filepath: []const u8,
37+
root_out_dir: ?[]const u8 = null,
3538
};
3639

3740
pub fn process(opt: Options) !void {
@@ -77,6 +80,11 @@ pub fn process(opt: Options) !void {
7780
.diagnostics = &tardiag,
7881
});
7982

83+
const root_out_dir = if (opt.root_out_dir) |rod|
84+
try std.fs.cwd().makeOpenPath(rod, .{})
85+
else
86+
null;
87+
8088
var count_entries: usize = 0;
8189
while (it.next() catch |err| {
8290
std.log.err("count_entries: {} err: {}", .{ count_entries, err });
@@ -86,18 +94,44 @@ pub fn process(opt: Options) !void {
8694
return err;
8795
}) |entry| {
8896
count_entries += 1;
89-
if (!std.mem.startsWith(u8, entry.name, tar_prefix)) continue;
97+
if (root_out_dir) |rod| {
98+
if (std.mem.startsWith(u8, entry.name, "build/root/")) {
99+
const entry_short_name = entry.name["build/root/".len..];
100+
switch (entry.kind) {
101+
.directory => try rod.makePath(entry_short_name),
102+
.file => {
103+
if (std.fs.path.dirname(entry_short_name)) |out_dir_name| {
104+
try rod.makePath(out_dir_name);
105+
}
106+
const out_fd = try rod.createFile(entry_short_name, .{});
107+
defer out_fd.close();
108+
var out_writer = out_fd.writer(&.{});
109+
try it.reader.streamExact64(&out_writer.interface, entry.size);
110+
it.unread_file_bytes = 0;
111+
},
112+
.sym_link => {
113+
if (std.fs.path.dirname(entry_short_name)) |out_dir_name| {
114+
try rod.makePath(out_dir_name);
115+
}
116+
try rod.symLink(entry_short_name, entry.link_name, .{});
117+
},
118+
}
119+
it.unread_file_bytes = 0;
120+
continue;
121+
}
122+
}
123+
if (!std.mem.startsWith(u8, entry.name, tar_package_prefix)) continue;
90124
const sep_idx = std.mem.indexOfAnyPos(
91125
u8,
92126
entry.name,
93-
tar_prefix.len,
127+
tar_package_prefix.len,
94128
std.fs.path.sep_str_posix,
95129
) orelse entry.name.len;
96130
const prefix = entry.name[0..sep_idx];
97131

98132
const gop = try temp.getOrPut(prefix);
99133
if (!gop.found_existing) {
100-
const hash = try opt.gpa.dupe(u8, prefix[tar_prefix.len..]);
134+
const hash = try opt.gpa.dupe(u8, prefix[tar_package_prefix.len..]);
101135
gop.value_ptr.* = .{
102136
.hash = hash,
103137
.tf = try TempFile.tmpFile(.{
@@ -148,6 +182,11 @@ pub fn process(opt: Options) !void {
148182
}
149183
it.unread_file_bytes = 0;
150184
}
185+
186+
if (opt.root_out_dir) |rod| {
187+
std.log.info("extracted: {s}", .{rod});
188+
}
189+
151190
{
152191
var fetch_err: ?anyerror = null;
153192
var err_buf: std.Io.Writer.Allocating = .init(opt.gpa);

src/zigpkg.zig

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ const GlobalOptions = struct {
4545
const CommandMap = []const Command;
4646
const Command = struct {
4747
[]const u8,
48-
*const fn (GlobalOptions, []const []const u8) anyerror!void,
48+
*const fn (GlobalOptions, []const []const u8) anyerror!u8,
4949
};
5050

51-
const commands = &.{
51+
const commands: CommandMap = &.{
5252
.{ "dot", cmd_dot },
5353
.{ "dotall", cmd_dotall },
5454
.{ "dothtml", cmd_dothtml },
@@ -88,6 +88,8 @@ pub fn main() !void {
8888

8989
if (args.len < 2) {
9090
try stdout.writeAll(usage);
91+
try stdout.flush();
92+
try stderr.flush();
9193
return std.process.exit(1);
9294
}
9395

@@ -115,18 +117,24 @@ pub fn main() !void {
115117

116118
inline for (commands) |cmd| {
117119
if (std.mem.eql(u8, args[1], cmd[0])) {
118-
return cmd[1](opt, args[2..]);
120+
const res = try cmd[1](opt, args[2..]);
121+
if (res == 0) return;
122+
try stdout.flush();
123+
try stderr.flush();
124+
std.process.exit(res);
119125
}
120126
}
121127

122128
try stdout.writeAll(usage);
123129
try stdout.writeAll("unknown command: ");
124130
try stdout.writeAll(args[1]);
125131
try stdout.writeAll("\n");
132+
try stdout.flush();
133+
try stderr.flush();
126134
return std.process.exit(1);
127135
}
128136

129-
pub fn cmd_deppkg(opt: GlobalOptions, args: []const []const u8) !void {
137+
pub fn cmd_deppkg(opt: GlobalOptions, args: []const []const u8) !u8 {
130138
const cmd_usage =
131139
\\usage: zigpkg deppkg <-h|--help|subcommand> [args]
132140
\\
@@ -143,11 +151,11 @@ pub fn cmd_deppkg(opt: GlobalOptions, args: []const []const u8) !void {
143151
;
144152
if (args.len < 1) {
145153
try opt.stdout.writeAll(cmd_usage);
146-
return std.process.exit(1);
154+
return 1;
147155
}
148156
if (helpArg(args[0..1])) {
149157
try opt.stdout.writeAll(cmd_usage);
150-
return std.process.exit(0);
158+
return 0;
151159
}
152160
inline for (deppkg_commands) |cmd| {
153161
if (std.mem.eql(u8, args[0], cmd[0])) {
@@ -159,7 +167,7 @@ pub fn cmd_deppkg(opt: GlobalOptions, args: []const []const u8) !void {
159167
try opt.stdout.writeAll("unknown command: ");
160168
try opt.stdout.writeAll(args[0]);
161169
try opt.stdout.writeAll("\n");
162-
return std.process.exit(1);
170+
return 1;
163171
}
164172

165173
pub fn helpArg(args: []const []const u8) bool {
@@ -172,34 +180,36 @@ pub fn helpArg(args: []const []const u8) bool {
172180
return false;
173181
}
174182

175-
pub fn cmd_extract(opt: GlobalOptions, args: []const []const u8) !void {
183+
pub fn cmd_extract(opt: GlobalOptions, args: []const []const u8) !u8 {
176184
const cmd_usage =
177-
\\usage: zigpkg extract <deppkg.tar.gz>
185+
\\usage: zigpkg extract <deppkg.tar.gz> <output_root>
178186
\\
179187
;
180-
if (args.len != 1) {
188+
if (args.len != 1 and args.len != 2) {
181189
try opt.stdout.writeAll(cmd_usage);
182-
return std.process.exit(1);
190+
return 1;
183191
}
184192
if (helpArg(args[0..args.len])) {
185193
try opt.stdout.writeAll(cmd_usage);
186-
return;
194+
return 0;
187195
}
188196
try pkg_extractor.process(.{
189197
.gpa = opt.gpa,
190198
.zig_exe = opt.zig_exe,
191199
.filepath = args[0],
200+
.root_out_dir = if (args.len == 1) null else args[1],
192201
});
202+
return 0;
193203
}
194204

195-
pub fn cmd_create(opt: GlobalOptions, args: []const []const u8) !void {
205+
pub fn cmd_create(opt: GlobalOptions, args: []const []const u8) !u8 {
196206
const cmd_usage =
197207
\\usage: zigpkg create <deppkg.tar.gz> <<build root path>|--> [z]
198208
\\
199209
;
200210
if (args.len < 1) {
201211
try opt.stdout.writeAll(cmd_usage);
202-
return std.process.exit(1);
212+
return 1;
203213
}
204214

205215
const output = try std.fs.path.resolve(opt.gpa, &.{ opt.cwd, args[0] });
@@ -241,9 +251,10 @@ pub fn cmd_create(opt: GlobalOptions, args: []const []const u8) !void {
241251
root,
242252
output,
243253
);
254+
return 0;
244255
}
245256

246-
pub fn cmd_from_zon(opt: GlobalOptions, args: []const []const u8) !void {
257+
pub fn cmd_from_zon(opt: GlobalOptions, args: []const []const u8) !u8 {
247258
const output = try std.fs.path.resolve(
248259
opt.gpa,
249260
&.{ opt.cwd, args[0] },
@@ -292,9 +303,10 @@ pub fn cmd_from_zon(opt: GlobalOptions, args: []const []const u8) !void {
292303
root,
293304
output,
294305
);
306+
return 0;
295307
}
296308

297-
pub fn cmd_dot(opt: GlobalOptions, args: []const []const u8) !void {
309+
pub fn cmd_dot(opt: GlobalOptions, args: []const []const u8) !u8 {
298310
const cmd_usage =
299311
\\usage: zigpkg dot {--help|build_root_path|--} [zig args]
300312
\\
@@ -320,10 +332,11 @@ pub fn cmd_dot(opt: GlobalOptions, args: []const []const u8) !void {
320332
return error.UnknownArgument;
321333
}
322334
}
323-
return runnerCommand(opt, "runner-dot.zig", root, args[arg_sep..]);
335+
try runnerCommand(opt, "runner-dot.zig", root, args[arg_sep..]);
336+
return 0;
324337
}
325338

326-
pub fn cmd_dotall(opt: GlobalOptions, args: []const []const u8) !void {
339+
pub fn cmd_dotall(opt: GlobalOptions, args: []const []const u8) !u8 {
327340
var arg_sep: usize = 0;
328341
var root: []const u8 = ".";
329342
for (args) |arg| {
@@ -376,16 +389,18 @@ pub fn cmd_dotall(opt: GlobalOptions, args: []const []const u8) !void {
376389
try opt.stdout.writeAll(dot.DotFileWriter.cluster_footer);
377390
}
378391
try opt.stdout.writeAll(dot.DotFileWriter.footer);
392+
return 0;
379393
}
380394

381-
pub fn cmd_dothtml(opt: GlobalOptions, args: []const []const u8) !void {
395+
pub fn cmd_dothtml(opt: GlobalOptions, args: []const []const u8) !u8 {
382396
const b = try zonOutputCmd(opt, args);
383397
defer b.deinit(opt.gpa);
384398

385399
try viz_network.render(b.parsed, opt.stdout);
400+
return 0;
386401
}
387402

388-
pub fn cmd_json(opt: GlobalOptions, args: []const []const u8) !void {
403+
pub fn cmd_json(opt: GlobalOptions, args: []const []const u8) !u8 {
389404
const b = try zonOutputCmd(opt, args);
390405
defer b.deinit(opt.gpa);
391406

@@ -394,9 +409,10 @@ pub fn cmd_json(opt: GlobalOptions, args: []const []const u8) !void {
394409
.emit_null_optional_fields = false,
395410
}),
396411
});
412+
return 0;
397413
}
398414

399-
pub fn cmd_zon(opt: GlobalOptions, args: []const []const u8) !void {
415+
pub fn cmd_zon(opt: GlobalOptions, args: []const []const u8) !u8 {
400416
const b = try zonOutputCmd(opt, args);
401417
defer b.deinit(opt.gpa);
402418

@@ -405,6 +421,7 @@ pub fn cmd_zon(opt: GlobalOptions, args: []const []const u8) !void {
405421
.emit_default_optional_fields = false,
406422
}, opt.stdout);
407423
try opt.stdout.writeAll("\n");
424+
return 0;
408425
}
409426

410427
pub fn zonOutputCmd(opt: GlobalOptions, args: []const []const u8) !SerializedZonType(Serialize) {
@@ -551,7 +568,7 @@ pub fn runnerCommand(opt: GlobalOptions, runner: []const u8, root: []const u8, a
551568
}
552569
}
553570

554-
pub fn cmd_build(opt: GlobalOptions, args: []const []const u8) !void {
571+
pub fn cmd_build(opt: GlobalOptions, args: []const []const u8) !u8 {
555572
_ = args;
556573
const cmd_usage =
557574
\\usage: zigpkg build <deppkg.tar.gz> <install directory> [zig build args]
@@ -563,7 +580,7 @@ pub fn cmd_build(opt: GlobalOptions, args: []const []const u8) !void {
563580
@panic("NOT IMPLEMENTED");
564581
}
565582

566-
pub fn cmd_checkout(opt: GlobalOptions, args: []const []const u8) !void {
583+
pub fn cmd_checkout(opt: GlobalOptions, args: []const []const u8) !u8 {
567584
_ = args;
568585
const cmd_usage =
569586
\\usage: zigpkg checkout <empty directory for git deps> {build root path}

0 commit comments

Comments
 (0)