authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-27 19:46:55 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-27 19:46:55 -07:00
log0cceba07a0e5fa26ec33e1a00b2e3b0aab07dbdd
treee3e3f726e019070e155a79b346a267f2cdc2faac
parentba166a3a7d614ee1bfd2475460410146666aebb9
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

make Commit own its memory


1 files changed, 17 insertions(+), 7 deletions(-)

git.zig+17-7
......@@ -723,7 +723,7 @@ pub const Repository = struct {
723723 unpacked_objects: std.AutoArrayHashMapUnmanaged(u64, GitObject),
724724 idx_content: std.StringArrayHashMapUnmanaged([]const u8),
725725 pack_content: std.StringArrayHashMapUnmanaged([]const u8),
726 commits: std.StringArrayHashMapUnmanaged(Commit),
726 commits: std.StringArrayHashMapUnmanaged(*Commit),
727727 trees: std.StringArrayHashMapUnmanaged(*Tree),
728728 tags: std.StringArrayHashMapUnmanaged(*Tag),
729729 mailmap: std.hash_map.StringHashMapUnmanaged([]const u8),
......@@ -757,7 +757,7 @@ pub const Repository = struct {
757757 r.idx_content.deinit(r.gpa);
758758 for (r.pack_content.values()) |v| nfs.munmap(v);
759759 r.pack_content.deinit(r.gpa);
760 for (r.commits.values()) |v| r.gpa.free(v.parents);
760 for (r.commits.values()) |v| v.destroy(r);
761761 r.commits.deinit(r.gpa);
762762 for (r.trees.values()) |v| v.destroy(r);
763763 r.trees.deinit(r.gpa);
......@@ -1102,17 +1102,21 @@ pub const Repository = struct {
11021102 return (try r.getBlob(.{ .id = id }, cache_behavior)).?;
11031103 }
11041104
1105 pub fn getCommit(r: *Repository, id: CommitId, cache_behavior: CacheBehavior) !?struct { CommitId, Commit } {
1105 pub fn getCommit(r: *Repository, id: CommitId, cache_behavior: CacheBehavior) !?struct { CommitId, *Commit } {
11061106 const t = tracer.trace(@src(), " {s}", .{id.id});
11071107 defer t.end();
11081108
1109 if (cache_behavior == .cache) if (r.commits.getPtr(id.id)) |val| {
1110 return .{ id, val.* };
1109 if (cache_behavior == .cache) if (r.commits.get(id.id)) |val| {
1110 return .{ id, val };
11111111 };
11121112 if (try r.getObject(id.id, cache_behavior)) |obj| {
11131113 if (obj.type == .commit) {
11141114 errdefer if (cache_behavior == .no_cache) r.gpa.free(obj.content);
1115 const commit = try parseCommit(r.gpa, obj.content, &r.mailmap, &r.mailmap_names);
1115 const raw = try r.gpa.dupe(u8, obj.content);
1116 errdefer r.gpa.free(raw);
1117 const commit = try r.gpa.create(Commit);
1118 errdefer r.gpa.destroy(commit);
1119 commit.* = try parseCommit(r.gpa, obj.content, &r.mailmap, &r.mailmap_names);
11161120 try r.commits.put(r.gpa, id.id, commit);
11171121 return .{ id, commit };
11181122 }
......@@ -1121,7 +1125,7 @@ pub const Repository = struct {
11211125 return null;
11221126 }
11231127
1124 pub fn getCommitA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !Commit {
1128 pub fn getCommitA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !*Commit {
11251129 return (try r.getCommit(.{ .id = id }, cache_behavior)).?.@"1";
11261130 }
11271131
......@@ -2029,6 +2033,12 @@ pub const Commit = struct {
20292033 author: UserAndAt,
20302034 committer: UserAndAt,
20312035 message: string,
2036
2037 pub fn destroy(t: *Commit, r: *Repository) void {
2038 r.gpa.free(t.parents);
2039 r.gpa.free(t.raw);
2040 r.gpa.destroy(t);
2041 }
20322042};
20332043
20342044pub const UserAndAt = struct {