diff --git a/crates/project/src/worktree_store.rs b/crates/project/src/worktree_store.rs index 8b620de43e..07764d4a05 100644 --- a/crates/project/src/worktree_store.rs +++ b/crates/project/src/worktree_store.rs @@ -182,14 +182,23 @@ impl WorktreeStore { visible: bool, cx: &mut ModelContext, ) -> Task, Arc>> { - let abs_path = abs_path.as_ref(); - let root_name = abs_path.file_name().unwrap().to_string_lossy().to_string(); - let path = abs_path.to_string_lossy().to_string(); + let mut abs_path = abs_path.as_ref().to_string_lossy().to_string(); + // If we start with `/~` that means the ssh path was something like `ssh://user@host/~/home-dir-folder/` + // in which case want to strip the leading the `/` and expand the tilde. + // That's what git does too: https://github.com/libgit2/libgit2/issues/3345#issuecomment-127050850 + if abs_path.starts_with("/~") { + abs_path = shellexpand::tilde(&abs_path[1..]).to_string(); + } + let root_name = PathBuf::from(abs_path.clone()) + .file_name() + .unwrap() + .to_string_lossy() + .to_string(); cx.spawn(|this, mut cx| async move { let response = client .request(proto::AddWorktree { project_id: SSH_PROJECT_ID, - path: path.clone(), + path: abs_path.clone(), }) .await?; let worktree = cx.update(|cx| { @@ -200,7 +209,7 @@ impl WorktreeStore { id: response.worktree_id, root_name, visible, - abs_path: path, + abs_path, }, client, cx,