in eden/mononoke/walker/src/commands/detail/state.rs [475:652]
fn needs_visit_impl(&self, outgoing: &OutgoingEdge, executing_step: bool) -> bool {
let target_node: &Node = &outgoing.target;
let k = target_node.get_type();
if !executing_step {
self.visit_count[k as usize].fetch_add(1, Ordering::Release);
}
// For types handled by record_resolved_visit logic is same when executing or checking a step
// For types handled by record() and record_with_path, executing_step returns true.
match (&target_node, executing_step) {
// Entry points
(Node::Root(_), _) => true,
(Node::Bookmark(_), _) => true,
(Node::PublishedBookmarks(_), _) => true,
// Bonsai
(Node::Changeset(_), true) => true,
(Node::Changeset(k), false) => {
let id = self.bcs_ids.interned(&k.inner);
if self.chunk_contains(id) {
self.record(&self.visited_bcs, &id)
} else {
if self.chunk_direction == Some(Direction::NewestFirst)
&& !self.visited_bcs.contains_key(&id)
{
self.record_multi(&self.deferred_bcs, id, outgoing);
}
false
}
}
(Node::BonsaiHgMapping(k), _) => {
if let Some(id) = self.bcs_ids.get(&k.inner) {
// Does not insert, see record_resolved_visit
!self.visited_bcs_mapping.contains_key(&id)
} else {
true
}
}
(Node::PhaseMapping(bcs_id), _) => {
if let Some(id) = self.bcs_ids.get(bcs_id) {
// Does not insert, as can only prune visits once data resolved, see record_resolved_visit
!self.visited_bcs_phase.contains_key(&id)
} else {
true
}
}
// Hg
(Node::HgBonsaiMapping(_), true) => true,
(Node::HgBonsaiMapping(k), false) => self.record(
&self.visited_hg_cs_mapping,
&self.hg_cs_ids.interned(&k.inner),
),
(Node::HgChangeset(_), true) => true,
(Node::HgChangeset(k), false) => {
self.record(&self.visited_hg_cs, &self.hg_cs_ids.interned(&k.inner))
}
(Node::HgChangesetViaBonsai(_), true) => true,
(Node::HgChangesetViaBonsai(k), false) => self.record(
&self.visited_hg_cs_via_bonsai,
&self.hg_cs_ids.interned(&k.inner),
),
(Node::HgManifest(_), true) => true,
(Node::HgManifest(k), false) => self.record_with_path(
&self.visited_hg_manifest,
(&k.path, &self.hg_manifest_ids.interned(&k.id)),
),
(Node::HgFileNode(_), true) => true,
(Node::HgFileNode(k), false) => self.record_with_path(
&self.visited_hg_filenode,
(&k.path, &self.hg_filenode_ids.interned(&k.id)),
),
(Node::HgManifestFileNode(_), true) => true,
(Node::HgManifestFileNode(k), false) => self.record_with_path(
&self.visited_hg_manifest_filenode,
(&k.path, &self.hg_filenode_ids.interned(&k.id)),
),
(Node::HgFileEnvelope(_), true) => true,
(Node::HgFileEnvelope(id), false) => self.record(
&self.visited_hg_file_envelope,
&self.hg_filenode_ids.interned(id),
),
// Content
(Node::FileContent(_), true) => true,
(Node::FileContent(content_id), false) => self.record(&self.visited_file, content_id),
(Node::FileContentMetadata(_), _) => true, // reached via expand_checked_nodes
(Node::AliasContentMapping(_), _) => true, // reached via expand_checked_nodes
// Derived
(Node::Blame(_), true) => true,
(Node::Blame(k), false) => self.record(
&self.visited_blame,
&self.unode_file_ids.interned(k.as_ref()),
),
(Node::ChangesetInfo(_), true) => true,
(Node::ChangesetInfo(bcs_id), false) => {
let id = self.bcs_ids.interned(bcs_id);
if self.chunk_contains(id) {
self.record(&self.visited_changeset_info, &id)
} else {
if self.chunk_direction == Some(Direction::NewestFirst)
&& !self.visited_changeset_info.contains_key(&id)
{
self.record_multi(&self.deferred_bcs, id, outgoing);
}
false
}
}
(Node::ChangesetInfoMapping(bcs_id), _) => {
if let Some(id) = self.bcs_ids.get(bcs_id) {
!self.visited_changeset_info_mapping.contains_key(&id) // Does not insert, see record_resolved_visit
} else {
true
}
}
(Node::DeletedManifest(_), true) => true,
(Node::DeletedManifest(id), false) => self.record(&self.visited_deleted_manifest, &id),
(Node::DeletedManifestMapping(bcs_id), _) => {
if let Some(id) = self.bcs_ids.get(bcs_id) {
!self.visited_deleted_manifest_mapping.contains_key(&id) // Does not insert, see record_resolved_visit
} else {
true
}
}
(Node::FastlogBatch(_), true) => true,
(Node::FastlogBatch(k), false) => self.record(&self.visited_fastlog_batch, &k),
(Node::FastlogDir(_), true) => true,
(Node::FastlogDir(k), false) => self.record(
&self.visited_fastlog_dir,
&self.unode_manifest_ids.interned(&k.inner),
),
(Node::FastlogFile(_), true) => true,
(Node::FastlogFile(k), false) => self.record(
&self.visited_fastlog_file,
&self.unode_file_ids.interned(&k.inner),
),
(Node::Fsnode(_), true) => true,
(Node::Fsnode(id), false) => self.record(&self.visited_fsnode, &id),
(Node::FsnodeMapping(bcs_id), _) => {
if let Some(id) = self.bcs_ids.get(bcs_id) {
!self.visited_fsnode_mapping.contains_key(&id) // Does not insert, see record_resolved_visit
} else {
true
}
}
(Node::SkeletonManifest(_), true) => true,
(Node::SkeletonManifest(id), false) => {
self.record(&self.visited_skeleton_manifest, &id)
}
(Node::SkeletonManifestMapping(bcs_id), _) => {
if let Some(id) = self.bcs_ids.get(bcs_id) {
!self.visited_skeleton_manifest_mapping.contains_key(&id) // Does not insert, see record_resolved_visit
} else {
true
}
}
(Node::UnodeFile(_), true) => true,
(Node::UnodeFile(k), false) => self.record(
&self.visited_unode_file,
&UnodeInterned {
id: self.unode_file_ids.interned(&k.inner),
flags: k.flags,
},
),
(Node::UnodeManifest(_), true) => true,
(Node::UnodeManifest(k), false) => self.record(
&self.visited_unode_manifest,
&UnodeInterned {
id: self.unode_manifest_ids.interned(&k.inner),
flags: k.flags,
},
),
(Node::UnodeMapping(bcs_id), _) => {
if let Some(id) = self.bcs_ids.get(bcs_id) {
!self.visited_unode_mapping.contains_key(&id) // Does not insert, see record_resolved_visit
} else {
true
}
}
}
}