From 6a07d39d618093fdce781204b471f7528c1ed698 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 16 Feb 2022 12:23:06 +0100 Subject: [PATCH] Don't send worktree updates until the initial share is done --- crates/project/src/worktree.rs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 4a3e690c8b..effba2f9c3 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -21,6 +21,7 @@ use language::{Buffer, DiagnosticEntry, Operation, PointUtf16, Rope}; use lazy_static::lazy_static; use parking_lot::Mutex; use postage::{ + oneshot, prelude::{Sink as _, Stream as _}, watch, }; @@ -768,10 +769,26 @@ impl LocalWorktree { let worktree_id = cx.model_id() as u64; let (snapshots_to_send_tx, snapshots_to_send_rx) = smol::channel::unbounded::(); + let (mut share_tx, mut share_rx) = oneshot::channel(); let maintain_remote_snapshot = cx.background().spawn({ let rpc = rpc.clone(); let snapshot = snapshot.clone(); + let diagnostic_summaries = self.diagnostic_summaries.clone(); + let weak = self.weak; async move { + if let Err(error) = rpc + .request(proto::ShareWorktree { + project_id, + worktree: Some(snapshot.to_proto(&diagnostic_summaries, weak)), + }) + .await + { + let _ = share_tx.try_send(Err(error)); + return; + } else { + let _ = share_tx.try_send(Ok(())); + } + let mut update_id = 0; let mut prev_snapshot = snapshot; while let Ok(snapshot) = snapshots_to_send_rx.recv().await { @@ -795,18 +812,11 @@ impl LocalWorktree { _maintain_remote_snapshot: Some(maintain_remote_snapshot), }); - let diagnostic_summaries = self.diagnostic_summaries.clone(); - let weak = self.weak; - let share_message = cx.background().spawn(async move { - proto::ShareWorktree { - project_id, - worktree: Some(snapshot.to_proto(&diagnostic_summaries, weak)), - } - }); - cx.foreground().spawn(async move { - rpc.request(share_message.await).await?; - Ok(()) + match share_rx.next().await { + Some(result) => result, + None => Err(anyhow!("unshared before sharing completed")), + } }) }