weavatrix-scan 0.4.2

Deterministic, safe repository scanner for code intelligence
Documentation
#[allow(dead_code)]
#[path = "support/mod.rs"]
mod support;

use std::panic::{AssertUnwindSafe, catch_unwind};
use std::sync::{
    Arc,
    atomic::{AtomicBool, AtomicUsize, Ordering},
};
use weavatrix_scan::{ParallelWalker, WalkControl, WalkEvent};

#[test]
fn nested_parallel_walk_from_worker_callback_falls_back_without_starvation() {
    let fixture = support::Fixture::new("scan-runtime-nested");
    for directory in 0..32 {
        fixture.write(
            &format!("branch-{directory:02}/file.rs"),
            "fn nested() {}\n",
        );
    }
    let root = fixture.root.clone();
    let started = Arc::new(AtomicBool::new(false));
    let nested_entries = Arc::new(AtomicUsize::new(0));
    let callback_started = Arc::clone(&started);
    let callback_entries = Arc::clone(&nested_entries);
    let report = ParallelWalker::new(&fixture.root)
        .with_parallelism(4)
        .visit(move |event| {
            if matches!(event, WalkEvent::Entry(entry) if entry.depth() > 0)
                && !callback_started.swap(true, Ordering::AcqRel)
            {
                let report = ParallelWalker::new(&root)
                    .with_parallelism(4)
                    .walk()
                    .expect("nested traversal completes");
                callback_entries.store(report.entries.len(), Ordering::Release);
            }
            WalkControl::Continue
        })
        .unwrap();

    assert!(report.visited > 32);
    assert!(started.load(Ordering::Acquire));
    assert_eq!(
        nested_entries.load(Ordering::Acquire),
        usize::try_from(report.visited).unwrap()
    );
}

#[test]
fn worker_callback_panic_propagates_and_pool_remains_usable() {
    let fixture = support::Fixture::new("scan-runtime-panic");
    fixture.write("branch/file.rs", "fn panic_probe() {}\n");

    let panic = catch_unwind(AssertUnwindSafe(|| {
        ParallelWalker::new(&fixture.root)
            .with_parallelism(4)
            .visit(|event| {
                if matches!(event, WalkEvent::Entry(entry) if entry.depth() > 0) {
                    panic!("worker visitor panic");
                }
                WalkControl::Continue
            })
            .unwrap();
    }));
    assert!(panic.is_err());

    let recovered = ParallelWalker::new(&fixture.root)
        .with_parallelism(4)
        .walk()
        .unwrap();
    assert!(
        recovered
            .entries
            .iter()
            .any(weavatrix_scan::WalkEntry::is_file)
    );
}

#[test]
fn nested_parallel_visit_uses_serial_fallback_controls() {
    let fixture = support::Fixture::new("scan-runtime-nested-visit");
    fixture.write("branch-00/skipped.rs", "fn skipped() {}\n");
    fixture.write("branch-01/stop.rs", "fn stop() {}\n");
    let root = fixture.root.clone();
    let started = Arc::new(AtomicBool::new(false));
    let skipped_file_seen = Arc::new(AtomicBool::new(false));
    let nested_quit = Arc::new(AtomicBool::new(false));

    let outer = ParallelWalker::new(&fixture.root)
        .with_parallelism(4)
        .visit({
            let started = Arc::clone(&started);
            let skipped_file_seen = Arc::clone(&skipped_file_seen);
            let nested_quit = Arc::clone(&nested_quit);
            move |event| {
                if matches!(event, WalkEvent::Entry(entry) if entry.depth() > 0)
                    && !started.swap(true, Ordering::AcqRel)
                {
                    let skipped_file_seen = Arc::clone(&skipped_file_seen);
                    let nested = ParallelWalker::new(&root)
                        .with_parallelism(4)
                        .visit(move |nested_event| match nested_event {
                            WalkEvent::Entry(entry)
                                if entry.relative_path() == std::path::Path::new("branch-00") =>
                            {
                                WalkControl::Skip
                            }
                            WalkEvent::Entry(entry)
                                if entry.relative_path()
                                    == std::path::Path::new("branch-00/skipped.rs") =>
                            {
                                skipped_file_seen.store(true, Ordering::Release);
                                WalkControl::Continue
                            }
                            WalkEvent::Entry(entry) if entry.is_file() => WalkControl::Quit,
                            WalkEvent::Entry(_) | WalkEvent::Error(_) => WalkControl::Continue,
                        })
                        .unwrap();
                    nested_quit.store(nested.quit, Ordering::Release);
                }
                WalkControl::Continue
            }
        })
        .unwrap();

    assert!(outer.visited > 0);
    assert!(started.load(Ordering::Acquire));
    assert!(nested_quit.load(Ordering::Acquire));
    assert!(!skipped_file_seen.load(Ordering::Acquire));
}