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;
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;
}
};
test "print HEAD" {
- var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var repo = try Repo.open(alloc, "../imgui/.git");
defer repo.close();
const head = try repo.getHead();
}
test "parse idx" {
- var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var repo = try Repo.open(alloc, "../imgui/.git");
defer repo.close();
if (repo.packfile) |packfile| {
}
test "get object" {
- var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.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");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.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 });
},
}
test "get tree" {
- var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.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");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.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| {
}
test "list commits" {
- var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var repo = try Repo.open(alloc, "../imgui/.git");
defer repo.close();
const head = try repo.getHead();
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;
}
test "list blobs" {
- var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.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}: [{x} {}]{s}\n", .{ treeEntry.name, treeEntry.id, bo.data.len, bo.data[0..50] });
}
}
}
+
+test "basic frontend" {
+ var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena.deinit();
+ const alloc = arena.allocator();
+
+ var repo = try Repo.open(alloc, "../imgui/.git");
+ defer repo.close();
+
+ const head = try repo.getHead();
+
+ var id = head;
+
+ for (0..3) |_| {
+ if (try repo.getObject(id)) |o| {
+ defer alloc.free(o.data);
+
+ 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;
+ },
+ else => {},
+ }
+ }
+ }
+}