1use std::{
2 path::Path,
3 sync::{Arc, atomic::AtomicUsize},
4};
5
6use fs::RealFs;
7use gpui::Application;
8use settings::Settings;
9use worktree::{Worktree, WorktreeSettings};
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 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}