Support multiple shorthand env vars (#3692)

This commit is contained in:
JT 2021-06-26 14:15:57 +12:00 committed by GitHub
parent a2dc4199d0
commit 0c82c1920e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 15 deletions

View File

@ -2099,18 +2099,33 @@ pub fn classify_block(
for group in &lite_block.block {
let mut out_group = Group::basic();
for pipeline in &group.pipelines {
let (pipeline, vars, err) = expand_shorthand_forms(pipeline);
let mut env_vars = vec![];
let mut pipeline = pipeline.clone();
loop {
if pipeline.commands.is_empty() || pipeline.commands[0].parts.is_empty() {
break;
}
let (pl, vars, err) = expand_shorthand_forms(&pipeline);
if error.is_none() {
error = err;
}
pipeline = pl;
if let Some(vars) = vars {
env_vars.push(vars);
} else {
break;
}
}
let pipeline_span = pipeline.span();
let (mut out_pipe, err) = parse_pipeline(pipeline, scope);
if error.is_none() {
error = err;
}
let (out_pipe, err) = parse_pipeline(pipeline.clone(), scope);
if error.is_none() {
error = err;
}
let pipeline = if let Some(vars) = vars {
let span = pipeline.span();
while let Some(vars) = env_vars.pop() {
let span = pipeline_span;
let block = hir::Block::new(
Signature::new("<block>"),
vec![Group::new(vec![out_pipe.clone()], span)],
@ -2149,16 +2164,14 @@ pub fn classify_block(
args: call,
});
Pipeline {
out_pipe = Pipeline {
list: vec![classified_with_env],
span,
}
} else {
out_pipe
};
};
}
if !pipeline.list.is_empty() {
out_group.push(pipeline);
if !out_pipe.list.is_empty() {
out_group.push(out_pipe);
}
}
if !out_group.pipelines.is_empty() {

View File

@ -6,6 +6,22 @@ use nu_test_support::playground::Playground;
use serial_test::serial;
#[test]
fn env_shorthand() {
let actual = nu!(cwd: ".", r#"
FOO=bar echo $nu.env.FOO
"#);
assert_eq!(actual.out, "bar");
}
#[test]
fn env_shorthand_multi() {
let actual = nu!(cwd: ".", r#"
FOO=bar BAR=baz $nu.env.FOO + $nu.env.BAR
"#);
assert_eq!(actual.out, "barbaz");
}
#[test]
fn passes_let_env_env_var_to_external_process() {
let actual = nu!(cwd: ".", r#"