Add flag to invoke in tmux (fix #10)

This commit is contained in:
Roey Darwish Dror
2018-06-20 21:05:49 +03:00
parent 2ee068f4fb
commit d434073239
2 changed files with 39 additions and 2 deletions

View File

@@ -46,6 +46,10 @@ Just run `topgrade`. It will run the following steps:
* *Linux*: Run [needrestart](https://github.com/liske/needrestart) * *Linux*: Run [needrestart](https://github.com/liske/needrestart)
* *macOS*: Upgrade App Store applications * *macOS*: Upgrade App Store applications
## Flags
* `-t/--tmux` - Topgrade will launch itself in a new tmux session. This flag has no effect if
Topgrade already runs inside tmux. This is useful when using topgrade on remote systems.
## Customization ## Customization
You can place a configuration file at `~/.config/topgrade.toml`. Here's an example: You can place a configuration file at `~/.config/topgrade.toml`. Here's an example:

View File

@@ -25,14 +25,18 @@ mod terminal;
mod utils; mod utils;
mod vim; mod vim;
use clap::App; use clap::{App, Arg};
use config::Config; use config::Config;
use failure::Error; use failure::Error;
use git::{Git, Repositories}; use git::{Git, Repositories};
use report::{Report, Reporter}; use report::{Report, Reporter};
use std::env;
use std::env::home_dir; use std::env::home_dir;
#[cfg(unix)]
use std::os::unix::process::CommandExt;
use std::path::PathBuf; use std::path::PathBuf;
use std::process::exit; use std::process::exit;
use std::process::Command;
use steps::*; use steps::*;
use terminal::Terminal; use terminal::Terminal;
use utils::{home_path, is_ancestor}; use utils::{home_path, is_ancestor};
@@ -53,11 +57,40 @@ fn tpm() -> Option<PathBuf> {
} }
fn run() -> Result<(), Error> { fn run() -> Result<(), Error> {
let _ = App::new("Topgrade") let matches = App::new("Topgrade")
.version(crate_version!()) .version(crate_version!())
.about("Upgrade all the things") .about("Upgrade all the things")
.arg(
Arg::with_name("tmux")
.help("Invoke inside tmux")
.short("t")
.long("tmux"),
)
.get_matches(); .get_matches();
if matches.is_present("tmux") && !env::var("TMUX").is_ok() {
if cfg!(unix) {
let tmux = utils::which("tmux").expect("Could not find tmux");
let err = Command::new(tmux)
.args(&[
"new-session",
"-s",
"topgrade",
"-n",
"topgrade",
&env::args().collect::<Vec<String>>().join(" "),
";",
"set",
"remain-on-exit",
"on",
])
.exec();
panic!("{:?}", err);
} else {
panic!("This flag is only implemented in Unix systems");
}
}
env_logger::init(); env_logger::init();
let git = Git::new(); let git = Git::new();
let mut git_repos = Repositories::new(&git); let mut git_repos = Repositories::new(&git);