diff --git a/crates/auto_update/src/auto_update.rs b/crates/auto_update/src/auto_update.rs index c8f70b1688..a129caf51f 100644 --- a/crates/auto_update/src/auto_update.rs +++ b/crates/auto_update/src/auto_update.rs @@ -166,7 +166,7 @@ impl AutoUpdater { mounted_app_path.push("/"); let running_app_path = ZED_APP_PATH .clone() - .map_or_else(|| cx.platform().path_for_resource(None, None), Ok)?; + .map_or_else(|| cx.platform().app_path(), Ok)?; let mut dmg_file = File::create(&dmg_path).await?; let response = client diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index cb62885651..284be36205 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -57,6 +57,7 @@ pub trait Platform: Send + Sync { fn local_timezone(&self) -> UtcOffset; fn path_for_resource(&self, name: Option<&str>, extension: Option<&str>) -> Result; + fn app_path(&self) -> Result; fn app_version(&self) -> Result; } diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs index 138fd106fb..e159b25357 100644 --- a/crates/gpui/src/platform/mac/platform.rs +++ b/crates/gpui/src/platform/mac/platform.rs @@ -615,15 +615,23 @@ impl platform::Platform for MacPlatform { if path.is_null() { Err(anyhow!("resource could not be found")) } else { - let len = msg_send![path, lengthOfBytesUsingEncoding: NSUTF8StringEncoding]; - let bytes = path.UTF8String() as *const u8; - let path = str::from_utf8(slice::from_raw_parts(bytes, len)).unwrap(); - Ok(PathBuf::from(path)) + Ok(path_from_objc(path)) } } } } + fn app_path(&self) -> Result { + unsafe { + let bundle: id = NSBundle::mainBundle(); + if bundle.is_null() { + Err(anyhow!("app is not running inside a bundle")) + } else { + Ok(path_from_objc(msg_send![bundle, bundlePath])) + } + } + } + fn app_version(&self) -> Result { unsafe { let bundle: id = NSBundle::mainBundle(); @@ -641,6 +649,13 @@ impl platform::Platform for MacPlatform { } } +unsafe fn path_from_objc(path: id) -> PathBuf { + let len = msg_send![path, lengthOfBytesUsingEncoding: NSUTF8StringEncoding]; + let bytes = path.UTF8String() as *const u8; + let path = str::from_utf8(slice::from_raw_parts(bytes, len)).unwrap(); + PathBuf::from(path) +} + unsafe fn get_foreground_platform(object: &mut Object) -> &MacForegroundPlatform { let platform_ptr: *mut c_void = *object.get_ivar(MAC_PLATFORM_IVAR); assert!(!platform_ptr.is_null()); diff --git a/crates/gpui/src/platform/test.rs b/crates/gpui/src/platform/test.rs index ccb98c6ba6..5bbf7d06c1 100644 --- a/crates/gpui/src/platform/test.rs +++ b/crates/gpui/src/platform/test.rs @@ -165,6 +165,10 @@ impl super::Platform for Platform { Err(anyhow!("app not running inside a bundle")) } + fn app_path(&self) -> Result { + Err(anyhow!("app not running inside a bundle")) + } + fn app_version(&self) -> Result { Ok(AppVersion { major: 1,