authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-24 14:27:58 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-24 14:27:58 -07:00
logc0da28486e36527301620e49c0c85a1aec11dcdd
tree819e8f4152bef9808d3825aa6b95de2ed0f764bd
parent1a34d5cddaa23cab20734da48b81cd305731ff9f
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

Repository.getObject: remove arena parameter


1 files changed, 46 insertions(+), 48 deletions(-)

git.zig+46-48
......@@ -740,6 +740,7 @@ pub const Repository = struct {
740740 r.unpacked_loose_objects.deinit(r.gpa);
741741 for (r.unpacked_objects.values()) |v| r.gpa.free(v.content);
742742 r.unpacked_objects.deinit(r.gpa);
743 for (r.idx_content.keys()) |k| r.gpa.free(k);
743744 for (r.idx_content.values()) |v| nfs.munmap(v);
744745 r.idx_content.deinit(r.gpa);
745746 for (r.pack_content.values()) |v| nfs.munmap(v);
......@@ -751,7 +752,7 @@ pub const Repository = struct {
751752 r.tags.deinit(r.gpa);
752753 }
753754
754 pub fn getObject(r: *Repository, arena: std.mem.Allocator, oid: Id, cache_behavior: CacheBehavior) anyerror!?GitObject {
755 pub fn getObject(r: *Repository, oid: Id, cache_behavior: CacheBehavior) anyerror!?GitObject {
755756 const t = tracer.trace(@src(), " {s}", .{oid});
756757 defer t.end();
757758
......@@ -807,14 +808,14 @@ pub const Repository = struct {
807808 errdefer nfs.munmap(idx_content);
808809 try r.idx_content.put(
809810 r.gpa,
810 try arena.dupe(u8, entry.name),
811 try r.gpa.dupe(u8, entry.name),
811812 idx_content,
812813 );
813814 }
814815 }
815816 const pack_index, const pack_offset = try r.getObjectPackIndex(oid) orelse return null;
816817 // parse .pack
817 return try r.getPackedObject(arena, oid, pack_index, pack_offset, cache_behavior);
818 return try r.getPackedObject(oid, pack_index, pack_offset, cache_behavior);
818819 }
819820
820821 fn getObjectPackIndex(r: *Repository, oid: Id) !?[2]usize {
......@@ -876,7 +877,7 @@ pub const Repository = struct {
876877 return null;
877878 }
878879
879 fn getPackedObject(r: *Repository, arena: std.mem.Allocator, maybe_oid: ?Id, pack_index: usize, pack_offset: usize, cache_behavior: CacheBehavior) !GitObject {
880 fn getPackedObject(r: *Repository, maybe_oid: ?Id, pack_index: usize, pack_offset: usize, cache_behavior: CacheBehavior) !GitObject {
880881 const t = tracer.trace(@src(), " {?s} {d} {d} {s}", .{ maybe_oid, pack_index, pack_offset, r.pack_content.keys()[pack_index] });
881882 defer t.end();
882883
......@@ -932,13 +933,13 @@ pub const Repository = struct {
932933 offset += 1;
933934 }
934935 const base_pack_offset = pack_offset - offset;
935 const base_obj = try r.getPackedObject(arena, null, pack_index, base_pack_offset, cache_behavior);
936 const base_obj = try r.getPackedObject(null, pack_index, base_pack_offset, cache_behavior);
936937 defer if (cache_behavior == .no_cache) r.gpa.free(base_obj.content);
937938 return r.getDeltadObject(maybe_oid, key, &packedobj_fbs, size, base_obj, cache_behavior);
938939 },
939940 .ref_delta => {
940941 const base_oid = extras.to_hex(packedobj_fbs.takeSlice(20)[0..20].*);
941 const base_obj = (try r.getObject(arena, &base_oid, cache_behavior)).?;
942 const base_obj = (try r.getObject(&base_oid, cache_behavior)).?;
942943 defer if (cache_behavior == .no_cache) r.gpa.free(base_obj.content);
943944 return r.getDeltadObject(maybe_oid, key, &packedobj_fbs, size, base_obj, cache_behavior);
944945 },
......@@ -1024,16 +1025,16 @@ pub const Repository = struct {
10241025 return obj;
10251026 }
10261027
1027 pub fn getObjectA(r: *Repository, arena: std.mem.Allocator, oid: Id, cache_behavior: CacheBehavior) !GitObject {
1028 return (try r.getObject(arena, oid, cache_behavior)).?;
1028 pub fn getObjectA(r: *Repository, oid: Id, cache_behavior: CacheBehavior) !GitObject {
1029 return (try r.getObject(oid, cache_behavior)).?;
10291030 }
10301031
1031 pub fn getObjectC(r: *Repository, arena: std.mem.Allocator, oid: Id, cache_behavior: CacheBehavior) ![]const u8 {
1032 return (try r.getObjectA(arena, oid, cache_behavior)).content;
1032 pub fn getObjectC(r: *Repository, oid: Id, cache_behavior: CacheBehavior) ![]const u8 {
1033 return (try r.getObjectA(oid, cache_behavior)).content;
10331034 }
10341035
1035 pub fn getObjectS(r: *Repository, arena: std.mem.Allocator, oid: Id, cache_behavior: CacheBehavior) !usize {
1036 const content = try r.getObjectC(arena, oid, cache_behavior);
1036 pub fn getObjectS(r: *Repository, oid: Id, cache_behavior: CacheBehavior) !usize {
1037 const content = try r.getObjectC(oid, cache_behavior);
10371038 defer if (cache_behavior == .no_cache) r.gpa.free(content);
10381039 return content.len;
10391040 }
......@@ -1043,8 +1044,8 @@ pub const Repository = struct {
10431044 content: []const u8,
10441045 };
10451046
1046 pub fn getBlob(r: *Repository, arena: std.mem.Allocator, id: BlobId, cache_behavior: CacheBehavior) !?[]const u8 {
1047 if (try r.getObject(arena, id.id, cache_behavior)) |obj| {
1047 pub fn getBlob(r: *Repository, id: BlobId, cache_behavior: CacheBehavior) !?[]const u8 {
1048 if (try r.getObject(id.id, cache_behavior)) |obj| {
10481049 if (obj.type == .blob) {
10491050 return obj.content;
10501051 }
......@@ -1053,18 +1054,18 @@ pub const Repository = struct {
10531054 return null;
10541055 }
10551056
1056 pub fn getBlobA(r: *Repository, arena: std.mem.Allocator, id: Id, cache_behavior: CacheBehavior) ![]const u8 {
1057 return (try r.getBlob(arena, .{ .id = id }, cache_behavior)).?;
1057 pub fn getBlobA(r: *Repository, id: Id, cache_behavior: CacheBehavior) ![]const u8 {
1058 return (try r.getBlob(.{ .id = id }, cache_behavior)).?;
10581059 }
10591060
1060 pub fn getCommit(r: *Repository, arena: std.mem.Allocator, id: CommitId) !?struct { CommitId, CommitIdx } {
1061 pub fn getCommit(r: *Repository, id: CommitId) !?struct { CommitId, CommitIdx } {
10611062 const t = tracer.trace(@src(), " {s}", .{id.id});
10621063 defer t.end();
10631064
10641065 if (r.commits.getIndex(id.id)) |idx| {
10651066 return .{ id, @enumFromInt(idx) };
10661067 }
1067 if (try r.getObject(arena, id.id, .cache)) |obj| {
1068 if (try r.getObject(id.id, .cache)) |obj| {
10681069 if (obj.type == .commit) {
10691070 const commit = try parseCommit(r.gpa, obj.content);
10701071 try r.commits.put(r.gpa, id.id, commit);
......@@ -1075,18 +1076,18 @@ pub const Repository = struct {
10751076 return null;
10761077 }
10771078
1078 pub fn getCommitA(r: *Repository, arena: std.mem.Allocator, id: Id) !CommitIdx {
1079 return (try r.getCommit(arena, .{ .id = id })).?.@"1";
1079 pub fn getCommitA(r: *Repository, id: Id) !CommitIdx {
1080 return (try r.getCommit(.{ .id = id })).?.@"1";
10801081 }
10811082
1082 pub fn getTree(r: *Repository, arena: std.mem.Allocator, id: TreeId, cache_behavior: CacheBehavior) !?struct { TreeId, Tree } {
1083 pub fn getTree(r: *Repository, id: TreeId, cache_behavior: CacheBehavior) !?struct { TreeId, Tree } {
10831084 const t = tracer.trace(@src(), " {s}", .{id.id});
10841085 defer t.end();
10851086
10861087 if (r.trees.getPtr(id.id)) |val| {
10871088 return .{ id, val.* };
10881089 }
1089 if (try r.getObject(arena, id.id, cache_behavior)) |obj| {
1090 if (try r.getObject(id.id, cache_behavior)) |obj| {
10901091 if (obj.type == .tree) {
10911092 errdefer if (cache_behavior == .no_cache) r.gpa.free(obj.content);
10921093 var children: std.ArrayList(Tree.Object) = .empty;
......@@ -1136,18 +1137,18 @@ pub const Repository = struct {
11361137 return null;
11371138 }
11381139
1139 pub fn getTreeA(r: *Repository, arena: std.mem.Allocator, id: Id, cache_behavior: CacheBehavior) !Tree {
1140 return (try r.getTree(arena, .{ .id = id }, cache_behavior)).?.@"1";
1140 pub fn getTreeA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !Tree {
1141 return (try r.getTree(.{ .id = id }, cache_behavior)).?.@"1";
11411142 }
11421143
1143 pub fn getTag(r: *Repository, arena: std.mem.Allocator, id: TagId, cache_behavior: CacheBehavior) !?struct { TagId, Tag } {
1144 pub fn getTag(r: *Repository, id: TagId, cache_behavior: CacheBehavior) !?struct { TagId, Tag } {
11441145 const t = tracer.trace(@src(), " {s}", .{id.id});
11451146 defer t.end();
11461147
11471148 if (r.tags.getPtr(id.id)) |val| {
11481149 return .{ id, val.* };
11491150 }
1150 if (try r.getObject(arena, id.id, cache_behavior)) |obj| {
1151 if (try r.getObject(id.id, cache_behavior)) |obj| {
11511152 if (obj.type == .tag) {
11521153 errdefer if (cache_behavior == .no_cache) r.gpa.free(obj.content);
11531154 const tag = try parseTag(obj.content);
......@@ -1159,8 +1160,8 @@ pub const Repository = struct {
11591160 return null;
11601161 }
11611162
1162 pub fn getTagA(r: *Repository, arena: std.mem.Allocator, id: Id, cache_behavior: CacheBehavior) !Tag {
1163 return (try r.getTag(arena, .{ .id = id }, cache_behavior)).?.@"1";
1163 pub fn getTagA(r: *Repository, id: Id, cache_behavior: CacheBehavior) !Tag {
1164 return (try r.getTag(.{ .id = id }, cache_behavior)).?.@"1";
11641165 }
11651166
11661167 pub fn getHeads(r: *Repository, arena: std.mem.Allocator) ![]Ref {
......@@ -1239,10 +1240,10 @@ pub const Repository = struct {
12391240
12401241 // const start = time.milliTimestamp();
12411242
1242 const base_idx = try r.getCommitA(arena, base_oid.id);
1243 const base_idx = try r.getCommitA(base_oid.id);
12431244 const base = base_idx.reify(r);
1244 const base_tree_id = (try traverseTo(r, arena, base.tree, dir_path)).?;
1245 const base_tree = try r.getTreeA(arena, base_tree_id.id, .cache);
1245 const base_tree_id = (try traverseTo(r, base.tree, dir_path)).?;
1246 const base_tree = try r.getTreeA(base_tree_id.id, .cache);
12461247 const total = base_tree.children.len;
12471248
12481249 var found: usize = 0;
......@@ -1261,11 +1262,11 @@ pub const Repository = struct {
12611262 var tree_id = base_tree_id;
12621263 while (true) {
12631264 if (commit.parents.len == 0) break;
1264 commit_id, commit_idx = (try r.getCommit(arena, commit.parents[0])).?;
1265 commit_id, commit_idx = (try r.getCommit(commit.parents[0])).?;
12651266 searched += 1;
12661267 defer commit_id_prev = commit_id;
12671268 commit = commit_idx.reify(r);
1268 const new_tree_id = try traverseTo(r, arena, commit.tree, dir_path) orelse {
1269 const new_tree_id = try traverseTo(r, commit.tree, dir_path) orelse {
12691270 var i: usize = 0;
12701271 while (findFirstUnset(set, i)) |j| : (i += 1) {
12711272 i = j;
......@@ -1280,7 +1281,7 @@ pub const Repository = struct {
12801281 };
12811282 if (new_tree_id.eql(tree_id)) continue;
12821283 tree_id = new_tree_id;
1283 const tree = try r.getTreeA(arena, tree_id.id, .cache);
1284 const tree = try r.getTreeA(tree_id.id, .cache);
12841285 var i: usize = 0;
12851286 while (findFirstUnset(set, i)) |j| : (i += 1) {
12861287 i = j;
......@@ -1323,7 +1324,7 @@ pub const Repository = struct {
13231324 try S.item(e, w, .none, mode, &@splat('0'), id, .A, p, name);
13241325 }
13251326 fn dir(e: *Repository, w: anytype, t: Id, p: ?*const PathListNode, o: usize) !void {
1326 const tree = try e.getTreeA(e.gpa, t, .cache);
1327 const tree = try e.getTreeA(t, .cache);
13271328 for (tree.children[o..]) |obj| {
13281329 if (obj.mode.type == .directory) {
13291330 try dir(e, w, obj.id.tree.id, &.{ .prev = p, .data = obj.name }, 0);
......@@ -1344,7 +1345,7 @@ pub const Repository = struct {
13441345 try S.item(e, w, mode, .none, id, &@splat('0'), .D, p, name);
13451346 }
13461347 fn dir(e: *Repository, w: anytype, t: Id, p: ?*const PathListNode, o: usize) !void {
1347 const tree = try e.getTreeA(e.gpa, t, .cache);
1348 const tree = try e.getTreeA(t, .cache);
13481349 for (tree.children[o..]) |obj| {
13491350 if (obj.mode.type == .directory) {
13501351 try dir(e, w, obj.id.tree.id, &.{ .prev = p, .data = obj.name }, 0);
......@@ -1363,11 +1364,11 @@ pub const Repository = struct {
13631364 const M = struct {
13641365 fn dir(e: *Repository, w: anytype, b_t: Id, a_t: Id, p: ?*const PathListNode) !void {
13651366 var before_i: usize = 0;
1366 const before_tree = try e.getTreeA(e.gpa, b_t, .cache);
1367 const before_tree = try e.getTreeA(b_t, .cache);
13671368 const before_children = before_tree.children;
13681369
13691370 var after_i: usize = 0;
1370 const after_tree = try e.getTreeA(e.gpa, a_t, .cache);
1371 const after_tree = try e.getTreeA(a_t, .cache);
13711372 const after_children = after_tree.children;
13721373
13731374 while (true) {
......@@ -1508,14 +1509,14 @@ pub const Repository = struct {
15081509 }
15091510 };
15101511 if (commitid_from == null) {
1511 const commitidx = try r.getCommitA(r.gpa, commitid_to.id);
1512 const commitidx = try r.getCommitA(commitid_to.id);
15121513 const commit = commitidx.reify(r);
15131514 try A.dir(r, writable, commit.tree.id, null, 0);
15141515 return;
15151516 }
1516 const before_commitidx = try r.getCommitA(r.gpa, commitid_from.?.id);
1517 const before_commitidx = try r.getCommitA(commitid_from.?.id);
15171518 const before_commit = before_commitidx.reify(r);
1518 const after_commitidx = try r.getCommitA(r.gpa, commitid_to.id);
1519 const after_commitidx = try r.getCommitA(commitid_to.id);
15191520 const after_commit = after_commitidx.reify(r);
15201521 try M.dir(r, writable, before_commit.tree.id, after_commit.tree.id, null);
15211522 }
......@@ -1633,12 +1634,12 @@ const ZlibCode = enum(c_int) {
16331634 Z_VERSION_ERROR = -6,
16341635};
16351636
1636fn traverseTo(r: *Repository, arena: std.mem.Allocator, treestart_id: TreeId, dir_path: []const u8) !?TreeId {
1637fn traverseTo(r: *Repository, treestart_id: TreeId, dir_path: []const u8) !?TreeId {
16371638 var id = treestart_id;
16381639 if (dir_path.len == 0) return id;
16391640 var iter = std.mem.splitScalar(u8, dir_path, '/');
16401641 while (iter.next()) |segment| {
1641 const tree = try r.getTreeA(arena, id.id, .cache);
1642 const tree = try r.getTreeA(id.id, .cache);
16421643 const o = tree.get(segment) orelse return null;
16431644 if (o.id != .tree) return null;
16441645 id = o.id.tree;
......@@ -1846,7 +1847,7 @@ pub const Tree = struct {
18461847 };
18471848 };
18481849
1849 pub fn walk(self: Tree, r: *Repository, arena: std.mem.Allocator) !Walker {
1850 pub fn walk(self: Tree, r: *Repository) !Walker {
18501851 var stack: std.ArrayListUnmanaged(Walker.StackItem) = .empty;
18511852
18521853 try stack.append(r.gpa, .{
......@@ -1856,7 +1857,6 @@ pub const Tree = struct {
18561857 });
18571858 return .{
18581859 .repo = r,
1859 .arena = arena,
18601860 .stack = stack,
18611861 .name_buffer = .empty,
18621862 };
......@@ -1864,7 +1864,6 @@ pub const Tree = struct {
18641864
18651865 pub const Walker = struct {
18661866 repo: *Repository,
1867 arena: std.mem.Allocator,
18681867 stack: std.ArrayListUnmanaged(StackItem),
18691868 name_buffer: std.ArrayListUnmanaged(u8),
18701869
......@@ -1881,7 +1880,6 @@ pub const Tree = struct {
18811880
18821881 pub fn next(self: *Walker) !?Walker.Entry {
18831882 const gpa = self.repo.gpa;
1884 const arena = self.arena;
18851883 while (self.stack.items.len != 0) {
18861884 var top = &self.stack.items[self.stack.items.len - 1];
18871885 var containing = top;
......@@ -1898,7 +1896,7 @@ pub const Tree = struct {
18981896 self.name_buffer.appendSliceAssumeCapacity(base.name);
18991897 self.name_buffer.appendAssumeCapacity(0);
19001898 if (base.id == .tree) {
1901 const new_tree = try self.repo.getTreeA(arena, base.id.tree.id, .cache);
1899 const new_tree = try self.repo.getTreeA(base.id.tree.id, .cache);
19021900 {
19031901 // errdefer new_dir.close();
19041902 try self.stack.append(gpa, .{