const Reader = std.io.AnyReader;
const Writer = std.io.AnyWriter;
+const MaxFileSize = 1024 * 1024;
+
const Id = u160;
const Commit = struct {
+ tree: Id,
+ parent: Id,
author: []u8,
+ committer: []u8,
message: []u8,
- parent: Id,
- tree: Id,
};
+const TreeEntry = struct {
+ permissions: []u8,
+ name: []u8,
+ id: Id,
+};
+const Tree = std.ArrayList(TreeEntry);
const Blob = struct {
data: []u8,
};
// pub fn getBlob(self: *Object) Blob {}
};
+fn decompress(alloc: Alloc, r: Reader) ![]u8 {
+ var buffer = std.ArrayList(u8).init(alloc);
+
+ try std.compress.zlib.decompress(r, buffer.writer().any());
+
+ return alloc.realloc(buffer.allocatedSlice(), buffer.items.len);
+}
+
const PackFile = struct {
alloc: Alloc,
idxFile: std.fs.File,
}
pub fn getObject(self: *Repo, id: Id) !?Object {
- return self.packfile.getObject(id);
+ if (self.packfile) |*packfile| {
+ return packfile.getObject(id);
+ }
+ return null;
}
};
test "print HEAD" {
- var repo = try Repo.open(std.testing.allocator, "../microwindows/.git");
+ var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
defer repo.close();
const head = try repo.getHead();
}
test "parse idx" {
- var repo = try Repo.open(std.testing.allocator, "../microwindows/.git");
+ var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
defer repo.close();
- std.debug.print("{}\n", .{repo.packfile.objectOffsets.keys().len});
- std.debug.print("{}\n", .{repo.packfile.objectOffsets.values().len});
+ if (repo.packfile) |packfile| {
+ std.debug.print("{}\n", .{packfile.objectOffsets.keys().len});
+ std.debug.print("{}\n", .{packfile.objectOffsets.values().len});
+ }
}
test "get object" {
- var repo = try Repo.open(std.testing.allocator, "../microwindows/.git");
+ var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
defer repo.close();
const head = try repo.getHead();