fn needs_visit_impl()

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
                }
            }
        }
    }