1 const std = @import("std");
3 const Alloc = std.mem.Allocator;
6 const Commit = struct {
7 author: std.BoundedArray(u8, 64),
8 message: std.BoundedArray(u8, 1024),
13 data: std.BoundedArray(u8, 1024),
15 const Object = struct {
18 // pub fn getCommit(self: *Object) Commit {}
19 // pub fn getBlob(self: *Object) Blob {}
21 const PackFile = struct {
24 pub fn open(alloc: Alloc, dir: std.fs.Dir) !PackFile {
25 var self = PackFile{ .alloc = alloc };
27 var packDir = try dir.openDir("objects/pack", .{ .iterate = true });
28 defer packDir.close();
30 var packIt = packDir.iterate();
31 while (try packIt.next()) |f| {
32 if (std.mem.endsWith(u8, f.name, ".idx")) {
33 const idxFilename = f.name;
34 var pckFilename = try std.BoundedArray(u8, std.fs.max_path_bytes).init(0);
38 .{idxFilename[0 .. idxFilename.len - 4]},
41 const idxFile = try packDir.openFile(idxFilename, .{});
42 const pckFile = try packDir.openFile(pckFilename.constSlice(), .{});
43 defer idxFile.close();
44 defer pckFile.close();
46 const idxReader = idxFile.reader().any();
47 const pckReader = pckFile.reader().any();
49 try self.parse(idxReader, pckReader);
55 pub fn parse(self: *PackFile, idxReader: std.io.AnyReader, pckReader: std.io.AnyReader) !void {
57 var buffer: [16]u8 = undefined;
58 _ = try idxReader.read(&buffer);
59 std.debug.print("{s}\n", .{&buffer});
60 _ = try pckReader.read(&buffer);
61 std.debug.print("{s}\n", .{&buffer});
64 // pub fn init(alloc: Alloc, path: []const u8) PackFile {}
65 // pub fn deinit(self: *PackFile) void {}
66 // pub fn getObject(self: *PackFile, id: Id) Object {}
73 pub fn open(alloc: Alloc, path: []const u8) !Repo {
74 const dir = try std.fs.cwd().openDir(path, .{});
76 const packfile = try PackFile.open(alloc, dir);
84 pub fn close(self: *Repo) void {
87 pub fn getHead(self: *Repo) !Id {
89 const head = try self.dir.readFileAlloc(self.alloc, "HEAD", 1024);
90 defer self.alloc.free(head);
92 // read file pointed at by HEAD
93 const headPath = head[5 .. head.len - 1];
94 var idBuffer: [40]u8 = undefined;
95 const idStr = try self.dir.readFile(headPath, &idBuffer);
98 return try std.fmt.parseUnsigned(u160, idStr, 16);
100 // pub fn getObject(self: *Repo, id: Id) Object {}
104 var repo = try Repo.open(std.testing.allocator, "../microwindows/.git");
107 const head = try repo.getHead();
109 std.debug.print("HEAD: {}\n", .{head});
112 // test "list commits" {
113 // var repo = Repo.open(std.testing.allocator, "../microwindows/.git");
114 // defer repo.close();
116 // const head = repo.getObject(repo.head);
117 // defer head.deinit();
119 // var c = head.getCommit();
121 // std.debug.print("{}\n", .{c});
127 // var repo = Repo.open(std.testing.allocator, "../microwindows/.git");
128 // defer repo.close();
130 // const head = repo.getObject(repo.head);
131 // defer head.deinit();
133 // const commit = head.getCommit();
135 // std.debug.print("{}\n", .{commit.tree});
139 // var repo = Repo.open(std.testing.allocator, "../microwindows/.git");
140 // defer repo.close();
142 // const head = repo.getObject(repo.head);
143 // defer head.deinit();
145 // const commit = head.getCommit();
146 // const blob = repo.getBlob(commit.files[0].id);
148 // std.debug.print("{}\n", .{blob});