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 }