diff --git a/zed-rpc/proto/zed.proto b/zed-rpc/proto/zed.proto index 51161134137d00d696f0b1f6aa7f0429cb94197d..c2f6929a19c3b2a04a68999fbe6079c6eeba683d 100644 --- a/zed-rpc/proto/zed.proto +++ b/zed-rpc/proto/zed.proto @@ -12,12 +12,13 @@ message Envelope { ShareWorktreeResponse share_worktree_response = 7; OpenWorktree open_worktree = 8; OpenWorktreeResponse open_worktree_response = 9; - OpenBuffer open_buffer = 10; - OpenBufferResponse open_buffer_response = 11; - CloseBuffer close_buffer = 12; - UpdateBuffer update_buffer = 13; - AddGuest add_guest = 14; - RemoveGuest remove_guest = 15; + CloseWorktree close_worktree = 10; + OpenBuffer open_buffer = 11; + OpenBufferResponse open_buffer_response = 12; + CloseBuffer close_buffer = 13; + UpdateBuffer update_buffer = 14; + AddGuest add_guest = 15; + RemoveGuest remove_guest = 16; } } @@ -50,6 +51,10 @@ message OpenWorktreeResponse { repeated Peer peers = 3; } +message CloseWorktree { + uint64 worktree_id = 1; +} + message AddGuest { uint64 worktree_id = 1; Peer guest = 2; diff --git a/zed-rpc/src/proto.rs b/zed-rpc/src/proto.rs index 40f530d550d45c0f1d9a6dfa099ef2794d3322d8..bbd18d23533401fc3793e1f2267282b0190efc22 100644 --- a/zed-rpc/src/proto.rs +++ b/zed-rpc/src/proto.rs @@ -71,6 +71,7 @@ macro_rules! request_message { request_message!(Auth, AuthResponse); request_message!(ShareWorktree, ShareWorktreeResponse); request_message!(OpenWorktree, OpenWorktreeResponse); +message!(CloseWorktree); request_message!(OpenBuffer, OpenBufferResponse); message!(CloseBuffer); message!(UpdateBuffer); diff --git a/zed/src/worktree.rs b/zed/src/worktree.rs index e27321661c8ec6f8a469f2caea838f40345e37c8..b7ac9d9eaf9cad842a5df64bcb4b16dd6513f329 100644 --- a/zed/src/worktree.rs +++ b/zed/src/worktree.rs @@ -74,6 +74,23 @@ pub enum Worktree { impl Entity for Worktree { type Event = (); + + fn release(&mut self, cx: &mut MutableAppContext) { + let rpc = match self { + Self::Local(tree) => tree.rpc.clone(), + Self::Remote(tree) => Some((tree.rpc.clone(), tree.remote_id)), + }; + + if let Some((rpc, worktree_id)) = rpc { + cx.spawn(|_| async move { + rpc.state.lock().await.shared_worktrees.remove(&worktree_id); + if let Err(err) = rpc.send(proto::CloseWorktree { worktree_id }).await { + log::error!("error closing worktree {}: {}", worktree_id, err); + } + }) + .detach(); + } + } } impl Worktree {