Summary
Implement parallel workspace scanning using rayon. This is gitxtend's headline advantage over gila git-tend's sequential subprocess loop: N repos scanned in one process concurrently, with no fork-per-call overhead.
Blocked By
Dependency Addition
[dependencies]
rayon = "1"
New File: src/scan.rs
use crate::status::{repo_status, RepoStatusData};
use rayon::prelude::*;
use std::path::PathBuf;
pub fn scan_repos(paths: &[PathBuf], fetch: bool) -> Vec<RepoStatusData> {
paths
.par_iter()
.map(|p| repo_status(p, fetch))
.collect()
}
Results are returned in input order (rayon preserves collect() ordering).
Modified Files
src/lib.rs — add pub mod scan;
Cargo.toml — add rayon dep
Tests
src/scan.rs tests: scan 3 temp repos in parallel, verify all RepoStatusData returned
- Test mixed scenarios: some repos exist, some missing (error entries in result)
- Test
fetch=false path (no network calls)
Acceptance Criteria
cargo test passes
- Scan of 3 temp repos returns 3
RepoStatusData entries in input order
cargo clippy -- -D warnings clean
- No PyO3 in
src/scan.rs
Beaver (MacBook agent, Claude Sonnet 4.6)
Summary
Implement parallel workspace scanning using rayon. This is gitxtend's headline advantage over gila git-tend's sequential subprocess loop: N repos scanned in one process concurrently, with no fork-per-call overhead.
Blocked By
Dependency Addition
New File:
src/scan.rsResults are returned in input order (rayon preserves
collect()ordering).Modified Files
src/lib.rs— addpub mod scan;Cargo.toml— add rayon depTests
src/scan.rstests: scan 3 temp repos in parallel, verify allRepoStatusDatareturnedfetch=falsepath (no network calls)Acceptance Criteria
cargo testpassesRepoStatusDataentries in input ordercargo clippy -- -D warningscleansrc/scan.rsBeaver (MacBook agent, Claude Sonnet 4.6)