X-Git-Url: https://gitweb.ps.run/ziggit/blobdiff_plain/b201a54d012efea0c92fb17fda58f41ce1ada19a..efdfc67c25639929fb63ef7f6e18474690546599:/git.zig diff --git a/git.zig b/git.zig index ee3eb3d..37933c9 100644 --- a/git.zig +++ b/git.zig @@ -23,6 +23,11 @@ const Tree = std.ArrayList(TreeEntry); const Blob = struct { data: []u8, }; +const ParsedObject = union(enum) { + c: Commit, + t: Tree, + b: Blob, +}; const Object = struct { kind: u3, data: []u8, @@ -33,7 +38,7 @@ const Object = struct { .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; @@ -279,6 +284,9 @@ const PackFile = struct { } counter += bitsSet; + if (dataSize == 0) + dataSize = 0x10000; + std.mem.copyForwards( u8, result[resultCounter..result.len], @@ -294,6 +302,7 @@ const PackFile = struct { result[resultCounter..result.len], deltData[deltaDataOffset + counter + 1 .. deltaDataOffset + counter + 1 + dataSize], ); + resultCounter += dataSize; counter += dataSize; } @@ -331,6 +340,7 @@ const PackFile = struct { if (objectKind == 6) { const offset = try getOffset(reader); + return try self.ofsDelta( @intCast(offset.offset + objectSize.bytelen + offset.bytelen), ); @@ -345,7 +355,9 @@ const PackFile = struct { 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; } @@ -515,7 +527,7 @@ test "list blobs" { 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}); }