Allow guests to create directories

Max Brunsfeld created

Change summary

crates/collab/src/rpc.rs      | 27 +++++++++++++++++++++++++++
crates/project/src/project.rs |  8 ++------
2 files changed, 29 insertions(+), 6 deletions(-)

Detailed changes

crates/collab/src/rpc.rs 🔗

@@ -1899,6 +1899,33 @@ mod tests {
                 [".zed.toml", "a.txt", "b.txt", "d.txt"]
             );
         });
+
+        project_b
+            .update(cx_b, |project, cx| {
+                project
+                    .create_entry((worktree_id, "DIR"), true, cx)
+                    .unwrap()
+            })
+            .await
+            .unwrap();
+        worktree_a.read_with(cx_a, |worktree, _| {
+            assert_eq!(
+                worktree
+                    .paths()
+                    .map(|p| p.to_string_lossy())
+                    .collect::<Vec<_>>(),
+                [".zed.toml", "DIR", "a.txt", "b.txt", "d.txt"]
+            );
+        });
+        worktree_b.read_with(cx_b, |worktree, _| {
+            assert_eq!(
+                worktree
+                    .paths()
+                    .map(|p| p.to_string_lossy())
+                    .collect::<Vec<_>>(),
+                [".zed.toml", "DIR", "a.txt", "b.txt", "d.txt"]
+            );
+        });
     }
 
     #[gpui::test(iterations = 10)]

crates/project/src/project.rs 🔗

@@ -3829,12 +3829,8 @@ impl Project {
                     .ok_or_else(|| anyhow!("worktree not found"))?;
                 worktree.update(cx, |worktree, cx| {
                     let worktree = worktree.as_local_mut().unwrap();
-                    if envelope.payload.is_directory {
-                        unimplemented!("can't yet create directories");
-                    } else {
-                        let path = PathBuf::from(OsString::from_vec(envelope.payload.path));
-                        anyhow::Ok(worktree.write_file(path, Default::default(), cx))
-                    }
+                    let path = PathBuf::from(OsString::from_vec(envelope.payload.path));
+                    anyhow::Ok(worktree.create_entry(path, envelope.payload.is_directory, cx))
                 })
             })?
             .await?;