From 6617bb870da4006d5e8903b40ed47ff5f06be611 Mon Sep 17 00:00:00 2001 From: Roey Darwish Dror Date: Tue, 4 Sep 2018 11:21:32 +0300 Subject: [PATCH] The -t flag now works when the tmux session already exists (fix #54) --- src/tmux.rs | 59 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/src/tmux.rs b/src/tmux.rs index f72ba5de..309f1fae 100644 --- a/src/tmux.rs +++ b/src/tmux.rs @@ -5,7 +5,9 @@ use super::utils::{Check, PathExt}; use directories::BaseDirs; use failure::Error; use std::env; +use std::io; use std::os::unix::process::CommandExt; +use std::path::Path; use std::process::Command; pub fn run_tpm(base_dirs: &BaseDirs, terminal: &mut Terminal, dry_run: bool) -> Option<(&'static str, bool)> { @@ -27,23 +29,50 @@ pub fn run_tpm(base_dirs: &BaseDirs, terminal: &mut Terminal, dry_run: bool) -> None } +fn has_session(tmux: &Path, session_name: &str) -> Result { + Ok(Command::new(tmux) + .args(&["has-session", "-t", session_name]) + .spawn()? + .wait()? + .success()) +} + +fn run_in_session(tmux: &Path, command: &str) -> Result<(), Error> { + Command::new(tmux) + .args(&["new-window", "-a", "-t", "topgrade:1", command]) + .spawn()? + .wait()? + .check()?; + + Ok(()) +} + pub fn run_in_tmux() -> ! { let tmux = which("tmux").expect("Could not find tmux"); + let command = env::args().collect::>().join(" "); - let err = Command::new(tmux) - .args(&[ - "new-session", - "-s", - "topgrade", - "-n", - "topgrade", - &env::args().collect::>().join(" "), - ";", - "set", - "remain-on-exit", - "on", - ]) - .exec(); + if has_session(&tmux, "topgrade").expect("Error launching tmux") { + run_in_session(&tmux, &command).expect("Error launching tmux"); - panic!("{:?}", err); + let err = Command::new(tmux).args(&["attach", "-t", "topgrade"]).exec(); + + panic!("{:?}", err); + } else { + let err = Command::new(tmux) + .args(&[ + "new-session", + "-s", + "topgrade", + "-n", + "topgrade", + &command, + ";", + "set", + "remain-on-exit", + "on", + ]) + .exec(); + + panic!("{:?}", err); + } }