authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-24 12:28:42 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-24 12:28:42 -07:00
log5b41631eadbbb03bbf81e53fe4c64cf233db9180
tree555f58fd1ea5954f9caaaf2576dd719db704edc4
parent9a91514527a5481ddd1ebeb9707b10808d5eea77
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

getTreeCommits: don't get the tree if it's the same one as the previous commit


1 files changed, 13 insertions(+), 7 deletions(-)

git.zig+13-7
......@@ -1206,7 +1206,8 @@ pub const Repository = struct {
12061206
12071207 const base_idx = try r.getCommitA(arena, base_oid.id);
12081208 const base = base_idx.reify(r);
1209 const base_tree = (try traverseTo(r, arena, base.tree, dir_path)).?;
1209 const base_tree_id = (try traverseTo(r, arena, base.tree, dir_path)).?;
1210 const base_tree = try r.getTreeA(arena, base_tree_id.id);
12101211 const total = base_tree.children.len();
12111212
12121213 var found: usize = 0;
......@@ -1222,13 +1223,14 @@ pub const Repository = struct {
12221223 var commit_id = base_oid;
12231224 var commit_idx = base_idx;
12241225 var commit = base;
1226 var tree_id = base_tree_id;
12251227 while (true) {
12261228 if (commit.parents.len == 0) break;
12271229 commit_id, commit_idx = (try r.getCommit(arena, commit.parents[0])).?;
12281230 searched += 1;
12291231 defer commit_id_prev = commit_id;
12301232 commit = commit_idx.reify(r);
1231 const tree = try traverseTo(r, arena, commit.tree, dir_path) orelse {
1233 const new_tree_id = try traverseTo(r, arena, commit.tree, dir_path) orelse {
12321234 for (result.keys(), 0..) |k, i| {
12331235 if (set.isSet(i)) continue;
12341236 found += 1;
......@@ -1239,6 +1241,9 @@ pub const Repository = struct {
12391241 }
12401242 break;
12411243 };
1244 if (new_tree_id.eql(tree_id)) continue;
1245 tree_id = new_tree_id;
1246 const tree = try r.getTreeA(arena, tree_id.id);
12421247 for (result.keys(), 0..) |k, i| {
12431248 if (set.isSet(i)) continue;
12441249 const original = base_tree.get(k).?;
......@@ -1328,15 +1333,16 @@ const ZlibCode = enum(c_int) {
13281333 Z_VERSION_ERROR = -6,
13291334};
13301335
1331fn traverseTo(r: *Repository, arena: std.mem.Allocator, treestart_id: TreeId, dir_path: []const u8) !?Tree {
1332 var tree = try r.getTreeA(arena, treestart_id.id);
1333 if (dir_path.len == 0) return tree;
1336fn traverseTo(r: *Repository, arena: std.mem.Allocator, treestart_id: TreeId, dir_path: []const u8) !?TreeId {
1337 var id = treestart_id;
1338 if (dir_path.len == 0) return id;
13341339 var iter = std.mem.splitScalar(u8, dir_path, '/');
13351340 while (iter.next()) |segment| {
1341 const tree = try r.getTreeA(arena, id.id);
13361342 const o = tree.get(segment) orelse return null;
1337 tree = try r.getTreeA(arena, o.id.tree.id);
1343 id = o.id.tree;
13381344 }
1339 return tree;
1345 return id;
13401346}
13411347
13421348pub const Tree = struct {