WIP

Antonio Scandurra created

Change summary

gpui/src/executor.rs | 23 +++++++----------------
zed/src/worktree.rs  | 41 ++++++++++++++++++++++++-----------------
2 files changed, 31 insertions(+), 33 deletions(-)

Detailed changes

gpui/src/executor.rs 🔗

@@ -204,22 +204,13 @@ impl Background {
             _phantom: PhantomData,
         };
         (scheduler)(&mut scope);
-        match self {
-            Self::Deterministic(_) => {
-                for spawned in scope.futures {
-                    spawned.await;
-                }
-            }
-            Self::Production { executor, .. } => {
-                let spawned = scope
-                    .futures
-                    .into_iter()
-                    .map(|f| executor.spawn(f))
-                    .collect::<Vec<_>>();
-                for task in spawned {
-                    task.await;
-                }
-            }
+        let spawned = scope
+            .futures
+            .into_iter()
+            .map(|f| self.spawn(f))
+            .collect::<Vec<_>>();
+        for task in spawned {
+            task.await;
         }
     }
 }

zed/src/worktree.rs 🔗

@@ -66,7 +66,7 @@ pub fn init(cx: &mut MutableAppContext, rpc: rpc::Client) {
 }
 
 #[async_trait::async_trait]
-trait Fs: Send + Sync {
+pub trait Fs: Send + Sync {
     async fn entry(
         &self,
         root_char_bag: CharBag,
@@ -83,12 +83,13 @@ trait Fs: Send + Sync {
     ) -> Result<Pin<Box<dyn 'a + Stream<Item = Result<Entry>> + Send>>>;
     async fn load(&self, path: &Path) -> Result<String>;
     async fn save(&self, path: &Path, text: &Rope) -> Result<()>;
+    async fn canonicalize(&self, path: &Path) -> Result<PathBuf>;
 }
 
-struct OsFs;
+struct ProductionFs;
 
 #[async_trait::async_trait]
-impl Fs for OsFs {
+impl Fs for ProductionFs {
     async fn entry(
         &self,
         root_char_bag: CharBag,
@@ -183,6 +184,10 @@ impl Fs for OsFs {
         writer.flush().await?;
         Ok(())
     }
+
+    async fn canonicalize(&self, path: &Path) -> Result<PathBuf> {
+        Ok(smol::fs::canonicalize(path).await?)
+    }
 }
 
 #[derive(Clone)]
@@ -403,20 +408,22 @@ impl Fs for InMemoryFs {
         } else {
             let inode = state.next_inode;
             state.next_inode += 1;
-            state.entries.insert(
-                path.to_path_buf(),
-                InMemoryEntry {
-                    inode,
-                    mtime: SystemTime::now(),
-                    is_dir: false,
-                    is_symlink: false,
-                    content: Some(text.chunks().collect()),
-                },
-            );
+            let entry = InMemoryEntry {
+                inode,
+                mtime: SystemTime::now(),
+                is_dir: false,
+                is_symlink: false,
+                content: Some(text.chunks().collect()),
+            };
+            state.entries.insert(path.to_path_buf(), entry);
             state.emit_event(path).await;
             Ok(())
         }
     }
+
+    async fn canonicalize(&self, path: &Path) -> Result<PathBuf> {
+        Ok(path.to_path_buf())
+    }
 }
 
 #[derive(Clone, Debug)]
@@ -462,7 +469,7 @@ impl Worktree {
         languages: Arc<LanguageRegistry>,
         cx: &mut ModelContext<Worktree>,
     ) -> Self {
-        let fs = Arc::new(OsFs);
+        let fs = Arc::new(ProductionFs);
         let (mut tree, scan_states_tx) = LocalWorktree::new(path, languages, fs.clone(), cx);
         let (event_stream, event_stream_handle) = fsevent::EventStream::new(
             &[tree.snapshot.abs_path.as_ref()],
@@ -2169,7 +2176,7 @@ impl BackgroundScanner {
                 break;
             }
 
-            if self.process_events(events).await {
+            if !self.process_events(events).await {
                 break;
             }
 
@@ -2339,7 +2346,7 @@ impl BackgroundScanner {
         let mut snapshot = self.snapshot();
         snapshot.scan_id += 1;
 
-        let root_abs_path = if let Ok(abs_path) = snapshot.abs_path.canonicalize() {
+        let root_abs_path = if let Ok(abs_path) = self.fs.canonicalize(&snapshot.abs_path).await {
             abs_path
         } else {
             return false;
@@ -3258,7 +3265,7 @@ mod tests {
                     next_entry_id: Default::default(),
                 })),
                 notify_tx,
-                Arc::new(OsFs),
+                Arc::new(ProductionFs),
                 Arc::new(gpui::executor::Background::new()),
             );
             smol::block_on(scanner.scan_dirs()).unwrap();