| ... | @@ -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 | } |
| 1104 | | 1104 | |
| 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(); |
| 1108 | | 1108 | |
| 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 | } |
| 1123 | | 1127 | |
| 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 | } |
| 1127 | | 1131 | |
| ... | @@ -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 | }; |
| 2033 | | 2043 | |
| 2034 | pub const UserAndAt = struct { | 2044 | pub const UserAndAt = struct { |