| ... | ... | @@ -793,9 +793,16 @@ pub const Repository = struct { |
| 793 | 793 | ); |
| 794 | 794 | } |
| 795 | 795 | } |
| 796 | | const t4 = tracer.trace(@src(), " find pack_index/pack_offset", .{}); |
| 797 | | errdefer t4.end(); |
| 798 | | const pack_index, const pack_offset = blk: for (r.idx_content.keys(), r.idx_content.values()) |idx_path, idx_content| { |
| 796 | const pack_index, const pack_offset = try r.getObjectPackIndex(oid) orelse return null; |
| 797 | // parse .pack |
| 798 | return try r.getPackedObject(arena, oid, pack_index, pack_offset); |
| 799 | } |
| 800 | |
| 801 | fn getObjectPackIndex(r: *Repository, oid: Id) !?[2]usize { |
| 802 | const t = tracer.trace(@src(), " {s}", .{oid}); |
| 803 | defer t.end(); |
| 804 | |
| 805 | for (r.idx_content.keys(), r.idx_content.values()) |idx_path, idx_content| { |
| 799 | 806 | if (std.mem.startsWith(u8, idx_content, "\xfftOc")) { |
| 800 | 807 | var idx_fbs: nio.FixedBufferStream([]const u8) = .init(idx_content); |
| 801 | 808 | _ = idx_fbs.takeSlice(4); |
| ... | ... | @@ -843,15 +850,11 @@ pub const Repository = struct { |
| 843 | 850 | try r.pack_content.put(r.gpa, idx_path, pack_content); |
| 844 | 851 | break :clk r.pack_content.count() - 1; |
| 845 | 852 | }; |
| 846 | | break :blk .{ pack_index, pack_offset }; |
| 847 | | } else { |
| 848 | | return error.Version1Idx; |
| 853 | return .{ pack_index, pack_offset }; |
| 849 | 854 | } |
| 850 | | } else return null; |
| 851 | | t4.end(); |
| 852 | | |
| 853 | | // parse .pack |
| 854 | | return try r.getPackedObject(arena, oid, pack_index, pack_offset); |
| 855 | return error.UnexpectedIdxVersion; |
| 856 | } |
| 857 | return null; |
| 855 | 858 | } |
| 856 | 859 | |
| 857 | 860 | fn getPackedObject(r: *Repository, arena: std.mem.Allocator, maybe_oid: ?Id, pack_index: usize, pack_offset: usize) !GitObject { |