authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-21 20:35:55 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-21 20:35:55 -07:00
log487852c217fd23097a0dba82efa6edfaed13a9d4
treea3f94a7c429724dafd7a56de9549985043d10cbd
parent5f9e5b23ee5e51193f89f8f02b16ed2382132165
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

getTreeCommits: short-circuit when traverseTo cant find the path


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

git.zig+14-4
......@@ -1336,7 +1336,7 @@ pub const Repository = struct {
13361336
13371337 const base_idx = try r.getCommitA(arena, base_oid.id);
13381338 const base = base_idx.reify(r);
1339 const base_tree = try traverseTo(r, arena, base.tree, dir_path);
1339 const base_tree = (try traverseTo(r, arena, base.tree, dir_path)).?;
13401340 const total = base_tree.children.len;
13411341
13421342 var found: usize = 0;
......@@ -1358,7 +1358,17 @@ pub const Repository = struct {
13581358 searched += 1;
13591359 defer commit_id_prev = commit_id;
13601360 commit = commit_idx.reify(r);
1361 const tree = try traverseTo(r, arena, commit.tree, dir_path);
1361 const tree = try traverseTo(r, arena, commit.tree, dir_path) orelse {
1362 for (result.keys(), 0..) |k, i| {
1363 if (set.isSet(i)) continue;
1364 found += 1;
1365 result.putAssumeCapacity(k, commit_id_prev);
1366 set.set(i);
1367 // std.log.debug("found [{d}/{d}] objects after searching {d} commits", .{ found, total, searched });
1368 continue;
1369 }
1370 break;
1371 };
13621372 for (result.keys(), 0..) |k, i| {
13631373 if (set.isSet(i)) continue;
13641374 const original = base_tree.get(k).?;
......@@ -1448,12 +1458,12 @@ const ZlibCode = enum(c_int) {
14481458 Z_VERSION_ERROR = -6,
14491459};
14501460
1451fn traverseTo(r: *Repository, arena: std.mem.Allocator, treestart_id: TreeId, dir_path: []const u8) !Tree {
1461fn traverseTo(r: *Repository, arena: std.mem.Allocator, treestart_id: TreeId, dir_path: []const u8) !?Tree {
14521462 var tree = try r.getTreeA(arena, treestart_id.id);
14531463 if (dir_path.len == 0) return tree;
14541464 var iter = std.mem.splitScalar(u8, dir_path, '/');
14551465 while (iter.next()) |segment| {
1456 const o = tree.get(segment).?;
1466 const o = tree.get(segment) orelse return null;
14571467 tree = try r.getTreeA(arena, o.id.tree.id);
14581468 }
14591469 return tree;