fn spawn_target_search_thread()

in focus/operations/src/selection.rs [363:404]


fn spawn_target_search_thread(tx: SkimItemSender, sparse_repo_path: PathBuf) {
    fn inner(tx: SkimItemSender, sparse_repo_path: PathBuf) -> anyhow::Result<()> {
        let repo = git2::Repository::open(sparse_repo_path)?;
        let head_ref = repo.head()?;
        let head_tree = head_ref.peel_to_tree()?;

        head_tree.walk(TreeWalkMode::PreOrder, |root, entry| {
            if root.is_empty() {
                return TreeWalkResult::Ok;
            }

            let entry_name = match entry.name() {
                Some(name) => name,
                None => return TreeWalkResult::Skip,
            };
            if (entry.filemode() == i32::from(FileMode::Blob)
                || entry.filemode() == i32::from(FileMode::BlobExecutable))
                && is_relevant_to_build_graph(entry_name)
            {
                let name = root.trim_matches('/').to_string();
                let build_file = PathBuf::from(root).join(entry_name);
                let item = SkimProjectOrTarget::BazelPackage {
                    source: SkimSource::Repository,
                    name,
                    build_file,
                };
                if tx.send(Arc::new(item)).is_err() {
                    return TreeWalkResult::Abort;
                }
            }
            TreeWalkResult::Ok
        })?;

        Ok(())
    }

    thread::spawn(move || {
        if let Err(err) = inner(tx, sparse_repo_path) {
            info!(?err, "Error while searching for targets");
        }
    });
}