Compare commits

...

6 Commits

Author SHA1 Message Date
f3cf693ec7 Disallow more characters in arguments for internal cmd commands (#13009)
# Description
Makes `run-external` error if arguments to `cmd.exe` internal commands
contain newlines or a percent sign. This is because the percent sign can
expand environment variables, potentially? allowing command injection.
Newlines I think will truncate the rest of the arguments and should
probably be disallowed to be safe.

# After Submitting
- If the user calls `cmd.exe` directly, then this bypasses our
handling/checking for internal `cmd` commands. Instead, we use the
handling from the Rust std lib which, in this case, does not do special
handling and is potentially unsafe. Then again, it could be the user's
specific intention to run `cmd` with whatever trusted input. The problem
is that since we use the std lib handling, it assumes the exe uses the C
runtime escaping rules and will perform some unwanted escaping. E.g., it
will add backslashes to the quotes in `cmd echo /c '""'`.
- If `cmd` is called indirectly via a `.bat` or `.cmd` file, then we use
the Rust std lib which has separate handling for bat files that should
be safe, but will reject some inputs.
- ~~I'm not sure how we handle `PATHEXT`, that can also cause a file
without an extension to be run as a bat file. If so, I don't know where
the handling, if any, is done for that.~~ It looks like we use the
`which` crate to do the lookup using `PATHEXT`. Then, we pass the exe
path from that to the Rust std lib `Command`, which should be safe
(except for the first `cmd.exe` note).

So, in the future we need to unify and/or fix these different
implementations, including our own special handling for internal `cmd`
commands that this PR tries to fix.
2024-05-30 19:24:48 +00:00
31f3d2f664 Restore path type behavior (#13006)
# Description
Restores `path type` to return an empty string on error like it did pre
0.94.0.
2024-05-30 13:42:22 +00:00
40772fea15 fix do closure with both required, options, and rest args (#13002)
# Description
Fixes: #12985

`val_iter` has already handle required positional and optional
positional arguments, it not skip them again while handling rest
arguments.

# User-Facing Changes
Makes `do {|a, ...b| echo $a ...$b} 1 2 3 4` output the following again:
```nushell
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
│ 2 │ 3 │
│ 3 │ 4 │
╰───┴───╯
```

# Tests + Formatting
Added some test cases
2024-05-30 08:29:46 -05:00
0e1553026e Restore tilde expansion on external command names (#13001)
# Description

Fix a regression introduced by #12921, where tilde expansion was no
longer done on the external command name, breaking things like

```nushell
> ~/.cargo/bin/exa
```

This properly handles quoted strings, so they don't expand:

```nushell
> ^"~/.cargo/bin/exa"
Error: nu:🐚:external_command

  × External command failed
   ╭─[entry #1:1:2]
 1 │ ^"~/.cargo/bin/exa"
   ·  ─────────┬────────
   ·           ╰── Command `~/.cargo/bin/exa` not found
   ╰────
  help: `~/.cargo/bin/exa` is neither a Nushell built-in or a known external command

```

This required a change to the parser, so the command name is also parsed
in the same way the arguments are - i.e. the quotes on the outside
remain in the expression. Hopefully that doesn't break anything else. 🤞

Fixes #13000. Should include in patch release 0.94.1

cc @YizhePKU

# User-Facing Changes
- Tilde expansion now works again for external commands
- The `command` of `run-external` will now have its quotes removed like
the other arguments if it is a literal string
- The parser is changed to include quotes in the command expression of
`ExternalCall` if they were present

# Tests + Formatting
I would like to add a regression test for this, but it's complicated
because we need a well-known binary within the home directory, which
just isn't a thing. We could drop one there, but that's kind of a bad
behavior for a test to do. I also considered changing the home directory
for the test, but that's so platform-specific - potentially could get it
working on specific platforms though. Changing `HOME` env on Linux
definitely works as far as tilde expansion works.

- 🟢 `toolkit fmt`
- 🟢 `toolkit clippy`
- 🟢 `toolkit test`
- 🟢 `toolkit test stdlib`
2024-05-29 18:48:29 -07:00
6a2996251c fixes a bug in OSC9;9 execution (#12994)
# Description

This fixes a bug in the `OSC 9;9` functionality where the path wasn't
being constructed properly and therefore wasn't getting set right for
things like "Duplicate Tab" in Windows Terminal. Thanks to @Araxeus for
finding it.

Related to https://github.com/nushell/nushell/issues/10166

# User-Facing Changes
<!-- List of all changes that impact the user experience here. This
helps us keep track of breaking changes. -->

# 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 toolkit.nu; toolkit test stdlib"` 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.
-->
2024-05-29 18:06:47 -05:00
f3991f2080 Bump version to 0.94.1 (#12988)
Merge this PR before merging any other PRs.
2024-05-28 22:41:23 +00:00
48 changed files with 289 additions and 252 deletions

72
Cargo.lock generated
View File

@ -2770,7 +2770,7 @@ dependencies = [
[[package]]
name = "nu"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"assert_cmd",
"crossterm",
@ -2823,7 +2823,7 @@ dependencies = [
[[package]]
name = "nu-cli"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"chrono",
"crossterm",
@ -2858,7 +2858,7 @@ dependencies = [
[[package]]
name = "nu-cmd-base"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"indexmap",
"miette",
@ -2870,7 +2870,7 @@ dependencies = [
[[package]]
name = "nu-cmd-extra"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"fancy-regex",
"heck 0.5.0",
@ -2895,7 +2895,7 @@ dependencies = [
[[package]]
name = "nu-cmd-lang"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"itertools 0.12.1",
"nu-engine",
@ -2907,7 +2907,7 @@ dependencies = [
[[package]]
name = "nu-cmd-plugin"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"itertools 0.12.1",
"nu-engine",
@ -2918,7 +2918,7 @@ dependencies = [
[[package]]
name = "nu-color-config"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"nu-ansi-term",
"nu-engine",
@ -2930,7 +2930,7 @@ dependencies = [
[[package]]
name = "nu-command"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"alphanumeric-sort",
"base64 0.22.1",
@ -3039,7 +3039,7 @@ dependencies = [
[[package]]
name = "nu-engine"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"nu-glob",
"nu-path",
@ -3049,7 +3049,7 @@ dependencies = [
[[package]]
name = "nu-explore"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"ansi-str",
"anyhow",
@ -3074,14 +3074,14 @@ dependencies = [
[[package]]
name = "nu-glob"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"doc-comment",
]
[[package]]
name = "nu-json"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"linked-hash-map",
"num-traits",
@ -3091,7 +3091,7 @@ dependencies = [
[[package]]
name = "nu-lsp"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"assert-json-diff",
"crossbeam-channel",
@ -3112,7 +3112,7 @@ dependencies = [
[[package]]
name = "nu-parser"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"bytesize",
"chrono",
@ -3128,7 +3128,7 @@ dependencies = [
[[package]]
name = "nu-path"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"dirs-next",
"omnipath",
@ -3137,7 +3137,7 @@ dependencies = [
[[package]]
name = "nu-plugin"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"log",
"nix",
@ -3152,7 +3152,7 @@ dependencies = [
[[package]]
name = "nu-plugin-core"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"interprocess",
"log",
@ -3166,7 +3166,7 @@ dependencies = [
[[package]]
name = "nu-plugin-engine"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"log",
"nu-engine",
@ -3181,7 +3181,7 @@ dependencies = [
[[package]]
name = "nu-plugin-protocol"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"bincode",
"nu-protocol",
@ -3193,7 +3193,7 @@ dependencies = [
[[package]]
name = "nu-plugin-test-support"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"nu-ansi-term",
"nu-cmd-lang",
@ -3211,7 +3211,7 @@ dependencies = [
[[package]]
name = "nu-pretty-hex"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"heapless",
"nu-ansi-term",
@ -3220,7 +3220,7 @@ dependencies = [
[[package]]
name = "nu-protocol"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"brotli 5.0.0",
"byte-unit",
@ -3251,7 +3251,7 @@ dependencies = [
[[package]]
name = "nu-std"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"log",
"miette",
@ -3262,7 +3262,7 @@ dependencies = [
[[package]]
name = "nu-system"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"chrono",
"itertools 0.12.1",
@ -3280,7 +3280,7 @@ dependencies = [
[[package]]
name = "nu-table"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"fancy-regex",
"nu-ansi-term",
@ -3294,7 +3294,7 @@ dependencies = [
[[package]]
name = "nu-term-grid"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"nu-utils",
"unicode-width",
@ -3302,7 +3302,7 @@ dependencies = [
[[package]]
name = "nu-test-support"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"nu-glob",
"nu-path",
@ -3314,7 +3314,7 @@ dependencies = [
[[package]]
name = "nu-utils"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"crossterm_winapi",
"log",
@ -3340,7 +3340,7 @@ dependencies = [
[[package]]
name = "nu_plugin_example"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"nu-cmd-lang",
"nu-plugin",
@ -3350,7 +3350,7 @@ dependencies = [
[[package]]
name = "nu_plugin_formats"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"eml-parser",
"ical",
@ -3363,7 +3363,7 @@ dependencies = [
[[package]]
name = "nu_plugin_gstat"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"git2",
"nu-plugin",
@ -3372,7 +3372,7 @@ dependencies = [
[[package]]
name = "nu_plugin_inc"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"nu-plugin",
"nu-protocol",
@ -3381,7 +3381,7 @@ dependencies = [
[[package]]
name = "nu_plugin_polars"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"chrono",
"chrono-tz 0.9.0",
@ -3412,7 +3412,7 @@ dependencies = [
[[package]]
name = "nu_plugin_query"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"gjson",
"nu-plugin",
@ -3424,7 +3424,7 @@ dependencies = [
[[package]]
name = "nu_plugin_stress_internals"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"interprocess",
"serde",
@ -3550,7 +3550,7 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
[[package]]
name = "nuon"
version = "0.94.0"
version = "0.94.1"
dependencies = [
"chrono",
"fancy-regex",

View File

@ -11,7 +11,7 @@ license = "MIT"
name = "nu"
repository = "https://github.com/nushell/nushell"
rust-version = "1.77.2"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -174,22 +174,22 @@ windows = "0.54"
winreg = "0.52"
[dependencies]
nu-cli = { path = "./crates/nu-cli", version = "0.94.0" }
nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.94.0" }
nu-cmd-lang = { path = "./crates/nu-cmd-lang", version = "0.94.0" }
nu-cmd-plugin = { path = "./crates/nu-cmd-plugin", version = "0.94.0", optional = true }
nu-cmd-extra = { path = "./crates/nu-cmd-extra", version = "0.94.0" }
nu-command = { path = "./crates/nu-command", version = "0.94.0" }
nu-engine = { path = "./crates/nu-engine", version = "0.94.0" }
nu-explore = { path = "./crates/nu-explore", version = "0.94.0" }
nu-lsp = { path = "./crates/nu-lsp/", version = "0.94.0" }
nu-parser = { path = "./crates/nu-parser", version = "0.94.0" }
nu-path = { path = "./crates/nu-path", version = "0.94.0" }
nu-plugin-engine = { path = "./crates/nu-plugin-engine", optional = true, version = "0.94.0" }
nu-protocol = { path = "./crates/nu-protocol", version = "0.94.0" }
nu-std = { path = "./crates/nu-std", version = "0.94.0" }
nu-system = { path = "./crates/nu-system", version = "0.94.0" }
nu-utils = { path = "./crates/nu-utils", version = "0.94.0" }
nu-cli = { path = "./crates/nu-cli", version = "0.94.1" }
nu-cmd-base = { path = "./crates/nu-cmd-base", version = "0.94.1" }
nu-cmd-lang = { path = "./crates/nu-cmd-lang", version = "0.94.1" }
nu-cmd-plugin = { path = "./crates/nu-cmd-plugin", version = "0.94.1", optional = true }
nu-cmd-extra = { path = "./crates/nu-cmd-extra", version = "0.94.1" }
nu-command = { path = "./crates/nu-command", version = "0.94.1" }
nu-engine = { path = "./crates/nu-engine", version = "0.94.1" }
nu-explore = { path = "./crates/nu-explore", version = "0.94.1" }
nu-lsp = { path = "./crates/nu-lsp/", version = "0.94.1" }
nu-parser = { path = "./crates/nu-parser", version = "0.94.1" }
nu-path = { path = "./crates/nu-path", version = "0.94.1" }
nu-plugin-engine = { path = "./crates/nu-plugin-engine", optional = true, version = "0.94.1" }
nu-protocol = { path = "./crates/nu-protocol", version = "0.94.1" }
nu-std = { path = "./crates/nu-std", version = "0.94.1" }
nu-system = { path = "./crates/nu-system", version = "0.94.1" }
nu-utils = { path = "./crates/nu-utils", version = "0.94.1" }
reedline = { workspace = true, features = ["bashisms", "sqlite"] }
@ -218,9 +218,9 @@ nix = { workspace = true, default-features = false, features = [
] }
[dev-dependencies]
nu-test-support = { path = "./crates/nu-test-support", version = "0.94.0" }
nu-plugin-protocol = { path = "./crates/nu-plugin-protocol", version = "0.94.0" }
nu-plugin-core = { path = "./crates/nu-plugin-core", version = "0.94.0" }
nu-test-support = { path = "./crates/nu-test-support", version = "0.94.1" }
nu-plugin-protocol = { path = "./crates/nu-plugin-protocol", version = "0.94.1" }
nu-plugin-core = { path = "./crates/nu-plugin-core", version = "0.94.1" }
assert_cmd = "2.0"
dirs-next = { workspace = true }
tango-bench = "0.5"

View File

@ -5,27 +5,27 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-cli"
edition = "2021"
license = "MIT"
name = "nu-cli"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dev-dependencies]
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.0" }
nu-command = { path = "../nu-command", version = "0.94.0" }
nu-test-support = { path = "../nu-test-support", version = "0.94.0" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.1" }
nu-command = { path = "../nu-command", version = "0.94.1" }
nu-test-support = { path = "../nu-test-support", version = "0.94.1" }
rstest = { workspace = true, default-features = false }
tempfile = { workspace = true }
[dependencies]
nu-cmd-base = { path = "../nu-cmd-base", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.94.0", optional = true }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-color-config = { path = "../nu-color-config", version = "0.94.0" }
nu-cmd-base = { path = "../nu-cmd-base", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.94.1", optional = true }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
nu-color-config = { path = "../nu-color-config", version = "0.94.1" }
nu-ansi-term = { workspace = true }
reedline = { workspace = true, features = ["bashisms", "sqlite"] }

View File

@ -1110,9 +1110,9 @@ fn run_shell_integration_osc9_9(engine_state: &EngineState, stack: &mut Stack, u
let start_time = Instant::now();
// Otherwise, communicate the path as OSC 9;9 from ConEmu (often used for spawning new tabs in the same dir)
// This is helpful in Windows Terminal with Duplicate Tab
run_ansi_sequence(&format!(
"\x1b]9;9;{}{}\x1b\\",
if path.starts_with('/') { "" } else { "/" },
"\x1b]9;9;{}\x1b\\",
percent_encoding::utf8_percent_encode(&path, percent_encoding::CONTROLS)
));

View File

@ -5,15 +5,15 @@ edition = "2021"
license = "MIT"
name = "nu-cmd-base"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-cmd-base"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
indexmap = { workspace = true }
miette = { workspace = true }

View File

@ -5,7 +5,7 @@ edition = "2021"
license = "MIT"
name = "nu-cmd-extra"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-cmd-extra"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -13,13 +13,13 @@ version = "0.94.0"
bench = false
[dependencies]
nu-cmd-base = { path = "../nu-cmd-base", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-json = { version = "0.94.0", path = "../nu-json" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-pretty-hex = { version = "0.94.0", path = "../nu-pretty-hex" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-cmd-base = { path = "../nu-cmd-base", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-json = { version = "0.94.1", path = "../nu-json" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-pretty-hex = { version = "0.94.1", path = "../nu-pretty-hex" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
# Potential dependencies for extras
heck = { workspace = true }
@ -37,6 +37,6 @@ extra = ["default"]
default = []
[dev-dependencies]
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.0" }
nu-command = { path = "../nu-command", version = "0.94.0" }
nu-test-support = { path = "../nu-test-support", version = "0.94.0" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.1" }
nu-command = { path = "../nu-command", version = "0.94.1" }
nu-test-support = { path = "../nu-test-support", version = "0.94.1" }

View File

@ -6,16 +6,16 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-cmd-lang"
edition = "2021"
license = "MIT"
name = "nu-cmd-lang"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
itertools = { workspace = true }
shadow-rs = { version = "0.28", default-features = false }

View File

@ -298,9 +298,7 @@ fn bind_args_to(
if let Some(rest_positional) = &signature.rest_positional {
let mut rest_items = vec![];
for result in
val_iter.skip(signature.required_positional.len() + signature.optional_positional.len())
{
for result in val_iter {
rest_items.push(result);
}

View File

@ -5,15 +5,15 @@ edition = "2021"
license = "MIT"
name = "nu-cmd-plugin"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-cmd-plugin"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0", features = ["plugin"] }
nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1", features = ["plugin"] }
nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.94.1" }
itertools = { workspace = true }

View File

@ -5,18 +5,18 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-color-confi
edition = "2021"
license = "MIT"
name = "nu-color-config"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-json = { path = "../nu-json", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-json = { path = "../nu-json", version = "0.94.1" }
nu-ansi-term = { workspace = true }
serde = { workspace = true, features = ["derive"] }
[dev-dependencies]
nu-test-support = { path = "../nu-test-support", version = "0.94.0" }
nu-test-support = { path = "../nu-test-support", version = "0.94.1" }

View File

@ -5,7 +5,7 @@ edition = "2021"
license = "MIT"
name = "nu-command"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-command"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -13,21 +13,21 @@ version = "0.94.0"
bench = false
[dependencies]
nu-cmd-base = { path = "../nu-cmd-base", version = "0.94.0" }
nu-color-config = { path = "../nu-color-config", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-glob = { path = "../nu-glob", version = "0.94.0" }
nu-json = { path = "../nu-json", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-pretty-hex = { path = "../nu-pretty-hex", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-system = { path = "../nu-system", version = "0.94.0" }
nu-table = { path = "../nu-table", version = "0.94.0" }
nu-term-grid = { path = "../nu-term-grid", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-cmd-base = { path = "../nu-cmd-base", version = "0.94.1" }
nu-color-config = { path = "../nu-color-config", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-glob = { path = "../nu-glob", version = "0.94.1" }
nu-json = { path = "../nu-json", version = "0.94.1" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-pretty-hex = { path = "../nu-pretty-hex", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-system = { path = "../nu-system", version = "0.94.1" }
nu-table = { path = "../nu-table", version = "0.94.1" }
nu-term-grid = { path = "../nu-term-grid", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
nu-ansi-term = { workspace = true }
nuon = { path = "../nuon", version = "0.94.0" }
nuon = { path = "../nuon", version = "0.94.1" }
alphanumeric-sort = { workspace = true }
base64 = { workspace = true }
@ -137,8 +137,8 @@ trash-support = ["trash"]
which-support = []
[dev-dependencies]
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.0" }
nu-test-support = { path = "../nu-test-support", version = "0.94.0" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.1" }
nu-test-support = { path = "../nu-test-support", version = "0.94.1" }
dirs-next = { workspace = true }
mockito = { workspace = true, default-features = false }

View File

@ -104,10 +104,9 @@ If nothing is found, an empty string will be returned."#
fn path_type(path: &Path, span: Span, args: &Arguments) -> Value {
let path = nu_path::expand_path_with(path, &args.pwd, true);
match std::fs::symlink_metadata(path) {
Ok(metadata) => Value::string(get_file_type(&metadata), span),
Err(err) => Value::error(err.into(), span),
}
let meta = path.symlink_metadata();
let ty = meta.as_ref().map(get_file_type).unwrap_or("");
Value::string(ty, span)
}
fn get_file_type(md: &std::fs::Metadata) -> &str {

View File

@ -46,15 +46,36 @@ impl Command for External {
) -> Result<PipelineData, ShellError> {
let cwd = engine_state.cwd(Some(stack))?;
// Evaluate the command name in the same way the arguments are evaluated. Since this isn't
// a spread, it should return a one-element vec.
let name_expr = call
.positional_nth(0)
.ok_or_else(|| ShellError::MissingParameter {
param_name: "command".into(),
span: call.head,
})?;
let name = eval_argument(engine_state, stack, name_expr, false)?
.pop()
.expect("eval_argument returned zero-element vec")
.into_spanned(name_expr.span);
// Find the absolute path to the executable. On Windows, set the
// executable to "cmd.exe" if it's is a CMD internal command. If the
// command is not found, display a helpful error message.
let name: Spanned<String> = call.req(engine_state, stack, 0)?;
let executable = if cfg!(windows) && is_cmd_internal_command(&name.item) {
PathBuf::from("cmd.exe")
} else {
// Expand tilde on the name if it's a bare string (#13000)
let expanded_name = if is_bare_string(name_expr) {
expand_tilde(&name.item)
} else {
name.item.clone()
};
// Determine the PATH to be used and then use `which` to find it - though this has no
// effect if it's an absolute path already
let paths = nu_engine::env::path_str(engine_state, stack, call.head)?;
let Some(executable) = which(&name.item, &paths, &cwd) else {
let Some(executable) = which(&expanded_name, &paths, &cwd) else {
return Err(command_not_found(
&name.item,
call.head,
@ -544,12 +565,20 @@ fn has_cmd_special_character(s: &str) -> bool {
SPECIAL_CHARS.iter().any(|c| s.contains(*c))
}
/// Escape an argument for CMD internal commands. The result can be safely
/// passed to `raw_arg()`.
/// Escape an argument for CMD internal commands. The result can be safely passed to `raw_arg()`.
#[cfg(windows)]
fn escape_cmd_argument(arg: &Spanned<String>) -> Result<Cow<'_, str>, ShellError> {
let Spanned { item: arg, span } = arg;
if arg.contains('"') {
if arg.contains(['\r', '\n', '%']) {
// \r and \n trunacte the rest of the arguments and % can expand environment variables
Err(ShellError::ExternalCommand {
label:
"Arguments to CMD internal commands cannot contain new lines or percent signs '%'"
.into(),
help: "some characters currently cannot be securely escaped".into(),
span: *span,
})
} else if arg.contains('"') {
// If `arg` is already quoted by double quotes, confirm there's no
// embedded double quotes, then leave it as is.
if arg.chars().filter(|c| *c == '"').count() == 2
@ -561,7 +590,7 @@ fn escape_cmd_argument(arg: &Spanned<String>) -> Result<Cow<'_, str>, ShellError
Err(ShellError::ExternalCommand {
label: "Arguments to CMD internal commands cannot contain embedded double quotes"
.into(),
help: "CMD doesn't support escaping double quotes inside double quotes".into(),
help: "this case currently cannot be securely handled".into(),
span: *span,
})
}
@ -569,6 +598,7 @@ fn escape_cmd_argument(arg: &Spanned<String>) -> Result<Cow<'_, str>, ShellError
// If `arg` contains space or special characters, quote the entire argument by double quotes.
Ok(Cow::Owned(format!("\"{arg}\"")))
} else {
// FIXME?: what if `arg.is_empty()`?
Ok(Cow::Borrowed(arg))
}
}

View File

@ -5,16 +5,16 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-engine"
edition = "2021"
license = "MIT"
name = "nu-engine"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-protocol = { path = "../nu-protocol", features = ["plugin"], version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-glob = { path = "../nu-glob", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", features = ["plugin"], version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-glob = { path = "../nu-glob", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
[features]
plugin = []

View File

@ -5,21 +5,21 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-explore"
edition = "2021"
license = "MIT"
name = "nu-explore"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-color-config = { path = "../nu-color-config", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-table = { path = "../nu-table", version = "0.94.0" }
nu-json = { path = "../nu-json", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-color-config = { path = "../nu-color-config", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-table = { path = "../nu-table", version = "0.94.1" }
nu-json = { path = "../nu-json", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
nu-ansi-term = { workspace = true }
nu-pretty-hex = { path = "../nu-pretty-hex", version = "0.94.0" }
nu-pretty-hex = { path = "../nu-pretty-hex", version = "0.94.1" }
anyhow = { workspace = true }
log = { workspace = true }

View File

@ -1,6 +1,6 @@
[package]
name = "nu-glob"
version = "0.94.0"
version = "0.94.1"
authors = ["The Nushell Project Developers", "The Rust Project Developers"]
license = "MIT/Apache-2.0"
description = """

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-json"
edition = "2021"
license = "MIT"
name = "nu-json"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -23,5 +23,5 @@ serde = { workspace = true }
serde_json = { workspace = true }
[dev-dependencies]
# nu-path = { path="../nu-path", version = "0.94.0" }
# nu-path = { path="../nu-path", version = "0.94.1" }
# serde_json = "1.0"

View File

@ -3,14 +3,14 @@ authors = ["The Nushell Project Developers"]
description = "Nushell's integrated LSP server"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-lsp"
name = "nu-lsp"
version = "0.94.0"
version = "0.94.1"
edition = "2021"
license = "MIT"
[dependencies]
nu-cli = { path = "../nu-cli", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-cli = { path = "../nu-cli", version = "0.94.1" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
reedline = { workspace = true }
@ -23,8 +23,8 @@ serde = { workspace = true }
serde_json = { workspace = true }
[dev-dependencies]
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.0" }
nu-command = { path = "../nu-command", version = "0.94.0" }
nu-test-support = { path = "../nu-test-support", version = "0.94.0" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.1" }
nu-command = { path = "../nu-command", version = "0.94.1" }
nu-test-support = { path = "../nu-test-support", version = "0.94.1" }
assert-json-diff = "2.0"

View File

@ -5,17 +5,17 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-parser"
edition = "2021"
license = "MIT"
name = "nu-parser"
version = "0.94.0"
version = "0.94.1"
exclude = ["/fuzz"]
[lib]
bench = false
[dependencies]
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-plugin-engine = { path = "../nu-plugin-engine", optional = true, version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-plugin-engine = { path = "../nu-plugin-engine", optional = true, version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
bytesize = { workspace = true }
chrono = { default-features = false, features = ['std'], workspace = true }

View File

@ -278,13 +278,14 @@ pub fn parse_external_call(working_set: &mut StateWorkingSet, spans: &[Span]) ->
let arg = parse_expression(working_set, &[head_span]);
Box::new(arg)
} else {
let (contents, err) = unescape_unquote_string(&head_contents, head_span);
// Eval stage will unquote the string, so we don't bother with that here
let (contents, err) = unescape_string(&head_contents, head_span);
if let Some(err) = err {
working_set.error(err)
}
Box::new(Expression {
expr: Expr::String(contents),
expr: Expr::String(String::from_utf8_lossy(&contents).into_owned()),
span: head_span,
ty: Type::String,
custom_completion: None,

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-path"
edition = "2021"
license = "MIT"
name = "nu-path"
version = "0.94.0"
version = "0.94.1"
exclude = ["/fuzz"]
[lib]

View File

@ -5,14 +5,14 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-plugin-core
edition = "2021"
license = "MIT"
name = "nu-plugin-core"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.0", default-features = false }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.1", default-features = false }
rmp-serde = { workspace = true }
serde = { workspace = true }

View File

@ -5,17 +5,17 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-plugin-engi
edition = "2021"
license = "MIT"
name = "nu-plugin-engine"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-system = { path = "../nu-system", version = "0.94.0" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.0" }
nu-plugin-core = { path = "../nu-plugin-core", version = "0.94.0", default-features = false }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-system = { path = "../nu-system", version = "0.94.1" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.1" }
nu-plugin-core = { path = "../nu-plugin-core", version = "0.94.1", default-features = false }
serde = { workspace = true }
log = { workspace = true }

View File

@ -5,14 +5,14 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-plugin-prot
edition = "2021"
license = "MIT"
name = "nu-plugin-protocol"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.94.0", features = ["plugin"] }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1", features = ["plugin"] }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
bincode = "1.3"
serde = { workspace = true, features = ["derive"] }

View File

@ -1,6 +1,6 @@
[package]
name = "nu-plugin-test-support"
version = "0.94.0"
version = "0.94.1"
edition = "2021"
license = "MIT"
description = "Testing support for Nushell plugins"
@ -12,14 +12,14 @@ bench = false
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nu-engine = { path = "../nu-engine", version = "0.94.0", features = ["plugin"] }
nu-protocol = { path = "../nu-protocol", version = "0.94.0", features = ["plugin"] }
nu-parser = { path = "../nu-parser", version = "0.94.0", features = ["plugin"] }
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-plugin-core = { path = "../nu-plugin-core", version = "0.94.0" }
nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.94.0" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.0" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.1", features = ["plugin"] }
nu-protocol = { path = "../nu-protocol", version = "0.94.1", features = ["plugin"] }
nu-parser = { path = "../nu-parser", version = "0.94.1", features = ["plugin"] }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-plugin-core = { path = "../nu-plugin-core", version = "0.94.1" }
nu-plugin-engine = { path = "../nu-plugin-engine", version = "0.94.1" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.1" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.1" }
nu-ansi-term = { workspace = true }
similar = "2.5"

View File

@ -5,16 +5,16 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-plugin"
edition = "2021"
license = "MIT"
name = "nu-plugin"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.0" }
nu-plugin-core = { path = "../nu-plugin-core", version = "0.94.0", default-features = false }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-plugin-protocol = { path = "../nu-plugin-protocol", version = "0.94.1" }
nu-plugin-core = { path = "../nu-plugin-core", version = "0.94.1", default-features = false }
log = { workspace = true }
thiserror = "1.0"

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-pretty-hex"
edition = "2021"
license = "MIT"
name = "nu-pretty-hex"
version = "0.94.0"
version = "0.94.1"
[lib]
doctest = false

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-protocol"
edition = "2021"
license = "MIT"
name = "nu-protocol"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -13,9 +13,9 @@ version = "0.94.0"
bench = false
[dependencies]
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-system = { path = "../nu-system", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-system = { path = "../nu-system", version = "0.94.1" }
brotli = { workspace = true, optional = true }
byte-unit = { version = "5.1", features = [ "serde" ] }
@ -45,7 +45,7 @@ plugin = [
serde_json = { workspace = true }
strum = "0.26"
strum_macros = "0.26"
nu-test-support = { path = "../nu-test-support", version = "0.94.0" }
nu-test-support = { path = "../nu-test-support", version = "0.94.1" }
pretty_assertions = { workspace = true }
rstest = { workspace = true }
tempfile = { workspace = true }

View File

@ -5,12 +5,12 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-std"
edition = "2021"
license = "MIT"
name = "nu-std"
version = "0.94.0"
version = "0.94.1"
[dependencies]
nu-parser = { version = "0.94.0", path = "../nu-parser" }
nu-protocol = { version = "0.94.0", path = "../nu-protocol" }
nu-engine = { version = "0.94.0", path = "../nu-engine" }
nu-parser = { version = "0.94.1", path = "../nu-parser" }
nu-protocol = { version = "0.94.1", path = "../nu-protocol" }
nu-engine = { version = "0.94.1", path = "../nu-engine" }
miette = { workspace = true, features = ["fancy-no-backtrace"] }
log = "0.4"

View File

@ -3,7 +3,7 @@ authors = ["The Nushell Project Developers", "procs creators"]
description = "Nushell system querying"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-system"
name = "nu-system"
version = "0.94.0"
version = "0.94.1"
edition = "2021"
license = "MIT"

View File

@ -5,20 +5,20 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-table"
edition = "2021"
license = "MIT"
name = "nu-table"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-color-config = { path = "../nu-color-config", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-color-config = { path = "../nu-color-config", version = "0.94.1" }
nu-ansi-term = { workspace = true }
once_cell = { workspace = true }
fancy-regex = { workspace = true }
tabled = { workspace = true, features = ["color"], default-features = false }
[dev-dependencies]
# nu-test-support = { path="../nu-test-support", version = "0.94.0" }
# nu-test-support = { path="../nu-test-support", version = "0.94.1" }

View File

@ -5,12 +5,12 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-term-grid"
edition = "2021"
license = "MIT"
name = "nu-term-grid"
version = "0.94.0"
version = "0.94.1"
[lib]
bench = false
[dependencies]
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
unicode-width = { workspace = true }

View File

@ -5,16 +5,16 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu-test-suppor
edition = "2021"
license = "MIT"
name = "nu-test-support"
version = "0.94.0"
version = "0.94.1"
[lib]
doctest = false
bench = false
[dependencies]
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-glob = { path = "../nu-glob", version = "0.94.0" }
nu-utils = { path = "../nu-utils", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.1" }
nu-glob = { path = "../nu-glob", version = "0.94.1" }
nu-utils = { path = "../nu-utils", version = "0.94.1" }
num-format = { workspace = true }
which = { workspace = true }

View File

@ -5,7 +5,7 @@ edition = "2021"
license = "MIT"
name = "nu-utils"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-utils"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[[bin]]

View File

@ -1,6 +1,6 @@
# Nushell Config File
#
# version = "0.94.0"
# version = "0.94.1"
# For more information on defining custom themes, see
# https://www.nushell.sh/book/coloring_and_theming.html

View File

@ -1,6 +1,6 @@
# Nushell Environment Config File
#
# version = "0.94.0"
# version = "0.94.1"
def create_left_prompt [] {
let dir = match (do --ignore-shell-errors { $env.PWD | path relative-to $nu.home-path }) {

View File

@ -10,10 +10,10 @@ name = "nu_plugin_custom_values"
bench = false
[dependencies]
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0", features = ["plugin"] }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1", features = ["plugin"] }
serde = { workspace = true, default-features = false }
typetag = "0.2"
[dev-dependencies]
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.0" }
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.1" }

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu_plugin_exam
edition = "2021"
license = "MIT"
name = "nu_plugin_example"
version = "0.94.0"
version = "0.94.1"
[[bin]]
name = "nu_plugin_example"
@ -15,9 +15,9 @@ bench = false
bench = false
[dependencies]
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0", features = ["plugin"] }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1", features = ["plugin"] }
[dev-dependencies]
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.0" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.0" }
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.1" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.1" }

View File

@ -5,12 +5,12 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu_plugin_form
edition = "2021"
license = "MIT"
name = "nu_plugin_formats"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0", features = ["plugin"] }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1", features = ["plugin"] }
indexmap = { workspace = true }
eml-parser = "0.1"
@ -18,4 +18,4 @@ ical = "0.11"
rust-ini = "0.21.0"
[dev-dependencies]
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.0" }
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.1" }

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu_plugin_gsta
edition = "2021"
license = "MIT"
name = "nu_plugin_gstat"
version = "0.94.0"
version = "0.94.1"
[lib]
doctest = false
@ -16,7 +16,7 @@ name = "nu_plugin_gstat"
bench = false
[dependencies]
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
git2 = "0.18"

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu_plugin_inc"
edition = "2021"
license = "MIT"
name = "nu_plugin_inc"
version = "0.94.0"
version = "0.94.1"
[lib]
doctest = false
@ -16,7 +16,7 @@ name = "nu_plugin_inc"
bench = false
[dependencies]
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0", features = ["plugin"] }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1", features = ["plugin"] }
semver = "1.0"

View File

@ -6,7 +6,7 @@
# it also allows us to test the plugin interface with something manually implemented in a scripting
# language without adding any extra dependencies to our tests.
const NUSHELL_VERSION = "0.94.0"
const NUSHELL_VERSION = "0.94.1"
def main [--stdio] {
if ($stdio) {

View File

@ -5,7 +5,7 @@ edition = "2021"
license = "MIT"
name = "nu_plugin_polars"
repository = "https://github.com/nushell/nushell/tree/main/crates/nu_plugin_polars"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -17,9 +17,9 @@ bench = false
bench = false
[dependencies]
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-path = { path = "../nu-path", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-path = { path = "../nu-path", version = "0.94.1" }
# Potential dependencies for extras
chrono = { workspace = true, features = ["std", "unstable-locales"], default-features = false }
@ -73,9 +73,9 @@ optional = false
version = "0.39"
[dev-dependencies]
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-command = { path = "../nu-command", version = "0.94.0" }
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.0" }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-command = { path = "../nu-command", version = "0.94.1" }
nu-plugin-test-support = { path = "../nu-plugin-test-support", version = "0.94.1" }
tempfile.workspace = true

View File

@ -27,7 +27,7 @@ import sys
import json
NUSHELL_VERSION = "0.94.0"
NUSHELL_VERSION = "0.94.1"
def signatures():

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu_plugin_quer
edition = "2021"
license = "MIT"
name = "nu_plugin_query"
version = "0.94.0"
version = "0.94.1"
[lib]
doctest = false
@ -16,8 +16,8 @@ name = "nu_plugin_query"
bench = false
[dependencies]
nu-plugin = { path = "../nu-plugin", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-plugin = { path = "../nu-plugin", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
gjson = "0.8"
scraper = { default-features = false, version = "0.19" }

View File

@ -5,7 +5,7 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nu_plugin_stre
edition = "2021"
license = "MIT"
name = "nu_plugin_stress_internals"
version = "0.94.0"
version = "0.94.1"
[[bin]]
name = "nu_plugin_stress_internals"

View File

@ -5,14 +5,14 @@ repository = "https://github.com/nushell/nushell/tree/main/crates/nuon"
edition = "2021"
license = "MIT"
name = "nuon"
version = "0.94.0"
version = "0.94.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nu-parser = { path = "../nu-parser", version = "0.94.0" }
nu-protocol = { path = "../nu-protocol", version = "0.94.0" }
nu-engine = { path = "../nu-engine", version = "0.94.0" }
nu-parser = { path = "../nu-parser", version = "0.94.1" }
nu-protocol = { path = "../nu-protocol", version = "0.94.1" }
nu-engine = { path = "../nu-engine", version = "0.94.1" }
once_cell = { workspace = true }
fancy-regex = { workspace = true }

View File

@ -539,6 +539,15 @@ fn dynamic_closure_optional_arg() {
fn dynamic_closure_rest_args() {
let actual = nu!(r#"let closure = {|...args| $args | str join ""}; do $closure 1 2 3"#);
assert_eq!(actual.out, "123");
let actual = nu!(
r#"let closure = {|required, ...args| $"($required), ($args | str join "")"}; do $closure 1 2 3"#
);
assert_eq!(actual.out, "1, 23");
let actual = nu!(
r#"let closure = {|required, optional?, ...args| $"($required), ($optional), ($args | str join "")"}; do $closure 1 2 3"#
);
assert_eq!(actual.out, "1, 2, 3");
}
#[cfg(feature = "which-support")]