1use std::{
2 path::Path,
3 sync::{Arc, atomic::AtomicUsize},
4};
5
6use fs::RealFs;
7use gpui::Application;
8use worktree::Worktree;
9
10fn main() {
11 let Some(worktree_root_path) = std::env::args().nth(1) else {
12 println!(
13 "Missing path to worktree root\nUsage: bench_background_scan PATH_TO_WORKTREE_ROOT"
14 );
15 return;
16 };
17 let app = Application::headless();
18
19 app.run(|cx| {
20 settings::init(cx);
21 let fs = Arc::new(RealFs::new(None, cx.background_executor().clone()));
22
23 cx.spawn(async move |cx| {
24 let worktree = Worktree::local(
25 Path::new(&worktree_root_path),
26 true,
27 fs,
28 Arc::new(AtomicUsize::new(0)),
29 true,
30 cx,
31 )
32 .await
33 .expect("Worktree initialization to succeed");
34 let did_finish_scan = worktree
35 .update(cx, |this, _| this.as_local().unwrap().scan_complete())
36 .unwrap();
37 let start = std::time::Instant::now();
38 did_finish_scan.await;
39 let elapsed = start.elapsed();
40 let (files, directories) = worktree
41 .read_with(cx, |this, _| (this.file_count(), this.dir_count()))
42 .unwrap();
43 println!(
44 "{:?} for {directories} directories and {files} files",
45 elapsed
46 );
47 cx.update(|cx| {
48 cx.quit();
49 })
50 })
51 .detach();
52 })
53}