diff --git a/Cargo.lock b/Cargo.lock index 1bd8e47d..84171c0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1838,6 +1838,7 @@ dependencies = [ "notify-rust", "openssl-probe", "pretty_env_logger", + "regex", "rust-ini", "self_update", "serde", diff --git a/Cargo.toml b/Cargo.toml index 2facf534..438163d1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ tempfile = "3.1.0" cfg-if = "0.1.10" tokio = { version = "0.2", features = ["rt-core", "process"] } futures = "0.3" +regex = "1.3.9" [target.'cfg(target_os = "macos")'.dependencies] notify-rust = "4.0.0" diff --git a/src/config.rs b/src/config.rs index 3675fa2c..91a4f7db 100644 --- a/src/config.rs +++ b/src/config.rs @@ -3,6 +3,7 @@ use anyhow::Result; use directories::BaseDirs; use log::{debug, LevelFilter}; use pretty_env_logger::formatted_timed_builder; +use regex::Regex; use serde::Deserialize; use std::collections::BTreeMap; use std::fs::write; @@ -332,6 +333,10 @@ pub struct CommandLineArgs { /// Alternative configuration file #[structopt(long = "config")] config: Option, + + /// A regular expression for restricting remote host execution + #[structopt(long = "remote-host-limit", parse(try_from_str))] + remote_host_limit: Option, } impl CommandLineArgs { @@ -649,4 +654,12 @@ impl Config { #[cfg(target_os = "linux")] str_value!(linux, emerge_update_flags); + + pub fn should_execute_remote(&self, remote: &str) -> bool { + self.opt + .remote_host_limit + .as_ref() + .map(|h| h.is_match(remote)) + .unwrap_or(true) + } } diff --git a/src/main.rs b/src/main.rs index 510d698c..edc5e70d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -113,7 +113,7 @@ fn run() -> Result<()> { runner.execute(Step::Wsl, "WSL", || windows::run_wsl_topgrade(run_type))?; if let Some(topgrades) = config.remote_topgrades() { - for remote_topgrade in topgrades { + for remote_topgrade in topgrades.iter().filter(|t| config.should_execute_remote(t)) { runner.execute(Step::Remotes, format!("Remote ({})", remote_topgrade), || { generic::run_remote_topgrade(&ctx, remote_topgrade) })?;