authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-10 03:01:46 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-10 03:01:46 -07:00
loga598d750d766a79ba94b146f5697a6746dd2653e
tree363cc67da9d011e84d780dcb5b1a7d642ae02dbb
parent10d1d2f0499e09f8c66a263d8fa7a2601e29d385
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

Repository: add


1 files changed, 18 insertions(+), 1 deletions(-)

git.zig+18-1
......@@ -980,6 +980,7 @@ pub const Repository = struct {
980980 pack_content: std.StringArrayHashMapUnmanaged([]const u8),
981981 commits: std.StringArrayHashMapUnmanaged(Commit),
982982 trees: std.StringArrayHashMapUnmanaged(Tree),
983 tags: std.StringArrayHashMapUnmanaged(Tag),
983984
984985 pub fn init(gitdir: nfs.Dir, gpa: std.mem.Allocator) Repository {
985986 return .{
......@@ -990,6 +991,7 @@ pub const Repository = struct {
990991 .pack_content = .empty,
991992 .commits = .empty,
992993 .trees = .empty,
994 .tags = .empty,
993995 };
994996 }
995997
......@@ -1003,6 +1005,7 @@ pub const Repository = struct {
10031005 r.commits.deinit(r.gpa);
10041006 for (r.trees.values()) |v| r.gpa.free(v.children);
10051007 r.trees.deinit(r.gpa);
1008 r.tags.deinit(r.gpa);
10061009 }
10071010
10081011 fn getObject(r: *Repository, obj: Id, arena: std.mem.Allocator) !?[]const u8 {
......@@ -1142,7 +1145,7 @@ pub const Repository = struct {
11421145 return null;
11431146 }
11441147
1145 fn getGitObject(r: *Repository, obj: Id, arena: std.mem.Allocator) !?GitObject {
1148 pub fn getGitObject(r: *Repository, obj: Id, arena: std.mem.Allocator) !?GitObject {
11461149 if (try r.getObject(obj, arena)) |data| {
11471150 const header = data[0..std.mem.indexOfScalar(u8, data, 0).?];
11481151 const _type = header[0..std.mem.indexOfScalar(u8, header, ' ').?];
......@@ -1221,4 +1224,18 @@ pub const Repository = struct {
12211224 }
12221225 return null;
12231226 }
1227
1228 pub fn getTag(r: *Repository, arena: std.mem.Allocator, id: TagId) !?struct { TagId, Tag } {
1229 if (r.tags.getPtr(id.id)) |val| {
1230 return .{ id, val.* };
1231 }
1232 if (try r.getGitObject(id.id, arena)) |obj| {
1233 if (obj.type == .tag) {
1234 const tag = try parseTag(obj.content);
1235 try r.tags.put(r.gpa, id.id, tag);
1236 return .{ id, tag };
1237 }
1238 }
1239 return null;
1240 }
12241241};