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 {...@@ -723,7 +723,7 @@ pub const Repository = struct {
723 unpacked_objects: std.AutoArrayHashMapUnmanaged(u64, GitObject),723 unpacked_objects: std.AutoArrayHashMapUnmanaged(u64, GitObject),
724 idx_content: std.StringArrayHashMapUnmanaged([]const u8),724 idx_content: std.StringArrayHashMapUnmanaged([]const u8),
725 pack_content: std.StringArrayHashMapUnmanaged([]const u8),725 pack_content: std.StringArrayHashMapUnmanaged([]const u8),
726 commits: std.StringArrayHashMapUnmanaged(Commit),726 commits: std.StringArrayHashMapUnmanaged(*Commit),
727 trees: std.StringArrayHashMapUnmanaged(*Tree),727 trees: std.StringArrayHashMapUnmanaged(*Tree),
728 tags: std.StringArrayHashMapUnmanaged(*Tag),728 tags: std.StringArrayHashMapUnmanaged(*Tag),
729 mailmap: std.hash_map.StringHashMapUnmanaged([]const u8),729 mailmap: std.hash_map.StringHashMapUnmanaged([]const u8),
...@@ -757,7 +757,7 @@ pub const Repository = struct {...@@ -757,7 +757,7 @@ pub const Repository = struct {
757 r.idx_content.deinit(r.gpa);757 r.idx_content.deinit(r.gpa);
758 for (r.pack_content.values()) |v| nfs.munmap(v);758 for (r.pack_content.values()) |v| nfs.munmap(v);
759 r.pack_content.deinit(r.gpa);759 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);
761 r.commits.deinit(r.gpa);761 r.commits.deinit(r.gpa);
762 for (r.trees.values()) |v| v.destroy(r);762 for (r.trees.values()) |v| v.destroy(r);
763 r.trees.deinit(r.gpa);763 r.trees.deinit(r.gpa);
...@@ -1102,17 +1102,21 @@ pub const Repository = struct {...@@ -1102,17 +1102,21 @@ pub const Repository = struct {
1102 return (try r.getBlob(.{ .id = id }, cache_behavior)).?;1102 return (try r.getBlob(.{ .id = id }, cache_behavior)).?;
1103 }1103 }
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 } {
1106 const t = tracer.trace(@src(), " {s}", .{id.id});1106 const t = tracer.trace(@src(), " {s}", .{id.id});
1107 defer t.end();1107 defer t.end();
11081108
1109 if (cache_behavior == .cache) if (r.commits.getPtr(id.id)) |val| {1109 if (cache_behavior == .cache) if (r.commits.get(id.id)) |val| {
1110 return .{ id, val.* };1110 return .{ id, val };
1111 };1111 };
1112 if (try r.getObject(id.id, cache_behavior)) |obj| {1112 if (try r.getObject(id.id, cache_behavior)) |obj| {
1113 if (obj.type == .commit) {1113 if (obj.type == .commit) {
1114 errdefer if (cache_behavior == .no_cache) r.gpa.free(obj.content);1114 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);
1116 try r.commits.put(r.gpa, id.id, commit);1120 try r.commits.put(r.gpa, id.id, commit);
1117 return .{ id, commit };1121 return .{ id, commit };
1118 }1122 }
...@@ -1121,7 +1125,7 @@ pub const Repository = struct {...@@ -1121,7 +1125,7 @@ pub const Repository = struct {
1121 return null;1125 return null;
1122 }1126 }
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 {
1125 return (try r.getCommit(.{ .id = id }, cache_behavior)).?.@"1";1129 return (try r.getCommit(.{ .id = id }, cache_behavior)).?.@"1";
1126 }1130 }
11271131
...@@ -2029,6 +2033,12 @@ pub const Commit = struct {...@@ -2029,6 +2033,12 @@ pub const Commit = struct {
2029 author: UserAndAt,2033 author: UserAndAt,
2030 committer: UserAndAt,2034 committer: UserAndAt,
2031 message: string,2035 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 }
2032};2042};
20332043
2034pub const UserAndAt = struct {2044pub const UserAndAt = struct {