authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-30 14:44:25-07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-07-30 14:44:25-07:00
logde2862be18e85f25ab526bbd98c2b46b0dae4865
treeeecf28fde30e63670c520eeeb40fea0aba9e7d2d
parent496cd1145d8e39867c5c567236a4263134213d5c
signature Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

getTreeCommits: add a timeout param


1 files changed, 10 insertions(+), 5 deletions(-)

git.zig+10-5
...@@ -1314,11 +1314,12 @@ pub const Repository = struct {...@@ -1314,11 +1314,12 @@ pub const Repository = struct {
1314 }1314 }
1315 }1315 }
13161316
1317 pub fn getTreeCommits(r: *Repository, arena: std.mem.Allocator, base_oid: CommitId, dir_path: []const u8) ![]const CommitId {1317 pub fn getTreeCommits(r: *Repository, arena: std.mem.Allocator, base_oid: CommitId, dir_path: []const u8, timeout_ms: u64) ![]const CommitId {
1318 const t = tracer.trace(@src(), "", .{});1318 const t = tracer.trace(@src(), "", .{});
1319 defer t.end();1319 defer t.end();
13201320
1321 // const start = time.milliTimestamp();1321 const start = time.milliTimestamp();
1322 var timeout_ended = false;
13221323
1323 const base = try r.getCommitA(base_oid.id, .no_cache);1324 const base = try r.getCommitA(base_oid.id, .no_cache);
1324 const base_tree_id, const base_tree_id_parent = try traverseTo(r, base.tree, dir_path);1325 const base_tree_id, const base_tree_id_parent = try traverseTo(r, base.tree, dir_path);
...@@ -1329,7 +1330,7 @@ pub const Repository = struct {...@@ -1329,7 +1330,7 @@ pub const Repository = struct {
1329 var found: usize = 0;1330 var found: usize = 0;
1330 var result: std.StringArrayHashMapUnmanaged(CommitId) = .empty;1331 var result: std.StringArrayHashMapUnmanaged(CommitId) = .empty;
1331 defer result.deinit(r.gpa);1332 defer result.deinit(r.gpa);
1332 for (base_tree.children) |obj| try result.put(r.gpa, obj.name, undefined);1333 for (base_tree.children) |obj| try result.put(r.gpa, obj.name, .zero);
13331334
1334 var set: std.bit_set.DynamicBitSetUnmanaged = try .initEmpty(r.gpa, total);1335 var set: std.bit_set.DynamicBitSetUnmanaged = try .initEmpty(r.gpa, total);
1335 defer set.deinit(r.gpa);1336 defer set.deinit(r.gpa);
...@@ -1350,6 +1351,10 @@ pub const Repository = struct {...@@ -1350,6 +1351,10 @@ pub const Repository = struct {
1350 }) {1351 }) {
1351 searched += 1;1352 searched += 1;
1352 if (commit.parents.len == 0) break;1353 if (commit.parents.len == 0) break;
1354 if (timeout_ms > 0 and time.milliTimestamp() - start > timeout_ms) {
1355 timeout_ended = true;
1356 break;
1357 }
1353 const new_tree_id, const new_tree_id_parent = try traverseTo(r, commit.tree, dir_path);1358 const new_tree_id, const new_tree_id_parent = try traverseTo(r, commit.tree, dir_path);
1354 defer if (new_tree_id_parent) |p| p.destroy(r);1359 defer if (new_tree_id_parent) |p| p.destroy(r);
1355 if (new_tree_id == null) {1360 if (new_tree_id == null) {
...@@ -1393,11 +1398,11 @@ pub const Repository = struct {...@@ -1393,11 +1398,11 @@ pub const Repository = struct {
1393 break;1398 break;
1394 }1399 }
1395 }1400 }
1396 for (0..total, result.values()) |i, *v| {1401 if (!timeout_ended) for (0..total, result.values()) |i, *v| {
1397 if (!set.isSet(i)) {1402 if (!set.isSet(i)) {
1398 v.* = commit_id;1403 v.* = commit_id;
1399 }1404 }
1400 }1405 };
14011406
1402 // const end = time.milliTimestamp();1407 // const end = time.milliTimestamp();
1403 // std.log.debug("found {d} in {d}ms", .{ total, end - start });1408 // std.log.debug("found {d} in {d}ms", .{ total, end - start });