authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-27 19:24:23 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-27 19:24:23 -07:00
logfc9a0e648f726225767dbf69ed931b3b321a8dcc
treeb7dc59a228f136ea78168aeffd801fece35bdc3a
parent6d4f705000c3b5d71655c55166fffa5fa099f36a
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

make Tag own its memory


1 files changed, 14 insertions(+), 4 deletions(-)

git.zig+14-4
......@@ -725,7 +725,7 @@ pub const Repository = struct {
725725 pack_content: std.StringArrayHashMapUnmanaged([]const u8),
726726 commits: std.StringArrayHashMapUnmanaged(Commit),
727727 trees: std.StringArrayHashMapUnmanaged(Tree),
728 tags: std.StringArrayHashMapUnmanaged(Tag),
728 tags: std.StringArrayHashMapUnmanaged(*Tag),
729729 mailmap: std.hash_map.StringHashMapUnmanaged([]const u8),
730730 mailmap_names: std.hash_map.StringHashMapUnmanaged([]const u8),
731731
......@@ -761,6 +761,7 @@ pub const Repository = struct {
761761 r.commits.deinit(r.gpa);
762762 for (r.trees.values()) |*v| r.gpa.free(v.children);
763763 r.trees.deinit(r.gpa);
764 for (r.tags.values()) |v| v.destroy(r);
764765 r.tags.deinit(r.gpa);
765766 r.mailmap.deinit(r.gpa);
766767 r.mailmap_names.deinit(r.gpa);
......@@ -1185,7 +1186,7 @@ pub const Repository = struct {
11851186 return (try r.getTree(.{ .id = id }, cache_behavior)).?.@"1";
11861187 }
11871188
1188 pub fn getTag(r: *Repository, id: TagId, cache_behavior: CacheBehavior) !?struct { TagId, Tag } {
1189 pub fn getTag(r: *Repository, id: TagId, cache_behavior: CacheBehavior) !?struct { TagId, *Tag } {
11891190 const t = tracer.trace(@src(), " {s}", .{id.id});
11901191 defer t.end();
11911192
......@@ -1195,7 +1196,11 @@ pub const Repository = struct {
11951196 if (try r.getObject(id.id, cache_behavior)) |obj| {
11961197 if (obj.type == .tag) {
11971198 errdefer if (cache_behavior == .no_cache) r.gpa.free(obj.content);
1198 const tag = try parseTag(obj.content);
1199 const raw = try r.gpa.dupe(u8, obj.content);
1200 errdefer r.gpa.free(raw);
1201 const tag = try r.gpa.create(Tag);
1202 errdefer r.gpa.destroy(tag);
1203 tag.* = try parseTag(obj.content);
11991204 if (cache_behavior == .cache) try r.tags.put(r.gpa, id.id, tag);
12001205 return .{ id, tag };
12011206 }
......@@ -1204,7 +1209,7 @@ pub const Repository = struct {
12041209 return null;
12051210 }
12061211
1207 pub fn getTagA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !Tag {
1212 pub fn getTagA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !*Tag {
12081213 return (try r.getTag(.{ .id = id }, cache_behavior)).?.@"1";
12091214 }
12101215
......@@ -2028,6 +2033,11 @@ pub const Tag = struct {
20282033 type: RefType,
20292034 tagger: ?UserAndAt,
20302035 message: string,
2036
2037 pub fn destroy(t: *Tag, r: *Repository) void {
2038 r.gpa.free(t.raw);
2039 r.gpa.destroy(t);
2040 }
20312041};
20322042
20332043pub const Ref = struct {