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