From f1c193a7b0522bc268e0185b3e2b118ba90d0c95 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 14 Mar 2026 03:42:26 -0700 Subject: [PATCH] getObject: read .git/objects/ when available --- git.zig | 23 +++++++++++++++++++++++ zig.mod | 1 + 2 files changed, 24 insertions(+) diff --git a/git.zig b/git.zig index 4eb31725e45c3b3bcf63c9a215d1fac115cfe9ba..b10b9db593010a8473c541b9e803f9bcf88ced54 100644 --- a/git.zig +++ b/git.zig @@ -5,6 +5,7 @@ const time = @import("time"); const extras = @import("extras"); const tracer = @import("tracer"); const nfs = @import("nfs"); +const nio = @import("nio"); pub const Id = []const u8; @@ -109,6 +110,28 @@ pub fn getObject(alloc: std.mem.Allocator, dir: nfs.Dir, obj: Id) !string { const t = tracer.trace(@src(), " {s}", .{obj}); defer t.end(); + if (obj.len == 40) blk: { //sha1 object + var sub_path: [49:0]u8 = "objects/00/00000000000000000000000000000000000000".*; + @memcpy(sub_path[8..][0..2], obj[0..2]); + @memcpy(sub_path[11..], obj[2..]); + const objfile = dir.openFile(&sub_path, .{}) catch |err| switch (err) { + error.ENOENT => break :blk, + else => |e| return e, + }; + defer objfile.close(); + var bufr = nio.BufferedReader(4096, nfs.File).init(objfile); + var list = std.ArrayList(u8).init(alloc); + defer list.deinit(); + try list.ensureUnusedCapacity(512); + try std.compress.flate.inflate.decompress(.zlib, bufr.anyReadable(), list.writer()); + const header = list.items[0..std.mem.indexOfScalar(u8, list.items, 0).?]; + const _type = header[0..std.mem.indexOfScalar(u8, header, ' ').?]; + const content_len = try extras.parseDigits(u64, header[_type.len + 1 ..], 10); + std.debug.assert(list.items[header.len + 1 ..].len == content_len); + list.replaceRangeAssumeCapacity(0, header.len + 1, ""); + return list.toOwnedSlice(); + } + const result = try std.process.Child.run(.{ .allocator = alloc, .cwd_dir = dir.to_std(), diff --git a/zig.mod b/zig.mod index 612fd938c021850d6c484a7d4578d09097299bd1..42da14b0539823d3085f5d185005878a75a56d66 100644 --- a/zig.mod +++ b/zig.mod @@ -8,6 +8,7 @@ dependencies: - src: git https://github.com/nektro/zig-extras - src: git https://github.com/nektro/zig-tracer - src: git https://github.com/nektro/zig-nfs + - src: git https://github.com/nektro/zig-nio root_dependencies: - src: git https://github.com/nektro/zig-extras - src: git https://github.com/nektro/zig-expect -- 2.54.0