| ... | @@ -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 | } |
| 1502 | | 1502 | |
| 1503 | /// Expands delta data from `delta_reader` to `writer`. `base_object` must | 1503 | /// 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 in | 1505 | /// 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). |
| 1508 | fn expandDelta(base_object: []const u8, delta_reader: *std.Io.Reader, writer: *std.Io.Writer) !void { | 1507 | fn 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; |
| 1584 | | 1581 | |
| 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 should | 1584 | defer testing.allocator.free(index_file_data); |
| 1588 | // match it exactly. Running `git verify-pack -v testrepo.pack` can verify | 1585 | // 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 | } |
| 1592 | | 1591 | |
| 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 |
| 1669 | const skip_checksums = true; | 1668 | const skip_checksums = true; |
| 1670 | | 1669 | |
| 1671 | test "SHA-1 packfile indexing and checkout" { | 1670 | test "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 | } |
| 1675 | | 1673 | |
| 1676 | test "SHA-256 packfile indexing and checkout" { | 1674 | test "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 | } |
| 1680 | | 1677 | |