forked from extern/nushell
09b3dab35d
(squashed version of #10557, clean commit history and review thread) Fixes #10571, also potentially: #10364, #10211, #9558, #9310, # Description Changes processing of arguments to filesystem commands that are source paths or globs. Applies to `cp, cp-old, mv, rm, du` but not `ls` (because it uses a different globbing interface) or `glob` (because it uses a different globbing library). The core of the change is to lookup the argument first as a file and only glob if it is not. That way, a path containing glob metacharacters can be referenced without glob quoting, though it will have to be single quoted to avoid nushell parsing. Before: A file path that looks like a glob is not matched by the glob specified as a (source) argument and takes some thinking about to access. You might say the glob pattern shadows a file with the same spelling. ``` > ls a* ╭───┬────────┬──────┬──────┬────────────────╮ │ # │ name │ type │ size │ modified │ ├───┼────────┼──────┼──────┼────────────────┤ │ 0 │ a[bc]d │ file │ 0 B │ 34 seconds ago │ │ 1 │ abd │ file │ 0 B │ now │ │ 2 │ acd │ file │ 0 B │ now │ ╰───┴────────┴──────┴──────┴────────────────╯ > cp --verbose 'a[bc]d' dest copied /home/bobhy/src/rust/work/r4/abd to /home/bobhy/src/rust/work/r4/dest/abd copied /home/bobhy/src/rust/work/r4/acd to /home/bobhy/src/rust/work/r4/dest/acd > ## Note -- a[bc]d *not* copied, and seemingly hard to access. > cp --verbose 'a\[bc\]d' dest Error: × No matches found ╭─[entry #33:1:1] 1 │ cp --verbose 'a\[bc\]d' dest · ─────┬──── · ╰── no matches found ╰──── > #.. but is accessible with enough glob quoting. > cp --verbose 'a[[]bc[]]d' dest copied /home/bobhy/src/rust/work/r4/a[bc]d to /home/bobhy/src/rust/work/r4/dest/a[bc]d ``` Before_2: if file has glob metachars but isn't a valid pattern, user gets a confusing error: ``` > touch 'a[b' > cp 'a[b' dest Error: × Pattern syntax error near position 30: invalid range pattern ╭─[entry #13:1:1] 1 │ cp 'a[b' dest · ──┬── · ╰── invalid pattern ╰──── ``` After: Args to cp, mv, etc. are tried first as literal files, and only as globs if not found to be files. ``` > cp --verbose 'a[bc]d' dest copied /home/bobhy/src/rust/work/r4/a[bc]d to /home/bobhy/src/rust/work/r4/dest/a[bc]d > cp --verbose '[a][bc]d' dest copied /home/bobhy/src/rust/work/r4/abd to /home/bobhy/src/rust/work/r4/dest/abd copied /home/bobhy/src/rust/work/r4/acd to /home/bobhy/src/rust/work/r4/dest/acd ``` After_2: file with glob metachars but invalid pattern just works. (though Windows does not allow file name to contain `*`.). ``` > cp --verbose 'a[b' dest copied /home/bobhy/src/rust/work/r4/a[b to /home/bobhy/src/rust/work/r4/dest/a[b ``` So, with this fix, a file shadows a glob pattern with the same spelling. If you have such a file and really want to use the glob pattern, you will have to glob quote some of the characters in the pattern. I think that's less confusing to the user: if ls shows a file with a weird name, s/he'll still be able to copy, rename or delete it. # User-Facing Changes Could break some existing scripts. If user happened to have a file with a globbish name but was using a glob pattern with the same spelling, the new version will process the file and not expand the glob. # Tests + Formatting <!-- Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass (on Windows make sure to [enable developer mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging)) - `cargo run -- -c "use std testing; testing run-tests --path crates/nu-std"` to run the tests for the standard library > **Note** > from `nushell` you can also use the `toolkit` as follows > ```bash > use toolkit.nu # or use an `env_change` hook to activate it automatically > toolkit check pr > ``` --> # After Submitting <!-- If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. --> --------- Co-authored-by: Darren Schroeder <343840+fdncred@users.noreply.github.com> |
||
---|---|---|
.. | ||
assignment | ||
conversions | ||
date | ||
hash_ | ||
math | ||
move_ | ||
network | ||
path | ||
platform | ||
query | ||
random | ||
skip | ||
str_ | ||
take | ||
url | ||
alias.rs | ||
all.rs | ||
any.rs | ||
append.rs | ||
break_.rs | ||
cal.rs | ||
cd.rs | ||
compact.rs | ||
config_env_default.rs | ||
config_nu_default.rs | ||
continue_.rs | ||
cp.rs | ||
def.rs | ||
default.rs | ||
detect_columns.rs | ||
do_.rs | ||
drop.rs | ||
each.rs | ||
echo.rs | ||
empty.rs | ||
error_make.rs | ||
every.rs | ||
exec.rs | ||
export_def.rs | ||
fill.rs | ||
find.rs | ||
first.rs | ||
flatten.rs | ||
for_.rs | ||
format.rs | ||
get.rs | ||
glob.rs | ||
group_by.rs | ||
headers.rs | ||
help.rs | ||
histogram.rs | ||
insert.rs | ||
inspect.rs | ||
into_datetime.rs | ||
into_filesize.rs | ||
into_int.rs | ||
join.rs | ||
last.rs | ||
length.rs | ||
let_.rs | ||
lines.rs | ||
loop_.rs | ||
ls.rs | ||
match_.rs | ||
merge.rs | ||
mkdir.rs | ||
mod.rs | ||
mut_.rs | ||
nu_check.rs | ||
open.rs | ||
par_each.rs | ||
parse.rs | ||
prepend.rs | ||
print.rs | ||
range.rs | ||
redirection.rs | ||
reduce.rs | ||
reject.rs | ||
rename.rs | ||
return_.rs | ||
reverse.rs | ||
rm.rs | ||
roll.rs | ||
rotate.rs | ||
run_external.rs | ||
save.rs | ||
select.rs | ||
semicolon.rs | ||
seq_char.rs | ||
seq.rs | ||
sort_by.rs | ||
sort.rs | ||
source_env.rs | ||
split_by.rs | ||
split_column.rs | ||
split_row.rs | ||
table.rs | ||
to_text.rs | ||
touch.rs | ||
transpose.rs | ||
try_.rs | ||
ucp.rs | ||
unfold.rs | ||
uniq_by.rs | ||
uniq.rs | ||
update.rs | ||
upsert.rs | ||
use_.rs | ||
where_.rs | ||
which.rs | ||
while_.rs | ||
with_env.rs | ||
wrap.rs | ||
zip.rs |