X-Git-Url: https://gitweb.ps.run/ziggit/blobdiff_plain/a6e6daa88e6d294fbb7b6173b3cc37bcad28ccc8..107927604089c6fc63b5f5fef633542352f5269d:/git.zig diff --git a/git.zig b/git.zig index 0d42c2a..4dbe474 100644 --- a/git.zig +++ b/git.zig @@ -279,6 +279,9 @@ const PackFile = struct { } counter += bitsSet; + if (dataSize == 0) + dataSize = 0x10000; + std.mem.copyForwards( u8, result[resultCounter..result.len], @@ -294,6 +297,7 @@ const PackFile = struct { result[resultCounter..result.len], deltData[deltaDataOffset + counter + 1 .. deltaDataOffset + counter + 1 + dataSize], ); + resultCounter += dataSize; counter += dataSize; } @@ -331,6 +335,7 @@ const PackFile = struct { if (objectKind == 6) { const offset = try getOffset(reader); + return try self.ofsDelta( @intCast(offset.offset + objectSize.bytelen + offset.bytelen), ); @@ -425,7 +430,25 @@ test "get object" { if (try repo.getObject(head)) |o| { defer std.testing.allocator.free(o.data); - std.debug.print("object: {s}\n", .{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"); + defer repo.close(); + + const head = try repo.getHead(); + + if (try repo.getObject(head)) |o| { + defer std.testing.allocator.free(o.data); + + switch (try o.parse(std.testing.allocator)) { + .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 }); + }, + else => {}, + } } } @@ -436,44 +459,75 @@ test "get tree" { if (try repo.getObject(0xceb2b2c62d6f8f3686dcacecd5be931839b02c77)) |o| { defer std.testing.allocator.free(o.data); - std.debug.print("tree: {s}\n", .{o.data}); + // std.debug.print("tree({}): {any}\n", .{ o.kind, o.data }); } } -// test "list commits" { -// var repo = Repo.open(std.testing.allocator, "../imgui/.git"); -// defer repo.close(); -// const head = repo.getObject(repo.head); -// defer head.deinit(); +test "parse tree" { + var repo = try Repo.open(std.testing.allocator, "../imgui/.git"); + defer repo.close(); -// var c = head.getCommit(); -// for (0..3) |_| { -// std.debug.print("{}\n", .{c}); -// c = c.parent; -// } -// } + if (try repo.getObject(0xceb2b2c62d6f8f3686dcacecd5be931839b02c77)) |o| { + defer std.testing.allocator.free(o.data); -// test "tree" { -// var repo = Repo.open(std.testing.allocator, "../imgui/.git"); -// defer repo.close(); + switch (try o.parse(std.testing.allocator)) { + .t => |t| { + defer t.deinit(); + for (t.items) |treeEntry| { + std.debug.print("{s} {s} {x}\n", .{ treeEntry.permissions, treeEntry.name, treeEntry.id }); + } + }, + else => {}, + } + } +} -// const head = repo.getObject(repo.head); -// defer head.deinit(); +test "list commits" { + var repo = try Repo.open(std.testing.allocator, "../imgui/.git"); + defer repo.close(); -// const commit = head.getCommit(); + const head = try repo.getHead(); -// std.debug.print("{}\n", .{commit.tree}); -// } + var id = head; -// test "blob" { -// var repo = Repo.open(std.testing.allocator, "../imgui/.git"); -// defer repo.close(); + for (0..3) |_| { + if (try repo.getObject(id)) |o| { + defer std.testing.allocator.free(o.data); -// const head = repo.getObject(repo.head); -// defer head.deinit(); + switch (try o.parse(std.testing.allocator)) { + .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; + }, + else => {}, + } + } + } +} -// const commit = head.getCommit(); -// const blob = repo.getBlob(commit.files[0].id); +test "list blobs" { + var repo = try Repo.open(std.testing.allocator, "../imgui/.git"); + defer repo.close(); -// std.debug.print("{}\n", .{blob}); -// } + if (try repo.getObject(0xceb2b2c62d6f8f3686dcacecd5be931839b02c77)) |o| { + defer std.testing.allocator.free(o.data); + + switch (try o.parse(std.testing.allocator)) { + .t => |t| { + defer t.deinit(); + for (t.items) |treeEntry| { + if (try repo.getObject(treeEntry.id)) |bo| { + defer std.testing.allocator.free(bo.data); + + if (treeEntry.permissions.len == 6) { + std.debug.print("{s}: {s}\n", .{ treeEntry.name, bo.data[0..50] }); + } else { + std.debug.print("[{s}]\n", .{treeEntry.name}); + } + } + } + }, + else => {}, + } + } +}