diff --git a/zed/src/worktree.rs b/zed/src/worktree.rs index d5d6bee8901a119cdfc1804b726ae10a04e9214d..f68baf4788934ac1e700aaeb2dd52fa8ccde07fa 100644 --- a/zed/src/worktree.rs +++ b/zed/src/worktree.rs @@ -59,6 +59,7 @@ pub fn init(cx: &mut MutableAppContext, rpc: rpc::Client) { rpc.on_message(remote::close_buffer, cx); rpc.on_message(remote::update_buffer, cx); rpc.on_message(remote::buffer_saved, cx); + rpc.on_message(remote::save_buffer, cx); } #[derive(Clone, Debug)] @@ -712,20 +713,6 @@ impl LocalWorktree { }) } - pub fn save_remote_buffer( - &self, - envelope: &TypedEnvelope, - cx: &mut ModelContext, - ) -> Result>> { - let sender_id = envelope.original_sender_id()?; - let buffer = self - .shared_buffers - .get_mut(&sender_id) - .and_then(|shared_buffers| shared_buffers.get(&envelope.payload.buffer_id)) - .ok_or_else(|| anyhow!("unknown buffer id {}", envelope.payload.buffer_id))?; - buffer.update(cx, |buffer, cx| buffer.save(cx)) - } - pub fn save_buffer_as( &self, buffer: ModelHandle, @@ -2187,15 +2174,18 @@ mod remote { rpc: &rpc::Client, cx: &mut AsyncAppContext, ) -> anyhow::Result<()> { - let mut state = rpc.state.lock().await; + let state = rpc.state.read().await; let worktree = state.shared_worktree(envelope.payload.worktree_id, cx)?; - let version = worktree - .update(cx, |tree, cx| { - tree.as_local_mut() - .unwrap() - .save_remote_buffer(&envelope, cx) - })? - .await?; + let sender_id = envelope.original_sender_id()?; + let buffer = worktree.read_with(cx, |tree, _| { + tree.as_local() + .unwrap() + .shared_buffers + .get(&sender_id) + .and_then(|shared_buffers| shared_buffers.get(&envelope.payload.buffer_id).cloned()) + .ok_or_else(|| anyhow!("unknown buffer id {}", envelope.payload.buffer_id)) + })?; + let version = buffer.update(cx, |buffer, cx| buffer.save(cx))?.await?; rpc.respond( envelope.receipt(), proto::BufferSaved {