Split worktree updates when a peer joins an already-shared project
This commit is contained in:
parent
845c79ee05
commit
484af8c7c4
6 changed files with 137 additions and 184 deletions
|
@ -1472,6 +1472,7 @@ async fn test_collaborating_with_diagnostics(
|
|||
|
||||
// Join project as client C and observe the diagnostics.
|
||||
let project_c = client_c.build_remote_project(&project_a, cx_a, cx_c).await;
|
||||
deterministic.run_until_parked();
|
||||
project_c.read_with(cx_c, |project, cx| {
|
||||
assert_eq!(
|
||||
project.diagnostic_summaries(cx).collect::<Vec<_>>(),
|
||||
|
|
|
@ -791,21 +791,10 @@ impl Server {
|
|||
let worktrees = project
|
||||
.worktrees
|
||||
.iter()
|
||||
.filter_map(|(id, shared_worktree)| {
|
||||
let worktree = project.worktrees.get(&id)?;
|
||||
Some(proto::Worktree {
|
||||
id: *id,
|
||||
root_name: worktree.root_name.clone(),
|
||||
entries: shared_worktree.entries.values().cloned().collect(),
|
||||
diagnostic_summaries: shared_worktree
|
||||
.diagnostic_summaries
|
||||
.values()
|
||||
.cloned()
|
||||
.collect(),
|
||||
visible: worktree.visible,
|
||||
scan_id: shared_worktree.scan_id,
|
||||
is_complete: worktree.is_complete,
|
||||
})
|
||||
.map(|(id, worktree)| proto::WorktreeMetadata {
|
||||
id: *id,
|
||||
root_name: worktree.root_name.clone(),
|
||||
visible: worktree.visible,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
|
@ -841,14 +830,15 @@ impl Server {
|
|||
}
|
||||
}
|
||||
|
||||
for (receipt, replica_id) in receipts_with_replica_ids {
|
||||
// First, we send the metadata associated with each worktree.
|
||||
for (receipt, replica_id) in &receipts_with_replica_ids {
|
||||
self.peer.respond(
|
||||
receipt,
|
||||
receipt.clone(),
|
||||
proto::JoinProjectResponse {
|
||||
variant: Some(proto::join_project_response::Variant::Accept(
|
||||
proto::join_project_response::Accept {
|
||||
worktrees: worktrees.clone(),
|
||||
replica_id: replica_id as u32,
|
||||
replica_id: *replica_id as u32,
|
||||
collaborators: collaborators.clone(),
|
||||
language_servers: project.language_servers.clone(),
|
||||
},
|
||||
|
@ -856,6 +846,43 @@ impl Server {
|
|||
},
|
||||
)?;
|
||||
}
|
||||
|
||||
for (worktree_id, worktree) in &project.worktrees {
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
const MAX_CHUNK_SIZE: usize = 2;
|
||||
#[cfg(not(any(test, feature = "test-support")))]
|
||||
const MAX_CHUNK_SIZE: usize = 256;
|
||||
|
||||
// Stream this worktree's entries.
|
||||
let message = proto::UpdateWorktree {
|
||||
project_id: project_id.to_proto(),
|
||||
worktree_id: *worktree_id,
|
||||
root_name: worktree.root_name.clone(),
|
||||
updated_entries: worktree.entries.values().cloned().collect(),
|
||||
removed_entries: Default::default(),
|
||||
scan_id: worktree.scan_id,
|
||||
is_last_update: worktree.is_complete,
|
||||
};
|
||||
for update in proto::split_worktree_update(message, MAX_CHUNK_SIZE) {
|
||||
for (receipt, _) in &receipts_with_replica_ids {
|
||||
self.peer.send(receipt.sender_id, update.clone())?;
|
||||
}
|
||||
}
|
||||
|
||||
// Stream this worktree's diagnostics.
|
||||
for summary in worktree.diagnostic_summaries.values() {
|
||||
for (receipt, _) in &receipts_with_replica_ids {
|
||||
self.peer.send(
|
||||
receipt.sender_id,
|
||||
proto::UpdateDiagnosticSummary {
|
||||
project_id: project_id.to_proto(),
|
||||
worktree_id: *worktree_id,
|
||||
summary: Some(summary.clone()),
|
||||
},
|
||||
)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.update_user_contacts(host_user_id).await?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue