Don't share a project unless it's online and we're allowing a request

Antonio Scandurra created

Change summary

crates/collab/src/rpc/store.rs |  4 ++++
crates/project/src/project.rs  | 14 ++++++++++++--
2 files changed, 16 insertions(+), 2 deletions(-)

Detailed changes

crates/collab/src/rpc/store.rs 🔗

@@ -657,6 +657,10 @@ impl Store {
         scan_id: u64,
     ) -> Result<(Vec<ConnectionId>, bool, HashMap<String, usize>)> {
         let project = self.write_project(project_id, connection_id)?;
+        if !project.online {
+            return Err(anyhow!("project is not online"));
+        }
+
         let connection_ids = project.connection_ids();
         let mut worktree = project.worktrees.entry(worktree_id).or_default();
         let metadata_changed = worktree_root_name != worktree.root_name;

crates/project/src/project.rs 🔗

@@ -1243,6 +1243,10 @@ impl Project {
     }
 
     fn share(&mut self, cx: &mut ModelContext<Self>) -> Task<Result<()>> {
+        if !self.is_online() {
+            return Task::ready(Err(anyhow!("can't share an offline project")));
+        }
+
         let project_id;
         if let ProjectClientState::Local {
             remote_id_rx,
@@ -1358,11 +1362,17 @@ impl Project {
         cx: &mut ModelContext<Self>,
     ) {
         if let Some(project_id) = self.remote_id() {
-            let share = self.share(cx);
+            let share = if self.is_online() && allow {
+                Some(self.share(cx))
+            } else {
+                None
+            };
             let client = self.client.clone();
             cx.foreground()
                 .spawn(async move {
-                    share.await?;
+                    if let Some(share) = share {
+                        share.await?;
+                    }
                     client.send(proto::RespondToJoinProjectRequest {
                         requester_id,
                         project_id,