]> gitweb.ps.run Git - ziggit/blobdiff - git.zig
refactor std.testing.allocator into alloc
[ziggit] / git.zig
diff --git a/git.zig b/git.zig
index ee3eb3d4f19abd35cca3d462ab9e9623cb730e2a..22bdf5daab0420333bd0fd461f9bb527b35f3883 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;
     }
@@ -398,7 +410,8 @@ const Repo = struct {
 };
 
 test "print HEAD" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     const head = try repo.getHead();
@@ -407,7 +420,8 @@ test "print HEAD" {
 }
 
 test "parse idx" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     if (repo.packfile) |packfile| {
@@ -417,28 +431,30 @@ test "parse idx" {
 }
 
 test "get object" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     const head = try repo.getHead();
 
     if (try repo.getObject(head)) |o| {
-        defer std.testing.allocator.free(o.data);
+        defer alloc.free(o.data);
 
         std.debug.print("object({}): {s}\n", .{ o.kind, o.data });
     }
 }
 
 test "parse commit" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     const head = try repo.getHead();
 
     if (try repo.getObject(head)) |o| {
-        defer std.testing.allocator.free(o.data);
+        defer alloc.free(o.data);
 
-        switch (try o.parse(std.testing.allocator)) {
+        switch (try o.parse(alloc)) {
             .c => |c| {
                 std.debug.print("commit:\n  tree: {x}\n  parent: {x}\n  author: {s}\n  committer: {s}\n  message: {s}\n", .{ c.tree, c.parent, c.author, c.committer, c.message });
             },
@@ -448,24 +464,26 @@ test "parse commit" {
 }
 
 test "get tree" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     if (try repo.getObject(0xceb2b2c62d6f8f3686dcacecd5be931839b02c77)) |o| {
-        defer std.testing.allocator.free(o.data);
+        defer alloc.free(o.data);
 
         // std.debug.print("tree({}): {any}\n", .{ o.kind, o.data });
     }
 }
 
 test "parse tree" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     if (try repo.getObject(0xceb2b2c62d6f8f3686dcacecd5be931839b02c77)) |o| {
-        defer std.testing.allocator.free(o.data);
+        defer alloc.free(o.data);
 
-        switch (try o.parse(std.testing.allocator)) {
+        switch (try o.parse(alloc)) {
             .t => |t| {
                 defer t.deinit();
                 for (t.items) |treeEntry| {
@@ -478,7 +496,8 @@ test "parse tree" {
 }
 
 test "list commits" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     const head = try repo.getHead();
@@ -487,9 +506,9 @@ test "list commits" {
 
     for (0..3) |_| {
         if (try repo.getObject(id)) |o| {
-            defer std.testing.allocator.free(o.data);
+            defer alloc.free(o.data);
 
-            switch (try o.parse(std.testing.allocator)) {
+            switch (try o.parse(alloc)) {
                 .c => |c| {
                     std.debug.print("commit {x}:\n  tree: {x}\n  parent: {x}\n  author: {s}\n  committer: {s}\n  message: {s}\n", .{ id, c.tree, c.parent, c.author, c.committer, c.message });
                     id = c.parent;
@@ -501,21 +520,22 @@ test "list commits" {
 }
 
 test "list blobs" {
-    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+    const alloc = std.testing.allocator;
+    var repo = try Repo.open(alloc, "../imgui/.git");
     defer repo.close();
 
     if (try repo.getObject(0xceb2b2c62d6f8f3686dcacecd5be931839b02c77)) |o| {
-        defer std.testing.allocator.free(o.data);
+        defer alloc.free(o.data);
 
-        switch (try o.parse(std.testing.allocator)) {
+        switch (try o.parse(alloc)) {
             .t => |t| {
                 defer t.deinit();
                 for (t.items) |treeEntry| {
                     if (try repo.getObject(treeEntry.id)) |bo| {
-                        defer std.testing.allocator.free(bo.data);
+                        defer alloc.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});
                         }