| ... | ... | @@ -1111,24 +1111,21 @@ fn indexPackFirstPass( |
| 1111 | 1111 | index_entries: *std.AutoHashMapUnmanaged(Oid, IndexEntry), |
| 1112 | 1112 | pending_deltas: *std.ArrayListUnmanaged(IndexEntry), |
| 1113 | 1113 | ) ![Sha1.digest_length]u8 { |
| 1114 | | var pack_counting_writer = std.io.countingWriter(std.io.null_writer); |
| 1115 | | var pack_hashed_writer = std.compress.hashedWriter(pack_counting_writer.writer(), Sha1.init(.{})); |
| 1116 | | var entry_crc32_writer = std.compress.hashedWriter(pack_hashed_writer.writer(), std.hash.Crc32.init()); |
| 1117 | | var pack_buffered_reader = std.io.bufferedTee(4096, 8, pack.reader(), entry_crc32_writer.writer()); |
| 1118 | | const pack_reader = pack_buffered_reader.reader(); |
| 1114 | var pack_buffered_reader = std.io.bufferedReader(pack.reader()); |
| 1115 | var pack_counting_reader = std.io.countingReader(pack_buffered_reader.reader()); |
| 1116 | var pack_hashed_reader = std.compress.hashedReader(pack_counting_reader.reader(), Sha1.init(.{})); |
| 1117 | const pack_reader = pack_hashed_reader.reader(); |
| 1119 | 1118 | |
| 1120 | 1119 | const pack_header = try PackHeader.read(pack_reader); |
| 1121 | | try pack_buffered_reader.flush(); |
| 1122 | 1120 | |
| 1123 | 1121 | var current_entry: u32 = 0; |
| 1124 | 1122 | while (current_entry < pack_header.total_objects) : (current_entry += 1) { |
| 1125 | | const entry_offset = pack_counting_writer.bytes_written; |
| 1126 | | entry_crc32_writer.hasher = std.hash.Crc32.init(); // reset hasher |
| 1127 | | const entry_header = try EntryHeader.read(pack_reader); |
| 1128 | | |
| 1123 | const entry_offset = pack_counting_reader.bytes_read; |
| 1124 | var entry_crc32_reader = std.compress.hashedReader(pack_reader, std.hash.Crc32.init()); |
| 1125 | const entry_header = try EntryHeader.read(entry_crc32_reader.reader()); |
| 1129 | 1126 | switch (entry_header) { |
| 1130 | 1127 | .commit, .tree, .blob, .tag => |object| { |
| 1131 | | var entry_decompress_stream = std.compress.zlib.decompressor(pack_reader); |
| 1128 | var entry_decompress_stream = std.compress.zlib.decompressor(entry_crc32_reader.reader()); |
| 1132 | 1129 | var entry_counting_reader = std.io.countingReader(entry_decompress_stream.reader()); |
| 1133 | 1130 | var entry_hashed_writer = hashedWriter(std.io.null_writer, Sha1.init(.{})); |
| 1134 | 1131 | const entry_writer = entry_hashed_writer.writer(); |
| ... | ... | @@ -1141,33 +1138,29 @@ fn indexPackFirstPass( |
| 1141 | 1138 | return error.InvalidObject; |
| 1142 | 1139 | } |
| 1143 | 1140 | const oid = entry_hashed_writer.hasher.finalResult(); |
| 1144 | | pack_buffered_reader.putBack(entry_decompress_stream.unreadBytes()); |
| 1145 | | try pack_buffered_reader.flush(); |
| 1146 | 1141 | try index_entries.put(allocator, oid, .{ |
| 1147 | 1142 | .offset = entry_offset, |
| 1148 | | .crc32 = entry_crc32_writer.hasher.final(), |
| 1143 | .crc32 = entry_crc32_reader.hasher.final(), |
| 1149 | 1144 | }); |
| 1150 | 1145 | }, |
| 1151 | 1146 | inline .ofs_delta, .ref_delta => |delta| { |
| 1152 | | var entry_decompress_stream = std.compress.zlib.decompressor(pack_reader); |
| 1147 | var entry_decompress_stream = std.compress.zlib.decompressor(entry_crc32_reader.reader()); |
| 1153 | 1148 | var entry_counting_reader = std.io.countingReader(entry_decompress_stream.reader()); |
| 1154 | 1149 | var fifo = std.fifo.LinearFifo(u8, .{ .Static = 4096 }).init(); |
| 1155 | 1150 | try fifo.pump(entry_counting_reader.reader(), std.io.null_writer); |
| 1156 | 1151 | if (entry_counting_reader.bytes_read != delta.uncompressed_length) { |
| 1157 | 1152 | return error.InvalidObject; |
| 1158 | 1153 | } |
| 1159 | | pack_buffered_reader.putBack(entry_decompress_stream.unreadBytes()); |
| 1160 | | try pack_buffered_reader.flush(); |
| 1161 | 1154 | try pending_deltas.append(allocator, .{ |
| 1162 | 1155 | .offset = entry_offset, |
| 1163 | | .crc32 = entry_crc32_writer.hasher.final(), |
| 1156 | .crc32 = entry_crc32_reader.hasher.final(), |
| 1164 | 1157 | }); |
| 1165 | 1158 | }, |
| 1166 | 1159 | } |
| 1167 | 1160 | } |
| 1168 | 1161 | |
| 1169 | | const pack_checksum = pack_hashed_writer.hasher.finalResult(); |
| 1170 | | const recorded_checksum = try pack_reader.readBytesNoEof(Sha1.digest_length); |
| 1162 | const pack_checksum = pack_hashed_reader.hasher.finalResult(); |
| 1163 | const recorded_checksum = try pack_buffered_reader.reader().readBytesNoEof(Sha1.digest_length); |
| 1171 | 1164 | if (!mem.eql(u8, &pack_checksum, &recorded_checksum)) { |
| 1172 | 1165 | return error.CorruptedPack; |
| 1173 | 1166 | } |