+ return result;
+ }
+
+ fn ofsDelta(self: *PackFile, offset: i64) anyerror!Object {
+ const pckReader = self.pckFile.reader().any();
+
+ const pos = try self.pckFile.getPos();
+
+ try self.pckFile.seekBy(-offset);
+ const baseObject = try self.readObject(pckReader);
+ defer self.alloc.free(baseObject.data);
+
+ try self.pckFile.seekTo(pos);
+ const deltaData = try decompress(self.alloc, pckReader);
+ defer self.alloc.free(deltaData);
+
+ const objectData = try applyDelta(self.alloc, baseObject.data, deltaData);
+ return Object.init(baseObject.kind, objectData);
+ }
+
+ fn readObject(self: *PackFile, reader: Reader) anyerror!Object {
+ const firstByte = try reader.readByte();
+ const objectKind: u3 = @truncate(firstByte >> 4);
+ try self.pckFile.seekBy(-1);
+ const objectSize = try getSize(reader, true);
+
+ if (objectKind == 6) {
+ const offset = try getOffset(reader);
+ return try self.ofsDelta(
+ @intCast(offset.offset + objectSize.bytelen + offset.bytelen),
+ );
+ } else {
+ const objectData = try decompress(self.alloc, reader);
+ return Object.init(objectKind, objectData);
+ }
+ }
+
+ pub fn getObject(self: *PackFile, id: Id) !?Object {
+ if (self.objectOffsets.get(id)) |offset| {
+ const pckReader = self.pckFile.reader().any();
+ try self.pckFile.seekTo(offset);
+
+ return try self.readObject(pckReader);
+ }
+ return null;
+ }
+};
+
+const Repo = struct {
+ alloc: Alloc,
+ dir: std.fs.Dir,
+ packfile: ?PackFile,
+
+ pub fn open(alloc: Alloc, path: []const u8) !Repo {
+ const dir = try std.fs.cwd().openDir(path, .{});
+
+ const packfile = try PackFile.open(alloc, dir);
+