authorgravatar for ian@ianjohnson.devIan Johnson <ian@ianjohnson.dev> 2025-07-31 21:56:08-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 22:10:11-07:00
logd91744401fd83fe2d603b5020fc141285aa017a1
treeb0838fb1d140761a82b4357344b39f71efb06463
parent64814dc986a6ea4ab06ad523c48b2d3302903620

fetch: More Git fixes


2 files changed, 12 insertions(+), 15 deletions(-)

lib/std/Io/Writer.zig+1-1
...@@ -2418,7 +2418,7 @@ pub fn Hashing(comptime Hasher: type) type {...@@ -2418,7 +2418,7 @@ pub fn Hashing(comptime Hasher: type) type {
2418 n += slice.len;2418 n += slice.len;
2419 }2419 }
2420 for (0..splat) |_| hasher.update(data[data.len - 1]);2420 for (0..splat) |_| hasher.update(data[data.len - 1]);
2421 return n + splat;2421 return n + splat * data[data.len - 1].len;
2422 }2422 }
2423 };2423 };
2424}2424}
src/Package/Fetch/git.zig+11-14
...@@ -1500,13 +1500,11 @@ fn readObjectRaw(allocator: Allocator, reader: *std.Io.Reader, size: u64) ![]u8...@@ -1500,13 +1500,11 @@ fn readObjectRaw(allocator: Allocator, reader: *std.Io.Reader, size: u64) ![]u8
1500 return aw.toOwnedSlice();1500 return aw.toOwnedSlice();
1501}1501}
15021502
1503/// Expands delta data from `delta_reader` to `writer`. `base_object` must1503/// Expands delta data from `delta_reader` to `writer`.
1504/// support `reader` and `seekTo` (such as a `std.io.FixedBufferStream`).
1505///1504///
1506/// The format of the delta data is documented in1505/// The format of the delta data is documented in
1507/// [pack-format](https://git-scm.com/docs/pack-format).1506/// [pack-format](https://git-scm.com/docs/pack-format).
1508fn expandDelta(base_object: []const u8, delta_reader: *std.Io.Reader, writer: *std.Io.Writer) !void {1507fn expandDelta(base_object: []const u8, delta_reader: *std.Io.Reader, writer: *std.Io.Writer) !void {
1509 var base_offset: u32 = 0;
1510 while (true) {1508 while (true) {
1511 const inst: packed struct { value: u7, copy: bool } = @bitCast(delta_reader.takeByte() catch |e| switch (e) {1509 const inst: packed struct { value: u7, copy: bool } = @bitCast(delta_reader.takeByte() catch |e| switch (e) {
1512 error.EndOfStream => return,1510 error.EndOfStream => return,
...@@ -1528,7 +1526,7 @@ fn expandDelta(base_object: []const u8, delta_reader: *std.Io.Reader, writer: *s...@@ -1528,7 +1526,7 @@ fn expandDelta(base_object: []const u8, delta_reader: *std.Io.Reader, writer: *s
1528 .offset3 = if (available.offset3) try delta_reader.takeByte() else 0,1526 .offset3 = if (available.offset3) try delta_reader.takeByte() else 0,
1529 .offset4 = if (available.offset4) try delta_reader.takeByte() else 0,1527 .offset4 = if (available.offset4) try delta_reader.takeByte() else 0,
1530 };1528 };
1531 base_offset = @bitCast(offset_parts);1529 const base_offset: u32 = @bitCast(offset_parts);
1532 const size_parts: packed struct { size1: u8, size2: u8, size3: u8 } = .{1530 const size_parts: packed struct { size1: u8, size2: u8, size3: u8 } = .{
1533 .size1 = if (available.size1) try delta_reader.takeByte() else 0,1531 .size1 = if (available.size1) try delta_reader.takeByte() else 0,
1534 .size2 = if (available.size2) try delta_reader.takeByte() else 0,1532 .size2 = if (available.size2) try delta_reader.takeByte() else 0,
...@@ -1537,7 +1535,6 @@ fn expandDelta(base_object: []const u8, delta_reader: *std.Io.Reader, writer: *s...@@ -1537,7 +1535,6 @@ fn expandDelta(base_object: []const u8, delta_reader: *std.Io.Reader, writer: *s
1537 var size: u24 = @bitCast(size_parts);1535 var size: u24 = @bitCast(size_parts);
1538 if (size == 0) size = 0x10000;1536 if (size == 0) size = 0x10000;
1539 try writer.writeAll(base_object[base_offset..][0..size]);1537 try writer.writeAll(base_object[base_offset..][0..size]);
1540 base_offset += size;
1541 } else if (inst.value != 0) {1538 } else if (inst.value != 0) {
1542 try delta_reader.streamExact(writer, inst.value);1539 try delta_reader.streamExact(writer, inst.value);
1543 } else {1540 } else {
...@@ -1582,13 +1579,15 @@ fn runRepositoryTest(comptime format: Oid.Format, head_commit: []const u8) !void...@@ -1582,13 +1579,15 @@ fn runRepositoryTest(comptime format: Oid.Format, head_commit: []const u8) !void
1582 // (all files in the test repo are known to be smaller than this)1579 // (all files in the test repo are known to be smaller than this)
1583 const max_file_size = 8192;1580 const max_file_size = 8192;
15841581
1585 const index_file_data = try git_dir.dir.readFileAlloc(testing.allocator, "testrepo.idx", max_file_size);1582 if (!skip_checksums) {
1586 defer testing.allocator.free(index_file_data);1583 const index_file_data = try git_dir.dir.readFileAlloc(testing.allocator, "testrepo.idx", max_file_size);
1587 // testrepo.idx is generated by Git. The index created by this file should1584 defer testing.allocator.free(index_file_data);
1588 // match it exactly. Running `git verify-pack -v testrepo.pack` can verify1585 // testrepo.idx is generated by Git. The index created by this file should
1589 // this.1586 // match it exactly. Running `git verify-pack -v testrepo.pack` can verify
1590 const testrepo_idx = @embedFile("git/testdata/testrepo-" ++ @tagName(format) ++ ".idx");1587 // this.
1591 try testing.expectEqualSlices(u8, testrepo_idx, index_file_data);1588 const testrepo_idx = @embedFile("git/testdata/testrepo-" ++ @tagName(format) ++ ".idx");
1589 try testing.expectEqualSlices(u8, testrepo_idx, index_file_data);
1590 }
15921591
1593 var index_file_reader = index_file.reader(&index_file_buffer);1592 var index_file_reader = index_file.reader(&index_file_buffer);
1594 var repository: Repository = undefined;1593 var repository: Repository = undefined;
...@@ -1669,12 +1668,10 @@ fn runRepositoryTest(comptime format: Oid.Format, head_commit: []const u8) !void...@@ -1669,12 +1668,10 @@ fn runRepositoryTest(comptime format: Oid.Format, head_commit: []const u8) !void
1669const skip_checksums = true;1668const skip_checksums = true;
16701669
1671test "SHA-1 packfile indexing and checkout" {1670test "SHA-1 packfile indexing and checkout" {
1672 if (skip_checksums) return error.SkipZigTest;
1673 try runRepositoryTest(.sha1, "dd582c0720819ab7130b103635bd7271b9fd4feb");1671 try runRepositoryTest(.sha1, "dd582c0720819ab7130b103635bd7271b9fd4feb");
1674}1672}
16751673
1676test "SHA-256 packfile indexing and checkout" {1674test "SHA-256 packfile indexing and checkout" {
1677 if (skip_checksums) return error.SkipZigTest;
1678 try runRepositoryTest(.sha256, "7f444a92bd4572ee4a28b2c63059924a9ca1829138553ef3e7c41ee159afae7a");1675 try runRepositoryTest(.sha256, "7f444a92bd4572ee4a28b2c63059924a9ca1829138553ef3e7c41ee159afae7a");
1679}1676}
16801677