| ... | ... | @@ -48,6 +48,7 @@ pub fn make( |
| 48 | 48 | const conf_run = conf_step.extended.get(conf.extra).run; |
| 49 | 49 | const argv_list = &run.argv; |
| 50 | 50 | const output_placeholders = &run.output_placeholders; |
| 51 | const cache_root = graph.local_cache_root; |
| 51 | 52 | |
| 52 | 53 | argv_list.clearRetainingCapacity(); |
| 53 | 54 | output_placeholders.clearRetainingCapacity(); |
| ... | ... | @@ -174,51 +175,62 @@ pub fn make( |
| 174 | 175 | } |
| 175 | 176 | } |
| 176 | 177 | |
| 177 | | if (true) @panic("TODO"); |
| 178 | | |
| 179 | 178 | switch (conf_run.stdin.u) { |
| 180 | 179 | .bytes => |bytes| { |
| 181 | | man.hash.addBytes(bytes); |
| 180 | man.hash.addBytes(bytes.slice(conf)); |
| 182 | 181 | }, |
| 183 | 182 | .lazy_path => |lazy_path| { |
| 184 | | const file_path = lazy_path.getPath2(graph, step); |
| 185 | | _ = try man.addFile(file_path, null); |
| 183 | const file_path = try maker.resolveLazyPathIndex(arena, lazy_path, run_index); |
| 184 | _ = try man.addFilePath(file_path, null); |
| 186 | 185 | }, |
| 187 | 186 | .none => {}, |
| 188 | 187 | } |
| 189 | 188 | |
| 190 | | if (conf_run.captured_stdout) |captured| { |
| 191 | | man.hash.addBytes(captured.output.basename); |
| 192 | | man.hash.add(captured.trim_whitespace); |
| 189 | if (conf_run.captured_stdout.value) |captured| { |
| 190 | man.hash.addBytes(captured.basename.slice(conf)); |
| 191 | man.hash.add(conf_run.flags.stdout_trim_whitespace); |
| 193 | 192 | } |
| 194 | 193 | |
| 195 | | if (conf_run.captured_stderr) |captured| { |
| 196 | | man.hash.addBytes(captured.output.basename); |
| 197 | | man.hash.add(captured.trim_whitespace); |
| 194 | if (conf_run.captured_stderr.value) |captured| { |
| 195 | man.hash.addBytes(captured.basename.slice(conf)); |
| 196 | man.hash.add(conf_run.flags.stderr_trim_whitespace); |
| 198 | 197 | } |
| 199 | 198 | |
| 200 | | std.log.err("TODO hashStdIo", .{}); |
| 201 | | //hashStdIo(&man.hash, conf_run.stdio); |
| 199 | switch (conf_run.flags.stdio) { |
| 200 | .infer_from_args, .inherit, .zig_test => {}, |
| 201 | .check => { |
| 202 | man.hash.addBytes(if (conf_run.expect_stderr_exact.value) |bytes| bytes.slice(conf) else ""); |
| 203 | man.hash.addBytes(if (conf_run.expect_stdout_exact.value) |bytes| bytes.slice(conf) else ""); |
| 204 | for (conf_run.expect_stderr_match.slice) |bytes| man.hash.addBytes(bytes.slice(conf)); |
| 205 | for (conf_run.expect_stdout_match.slice) |bytes| man.hash.addBytes(bytes.slice(conf)); |
| 206 | man.hash.add(conf_run.flags2.expect_term_status); |
| 207 | man.hash.addOptional(conf_run.expect_term_value.value); |
| 208 | }, |
| 209 | } |
| 202 | 210 | |
| 203 | | for (conf_run.file_inputs.items) |lazy_path| { |
| 204 | | _ = try man.addFile(lazy_path.getPath2(graph, step), null); |
| 211 | for (conf_run.file_inputs.slice) |lazy_path| { |
| 212 | const file_path = try maker.resolveLazyPathIndex(arena, lazy_path, run_index); |
| 213 | _ = try man.addFilePath(file_path, null); |
| 205 | 214 | } |
| 206 | 215 | |
| 207 | | if (conf_run.cwd) |cwd| { |
| 208 | | const cwd_path = cwd.getPath3(graph, step); |
| 216 | if (conf_run.cwd.value) |lazy_path| { |
| 217 | const cwd_path = try maker.resolveLazyPathIndex(arena, lazy_path, run_index); |
| 209 | 218 | _ = man.hash.addBytes(try cwd_path.toString(arena)); |
| 210 | 219 | } |
| 211 | 220 | |
| 212 | 221 | const has_side_effects = conf_run.flags.has_side_effects; |
| 213 | 222 | |
| 214 | | if (!has_side_effects and try step.cacheHitAndWatch(&man)) { |
| 223 | if (true) @panic("TODO"); |
| 224 | |
| 225 | if (!has_side_effects and try step.cacheHitAndWatch(maker, &man)) { |
| 215 | 226 | // cache hit, skip running command |
| 216 | 227 | const digest = man.final(); |
| 217 | 228 | |
| 218 | 229 | try populateGeneratedPaths( |
| 219 | 230 | arena, |
| 220 | 231 | output_placeholders.items, |
| 221 | | graph.cache_root, |
| 232 | &conf_run, |
| 233 | cache_root, |
| 222 | 234 | &digest, |
| 223 | 235 | ); |
| 224 | 236 | |
| ... | ... | @@ -236,7 +248,8 @@ pub fn make( |
| 236 | 248 | try populateGeneratedPaths( |
| 237 | 249 | arena, |
| 238 | 250 | output_placeholders.items, |
| 239 | | graph.cache_root, |
| 251 | &conf_run, |
| 252 | cache_root, |
| 240 | 253 | &digest, |
| 241 | 254 | ); |
| 242 | 255 | |
| ... | ... | @@ -248,9 +261,9 @@ pub fn make( |
| 248 | 261 | .output_directory => output_sub_path, |
| 249 | 262 | else => unreachable, |
| 250 | 263 | }; |
| 251 | | graph.cache_root.handle.createDirPath(io, output_sub_dir_path) catch |err| { |
| 264 | cache_root.handle.createDirPath(io, output_sub_dir_path) catch |err| { |
| 252 | 265 | return step.fail(maker, "unable to make path '{f}{s}': {t}", .{ |
| 253 | | graph.cache_root, output_sub_dir_path, err, |
| 266 | cache_root, output_sub_dir_path, err, |
| 254 | 267 | }); |
| 255 | 268 | }; |
| 256 | 269 | const arg_output_path = try convertPathArg(run_index, maker, .{ |
| ... | ... | @@ -281,13 +294,13 @@ pub fn make( |
| 281 | 294 | .output_directory => output_sub_path, |
| 282 | 295 | else => unreachable, |
| 283 | 296 | }; |
| 284 | | graph.cache_root.handle.createDirPath(io, output_sub_dir_path) catch |err| { |
| 297 | cache_root.handle.createDirPath(io, output_sub_dir_path) catch |err| { |
| 285 | 298 | return step.fail(maker, "unable to make path '{f}{s}': {t}", .{ |
| 286 | | graph.cache_root, output_sub_dir_path, err, |
| 299 | cache_root, output_sub_dir_path, err, |
| 287 | 300 | }); |
| 288 | 301 | }; |
| 289 | 302 | const raw_output_path: Path = .{ |
| 290 | | .root_dir = graph.cache_root, |
| 303 | .root_dir = cache_root, |
| 291 | 304 | .sub_path = graph.pathJoin(&output_components), |
| 292 | 305 | }; |
| 293 | 306 | placeholder.output.generated_file.path = raw_output_path.toString(arena) catch @panic("OOM"); |
| ... | ... | @@ -318,21 +331,21 @@ pub fn make( |
| 318 | 331 | if (any_output) { |
| 319 | 332 | const o_sub_path = "o" ++ Dir.path.sep_str ++ &digest; |
| 320 | 333 | |
| 321 | | graph.cache_root.handle.rename(tmp_dir_path, graph.cache_root.handle, o_sub_path, io) catch |err| switch (err) { |
| 334 | cache_root.handle.rename(tmp_dir_path, cache_root.handle, o_sub_path, io) catch |err| switch (err) { |
| 322 | 335 | Dir.RenameError.DirNotEmpty => { |
| 323 | | graph.cache_root.handle.deleteTree(io, o_sub_path) catch |del_err| { |
| 336 | cache_root.handle.deleteTree(io, o_sub_path) catch |del_err| { |
| 324 | 337 | return step.fail(maker, "unable to remove dir '{f}'{s}: {t}", .{ |
| 325 | | graph.cache_root, tmp_dir_path, del_err, |
| 338 | cache_root, tmp_dir_path, del_err, |
| 326 | 339 | }); |
| 327 | 340 | }; |
| 328 | | graph.cache_root.handle.rename(tmp_dir_path, graph.cache_root.handle, o_sub_path, io) catch |retry_err| { |
| 341 | cache_root.handle.rename(tmp_dir_path, cache_root.handle, o_sub_path, io) catch |retry_err| { |
| 329 | 342 | return step.fail(maker, "unable to rename dir '{f}{s}' to '{f}{s}': {t}", .{ |
| 330 | | graph.cache_root, tmp_dir_path, graph.cache_root, o_sub_path, retry_err, |
| 343 | cache_root, tmp_dir_path, cache_root, o_sub_path, retry_err, |
| 331 | 344 | }); |
| 332 | 345 | }; |
| 333 | 346 | }, |
| 334 | 347 | else => return step.fail(maker, "unable to rename dir '{f}{s}' to '{f}{s}': {t}", .{ |
| 335 | | graph.cache_root, tmp_dir_path, graph.cache_root, o_sub_path, err, |
| 348 | cache_root, tmp_dir_path, cache_root, o_sub_path, err, |
| 336 | 349 | }), |
| 337 | 350 | }; |
| 338 | 351 | } |
| ... | ... | @@ -342,7 +355,8 @@ pub fn make( |
| 342 | 355 | try populateGeneratedPaths( |
| 343 | 356 | arena, |
| 344 | 357 | output_placeholders.items, |
| 345 | | graph.cache_root, |
| 358 | &conf_run, |
| 359 | cache_root, |
| 346 | 360 | &digest, |
| 347 | 361 | ); |
| 348 | 362 | } |
| ... | ... | @@ -1548,8 +1562,7 @@ const CapturedStdIo = void; // TODO get it from Configuration |
| 1548 | 1562 | fn populateGeneratedPaths( |
| 1549 | 1563 | arena: std.mem.Allocator, |
| 1550 | 1564 | output_placeholders: []const IndexedOutput, |
| 1551 | | captured_stdout: ?*CapturedStdIo, |
| 1552 | | captured_stderr: ?*CapturedStdIo, |
| 1565 | conf_run: *const Configuration.Step.Run, |
| 1553 | 1566 | cache_root: Cache.Directory, |
| 1554 | 1567 | digest: *const Cache.HexDigest, |
| 1555 | 1568 | ) !void { |
| ... | ... | @@ -1559,13 +1572,13 @@ fn populateGeneratedPaths( |
| 1559 | 1572 | }); |
| 1560 | 1573 | } |
| 1561 | 1574 | |
| 1562 | | if (captured_stdout) |captured| { |
| 1575 | if (conf_run.captured_stdout.value) |captured| { |
| 1563 | 1576 | captured.output.generated_file.path = try cache_root.join(arena, &.{ |
| 1564 | 1577 | "o", digest, captured.output.basename, |
| 1565 | 1578 | }); |
| 1566 | 1579 | } |
| 1567 | 1580 | |
| 1568 | | if (captured_stderr) |captured| { |
| 1581 | if (conf_run.captured_stderr.value) |captured| { |
| 1569 | 1582 | captured.output.generated_file.path = try cache_root.join(arena, &.{ |
| 1570 | 1583 | "o", digest, captured.output.basename, |
| 1571 | 1584 | }); |
| ... | ... | @@ -1985,29 +1998,6 @@ fn spawnChildAndCollect( |
| 1985 | 1998 | } |
| 1986 | 1999 | } |
| 1987 | 2000 | |
| 1988 | | fn hashStdIo(hh: *Cache.HashHelper, stdio: void) void { |
| 1989 | | switch (stdio) { |
| 1990 | | .infer_from_args, .inherit, .zig_test => {}, |
| 1991 | | .check => |checks| for (checks.items) |check| { |
| 1992 | | hh.add(@as(std.meta.Tag(@This().StdIo.Check), check)); |
| 1993 | | switch (check) { |
| 1994 | | .expect_stderr_exact, |
| 1995 | | .expect_stderr_match, |
| 1996 | | .expect_stdout_exact, |
| 1997 | | .expect_stdout_match, |
| 1998 | | => |s| hh.addBytes(s), |
| 1999 | | |
| 2000 | | .expect_term => |term| { |
| 2001 | | hh.add(@as(std.meta.Tag(process.Child.Term), term)); |
| 2002 | | switch (term) { |
| 2003 | | inline .exited, .signal, .stopped => |x| hh.add(x), |
| 2004 | | .unknown => |x| hh.add(x), |
| 2005 | | } |
| 2006 | | }, |
| 2007 | | } |
| 2008 | | }, |
| 2009 | | } |
| 2010 | | } |
| 2011 | 2001 | fn termMatches(expected: ?process.Child.Term, actual: process.Child.Term) bool { |
| 2012 | 2002 | return if (expected) |e| switch (e) { |
| 2013 | 2003 | .exited => |expected_code| switch (actual) { |