lib/sandbox/src/copied.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const sys = @import("sys");
3 const audit_data = @import("audit.zig");
4 const command = @import("command.zig");
5 const cwd_data = @import("cwd.zig");
6 const layer_data = @import("layer.zig");
7 const plan_data = @import("plan.zig");
8 const result_data = @import("result.zig");
9 const scan = @import("scan.zig");
10
11 const Allocator = std.mem.Allocator;
12 const fs_io = sys.fs.debugIo();
13
14 pub fn execute(allocator: Allocator, plan: plan_data.Plan, audit: audit_data.Audit) !result_data.Result {
15 if (plan.argv.len == 0) return error.EmptyArgv;
16 try cwd_data.validate(plan.cwd);
17 var layer = try layer_data.create(allocator, .{
18 .scratch = plan.scratch,
19 .source = plan.source,
20 .prefix = plan.prefix,
21 .max_file_bytes = plan.max_file_bytes,
22 });
23 errdefer layer.deinit();
24
25 var before = try scan.capture(layer.root, allocator);
26 defer before.deinit();
27
28 var cwd_dir: ?sys.fs.Dir = null;
29 defer if (cwd_dir) |dir| dir.close(fs_io);
30 const cwd = if (std.mem.eql(u8, plan.cwd, "."))
31 layer.root
32 else blk: {
33 cwd_dir = try layer.root.openDir(fs_io, plan.cwd, .{});
34 try cwd_data.ensureInside(layer.root, cwd_dir.?);
35 break :blk cwd_dir.?;
36 };
37
38 var executed = try command.run(allocator, .{
39 .argv = plan.argv,
40 .cwd = .{ .dir = cwd },
41 .environ_map = plan.environ_map,
42 .stdout_limit = plan.stdout_limit,
43 .stderr_limit = plan.stderr_limit,
44 .timeout_ms = plan.timeout_ms,
45 .interrupt = plan.interrupt,
46 });
47 errdefer executed.deinit(allocator);
48
49 var after = try scan.capture(layer.root, allocator);
50 defer after.deinit();
51 var changes = try scan.diff(allocator, &before, &after);
52 errdefer changes.deinit();
53
54 const stdout = executed.stdout;
55 const stderr = executed.stderr;
56 executed.stdout = &.{};
57 executed.stderr = &.{};
58
59 var audit_value = audit;
60 audit_value.environment = if (plan.environ_map == null) .inherited else .replaced;
61 return .{
62 .allocator = allocator,
63 .layer = layer,
64 .status = .{ .term = executed.term },
65 .stdout = stdout,
66 .stderr = stderr,
67 .changes = changes,
68 .audit = audit_value,
69 };
70 }