Skip to content

Commit

Permalink
Prompt user before installing things
Browse files Browse the repository at this point in the history
  • Loading branch information
YgorSouza committed Apr 17, 2024
1 parent 5361981 commit 836ba76
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 7 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 10 additions & 6 deletions xtask/src/deny.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,15 @@ pub fn deny(args: &[&str]) -> Result<(), DynError> {
}

fn install_cargo_deny() -> Result<(), DynError> {
let status = Command::new("cargo")
.args(["+stable", "install", "--quiet", "--locked", "cargo-deny"])
.status()?;
if !status.success() {
return Err(status.to_string().into());
let already_installed = Command::new("cargo")
.args(["deny", "--version"])
.output()
.is_ok_and(|out| out.status.success());
if already_installed {
return Ok(());
}
Ok(())
let mut cmd = Command::new("cargo");
cmd.args(["+stable", "install", "--quiet", "--locked", "cargo-deny"]);
let reason = "install cargo-deny";
super::utils::ask_to_run(cmd, true, reason)
}
1 change: 1 addition & 0 deletions xtask/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#![allow(clippy::exit)]

mod deny;
pub(crate) mod utils;

type DynError = Box<dyn std::error::Error>;

Expand Down
36 changes: 36 additions & 0 deletions xtask/src/utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
use std::{
env,
io::{self, Write as _},
process::Command,
};

use super::DynError;

/// Prompt user before running a command
///
/// Adapted from [miri](https://github.com/rust-lang/miri/blob/dba35d2be72f4b78343d1a0f0b4737306f310672/cargo-miri/src/util.rs#L181-L204)
pub fn ask_to_run(mut cmd: Command, ask: bool, reason: &str) -> Result<(), DynError> {
// Disable interactive prompts in CI (GitHub Actions, Travis, AppVeyor, etc).
// Azure doesn't set `CI` though (nothing to see here, just Microsoft being Microsoft),
// so we also check their `TF_BUILD`.
let is_ci = env::var_os("CI").is_some() || env::var_os("TF_BUILD").is_some();
if ask && !is_ci {
let mut buf = String::new();
print!("The script is going to run: \n\n`{cmd:?}`\n\n To {reason}.\nProceed? [Y/n] ",);
io::stdout().flush().unwrap();
io::stdin().read_line(&mut buf).unwrap();
match buf.trim().to_lowercase().as_ref() {
"" | "y" | "yes" => {}
"n" | "no" => return Err("Aborting as per your request".into()),
a => return Err(format!("Invalid answer `{a}`").into()),
};
} else {
eprintln!("Running `{cmd:?}` to {reason}.");
}

let status = cmd.status()?;
if !status.success() {
return Err(format!("failed to {reason}: {status}").into());
}
Ok(())
}

0 comments on commit 836ba76

Please sign in to comment.