use std::sync::Arc;
use std::time::Duration;
use tracing::error;
use crate::core::{self, RepoInfoWorker};
use crate::tui::state::AppState;
pub fn spawn_scan_repo_and_get_info_task(state: &AppState) {
let repos = state.repos.clone();
let config = state.config.clone();
tokio::spawn(async move {
let git_worker = Arc::new(RepoInfoWorker::for_repo_info());
match core::scan_directories(&config.main.scan_dirs, &config).await {
Ok(repo_paths) => {
git_worker.submit_repos(&repo_paths);
}
Err(e) => {
error!("Error scanning directories: {}", e);
}
}
loop {
tokio::time::sleep(Duration::from_millis(config.internal.refresh_interval)).await;
let results = git_worker.poll_results();
if results.is_empty() {
if git_worker.is_complete() {
break; }
continue;
}
let mut repos_lock = repos.lock().await;
for result in results {
match result {
Ok(repo_info) => {
if !repos_lock
.iter()
.any(|r| r.basic.path == repo_info.basic.path)
{
repos_lock.push(repo_info);
}
}
Err(e) => {
error!("Error processing repo: {}", e);
}
}
}
}
});
}