WIP: stream ignored entries

Antonio Scandurra created

Change summary

crates/project/src/worktree.rs | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)

Detailed changes

crates/project/src/worktree.rs 🔗

@@ -40,6 +40,7 @@ use std::{
     ffi::{OsStr, OsString},
     fmt,
     future::Future,
+    mem,
     ops::{Deref, DerefMut},
     os::unix::prelude::{OsStrExt, OsStringExt},
     path::{Path, PathBuf},
@@ -951,9 +952,39 @@ impl LocalWorktree {
                         })?;
                     }
 
+                    // Stream ignored entries in chunks.
+                    {
+                        let mut ignored_entries = prev_snapshot
+                            .entries_by_path
+                            .iter()
+                            .filter(|e| e.is_ignored);
+                        let mut ignored_entries_to_send = Vec::new();
+                        loop {
+                            const CHUNK_SIZE: usize = 256;
+                            let entry = ignored_entries.next();
+                            if ignored_entries_to_send.len() >= CHUNK_SIZE || entry.is_none() {
+                                rpc.request(proto::UpdateWorktree {
+                                    project_id,
+                                    worktree_id,
+                                    root_name: prev_snapshot.root_name().to_string(),
+                                    updated_entries: mem::take(&mut ignored_entries_to_send),
+                                    removed_entries: Default::default(),
+                                    scan_id: prev_snapshot.scan_id as u64,
+                                })
+                                .await?;
+                            }
+
+                            if let Some(entry) = ignored_entries.next() {
+                                ignored_entries_to_send.push(entry.into());
+                            } else {
+                                break;
+                            }
+                        }
+                    }
+
                     while let Ok(snapshot) = snapshots_to_send_rx.recv().await {
                         let message =
-                            snapshot.build_update(&prev_snapshot, project_id, worktree_id, false);
+                            snapshot.build_update(&prev_snapshot, project_id, worktree_id, true);
                         rpc.request(message).await?;
                         prev_snapshot = snapshot;
                     }