authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-09-13 19:32:44-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-09-16 13:12:47-07:00
log92439e73d06dfda221043830c23cad836d8232a5
treefaa2dd2e3c41712c19eec4b23646500243f29666
parentd1b961c9ebb875b8e8c6fc082a1f9d5e6f175daa

std.Build.Cache: don't preemptively truncate the manifest


1 files changed, 6 insertions(+), 14 deletions(-)

lib/std/Build/Cache.zig+6-14
......@@ -1017,17 +1017,14 @@ pub const Manifest = struct {
10171017 // Validate and check discovered files.
10181018 while (off + 1 < disk_contents.len) {
10191019 const file_off: File.Offset = @fromBackingInt(@intCast(off));
1020 const file = file_off.getFallible(disk_contents) catch
1021 return checkLockedMiss(m, input_contents_len, .invalid_manifest);
1022 if (file.flags.prefix >= m.cache.prefixes_len)
1023 return checkLockedMiss(m, input_contents_len, .invalid_manifest);
1024 const path = file_off.pathFallible(disk_contents) catch
1025 return checkLockedMiss(m, input_contents_len, .invalid_manifest);
1026 if (path.len == 0) return checkLockedMiss(m, input_contents_len, .invalid_manifest);
1020 const file = file_off.getFallible(disk_contents) catch return .invalid_manifest;
1021 if (file.flags.prefix >= m.cache.prefixes_len) return .invalid_manifest;
1022 const path = file_off.pathFallible(disk_contents) catch return .invalid_manifest;
1023 if (path.len == 0) return .invalid_manifest;
10271024
10281025 try m.files.putContext(gpa, file_off, {}, .{ .contents = disk_contents });
10291026 const result = try checkDiscoveredPath(m, file_off, disk_contents);
1030 if (result != .hit) return checkLockedMiss(m, input_contents_len, result);
1027 if (result != .hit) return result;
10311028
10321029 off += File.sizeOf(path.len);
10331030 }
......@@ -1035,7 +1032,7 @@ pub const Manifest = struct {
10351032 // Final terminating zero byte to distinguish empty manifest file from
10361033 // manifest with zero files.
10371034 const file_valid = off + 1 == disk_contents.len and disk_contents[off] == 0;
1038 if (!file_valid) return checkLockedMiss(m, input_contents_len, .incomplete_manifest);
1035 if (!file_valid) return .incomplete_manifest;
10391036
10401037 // Since it's a cache hit, we accept the input file contents from disk and discard the other copy.
10411038 // Furthermore, don't track the trailing zero byte in contents.
......@@ -1082,11 +1079,6 @@ pub const Manifest = struct {
10821079 return result;
10831080 }
10841081
1085 fn checkLockedMiss(m: *Manifest, input_contents_len: usize, result: CheckResult) CheckResult {
1086 m.contents.shrinkRetainingCapacity(input_contents_len);
1087 return result;
1088 }
1089
10901082 /// Similar to `checkInputPath` and `checkDiscoveredPath` but does not compare metadata or digest against file
10911083 /// system. Only ensures that metadata and digest are available.
10921084 fn populateInputPath(