diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 538b46ee77..482de94162 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -68,6 +68,7 @@ pub trait Platform: Send + Sync { fn write_to_clipboard(&self, item: ClipboardItem); fn read_from_clipboard(&self) -> Option; fn open_url(&self, url: &str); + fn convert_to_shortened_path(&self, path: &Path) -> PathBuf; fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()>; fn read_credentials(&self, url: &str) -> Result)>>; diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs index ab4fd873c6..d9ac7237ce 100644 --- a/crates/gpui/src/platform/mac/platform.rs +++ b/crates/gpui/src/platform/mac/platform.rs @@ -674,6 +674,18 @@ impl platform::Platform for MacPlatform { } } + fn convert_to_shortened_path(&self, path: &Path) -> PathBuf { + match path.strip_prefix(util::paths::HOME.as_path()) { + Ok(relative_path) => { + let mut shortened_path = PathBuf::new(); + shortened_path.push("~"); + shortened_path.push(relative_path); + shortened_path + } + Err(_) => path.to_path_buf(), + } + } + fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()> { let url = CFString::from(url); let username = CFString::from(username); @@ -1113,4 +1125,23 @@ mod tests { platform.pasteboard = unsafe { NSPasteboard::pasteboardWithUniqueName(nil) }; platform } + + #[test] + fn test_convert_to_shortened_path() { + let platform = build_platform(); + + let full_path: PathBuf = [ + util::paths::HOME.to_string_lossy().to_string(), + "a".to_string(), + "b".to_string(), + "c".to_string(), + ] + .iter() + .collect(); + + let shortened_path_actual = platform.convert_to_shortened_path(&full_path); + let shortened_path_expected = PathBuf::from("~/a/b/c"); + + assert_eq!(shortened_path_actual, shortened_path_expected); + } } diff --git a/crates/gpui/src/platform/test.rs b/crates/gpui/src/platform/test.rs index a3532dd96e..6b1cdf5e05 100644 --- a/crates/gpui/src/platform/test.rs +++ b/crates/gpui/src/platform/test.rs @@ -175,6 +175,10 @@ impl super::Platform for Platform { fn open_url(&self, _: &str) {} + fn convert_to_shortened_path(&self, _path: &Path) -> PathBuf { + PathBuf::new() + } + fn write_credentials(&self, _: &str, _: &str, _: &[u8]) -> Result<()> { Ok(()) } diff --git a/crates/recent_projects/src/highlighted_workspace_location.rs b/crates/recent_projects/src/highlighted_workspace_location.rs index b414b84f4a..bee7594d33 100644 --- a/crates/recent_projects/src/highlighted_workspace_location.rs +++ b/crates/recent_projects/src/highlighted_workspace_location.rs @@ -1,4 +1,4 @@ -use std::path::{Path, PathBuf}; +use std::path::Path; use fuzzy::StringMatch; use gpui::{ @@ -55,20 +55,17 @@ pub struct HighlightedWorkspaceLocation { } impl HighlightedWorkspaceLocation { - pub fn new(string_match: &StringMatch, location: &WorkspaceLocation) -> Self { + pub fn new( + string_match: &StringMatch, + location: &WorkspaceLocation, + cx: &gpui::AppContext, + ) -> Self { let mut path_start_offset = 0; let (names, paths): (Vec<_>, Vec<_>) = location .paths() .iter() .map(|path| { - let mut full_path = PathBuf::new(); - if path.starts_with(util::paths::HOME.as_path()) { - full_path.push("~"); - full_path.push(path.strip_prefix(util::paths::HOME.as_path()).unwrap()); - } else { - full_path.push(path) - } - + let full_path = cx.platform().convert_to_shortened_path(&path); let highlighted_text = Self::highlights_for_path( full_path.as_ref(), &string_match.positions, diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index e73d0b4fb5..81afd694d0 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -192,6 +192,7 @@ impl PickerDelegate for RecentProjectsView { let highlighted_location = HighlightedWorkspaceLocation::new( &string_match, &self.workspace_locations[string_match.candidate_id], + &cx, ); Flex::column()