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