]> gitweb.ps.run Git - ziggit/blobdiff - git.zig
replace packfile with optional
[ziggit] / git.zig
diff --git a/git.zig b/git.zig
index 7d0ccdbfc64cb2258687a34452b98ba01a2e6106..fd79e6c6174baf640ad8612de07ddfc86428b417 100644 (file)
--- a/git.zig
+++ b/git.zig
@@ -4,6 +4,8 @@ const Alloc = std.mem.Allocator;
 const Reader = std.io.AnyReader;
 const Writer = std.io.AnyWriter;
 
+const MaxFileSize = 1024 * 1024;
+
 const Id = u160;
 const Commit = struct {
     author: []u8,
@@ -34,7 +36,7 @@ const PackFile = struct {
     pckFile: std.fs.File,
     objectOffsets: std.AutoArrayHashMap(Id, u32),
 
-    pub fn open(alloc: Alloc, dir: std.fs.Dir) !PackFile {
+    pub fn open(alloc: Alloc, dir: std.fs.Dir) !?PackFile {
         var self = PackFile{
             .alloc = alloc,
             .idxFile = undefined,
@@ -45,6 +47,8 @@ const PackFile = struct {
         var packDir = try dir.openDir("objects/pack", .{ .iterate = true });
         defer packDir.close();
 
+        var packFileFound = false;
+
         var packIt = packDir.iterate();
         while (try packIt.next()) |f| {
             if (std.mem.endsWith(u8, f.name, ".idx")) {
@@ -60,9 +64,14 @@ const PackFile = struct {
                 self.pckFile = try packDir.openFile(pckFilename.constSlice(), .{});
 
                 try self.parseIndex();
+
+                packFileFound = true;
             }
         }
 
+        if (!packFileFound)
+            return null;
+
         return self;
     }
 
@@ -174,18 +183,6 @@ const PackFile = struct {
         };
     }
 
-    fn decompress(alloc: Alloc, reader: Reader, size: usize) ![]u8 {
-        const outBuffer = try alloc.alloc(u8, size);
-        errdefer alloc.free(outBuffer);
-
-        var outFbs = std.io.fixedBufferStream(outBuffer);
-        const writer = outFbs.writer();
-
-        try std.compress.zlib.decompress(reader, writer);
-
-        return outBuffer;
-    }
-
     fn applyDelta(alloc: Alloc, baseData: []const u8, deltData: []const u8) ![]u8 {
         var fbs = std.io.fixedBufferStream(deltData);
         const deltDataReader = fbs.reader().any();
@@ -245,7 +242,7 @@ const PackFile = struct {
         return result;
     }
 
-    fn ofsDelta(self: *PackFile, offset: i64, size: usize) anyerror!Object {
+    fn ofsDelta(self: *PackFile, offset: i64) anyerror!Object {
         const pckReader = self.pckFile.reader().any();
 
         const pos = try self.pckFile.getPos();
@@ -255,7 +252,7 @@ const PackFile = struct {
         defer self.alloc.free(baseObject.data);
 
         try self.pckFile.seekTo(pos);
-        const deltaData = try decompress(self.alloc, pckReader, size);
+        const deltaData = try decompress(self.alloc, pckReader);
         defer self.alloc.free(deltaData);
 
         const objectData = try applyDelta(self.alloc, baseObject.data, deltaData);
@@ -272,10 +269,9 @@ const PackFile = struct {
             const offset = try getOffset(reader);
             return try self.ofsDelta(
                 @intCast(offset.offset + objectSize.bytelen + offset.bytelen),
-                objectSize.size,
             );
         } else {
-            const objectData = try decompress(self.alloc, reader, objectSize.size);
+            const objectData = try decompress(self.alloc, reader);
             return Object.init(objectKind, objectData);
         }
     }
@@ -294,7 +290,7 @@ const PackFile = struct {
 const Repo = struct {
     alloc: Alloc,
     dir: std.fs.Dir,
-    packfile: PackFile,
+    packfile: ?PackFile,
 
     pub fn open(alloc: Alloc, path: []const u8) !Repo {
         const dir = try std.fs.cwd().openDir(path, .{});
@@ -310,7 +306,9 @@ const Repo = struct {
 
     pub fn close(self: *Repo) void {
         self.dir.close();
-        self.packfile.close();
+        if (self.packfile != null) {
+            self.packfile.?.close();
+        }
     }
 
     pub fn getHead(self: *Repo) !Id {
@@ -328,7 +326,10 @@ const Repo = struct {
     }
 
     pub fn getObject(self: *Repo, id: Id) !?Object {
-        return self.packfile.getObject(id);
+        if (self.packfile) |*packfile| {
+            return packfile.getObject(id);
+        }
+        return null;
     }
 };
 
@@ -345,8 +346,10 @@ test "parse idx" {
     var repo = try Repo.open(std.testing.allocator, "../microwindows/.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" {
@@ -363,17 +366,17 @@ test "get object" {
 }
 
 test "get tree" {
-    var repo = try Repo.open(std.testing.allocator, "../microwindows/.git");
+    var repo = try Repo.open(std.testing.allocator, "../imgui/.git");
     defer repo.close();
 
-    if (try repo.getObject(0xe59b68a950b643f9ea50997b3cf359a5956e852c)) |o| {
+    if (try repo.getObject(0xceb2b2c62d6f8f3686dcacecd5be931839b02c77)) |o| {
         defer std.testing.allocator.free(o.data);
 
         std.debug.print("tree: {s}\n", .{o.data});
     }
 }
 // test "list commits" {
-//     var repo = Repo.open(std.testing.allocator, "../microwindows/.git");
+//     var repo = Repo.open(std.testing.allocator, "../imgui/.git");
 //     defer repo.close();
 
 //     const head = repo.getObject(repo.head);
@@ -387,7 +390,7 @@ test "get tree" {
 // }
 
 // test "tree" {
-//     var repo = Repo.open(std.testing.allocator, "../microwindows/.git");
+//     var repo = Repo.open(std.testing.allocator, "../imgui/.git");
 //     defer repo.close();
 
 //     const head = repo.getObject(repo.head);
@@ -399,7 +402,7 @@ test "get tree" {
 // }
 
 // test "blob" {
-//     var repo = Repo.open(std.testing.allocator, "../microwindows/.git");
+//     var repo = Repo.open(std.testing.allocator, "../imgui/.git");
 //     defer repo.close();
 
 //     const head = repo.getObject(repo.head);