Don't allow dropping files on remote projects (cherry-pick #11218) (#11225)

gcp-cherry-pick-bot[bot] and Conrad Irwin created

Cherry-picked Don't allow dropping files on remote projects (#11218)

Release Notes:

- Fixed a panic when a remote participant dropped a local file on your
project

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>

Change summary

crates/project/src/project.rs | 12 +++++++-----
crates/workspace/src/pane.rs  | 18 ++++++++++++++++++
2 files changed, 25 insertions(+), 5 deletions(-)

Detailed changes

crates/project/src/project.rs 🔗

@@ -8457,11 +8457,13 @@ impl Project {
                     OpenBuffer::Weak(_) => {}
                 },
                 hash_map::Entry::Vacant(e) => {
-                    assert!(
-                        is_remote,
-                        "received buffer update from {:?}",
-                        envelope.original_sender_id
-                    );
+                    if !is_remote {
+                        debug_panic!(
+                            "received buffer update from {:?}",
+                            envelope.original_sender_id
+                        );
+                        return Err(anyhow!("received buffer update for non-remote project"));
+                    }
                     e.insert(OpenBuffer::Operations(ops));
                 }
             }

crates/workspace/src/pane.rs 🔗

@@ -1887,6 +1887,24 @@ impl Pane {
         let mut to_pane = cx.view().clone();
         let mut split_direction = self.drag_split_direction;
         let paths = paths.paths().to_vec();
+        let is_remote = self
+            .workspace
+            .update(cx, |workspace, cx| {
+                if workspace.project().read(cx).is_remote() {
+                    workspace.show_error(
+                        &anyhow::anyhow!("Cannot drop files on a remote project"),
+                        cx,
+                    );
+                    true
+                } else {
+                    false
+                }
+            })
+            .unwrap_or(true);
+        if is_remote {
+            return;
+        }
+
         self.workspace
             .update(cx, |workspace, cx| {
                 let fs = Arc::clone(workspace.project().read(cx).fs());