| ... | ... | @@ -725,7 +725,7 @@ pub const Repository = struct { |
| 725 | 725 | pack_content: std.StringArrayHashMapUnmanaged([]const u8), |
| 726 | 726 | commits: std.StringArrayHashMapUnmanaged(Commit), |
| 727 | 727 | trees: std.StringArrayHashMapUnmanaged(Tree), |
| 728 | | tags: std.StringArrayHashMapUnmanaged(Tag), |
| 728 | tags: std.StringArrayHashMapUnmanaged(*Tag), |
| 729 | 729 | mailmap: std.hash_map.StringHashMapUnmanaged([]const u8), |
| 730 | 730 | mailmap_names: std.hash_map.StringHashMapUnmanaged([]const u8), |
| 731 | 731 | |
| ... | ... | @@ -761,6 +761,7 @@ pub const Repository = struct { |
| 761 | 761 | r.commits.deinit(r.gpa); |
| 762 | 762 | for (r.trees.values()) |*v| r.gpa.free(v.children); |
| 763 | 763 | r.trees.deinit(r.gpa); |
| 764 | for (r.tags.values()) |v| v.destroy(r); |
| 764 | 765 | r.tags.deinit(r.gpa); |
| 765 | 766 | r.mailmap.deinit(r.gpa); |
| 766 | 767 | r.mailmap_names.deinit(r.gpa); |
| ... | ... | @@ -1185,7 +1186,7 @@ pub const Repository = struct { |
| 1185 | 1186 | return (try r.getTree(.{ .id = id }, cache_behavior)).?.@"1"; |
| 1186 | 1187 | } |
| 1187 | 1188 | |
| 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 } { |
| 1189 | 1190 | const t = tracer.trace(@src(), " {s}", .{id.id}); |
| 1190 | 1191 | defer t.end(); |
| 1191 | 1192 | |
| ... | ... | @@ -1195,7 +1196,11 @@ pub const Repository = struct { |
| 1195 | 1196 | if (try r.getObject(id.id, cache_behavior)) |obj| { |
| 1196 | 1197 | if (obj.type == .tag) { |
| 1197 | 1198 | 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); |
| 1199 | 1204 | if (cache_behavior == .cache) try r.tags.put(r.gpa, id.id, tag); |
| 1200 | 1205 | return .{ id, tag }; |
| 1201 | 1206 | } |
| ... | ... | @@ -1204,7 +1209,7 @@ pub const Repository = struct { |
| 1204 | 1209 | return null; |
| 1205 | 1210 | } |
| 1206 | 1211 | |
| 1207 | | pub fn getTagA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !Tag { |
| 1212 | pub fn getTagA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !*Tag { |
| 1208 | 1213 | return (try r.getTag(.{ .id = id }, cache_behavior)).?.@"1"; |
| 1209 | 1214 | } |
| 1210 | 1215 | |
| ... | ... | @@ -2028,6 +2033,11 @@ pub const Tag = struct { |
| 2028 | 2033 | type: RefType, |
| 2029 | 2034 | tagger: ?UserAndAt, |
| 2030 | 2035 | message: string, |
| 2036 | |
| 2037 | pub fn destroy(t: *Tag, r: *Repository) void { |
| 2038 | r.gpa.free(t.raw); |
| 2039 | r.gpa.destroy(t); |
| 2040 | } |
| 2031 | 2041 | }; |
| 2032 | 2042 | |
| 2033 | 2043 | pub const Ref = struct { |