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");
}
});
}