aboutsummaryrefslogtreecommitdiff
path: root/src/Cache.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-09-28 22:40:50 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-09-28 22:40:50 -0700
commit73167e80f8a1d440ebc5725a165b7cf484b96170 (patch)
treecb9eca574d1bc37ccdd2e54732a350f23a75b18a /src/Cache.zig
parentef9582a1ec452aab816b67cd2d0d35ef7356ddae (diff)
downloadzig-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.zig10
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;
}