Return base64 digest instead of using an out variable

master
LeRoyce Pearson 2020-03-06 22:19:43 -07:00 committed by Andrew Kelley
parent e75a6e5144
commit 8e4b80522f
1 changed files with 22 additions and 29 deletions

View File

@ -13,6 +13,7 @@ const os = @import("os.zig");
const base64_encoder = fs.base64_encoder;
const base64_decoder = fs.base64_decoder;
const BIN_DIGEST_LEN = 32;
const BASE64_DIGEST_LEN = base64.Base64Encoder.calcSize(BIN_DIGEST_LEN);
pub const File = struct {
path: ?[]const u8,
@ -41,7 +42,7 @@ pub const CacheHash = struct {
manifest_dirty: bool,
force_check_manifest: bool,
files: ArrayList(File),
b64_digest: ArrayList(u8),
b64_digest: [BASE64_DIGEST_LEN]u8,
pub fn init(alloc: *Allocator, manifest_dir_path: []const u8) !@This() {
try fs.cwd().makePath(manifest_dir_path);
@ -55,7 +56,7 @@ pub const CacheHash = struct {
.manifest_dirty = false,
.force_check_manifest = false,
.files = ArrayList(File).init(alloc),
.b64_digest = ArrayList(u8).init(alloc),
.b64_digest = undefined,
};
}
@ -126,27 +127,23 @@ pub const CacheHash = struct {
self.addSlice(cache_hash_file.path.?);
}
pub fn hit(self: *@This(), out_digest: *ArrayList(u8)) !bool {
pub fn hit(self: *@This()) !?[BASE64_DIGEST_LEN]u8 {
debug.assert(self.manifest_file == null);
var bin_digest: [BIN_DIGEST_LEN]u8 = undefined;
self.blake3.final(&bin_digest);
const OUT_DIGEST_LEN = base64.Base64Encoder.calcSize(BIN_DIGEST_LEN);
try self.b64_digest.resize(OUT_DIGEST_LEN);
base64_encoder.encode(self.b64_digest.toSlice(), &bin_digest);
base64_encoder.encode(self.b64_digest[0..], &bin_digest);
if (self.files.toSlice().len == 0 and !self.force_check_manifest) {
try out_digest.resize(OUT_DIGEST_LEN);
mem.copy(u8, out_digest.toSlice(), self.b64_digest.toSlice());
return true;
return self.b64_digest;
}
self.blake3 = Blake3.init();
self.blake3.update(&bin_digest);
{
const manifest_file_path = try fmt.allocPrint(self.alloc, "{}.txt", .{self.b64_digest.toSlice()});
const manifest_file_path = try fmt.allocPrint(self.alloc, "{}.txt", .{self.b64_digest});
defer self.alloc.free(manifest_file_path);
self.manifest_file = try self.manifest_dir.createFile(manifest_file_path, .{ .read = true, .truncate = false });
@ -231,7 +228,7 @@ pub const CacheHash = struct {
for (self.files.toSlice()) |file| {
self.blake3.update(&file.bin_digest);
}
return false;
return null;
}
if (idx < input_file_count or idx == 0) {
@ -244,11 +241,10 @@ pub const CacheHash = struct {
return error.CacheUnavailable;
};
}
return false;
return null;
}
try self.final(out_digest);
return true;
return try self.final();
}
pub fn populate_file_hash(self: *@This(), cache_hash_file: *File) !void {
@ -265,22 +261,22 @@ pub const CacheHash = struct {
self.blake3.update(&cache_hash_file.bin_digest);
}
pub fn final(self: *@This(), out_digest: *ArrayList(u8)) !void {
pub fn final(self: *@This()) ![BASE64_DIGEST_LEN]u8 {
debug.assert(self.manifest_file != null);
var bin_digest: [BIN_DIGEST_LEN]u8 = undefined;
self.blake3.final(&bin_digest);
const OUT_DIGEST_LEN = base64.Base64Encoder.calcSize(BIN_DIGEST_LEN);
try out_digest.resize(OUT_DIGEST_LEN);
base64_encoder.encode(out_digest.toSlice(), &bin_digest);
var out_digest: [BASE64_DIGEST_LEN]u8 = undefined;
base64_encoder.encode(&out_digest, &bin_digest);
return out_digest;
}
pub fn write_manifest(self: *@This()) !void {
debug.assert(self.manifest_file != null);
const OUT_DIGEST_LEN = base64.Base64Encoder.calcSize(BIN_DIGEST_LEN);
var encoded_digest = try Buffer.initSize(self.alloc, OUT_DIGEST_LEN);
var encoded_digest = try Buffer.initSize(self.alloc, BASE64_DIGEST_LEN);
defer encoded_digest.deinit();
var contents = try Buffer.init(self.alloc, "");
defer contents.deinit();
@ -308,7 +304,6 @@ pub const CacheHash = struct {
file.deinit(self.alloc);
}
self.files.deinit();
self.b64_digest.deinit();
self.manifest_dir.close();
}
};
@ -332,10 +327,8 @@ test "cache file and the recall it" {
try cwd.writeFile("test.txt", "Hello, world!\n");
var digest1 = try ArrayList(u8).initCapacity(testing.allocator, 32);
defer digest1.deinit();
var digest2 = try ArrayList(u8).initCapacity(testing.allocator, 32);
defer digest2.deinit();
var digest1: [BASE64_DIGEST_LEN]u8 = undefined;
var digest2: [BASE64_DIGEST_LEN]u8 = undefined;
{
var ch = try CacheHash.init(testing.allocator, temp_manifest_dir);
@ -347,9 +340,9 @@ test "cache file and the recall it" {
try ch.addFile("test.txt");
// There should be nothing in the cache
debug.assert((try ch.hit(&digest1)) == false);
debug.assert((try ch.hit()) == null);
try ch.final(&digest1);
digest1 = try ch.final();
}
{
var ch = try CacheHash.init(testing.allocator, temp_manifest_dir);
@ -361,10 +354,10 @@ test "cache file and the recall it" {
try ch.addFile("test.txt");
// Cache hit! We just "built" the same file
debug.assert((try ch.hit(&digest2)) == true);
digest2 = (try ch.hit()).?;
}
debug.assert(mem.eql(u8, digest1.toSlice(), digest2.toSlice()));
debug.assert(mem.eql(u8, digest1[0..], digest2[0..]));
try cwd.deleteTree(temp_manifest_dir);
}