diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-09-28 22:40:50 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-09-28 22:40:50 -0700 |
| commit | 73167e80f8a1d440ebc5725a165b7cf484b96170 (patch) | |
| tree | cb9eca574d1bc37ccdd2e54732a350f23a75b18a /src/Cache.zig | |
| parent | ef9582a1ec452aab816b67cd2d0d35ef7356ddae (diff) | |
| download | zig-73167e80f8a1d440ebc5725a165b7cf484b96170.tar.gz zig-73167e80f8a1d440ebc5725a165b7cf484b96170.zip | |
stage2: fix Cache not calling ftruncate in writeManifest
this led to a corrupt cache when the number of files got smaller. it is
now fixed.
Diffstat (limited to 'src/Cache.zig')
| -rw-r--r-- | src/Cache.zig | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/Cache.zig b/src/Cache.zig index 425c6407a3..dff6f7e38e 100644 --- a/src/Cache.zig +++ b/src/Cache.zig @@ -528,14 +528,15 @@ pub const Manifest = struct { } pub fn writeManifest(self: *Manifest) !void { - assert(self.manifest_file != null); + const manifest_file = self.manifest_file.?; if (!self.manifest_dirty) return; - var encoded_digest: [hex_digest_len]u8 = undefined; var contents = std.ArrayList(u8).init(self.cache.gpa); - var writer = contents.writer(); defer contents.deinit(); + const writer = contents.writer(); + var encoded_digest: [hex_digest_len]u8 = undefined; + for (self.files.items) |file| { _ = std.fmt.bufPrint(&encoded_digest, "{x}", .{file.bin_digest}) catch unreachable; try writer.print("{d} {d} {d} {s} {s}\n", .{ @@ -547,7 +548,8 @@ pub const Manifest = struct { }); } - try self.manifest_file.?.pwriteAll(contents.items, 0); + try manifest_file.setEndPos(contents.items.len); + try manifest_file.pwriteAll(contents.items, 0); self.manifest_dirty = false; } |
