mirror of
https://github.com/nushell/nushell.git
synced 2025-04-21 11:48:28 +02:00
fix $env.FILE_PWD and $env.CURRENT_FILE inside overlay use (#15126)
# Description Fixes: #14540 The change is similar to #14101 User input can be a directory, in this case, we need to use the return value of find_in_dirs_env carefully, so in case, I renamed maybe_file_path to maybe_file_path_or_dir to emphasize it. # User-Facing Changes NaN # Tests + Formatting Added 2 test cases # After Submitting
This commit is contained in:
parent
087fe484f6
commit
122bcff356
@ -119,31 +119,40 @@ impl Command for OverlayUse {
|
|||||||
|
|
||||||
// Evaluate the export-env block (if any) and keep its environment
|
// Evaluate the export-env block (if any) and keep its environment
|
||||||
if let Some(block_id) = module.env_block {
|
if let Some(block_id) = module.env_block {
|
||||||
let maybe_path = find_in_dirs_env(
|
let maybe_file_path_or_dir = find_in_dirs_env(
|
||||||
&name_arg.item,
|
&name_arg.item,
|
||||||
engine_state,
|
engine_state,
|
||||||
caller_stack,
|
caller_stack,
|
||||||
get_dirs_var_from_call(caller_stack, call),
|
get_dirs_var_from_call(caller_stack, call),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let block = engine_state.get_block(block_id);
|
let block = engine_state.get_block(block_id);
|
||||||
let mut callee_stack = caller_stack
|
let mut callee_stack = caller_stack
|
||||||
.gather_captures(engine_state, &block.captures)
|
.gather_captures(engine_state, &block.captures)
|
||||||
.reset_pipes();
|
.reset_pipes();
|
||||||
|
|
||||||
if let Some(path) = &maybe_path {
|
if let Some(path) = &maybe_file_path_or_dir {
|
||||||
// Set the currently evaluated directory, if the argument is a valid path
|
// Set the currently evaluated directory, if the argument is a valid path
|
||||||
let mut parent = path.clone();
|
let parent = if path.is_dir() {
|
||||||
parent.pop();
|
path.clone()
|
||||||
|
} else {
|
||||||
|
let mut parent = path.clone();
|
||||||
|
parent.pop();
|
||||||
|
parent
|
||||||
|
};
|
||||||
let file_pwd = Value::string(parent.to_string_lossy(), call.head);
|
let file_pwd = Value::string(parent.to_string_lossy(), call.head);
|
||||||
|
|
||||||
callee_stack.add_env_var("FILE_PWD".to_string(), file_pwd);
|
callee_stack.add_env_var("FILE_PWD".to_string(), file_pwd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(file_path) = &maybe_path {
|
if let Some(path) = &maybe_file_path_or_dir {
|
||||||
let file_path = Value::string(file_path.to_string_lossy(), call.head);
|
let module_file_path = if path.is_dir() {
|
||||||
callee_stack.add_env_var("CURRENT_FILE".to_string(), file_path);
|
// the existence of `mod.nu` is verified in parsing time
|
||||||
|
// so it's safe to use it here.
|
||||||
|
Value::string(path.join("mod.nu").to_string_lossy(), call.head)
|
||||||
|
} else {
|
||||||
|
Value::string(path.to_string_lossy(), call.head)
|
||||||
|
};
|
||||||
|
callee_stack.add_env_var("CURRENT_FILE".to_string(), module_file_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
let eval_block = get_eval_block(engine_state);
|
let eval_block = get_eval_block(engine_state);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use nu_test_support::fs::Stub::FileWithContentToBeTrimmed;
|
use nu_test_support::fs::Stub::{FileWithContent, FileWithContentToBeTrimmed};
|
||||||
use nu_test_support::playground::Playground;
|
use nu_test_support::playground::Playground;
|
||||||
use nu_test_support::{nu, nu_repl_code};
|
use nu_test_support::{nu, nu_repl_code};
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
@ -1408,3 +1408,50 @@ fn overlay_help_no_error() {
|
|||||||
let actual = nu!("overlay use -h");
|
let actual = nu!("overlay use -h");
|
||||||
assert!(actual.err.is_empty());
|
assert!(actual.err.is_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_overlay_use_with_printing_file_pwd() {
|
||||||
|
Playground::setup("use_with_printing_file_pwd", |dirs, nu| {
|
||||||
|
let file = dirs.test().join("foo").join("mod.nu");
|
||||||
|
nu.mkdir("foo").with_files(&[FileWithContent(
|
||||||
|
file.as_os_str().to_str().unwrap(),
|
||||||
|
r#"
|
||||||
|
export-env {
|
||||||
|
print $env.FILE_PWD
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)]);
|
||||||
|
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: dirs.test(),
|
||||||
|
"overlay use foo"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(actual.out, dirs.test().join("foo").to_string_lossy());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_overlay_use_with_printing_current_file() {
|
||||||
|
Playground::setup("use_with_printing_current_file", |dirs, nu| {
|
||||||
|
let file = dirs.test().join("foo").join("mod.nu");
|
||||||
|
nu.mkdir("foo").with_files(&[FileWithContent(
|
||||||
|
file.as_os_str().to_str().unwrap(),
|
||||||
|
r#"
|
||||||
|
export-env {
|
||||||
|
print $env.CURRENT_FILE
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
)]);
|
||||||
|
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: dirs.test(),
|
||||||
|
"overlay use foo"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
actual.out,
|
||||||
|
dirs.test().join("foo").join("mod.nu").to_string_lossy()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user