Introduce an open function

Petros Amoiridis and Mikayla Maki created

And refactor some of the older code to simplify it

Co-Authored-By: Mikayla Maki <mikayla.c.maki@gmail.com>

Change summary

crates/terminal/src/terminal.rs       | 34 ++--------------------------
crates/util/src/lib.rs                |  8 ++++++
crates/workspace/src/notifications.rs |  6 ----
3 files changed, 12 insertions(+), 36 deletions(-)

Detailed changes

crates/terminal/src/terminal.rs 🔗

@@ -32,17 +32,14 @@ use mappings::mouse::{
 
 use procinfo::LocalProcessInfo;
 use settings::{AlternateScroll, Settings, Shell, TerminalBlink};
-use util::ResultExt;
 
 use std::{
     cmp::min,
     collections::{HashMap, VecDeque},
     fmt::Display,
-    io,
     ops::{Deref, Index, RangeInclusive, Sub},
-    os::unix::{prelude::AsRawFd, process::CommandExt},
+    os::unix::prelude::AsRawFd,
     path::PathBuf,
-    process::Command,
     sync::Arc,
     time::{Duration, Instant},
 };
@@ -734,7 +731,7 @@ impl Terminal {
 
                 if let Some((url, url_match)) = found_url {
                     if *open {
-                        open_uri(&url).log_err();
+                        util::open(&url);
                     } else {
                         self.update_hyperlink(prev_hyperlink, url, url_match);
                     }
@@ -1075,7 +1072,7 @@ impl Terminal {
             if self.selection_phase == SelectionPhase::Ended {
                 let mouse_cell_index = content_index_for_mouse(position, &self.last_content);
                 if let Some(link) = self.last_content.cells[mouse_cell_index].hyperlink() {
-                    open_uri(link.uri()).log_err();
+                    util::open(link.uri());
                 } else {
                     self.events
                         .push_back(InternalEvent::FindHyperlink(position, true));
@@ -1234,31 +1231,6 @@ fn content_index_for_mouse<'a>(pos: Vector2F, content: &'a TerminalContent) -> u
     line * content.size.columns() + col
 }
 
-fn open_uri(uri: &str) -> Result<(), std::io::Error> {
-    let mut command = Command::new("open");
-    command.arg(uri);
-
-    unsafe {
-        command
-            .pre_exec(|| {
-                match libc::fork() {
-                    -1 => return Err(io::Error::last_os_error()),
-                    0 => (),
-                    _ => libc::_exit(0),
-                }
-
-                if libc::setsid() == -1 {
-                    return Err(io::Error::last_os_error());
-                }
-
-                Ok(())
-            })
-            .spawn()?
-            .wait()
-            .map(|_| ())
-    }
-}
-
 #[cfg(test)]
 mod tests {
     use alacritty_terminal::{

crates/util/src/lib.rs 🔗

@@ -54,6 +54,14 @@ pub fn truncate_and_trailoff(s: &str, max_chars: usize) -> String {
     }
 }
 
+pub fn open<P: AsRef<Path>>(path: P) {
+    let path_to_open = path.as_ref().to_string_lossy();
+    std::process::Command::new("open")
+        .arg(path_to_open.as_ref())
+        .spawn()
+        .log_err();
+}
+
 pub fn reveal_in_finder<P: AsRef<Path>>(path: P) {
     let path_to_reveal = path.as_ref().to_string_lossy();
     std::process::Command::new("open")

crates/workspace/src/notifications.rs 🔗

@@ -121,7 +121,6 @@ impl Workspace {
 }
 
 pub mod simple_message_notification {
-    use std::process::Command;
 
     use gpui::{
         actions,
@@ -150,10 +149,7 @@ pub mod simple_message_notification {
             |_workspace: &mut Workspace, open_action: &OsOpen, _cx: &mut ViewContext<Workspace>| {
                 #[cfg(target_os = "macos")]
                 {
-                    let mut command = Command::new("open");
-                    command.arg(open_action.0.clone());
-
-                    command.spawn().ok();
+                    util::open(&open_action.0);
                 }
             },
         )