mirror of
https://github.com/nushell/nushell.git
synced 2025-08-13 20:37:14 +02:00
Migrate to a new PWD API (#12603)
This is the first PR towards migrating to a new `$env.PWD` API that returns potentially un-canonicalized paths. Refer to PR #12515 for motivations. ## New API: `EngineState::cwd()` The goal of the new API is to cover both parse-time and runtime use case, and avoid unintentional misuse. It takes an `Option<Stack>` as argument, which if supplied, will search for `$env.PWD` on the stack in additional to the engine state. I think with this design, there's less confusion over parse-time and runtime environments. If you have access to a stack, just supply it; otherwise supply `None`. ## Deprecation of other PWD-related APIs Other APIs are re-implemented using `EngineState::cwd()` and properly documented. They're marked deprecated, but their behavior is unchanged. Unused APIs are deleted, and code that accesses `$env.PWD` directly without using an API is rewritten. Deprecated APIs: * `EngineState::current_work_dir()` * `StateWorkingSet::get_cwd()` * `env::current_dir()` * `env::current_dir_str()` * `env::current_dir_const()` * `env::current_dir_str_const()` Other changes: * `EngineState::get_cwd()` (deleted) * `StateWorkingSet::list_env()` (deleted) * `repl::do_run_cmd()` (rewritten with `env::current_dir_str()`) ## `cd` and `pwd` now use logical paths by default This pulls the changes from PR #12515. It's currently somewhat broken because using non-canonicalized paths exposed a bug in our path normalization logic (Issue #12602). Once that is fixed, this should work. ## Future plans This PR needs some tests. Which test helpers should I use, and where should I put those tests? I noticed that unquoted paths are expanded within `eval_filepath()` and `eval_directory()` before they even reach the `cd` command. This means every paths is expanded twice. Is this intended? Once this PR lands, the plan is to review all usages of the deprecated APIs and migrate them to `EngineState::cwd()`. In the meantime, these usages are annotated with `#[allow(deprecated)]` to avoid breaking CI. --------- Co-authored-by: Jakub Žádník <kubouch@gmail.com>
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
use super::PathSubcommandArguments;
|
||||
#[allow(deprecated)]
|
||||
use nu_engine::{command_prelude::*, current_dir, current_dir_const};
|
||||
use nu_path::expand_path_with;
|
||||
use nu_protocol::engine::StateWorkingSet;
|
||||
@ -53,6 +54,7 @@ If you need to distinguish dirs and files, please use `path type`."#
|
||||
input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let head = call.head;
|
||||
#[allow(deprecated)]
|
||||
let args = Arguments {
|
||||
pwd: current_dir(engine_state, stack)?,
|
||||
not_follow_symlink: call.has_flag(engine_state, stack, "no-symlink")?,
|
||||
@ -74,6 +76,7 @@ If you need to distinguish dirs and files, please use `path type`."#
|
||||
input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let head = call.head;
|
||||
#[allow(deprecated)]
|
||||
let args = Arguments {
|
||||
pwd: current_dir_const(working_set)?,
|
||||
not_follow_symlink: call.has_flag_const(working_set, "no-symlink")?,
|
||||
|
@ -1,4 +1,5 @@
|
||||
use super::PathSubcommandArguments;
|
||||
#[allow(deprecated)]
|
||||
use nu_engine::{
|
||||
command_prelude::*,
|
||||
env::{current_dir_str, current_dir_str_const},
|
||||
@ -57,6 +58,7 @@ impl Command for SubCommand {
|
||||
input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let head = call.head;
|
||||
#[allow(deprecated)]
|
||||
let args = Arguments {
|
||||
strict: call.has_flag(engine_state, stack, "strict")?,
|
||||
cwd: current_dir_str(engine_state, stack)?,
|
||||
@ -79,6 +81,7 @@ impl Command for SubCommand {
|
||||
input: PipelineData,
|
||||
) -> Result<PipelineData, ShellError> {
|
||||
let head = call.head;
|
||||
#[allow(deprecated)]
|
||||
let args = Arguments {
|
||||
strict: call.has_flag_const(working_set, "strict")?,
|
||||
cwd: current_dir_str_const(working_set)?,
|
||||
|
Reference in New Issue
Block a user