mirror of
https://github.com/nushell/nushell.git
synced 2025-05-19 09:20:45 +02:00
run-external
spreads command if it's a list (#15776)
This commit is contained in:
parent
5483519c7d
commit
1e8876b076
@ -53,9 +53,9 @@ impl Command for External {
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let cwd = engine_state.cwd(Some(stack))?;
|
||||
let rest = call.rest::<Value>(engine_state, stack, 0)?;
|
||||
let name_args = rest.split_first();
|
||||
let name_args = rest.split_first().map(|(x, y)| (x, y.to_vec()));
|
||||
|
||||
let Some((name, call_args)) = name_args else {
|
||||
let Some((name, mut call_args)) = name_args else {
|
||||
return Err(ShellError::MissingParameter {
|
||||
param_name: "no command given".into(),
|
||||
span: call.head,
|
||||
@ -65,6 +65,17 @@ impl Command for External {
|
||||
let name_str: Cow<str> = match &name {
|
||||
Value::Glob { val, .. } => Cow::Borrowed(val),
|
||||
Value::String { val, .. } => Cow::Borrowed(val),
|
||||
Value::List { vals, .. } => {
|
||||
let Some((first, args)) = vals.split_first() else {
|
||||
return Err(ShellError::MissingParameter {
|
||||
param_name: "external command given as list empty".into(),
|
||||
span: call.head,
|
||||
});
|
||||
};
|
||||
// Prepend elements in command list to the list of arguments except the first
|
||||
call_args.splice(0..0, args.to_vec());
|
||||
first.coerce_str()?
|
||||
}
|
||||
_ => Cow::Owned(name.clone().coerce_into_string()?),
|
||||
};
|
||||
|
||||
@ -164,7 +175,7 @@ impl Command for External {
|
||||
command.envs(envs);
|
||||
|
||||
// Configure args.
|
||||
let args = eval_external_arguments(engine_state, stack, call_args.to_vec())?;
|
||||
let args = eval_external_arguments(engine_state, stack, call_args)?;
|
||||
#[cfg(windows)]
|
||||
if is_cmd_internal_command(&name_str) || pathext_script_in_windows {
|
||||
// The /D flag disables execution of AutoRun commands from registry.
|
||||
|
@ -535,3 +535,32 @@ fn can_run_ps1_files(prefix: &str) {
|
||||
assert!(actual.out.contains("Hello World"));
|
||||
});
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case("^")]
|
||||
#[case("run-external ")]
|
||||
fn expand_command_if_list(#[case] prefix: &str) {
|
||||
use nu_test_support::fs::Stub::FileWithContent;
|
||||
Playground::setup("expand command if list", |dirs, sandbox| {
|
||||
sandbox.with_files(&[FileWithContent("foo.txt", "Hello World")]);
|
||||
let actual = nu!(
|
||||
cwd: dirs.test(),
|
||||
r#"
|
||||
let cmd = [nu `--testbin`]; {}$cmd meow foo.txt
|
||||
"#,
|
||||
prefix
|
||||
);
|
||||
|
||||
assert!(actual.out.contains("Hello World"));
|
||||
})
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case("^")]
|
||||
#[case("run-external ")]
|
||||
fn error_when_command_list_empty(#[case] prefix: &str) {
|
||||
Playground::setup("error when command is list with no items", |dirs, _| {
|
||||
let actual = nu!(cwd: dirs.test(), "let cmd = []; {}$cmd", prefix);
|
||||
assert!(actual.err.contains("missing parameter"));
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user