diff --git a/src/cli.rs b/src/cli.rs index 5a31f9b..596b0c5 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -22,9 +22,11 @@ fn build_command() -> Command<'static> { .about("A command-line benchmarking tool.") .arg( Arg::new("command") - .help("Command to benchmark. This can be the name of an executable or a shell \ - command like \"sleep 0.5 && echo test\". If multiple commands are given, \ - hyperfine will show a comparison of the respective runtimes.") + .help("The command to benchmark. This can be the name of an executable, a command \ + line like \"grep -i todo\" or a shell command like \"sleep 0.5 && echo test\". \ + The latter is only available if the shell is not explicitly disabled via \ + '--shell=none'. If multiple commands are given, hyperfine will show a \ + comparison of the respective runtimes.") .required(true) .multiple_occurrences(true) .forbid_empty_values(true), @@ -181,7 +183,19 @@ fn build_command() -> Command<'static> { .takes_value(true) .value_name("SHELL") .overrides_with("shell") - .help("Set the shell to use for executing benchmarked commands."), + .help("Set the shell to use for executing benchmarked commands. This can be the \ + name or the path to the shell executable, or a full command line \ + like \"bash --norc\". It can also be set to \"default\" to explicitly select \ + the default shell on this patform. Finally, this can also be set to \ + \"none\" to disable the shell. In this case, commands will be executed \ + directly. They can still have arguments, but more complex things like \ + \"sleep 0.1; sleep 0.2\" are not possible without a shell.") + ) + .arg( + Arg::new("no-shell") + .short('N') + .conflicts_with_all(&["shell", "debug-mode"]) + .help("An alias for '--shell=none'.") ) .arg( Arg::new("ignore-failure") diff --git a/src/options.rs b/src/options.rs index 6a39900..bad0f37 100644 --- a/src/options.rs +++ b/src/options.rs @@ -282,13 +282,17 @@ impl Options { OutputStyleOption::Disabled => {} }; - options.executor_kind = match (matches.is_present("debug-mode"), matches.value_of("shell")) - { - (false, Some(shell)) if shell == "default" => ExecutorKind::Shell(Shell::default()), - (false, Some(shell)) => ExecutorKind::Shell(Shell::parse_from_str(shell)?), - (false, None) => ExecutorKind::Raw, - (true, Some(shell)) => ExecutorKind::Mock(Some(shell.into())), - (true, None) => ExecutorKind::Mock(None), + options.executor_kind = if matches.is_present("no-shell") { + ExecutorKind::Raw + } else { + match (matches.is_present("debug-mode"), matches.value_of("shell")) { + (false, Some(shell)) if shell == "default" => ExecutorKind::Shell(Shell::default()), + (false, Some(shell)) if shell == "none" => ExecutorKind::Raw, + (false, Some(shell)) => ExecutorKind::Shell(Shell::parse_from_str(shell)?), + (false, None) => ExecutorKind::Shell(Shell::default()), + (true, Some(shell)) => ExecutorKind::Mock(Some(shell.into())), + (true, None) => ExecutorKind::Mock(None), + } }; if matches.is_present("ignore-failure") { diff --git a/tests/common.rs b/tests/common.rs index 6a3d247..b740888 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -11,9 +11,3 @@ pub fn hyperfine_raw_command() -> Command { pub fn hyperfine() -> assert_cmd::Command { assert_cmd::Command::from_std(hyperfine_raw_command()) } - -pub fn hyperfine_shell() -> assert_cmd::Command { - let mut cmd = hyperfine(); - cmd.arg("--shell=default"); - cmd -} diff --git a/tests/execution_order_tests.rs b/tests/execution_order_tests.rs index f8c94f4..fbbfe4e 100644 --- a/tests/execution_order_tests.rs +++ b/tests/execution_order_tests.rs @@ -3,7 +3,7 @@ use std::{fs::File, io::Read, path::PathBuf}; use tempfile::{tempdir, TempDir}; mod common; -use common::hyperfine_shell; +use common::hyperfine; struct ExecutionOrderTest { cmd: assert_cmd::Command, @@ -19,7 +19,7 @@ impl ExecutionOrderTest { let logfile_path = tempdir.path().join("output.log"); ExecutionOrderTest { - cmd: hyperfine_shell(), + cmd: hyperfine(), expected_content: String::new(), logfile_path, tempdir, diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 6ea3584..349dae6 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -1,5 +1,5 @@ mod common; -use common::{hyperfine, hyperfine_shell}; +use common::hyperfine; use predicates::prelude::*; @@ -86,19 +86,20 @@ fn fails_for_unknown_command() { .assert() .failure() .stderr(predicate::str::contains( - "Failed to run command 'some-nonexisting-program-b5d9574198b7e4b12a71fa4747c0a577'", + "Command terminated with non-zero exit code", )); } #[test] -fn fails_for_unknown_shell_command() { - hyperfine_shell() +fn fails_for_unknown_command_without_shell() { + hyperfine() + .arg("--shell=none") .arg("--runs=1") .arg("some-nonexisting-program-b5d9574198b7e4b12a71fa4747c0a577") .assert() .failure() .stderr(predicate::str::contains( - "Command terminated with non-zero exit code", + "Failed to run command 'some-nonexisting-program-b5d9574198b7e4b12a71fa4747c0a577'", )); }