(
txn: &T,
inode: Inode,
start: GraphNode<NodeId>,
target: GraphNode<NodeId>,
visible: &HashSet<NodeId>,
)
| 297 | } |
| 298 | |
| 299 | fn import_seed_alive_reaches<T>( |
| 300 | txn: &T, |
| 301 | inode: Inode, |
| 302 | start: GraphNode<NodeId>, |
| 303 | target: GraphNode<NodeId>, |
| 304 | visible: &HashSet<NodeId>, |
| 305 | ) -> bool |
| 306 | where |
| 307 | T: GraphTxnT + InodeGraphOps, |
| 308 | { |
| 309 | if start == target { |
| 310 | return true; |
| 311 | } |
| 312 | |
| 313 | let mut stack = vec![start]; |
| 314 | let mut seen = HashSet::new(); |
| 315 | |
| 316 | while let Some(current) = stack.pop() { |
| 317 | if !seen.insert(current) { |
| 318 | continue; |
| 319 | } |
| 320 | |
| 321 | let mut adj = match txn.init_inode_adj(inode, current, EdgeFlags::BLOCK, EdgeFlags::all()) { |
| 322 | Ok(adj) => adj, |
| 323 | Err(_) => continue, |
| 324 | }; |
| 325 | |
| 326 | while let Some(edge) = txn.next_inode_adj(&mut adj) { |
| 327 | let Ok(edge) = edge else { |
| 328 | continue; |
| 329 | }; |
| 330 | let flags = edge.flag(); |
| 331 | if flags.contains(EdgeFlags::PARENT) |
| 332 | || flags.contains(EdgeFlags::DELETED) |
| 333 | || flags.contains(EdgeFlags::PSEUDO) |
| 334 | || !import_seed_edge_visible(&edge, visible) |
| 335 | { |
| 336 | continue; |
| 337 | } |
| 338 | |
| 339 | let Some(dest) = txn |
| 340 | .find_block_in_inode(inode, edge.dest()) |
| 341 | .ok() |
| 342 | .flatten() |
| 343 | .or_else(|| txn.find_block(edge.dest()).ok()) |
| 344 | else { |
| 345 | continue; |
| 346 | }; |
| 347 | if !import_seed_node_visible(dest, visible) |
| 348 | || import_seed_is_dead(txn, inode, dest, visible) |
| 349 | { |
| 350 | continue; |
| 351 | } |
| 352 | if dest == target { |
| 353 | return true; |
| 354 | } |
| 355 | stack.push(dest); |
| 356 | } |
no test coverage detected