const Blob = struct {
data: []u8,
};
+const ParsedObject = union(enum) {
+ c: Commit,
+ t: Tree,
+ b: Blob,
+};
const Object = struct {
kind: u3,
data: []u8,
.data = data,
};
}
- pub fn parse(self: Object, alloc: Alloc) !union(enum) { c: Commit, t: Tree, b: Blob } {
+ pub fn parse(self: Object, alloc: Alloc) !ParsedObject {
switch (self.kind) {
1 => {
const authorOffset = std.mem.indexOf(u8, self.data, "author ") orelse return error.InvalidCommitFormat;
}
counter += bitsSet;
+ if (dataSize == 0)
+ dataSize = 0x10000;
+
std.mem.copyForwards(
u8,
result[resultCounter..result.len],
result[resultCounter..result.len],
deltData[deltaDataOffset + counter + 1 .. deltaDataOffset + counter + 1 + dataSize],
);
+
resultCounter += dataSize;
counter += dataSize;
}
if (objectKind == 6) {
const offset = try getOffset(reader);
+
return try self.ofsDelta(
@intCast(offset.offset + objectSize.bytelen + offset.bytelen),
);
const pckReader = self.pckFile.reader().any();
try self.pckFile.seekTo(offset);
- return try self.readObject(pckReader);
+ const o = try self.readObject(pckReader);
+
+ return o;
}
return null;
}
defer std.testing.allocator.free(bo.data);
if (treeEntry.permissions.len == 6) {
- std.debug.print("{s}: {s}\n", .{ treeEntry.name, bo.data[0..50] });
+ std.debug.print("{s}: [{x} {}]{s}\n", .{ treeEntry.name, treeEntry.id, bo.data.len, bo.data[0..50] });
} else {
std.debug.print("[{s}]\n", .{treeEntry.name});
}