diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3038d541..9e3161d5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,6 +7,7 @@ jobs: strategy: matrix: platform: [ubuntu-latest, macos-latest, windows-latest] + fail-fast: false runs-on: ${{ matrix.platform }} steps: - uses: actions/checkout@v2 diff --git a/src/config.rs b/src/config.rs index 4acdee4a..ab844926 100644 --- a/src/config.rs +++ b/src/config.rs @@ -393,9 +393,9 @@ pub struct CommandLineArgs { #[structopt(short = "k", long = "keep")] keep_at_end: bool, - /// Say yes to package manager's prompt (experimental) + /// Say yes to package manager's prompt #[structopt(short = "y", long = "yes")] - yes: bool, + yes: Option>, /// Don't pull the predefined git repos #[structopt(long = "disable-predefined-git-repos")] @@ -585,8 +585,20 @@ impl Config { /// Whether to say yes to package managers #[allow(dead_code)] - pub fn yes(&self) -> bool { - self.config_file.assume_yes.unwrap_or(self.opt.yes) + pub fn yes(&self, step: Step) -> bool { + if let Some(yes) = self.config_file.assume_yes { + return yes; + } + + if let Some(yes_list) = &self.opt.yes { + if yes_list.is_empty() { + return true; + } + + return yes_list.contains(&step); + } + + false } /// Bash-it branch diff --git a/src/steps/emacs.rs b/src/steps/emacs.rs index 9d9a6fd6..862ff16d 100644 --- a/src/steps/emacs.rs +++ b/src/steps/emacs.rs @@ -1,12 +1,15 @@ -use crate::execution_context::ExecutionContext; -use crate::terminal::print_separator; -use crate::utils::{require, require_option, PathExt}; -use anyhow::Result; -use directories::BaseDirs; #[cfg(any(windows, target_os = "macos"))] use std::env; use std::path::{Path, PathBuf}; +use anyhow::Result; +use directories::BaseDirs; + +use crate::execution_context::ExecutionContext; +use crate::terminal::print_separator; +use crate::utils::{require, require_option, PathExt}; +use crate::Step; + const EMACS_UPGRADE: &str = include_str!("emacs.el"); #[cfg(windows)] const DOOM_PATH: &str = "bin/doom.cmd"; @@ -66,7 +69,7 @@ impl Emacs { let mut command = ctx.run_type().execute(doom); command.args(&["-y", "upgrade"]); - if ctx.config().yes() { + if ctx.config().yes(Step::Emacs) { command.arg("--force"); } diff --git a/src/steps/os/archlinux.rs b/src/steps/os/archlinux.rs index 76eaa9dc..cee133aa 100644 --- a/src/steps/os/archlinux.rs +++ b/src/steps/os/archlinux.rs @@ -1,6 +1,6 @@ -use crate::config; use crate::execution_context::ExecutionContext; use crate::utils::which; +use crate::{config, Step}; use anyhow::Result; use std::env::var_os; use std::ffi::OsString; @@ -42,7 +42,7 @@ impl ArchPackageManager for YayParu { .args(ctx.config().yay_arguments().split_whitespace()) .env("PATH", get_execution_path()); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("--noconfirm"); } command.check_run()?; @@ -50,7 +50,7 @@ impl ArchPackageManager for YayParu { if ctx.config().cleanup() { let mut command = ctx.run_type().execute(&self.executable); command.arg("--pacman").arg(&self.pacman).arg("-Scc"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("--noconfirm"); } command.check_run()?; @@ -82,7 +82,7 @@ impl ArchPackageManager for Trizen { .args(ctx.config().trizen_arguments().split_whitespace()) .env("PATH", get_execution_path()); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("--noconfirm"); } command.check_run()?; @@ -90,7 +90,7 @@ impl ArchPackageManager for Trizen { if ctx.config().cleanup() { let mut command = ctx.run_type().execute(&self.executable); command.arg("-Sc"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("--noconfirm"); } command.check_run()?; @@ -120,7 +120,7 @@ impl ArchPackageManager for Pacman { .arg(&self.executable) .arg("-Syu") .env("PATH", get_execution_path()); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("--noconfirm"); } command.check_run()?; @@ -128,7 +128,7 @@ impl ArchPackageManager for Pacman { if ctx.config().cleanup() { let mut command = ctx.run_type().execute(&self.sudo); command.arg(&self.executable).arg("-Scc"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("--noconfirm"); } command.check_run()?; diff --git a/src/steps/os/linux.rs b/src/steps/os/linux.rs index faa91243..8784ff85 100644 --- a/src/steps/os/linux.rs +++ b/src/steps/os/linux.rs @@ -4,6 +4,7 @@ use crate::executor::{CommandExt, RunType}; use crate::steps::os::archlinux; use crate::terminal::{print_separator, print_warning}; use crate::utils::{require, require_option, which, PathExt}; +use crate::Step; use anyhow::Result; use ini::Ini; use log::debug; @@ -137,7 +138,7 @@ fn upgrade_redhat(ctx: &ExecutionContext) -> Result<()> { if ctx.config().rpm_ostree() { let mut command = ctx.run_type().execute(ostree); command.arg("upgrade"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("-y"); } @@ -163,7 +164,7 @@ fn upgrade_redhat(ctx: &ExecutionContext) -> Result<()> { command.args(args.split_whitespace()); } - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("-y"); } @@ -259,7 +260,7 @@ fn upgrade_debian(ctx: &ExecutionContext) -> Result<()> { let mut command = ctx.run_type().execute(&sudo); command.arg(&apt).arg("dist-upgrade"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("-y"); } if let Some(args) = ctx.config().apt_arguments() { @@ -272,7 +273,7 @@ fn upgrade_debian(ctx: &ExecutionContext) -> Result<()> { let mut command = ctx.run_type().execute(&sudo); command.arg(&apt).arg("autoremove"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { command.arg("-y"); } command.check_run()?; @@ -391,7 +392,7 @@ fn upgrade_neon(ctx: &ExecutionContext) -> Result<()> { ctx.run_type().execute(&sudo).arg(&pkcon).arg("refresh").check_run()?; let mut exe = ctx.run_type().execute(&sudo); let cmd = exe.arg(&pkcon).arg("update"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { cmd.arg("-y"); } if ctx.config().cleanup() { @@ -438,7 +439,7 @@ pub fn run_fwupdmgr(ctx: &ExecutionContext) -> Result<()> { if ctx.config().firmware_upgrade() { updmgr.arg("update"); - if ctx.config().yes() { + if ctx.config().yes(Step::System) { updmgr.arg("-y"); } } else { diff --git a/src/steps/os/macos.rs b/src/steps/os/macos.rs index 3fb39a9f..7327eed2 100644 --- a/src/steps/os/macos.rs +++ b/src/steps/os/macos.rs @@ -1,7 +1,7 @@ use crate::execution_context::ExecutionContext; use crate::executor::RunType; use crate::terminal::{print_separator, prompt_yesno}; -use crate::{error::TopgradeError, utils::require}; +use crate::{error::TopgradeError, utils::require, Step}; use anyhow::Result; use log::debug; use std::process::Command; @@ -42,7 +42,7 @@ pub fn run_silnite(ctx: &ExecutionContext) -> Result<()> { pub fn upgrade_macos(ctx: &ExecutionContext) -> Result<()> { print_separator("macOS system update"); - let should_ask = !(ctx.config().yes()) || (ctx.config().dry_run()); + let should_ask = !(ctx.config().yes(Step::System)) || (ctx.config().dry_run()); if should_ask { println!("Finding available software"); if system_update_available()? { diff --git a/src/steps/os/unix.rs b/src/steps/os/unix.rs index 124391d0..e36150fa 100644 --- a/src/steps/os/unix.rs +++ b/src/steps/os/unix.rs @@ -7,6 +7,7 @@ use crate::executor::CommandExt; use crate::executor::{Executor, ExecutorExitStatus, RunType}; use crate::terminal::{print_separator, print_warning}; use crate::utils::{require, require_option, PathExt}; +use crate::Step; use anyhow::Result; use directories::BaseDirs; use log::debug; @@ -106,14 +107,14 @@ pub fn run_pkgin(ctx: &ExecutionContext) -> Result<()> { let mut command = ctx.run_type().execute(ctx.sudo().as_ref().unwrap()); command.arg(&pkgin).arg("update"); - if ctx.config().yes() { + if ctx.config().yes(Step::Pkgin) { command.arg("-y"); } command.check_run()?; let mut command = ctx.run_type().execute(ctx.sudo().as_ref().unwrap()); command.arg(&pkgin).arg("upgrade"); - if ctx.config().yes() { + if ctx.config().yes(Step::Pkgin) { command.arg("-y"); } command.check_run() diff --git a/src/steps/os/windows.rs b/src/steps/os/windows.rs index 850fa90e..f5bf9cae 100644 --- a/src/steps/os/windows.rs +++ b/src/steps/os/windows.rs @@ -1,18 +1,20 @@ -use crate::execution_context::ExecutionContext; -use crate::executor::{CommandExt, RunType}; -use crate::powershell; -use crate::terminal::print_separator; -use crate::utils::require; -use crate::{error::SkipStep, steps::git::Repositories}; -use anyhow::Result; -use log::debug; use std::convert::TryFrom; use std::path::Path; use std::{ffi::OsStr, process::Command}; +use anyhow::Result; +use log::debug; + +use crate::execution_context::ExecutionContext; +use crate::executor::{CommandExt, RunType}; +use crate::terminal::print_separator; +use crate::utils::require; +use crate::{error::SkipStep, steps::git::Repositories}; +use crate::{powershell, Step}; + pub fn run_chocolatey(ctx: &ExecutionContext) -> Result<()> { let choco = require("choco")?; - let yes = ctx.config().yes(); + let yes = ctx.config().yes(Step::Chocolatey); print_separator("Chocolatey"); @@ -70,7 +72,7 @@ pub fn run_wsl_topgrade(ctx: &ExecutionContext) -> Result<()> { .args(&["bash", "-c"]) .arg(format!("TOPGRADE_PREFIX=WSL exec {}", topgrade)); - if ctx.config().yes() { + if ctx.config().yes(Step::Wsl) { command.arg("-y"); } diff --git a/src/steps/powershell.rs b/src/steps/powershell.rs index b5fa0fd2..4a0a09c3 100644 --- a/src/steps/powershell.rs +++ b/src/steps/powershell.rs @@ -1,13 +1,16 @@ -use crate::execution_context::ExecutionContext; -use crate::executor::CommandExt; -use crate::terminal::{is_dumb, print_separator}; -use crate::utils::{require_option, which, PathExt}; -use anyhow::Result; #[cfg(windows)] use std::path::Path; use std::path::PathBuf; use std::process::Command; +use anyhow::Result; + +use crate::execution_context::ExecutionContext; +use crate::executor::CommandExt; +use crate::terminal::{is_dumb, print_separator}; +use crate::utils::{require_option, which, PathExt}; +use crate::Step; + pub struct Powershell { path: Option, profile: Option, @@ -69,7 +72,7 @@ impl Powershell { cmd.push("-Verbose") } - if ctx.config().yes() { + if ctx.config().yes(Step::Powershell) { cmd.push("-Confirm") } diff --git a/src/steps/remote/ssh.rs b/src/steps/remote/ssh.rs index e8345f53..c759259a 100644 --- a/src/steps/remote/ssh.rs +++ b/src/steps/remote/ssh.rs @@ -1,6 +1,7 @@ -use crate::{error::SkipStep, execution_context::ExecutionContext, terminal::print_separator, utils}; use anyhow::Result; +use crate::{error::SkipStep, execution_context::ExecutionContext, terminal::print_separator, utils}; + fn prepare_async_ssh_command(args: &mut Vec<&str>) { args.insert(0, "ssh"); args.push("--keep"); @@ -19,10 +20,6 @@ pub fn ssh_step(ctx: &ExecutionContext, hostname: &str) -> Result<()> { let env = format!("TOPGRADE_PREFIX={}", hostname); args.extend(&["env", &env, "$SHELL", "-lc", topgrade]); - if ctx.config().yes() { - args.push("-y"); - } - if ctx.config().run_in_tmux() && !ctx.run_type().dry() { #[cfg(unix)] { @@ -47,10 +44,6 @@ pub fn ssh_step(ctx: &ExecutionContext, hostname: &str) -> Result<()> { let env = format!("TOPGRADE_PREFIX={}", hostname); args.extend(&["env", &env, "$SHELL", "-lc", topgrade]); - if ctx.config().yes() { - args.push("-y"); - } - print_separator(format!("Remote ({})", hostname)); println!("Connecting to {}...", hostname); diff --git a/src/steps/remote/vagrant.rs b/src/steps/remote/vagrant.rs index 3c4af976..ed3dfad3 100644 --- a/src/steps/remote/vagrant.rs +++ b/src/steps/remote/vagrant.rs @@ -1,14 +1,16 @@ -use crate::execution_context::ExecutionContext; -use crate::executor::CommandExt; -use crate::terminal::print_separator; -use crate::{error::SkipStep, utils}; -use anyhow::Result; -use log::{debug, error}; use std::path::{Path, PathBuf}; use std::process::Command; use std::{fmt::Display, rc::Rc, str::FromStr}; + +use anyhow::Result; +use log::{debug, error}; use strum::EnumString; +use crate::execution_context::ExecutionContext; +use crate::executor::CommandExt; +use crate::terminal::print_separator; +use crate::{error::SkipStep, utils, Step}; + #[derive(Debug, Copy, Clone, EnumString)] #[strum(serialize_all = "lowercase")] enum BoxStatus { @@ -188,7 +190,7 @@ pub fn topgrade_vagrant_box(ctx: &ExecutionContext, vagrant_box: &VagrantBox) -> print_separator(seperator); } let mut command = format!("env TOPGRADE_PREFIX={} topgrade", vagrant_box.smart_name()); - if ctx.config().yes() { + if ctx.config().yes(Step::Vagrant) { command.push_str(" -y"); }