diff --git a/Cargo.lock b/Cargo.lock index e45ed5c433..fb94530b6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1097,7 +1097,6 @@ dependencies = [ "ipc-channel", "plist", "serde", - "sysinfo", ] [[package]] diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 98c5ba60ab..f2bab22ea7 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -18,7 +18,6 @@ clap = { version = "3.1", features = ["derive"] } dirs = "3.0" ipc-channel = "0.16" serde = { version = "1.0", features = ["derive", "rc"] } -sysinfo = "0.27" [target.'cfg(target_os = "macos")'.dependencies] core-foundation = "0.9" diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 8ef1b1fb2b..a31e59587f 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -14,10 +14,8 @@ use std::{ fs::{self, OpenOptions}, io, path::{Path, PathBuf}, - ptr, thread, - time::Duration, + ptr, }; -use sysinfo::{Pid, System, SystemExt}; #[derive(Parser)] #[clap(name = "zed", global_setting(clap::AppSettings::NoAutoVersion))] @@ -34,8 +32,6 @@ struct Args { /// Custom Zed.app path #[clap(short, long)] bundle_path: Option, - #[clap(short, long)] - restart_from: Option, } #[derive(Debug, Deserialize)] @@ -64,13 +60,6 @@ fn main() -> Result<()> { return Ok(()); } - if let Some(parent_pid) = args.restart_from { - let mut system = System::new(); - while system.refresh_process(parent_pid) { - thread::sleep(Duration::from_millis(100)); - } - } - for path in args.paths.iter() { if !path.exists() { touch(path.as_path())?; diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 4753450110..1bf19e983e 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -81,6 +81,7 @@ pub trait Platform: Send + Sync { fn app_version(&self) -> Result; fn os_name(&self) -> &'static str; fn os_version(&self) -> Result; + fn restart(&self); } pub(crate) trait ForegroundPlatform { diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs index ccbae5a832..3db7c6eedc 100644 --- a/crates/gpui/src/platform/mac/platform.rs +++ b/crates/gpui/src/platform/mac/platform.rs @@ -45,6 +45,7 @@ use std::{ ffi::{c_void, CStr, OsStr}, os::{raw::c_char, unix::ffi::OsStrExt}, path::{Path, PathBuf}, + process::Command, ptr, rc::Rc, slice, str, @@ -803,6 +804,33 @@ impl platform::Platform for MacPlatform { }) } } + + fn restart(&self) { + #[cfg(debug_assertions)] + let path = std::env::current_exe(); + + #[cfg(not(debug_assertions))] + let path = unsafe { + let bundle: id = NSBundle::mainBundle(); + if bundle.is_null() { + std::env::current_exe() + } else { + let path: id = msg_send![bundle, bundlePath]; + let path: *mut c_char = msg_send![path, UTF8String]; + + Ok(PathBuf::from(OsStr::from_bytes( + CStr::from_ptr(path).to_bytes(), + ))) + } + }; + + let command = path.and_then(|path| Command::new("/usr/bin/open").arg(path).spawn()); + + match command { + Err(err) => log::error!("Unable to restart application {}", err), + Ok(_) => self.quit(), + } + } } unsafe fn path_from_objc(path: id) -> PathBuf { diff --git a/crates/gpui/src/platform/test.rs b/crates/gpui/src/platform/test.rs index cf0e31c2b8..e81daa8788 100644 --- a/crates/gpui/src/platform/test.rs +++ b/crates/gpui/src/platform/test.rs @@ -226,6 +226,8 @@ impl super::Platform for Platform { patch: 0, }) } + + fn restart(&self) {} } #[derive(Debug)] diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 5679bce53a..a775b31bc4 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -38,7 +38,9 @@ use terminal_view::{get_working_directory, TerminalView}; use fs::RealFs; use settings::watched_json::{watch_keymap_file, watch_settings_file, WatchedJsonFile}; use theme::ThemeRegistry; -use util::{channel::RELEASE_CHANNEL, paths, ResultExt, StaffMode, TryFutureExt}; +#[cfg(debug_assertions)] +use util::StaffMode; +use util::{channel::RELEASE_CHANNEL, paths, ResultExt, TryFutureExt}; use workspace::{ self, item::ItemHandle, notifications::NotifyResultExt, AppState, NewFile, OpenPaths, Workspace, }; diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index 7be2818b61..16b5413fda 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -23,8 +23,7 @@ use gpui::{ }, impl_actions, platform::{WindowBounds, WindowOptions}, - AssetSource, AsyncAppContext, Platform, PromptLevel, Task, TitlebarOptions, ViewContext, - WindowKind, + AssetSource, AsyncAppContext, Platform, PromptLevel, TitlebarOptions, ViewContext, WindowKind, }; use language::Rope; use lazy_static::lazy_static; @@ -35,7 +34,7 @@ use search::{BufferSearchBar, ProjectSearchBar}; use serde::Deserialize; use serde_json::to_string_pretty; use settings::{keymap_file_json_schema, settings_file_json_schema, Settings}; -use std::{borrow::Cow, env, path::Path, process::Command, str, sync::Arc}; +use std::{borrow::Cow, env, path::Path, str, sync::Arc}; use util::{channel::ReleaseChannel, paths, ResultExt, StaffMode}; use uuid::Uuid; pub use workspace; @@ -130,9 +129,7 @@ pub fn init(app_state: &Arc, cx: &mut gpui::MutableAppContext) { } }, ); - cx.add_global_action(|_: &Quit, cx| { - quit(cx).detach_and_log_err(cx); - }); + cx.add_global_action(quit); cx.add_global_action(restart); cx.add_global_action(move |action: &OpenBrowser, cx| cx.platform().open_url(&action.url)); cx.add_global_action(move |_: &IncreaseBufferFontSize, cx| { @@ -408,30 +405,10 @@ pub fn build_window_options( } fn restart(_: &Restart, cx: &mut gpui::MutableAppContext) { - let cli_process = cx - .platform() - .path_for_auxiliary_executable("cli") - .log_err() - .and_then(|path| { - Command::new(path) - .args(["--restart-from", &format!("{}", std::process::id())]) - .spawn() - .log_err() - }); - - cx.spawn(|mut cx| async move { - let did_quit = cx.update(quit).await?; - if !did_quit { - if let Some(mut cli_process) = cli_process { - cli_process.kill().log_err(); - } - } - Ok::<(), anyhow::Error>(()) - }) - .detach_and_log_err(cx); + cx.platform().restart(); } -fn quit(cx: &mut gpui::MutableAppContext) -> Task> { +fn quit(_: &Quit, cx: &mut gpui::MutableAppContext) { let mut workspaces = cx .window_ids() .filter_map(|window_id| cx.root_view::(window_id)) @@ -454,7 +431,7 @@ fn quit(cx: &mut gpui::MutableAppContext) -> Task> { .next() .await; if answer != Some(0) { - return Ok(false); + return Ok(()); } } @@ -466,12 +443,13 @@ fn quit(cx: &mut gpui::MutableAppContext) -> Task> { }) .await? { - return Ok(false); + return Ok(()); } } cx.platform().quit(); - anyhow::Ok(true) + anyhow::Ok(()) }) + .detach_and_log_err(cx); } fn about(_: &mut Workspace, _: &About, cx: &mut gpui::ViewContext) {