authorgravatar for michaldrozd@protonmail.chfardragon <michaldrozd@protonmail.ch> 2025-06-05 21:23:40+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-06-06 11:11:49-07:00
log3c151f0b1c560167326aa73ebbb7923dd810ee95
treec61807bdf7a3d5b31ca5913df709f906b8b303f7
parentb6d904624296dc5c60c34d8613d6c261e60328cf

Handle empty hashes in build.zig.zon


2 files changed, 11 insertions(+), 2 deletions(-)

src/Package.zig+6
...@@ -67,6 +67,7 @@ pub const Hash = struct {...@@ -67,6 +67,7 @@ pub const Hash = struct {
67 pub fn toSlice(ph: *const Hash) []const u8 {67 pub fn toSlice(ph: *const Hash) []const u8 {
68 var end: usize = ph.bytes.len;68 var end: usize = ph.bytes.len;
69 while (true) {69 while (true) {
70 if (end == 0) return &.{};
70 end -= 1;71 end -= 1;
71 if (ph.bytes[end] != 0) return ph.bytes[0 .. end + 1];72 if (ph.bytes[end] != 0) return ph.bytes[0 .. end + 1];
72 }73 }
...@@ -195,6 +196,11 @@ test Hash {...@@ -195,6 +196,11 @@ test Hash {
195 try std.testing.expectEqualStrings("nasm-2.16.1-3-vrr-ygAAoADH9XG3tOdvPNuHen_d-XeHndOG-nNXmved", result.toSlice());196 try std.testing.expectEqualStrings("nasm-2.16.1-3-vrr-ygAAoADH9XG3tOdvPNuHen_d-XeHndOG-nNXmved", result.toSlice());
196}197}
197198
199test "EmptyHash" {
200 const hash = Hash.fromSlice("");
201 try std.testing.expectEqualStrings("", hash.toSlice());
202}
203
198test {204test {
199 _ = Fetch;205 _ = Fetch;
200}206}
src/Package/Fetch.zig+5-2
...@@ -567,16 +567,18 @@ fn runResource(...@@ -567,16 +567,18 @@ fn runResource(
567 if (declared_hash.isOld()) {567 if (declared_hash.isOld()) {
568 const actual_hex = Package.multiHashHexDigest(f.computed_hash.digest);568 const actual_hex = Package.multiHashHexDigest(f.computed_hash.digest);
569 if (!std.mem.eql(u8, declared_hash.toSlice(), &actual_hex)) {569 if (!std.mem.eql(u8, declared_hash.toSlice(), &actual_hex)) {
570 const declared = if (declared_hash.toSlice().len > 0) declared_hash.toSlice() else "<empty>";
570 return f.fail(hash_tok, try eb.printString(571 return f.fail(hash_tok, try eb.printString(
571 "hash mismatch: manifest declares {s} but the fetched package has {s}",572 "hash mismatch: manifest declares {s} but the fetched package has {s}",
572 .{ declared_hash.toSlice(), actual_hex },573 .{ declared, actual_hex },
573 ));574 ));
574 }575 }
575 } else {576 } else {
576 if (!computed_package_hash.eql(&declared_hash)) {577 if (!computed_package_hash.eql(&declared_hash)) {
578 const declared = if (declared_hash.toSlice().len > 0) declared_hash.toSlice() else "<empty>";
577 return f.fail(hash_tok, try eb.printString(579 return f.fail(hash_tok, try eb.printString(
578 "hash mismatch: manifest declares {s} but the fetched package has {s}",580 "hash mismatch: manifest declares {s} but the fetched package has {s}",
579 .{ declared_hash.toSlice(), computed_package_hash.toSlice() },581 .{ declared, computed_package_hash.toSlice() },
580 ));582 ));
581 }583 }
582 }584 }
...@@ -726,6 +728,7 @@ fn queueJobsForDeps(f: *Fetch) RunError!void {...@@ -726,6 +728,7 @@ fn queueJobsForDeps(f: *Fetch) RunError!void {
726 .hash = h: {728 .hash = h: {
727 const h = dep.hash orelse break :h null;729 const h = dep.hash orelse break :h null;
728 const pkg_hash: Package.Hash = .fromSlice(h);730 const pkg_hash: Package.Hash = .fromSlice(h);
731 if (h.len == 0) break :h pkg_hash;
729 const gop = f.job_queue.table.getOrPutAssumeCapacity(pkg_hash);732 const gop = f.job_queue.table.getOrPutAssumeCapacity(pkg_hash);
730 if (gop.found_existing) {733 if (gop.found_existing) {
731 if (!dep.lazy) {734 if (!dep.lazy) {