]> gitweb.ps.run Git - ziggit/blobdiff - git.zig
Create type for object parse return enum
[ziggit] / git.zig
diff --git a/git.zig b/git.zig
index ee3eb3d4f19abd35cca3d462ab9e9623cb730e2a..37933c987c857c99f413668400d1ebd4f0e8e066 100644 (file)
--- 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});
                         }