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 {...@@ -1336,7 +1336,7 @@ pub const Repository = struct {
13361336
1337 const base_idx = try r.getCommitA(arena, base_oid.id);1337 const base_idx = try r.getCommitA(arena, base_oid.id);
1338 const base = base_idx.reify(r);1338 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)).?;
1340 const total = base_tree.children.len;1340 const total = base_tree.children.len;
13411341
1342 var found: usize = 0;1342 var found: usize = 0;
...@@ -1358,7 +1358,17 @@ pub const Repository = struct {...@@ -1358,7 +1358,17 @@ pub const Repository = struct {
1358 searched += 1;1358 searched += 1;
1359 defer commit_id_prev = commit_id;1359 defer commit_id_prev = commit_id;
1360 commit = commit_idx.reify(r);1360 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 };
1362 for (result.keys(), 0..) |k, i| {1372 for (result.keys(), 0..) |k, i| {
1363 if (set.isSet(i)) continue;1373 if (set.isSet(i)) continue;
1364 const original = base_tree.get(k).?;1374 const original = base_tree.get(k).?;
...@@ -1448,12 +1458,12 @@ const ZlibCode = enum(c_int) {...@@ -1448,12 +1458,12 @@ const ZlibCode = enum(c_int) {
1448 Z_VERSION_ERROR = -6,1458 Z_VERSION_ERROR = -6,
1449};1459};
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 {
1452 var tree = try r.getTreeA(arena, treestart_id.id);1462 var tree = try r.getTreeA(arena, treestart_id.id);
1453 if (dir_path.len == 0) return tree;1463 if (dir_path.len == 0) return tree;
1454 var iter = std.mem.splitScalar(u8, dir_path, '/');1464 var iter = std.mem.splitScalar(u8, dir_path, '/');
1455 while (iter.next()) |segment| {1465 while (iter.next()) |segment| {
1456 const o = tree.get(segment).?;1466 const o = tree.get(segment) orelse return null;
1457 tree = try r.getTreeA(arena, o.id.tree.id);1467 tree = try r.getTreeA(arena, o.id.tree.id);
1458 }1468 }
1459 return tree;1469 return tree;