forked from extern/nushell
Do not pass non-string env vars to externals (#4748)
* Do not pass non-string env vars to externals Also misc cleanup * Add note to default config * Add a test * Ensure PATH/Path conversion list <-> string
This commit is contained in:
14
crates/nu-command/src/env/env_command.rs
vendored
14
crates/nu-command/src/env/env_command.rs
vendored
@ -1,7 +1,9 @@
|
||||
use nu_engine::env_to_string;
|
||||
use nu_protocol::ast::Call;
|
||||
use nu_protocol::engine::{Command, EngineState, Stack};
|
||||
use nu_protocol::{Category, Example, IntoPipelineData, PipelineData, Signature, Value};
|
||||
use nu_protocol::{
|
||||
Category, Example, IntoPipelineData, PipelineData, ShellError, Signature, Value,
|
||||
};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Env;
|
||||
@ -27,7 +29,6 @@ impl Command for Env {
|
||||
_input: PipelineData,
|
||||
) -> Result<nu_protocol::PipelineData, nu_protocol::ShellError> {
|
||||
let span = call.head;
|
||||
let config = stack.get_config().unwrap_or_default();
|
||||
|
||||
let mut env_vars: Vec<(String, Value)> =
|
||||
stack.get_env_vars(engine_state).into_iter().collect();
|
||||
@ -39,7 +40,12 @@ impl Command for Env {
|
||||
let mut cols = vec![];
|
||||
let mut vals = vec![];
|
||||
|
||||
let raw = env_to_string(&name, val.clone(), engine_state, stack, &config)?;
|
||||
let raw_val = match env_to_string(&name, &val, engine_state, stack) {
|
||||
Ok(raw) => Value::string(raw, span),
|
||||
Err(ShellError::EnvVarNotAString(..)) => Value::nothing(span),
|
||||
Err(e) => return Err(e),
|
||||
};
|
||||
|
||||
let val_type = val.get_type();
|
||||
|
||||
cols.push("name".into());
|
||||
@ -52,7 +58,7 @@ impl Command for Env {
|
||||
vals.push(val);
|
||||
|
||||
cols.push("raw".into());
|
||||
vals.push(Value::string(raw, span));
|
||||
vals.push(raw_val);
|
||||
|
||||
values.push(Value::Record { cols, vals, span });
|
||||
}
|
||||
|
@ -76,8 +76,7 @@ fn exec(
|
||||
let args: Vec<Spanned<String>> = call.rest(engine_state, stack, 1)?;
|
||||
|
||||
let cwd = current_dir(engine_state, stack)?;
|
||||
let config = stack.get_config()?;
|
||||
let env_vars = env_to_strings(engine_state, stack, &config)?;
|
||||
let env_vars = env_to_strings(engine_state, stack)?;
|
||||
let current_dir = current_dir(engine_state, stack)?;
|
||||
|
||||
let external_command = ExternalCommand {
|
||||
|
@ -55,8 +55,7 @@ impl Command for External {
|
||||
let redirect_stderr = call.has_flag("redirect-stderr");
|
||||
|
||||
// Translate environment variables from Values to Strings
|
||||
let config = stack.get_config().unwrap_or_default();
|
||||
let env_vars_str = env_to_strings(engine_state, stack, &config)?;
|
||||
let env_vars_str = env_to_strings(engine_state, stack)?;
|
||||
|
||||
fn value_as_spanned(value: Value) -> Result<Spanned<String>, ShellError> {
|
||||
let span = value.span()?;
|
||||
|
@ -66,7 +66,7 @@ prints out the list properly."#
|
||||
let separator_param: Option<String> = call.get_flag(engine_state, stack, "separator")?;
|
||||
let config = stack.get_config().unwrap_or_default();
|
||||
let env_str = match stack.get_env_var(engine_state, "LS_COLORS") {
|
||||
Some(v) => Some(env_to_string("LS_COLORS", v, engine_state, stack, &config)?),
|
||||
Some(v) => Some(env_to_string("LS_COLORS", &v, engine_state, stack)?),
|
||||
None => None,
|
||||
};
|
||||
let use_grid_icons = config.use_grid_icons;
|
||||
|
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user