| ... | @@ -1336,7 +1336,7 @@ pub const Repository = struct { | ... | @@ -1336,7 +1336,7 @@ pub const Repository = struct { |
| 1336 | | 1336 | |
| 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; |
| 1341 | | 1341 | |
| 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 | }; |
| 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 | 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; |