2021-01-12 05:59:53 +01:00
|
|
|
[package]
|
2022-03-22 21:25:38 +01:00
|
|
|
authors = ["The Nushell Project Developers"]
|
2022-04-11 20:17:06 +02:00
|
|
|
description = "Nushell's built-in commands"
|
2022-03-22 21:25:38 +01:00
|
|
|
edition = "2021"
|
|
|
|
license = "MIT"
|
2021-01-12 05:59:53 +01:00
|
|
|
name = "nu-command"
|
2023-02-11 19:59:11 +01:00
|
|
|
repository = "https://github.com/nushell/nushell/tree/main/crates/nu-command"
|
2023-12-14 18:14:47 +01:00
|
|
|
version = "0.88.1"
|
2021-12-11 21:08:17 +01:00
|
|
|
|
2021-09-02 03:29:43 +02:00
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
|
|
|
2023-02-12 23:22:00 +01:00
|
|
|
[lib]
|
|
|
|
bench = false
|
|
|
|
|
2021-09-02 03:29:43 +02:00
|
|
|
[dependencies]
|
2023-07-24 13:16:18 +02:00
|
|
|
nu-ansi-term = "0.49.0"
|
2023-12-14 18:14:47 +01:00
|
|
|
nu-cmd-base = { path = "../nu-cmd-base", version = "0.88.1" }
|
|
|
|
nu-color-config = { path = "../nu-color-config", version = "0.88.1" }
|
|
|
|
nu-engine = { path = "../nu-engine", version = "0.88.1" }
|
|
|
|
nu-glob = { path = "../nu-glob", version = "0.88.1" }
|
|
|
|
nu-json = { path = "../nu-json", version = "0.88.1" }
|
|
|
|
nu-parser = { path = "../nu-parser", version = "0.88.1" }
|
|
|
|
nu-path = { path = "../nu-path", version = "0.88.1" }
|
|
|
|
nu-pretty-hex = { path = "../nu-pretty-hex", version = "0.88.1" }
|
|
|
|
nu-protocol = { path = "../nu-protocol", version = "0.88.1" }
|
|
|
|
nu-system = { path = "../nu-system", version = "0.88.1" }
|
|
|
|
nu-table = { path = "../nu-table", version = "0.88.1" }
|
|
|
|
nu-term-grid = { path = "../nu-term-grid", version = "0.88.1" }
|
|
|
|
nu-utils = { path = "../nu-utils", version = "0.88.1" }
|
2023-03-14 19:46:42 +01:00
|
|
|
|
2023-05-26 17:32:48 +02:00
|
|
|
alphanumeric-sort = "1.5"
|
|
|
|
base64 = "0.21"
|
2023-10-10 14:57:36 +02:00
|
|
|
byteorder = "1.5"
|
2023-09-11 11:55:21 +02:00
|
|
|
bytesize = "1.3"
|
2023-09-11 12:39:52 +02:00
|
|
|
calamine = "0.22"
|
2023-06-28 16:54:08 +02:00
|
|
|
chrono = { version = "0.4", features = ["std", "unstable-locales"], default-features = false }
|
2023-08-25 10:54:01 +02:00
|
|
|
chrono-humanize = "0.2.3"
|
2023-05-26 17:32:48 +02:00
|
|
|
chrono-tz = "0.8"
|
2023-09-04 02:22:25 +02:00
|
|
|
crossterm = "0.27"
|
2023-10-18 23:01:14 +02:00
|
|
|
csv = "1.3"
|
2023-09-26 18:00:16 +02:00
|
|
|
dialoguer = { default-features = false, features = ["fuzzy-select"], version = "0.11" }
|
2023-05-26 17:32:48 +02:00
|
|
|
digest = { default-features = false, version = "0.10" }
|
2023-08-25 10:54:01 +02:00
|
|
|
dtparse = "2.0"
|
2023-05-26 17:32:48 +02:00
|
|
|
encoding_rs = "0.8"
|
|
|
|
fancy-regex = "0.11"
|
|
|
|
filesize = "0.2"
|
|
|
|
filetime = "0.2"
|
|
|
|
fs_extra = "1.3"
|
|
|
|
htmlescape = "0.3"
|
2023-11-16 00:43:37 +01:00
|
|
|
human-date-parser = "0.1.1"
|
2023-11-07 16:36:34 +01:00
|
|
|
indexmap = "2.1"
|
2023-05-26 17:32:48 +02:00
|
|
|
indicatif = "0.17"
|
2023-09-09 01:12:45 +02:00
|
|
|
itertools = "0.11"
|
2023-05-26 17:32:48 +02:00
|
|
|
log = "0.4"
|
2023-07-24 13:16:18 +02:00
|
|
|
lscolors = { version = "0.15", default-features = false, features = ["nu-ansi-term"] }
|
2023-05-26 17:32:48 +02:00
|
|
|
md5 = { package = "md-5", version = "0.10" }
|
2023-07-17 08:25:04 +02:00
|
|
|
miette = { version = "5.10", features = ["fancy-no-backtrace"] }
|
2023-05-26 17:32:48 +02:00
|
|
|
mime = "0.3"
|
|
|
|
mime_guess = "2.0"
|
2023-06-28 16:54:08 +02:00
|
|
|
native-tls = "0.2"
|
2023-09-01 00:07:41 +02:00
|
|
|
notify-debouncer-full = { version = "0.3", default-features = false }
|
2023-05-26 17:32:48 +02:00
|
|
|
num = { version = "0.4", optional = true }
|
|
|
|
num-format = { version = "0.4" }
|
|
|
|
num-traits = "0.2"
|
2023-06-19 08:16:00 +02:00
|
|
|
once_cell = "1.18"
|
2023-06-29 15:30:07 +02:00
|
|
|
open = "5.0"
|
2023-05-26 17:32:48 +02:00
|
|
|
os_pipe = "1.1"
|
|
|
|
pathdiff = "0.2"
|
2023-06-19 09:00:12 +02:00
|
|
|
percent-encoding = "2.3"
|
2023-05-26 17:32:48 +02:00
|
|
|
print-positions = "0.6"
|
2023-08-14 15:58:15 +02:00
|
|
|
quick-xml = "0.30"
|
2022-02-03 18:35:06 +01:00
|
|
|
rand = "0.8"
|
2023-09-25 13:00:05 +02:00
|
|
|
rayon = "1.8"
|
2023-10-23 16:11:32 +02:00
|
|
|
regex = "1.9.5"
|
2023-05-26 17:32:48 +02:00
|
|
|
roxmltree = "0.18"
|
Add `stor` family of commands (#11170)
# Description
This PR adds the `stor` family of commands. These commands are meant to
create, open, insert, update, delete, reset data in an in-memory sqlite
database. This is really an experiment to see how creatively we can use
an in-memory database.
```
Usage:
> stor
Subcommands:
stor create - Create a table in the in-memory sqlite database
stor delete - Delete a table or specified rows in the in-memory sqlite database
stor export - Export the in-memory sqlite database to a sqlite database file
stor import - Import a sqlite database file into the in-memory sqlite database
stor insert - Insert information into a specified table in the in-memory sqlite database
stor open - Opens the in-memory sqlite database
stor reset - Reset the in-memory database by dropping all tables
stor update - Update information in a specified table in the in-memory sqlite database
Flags:
-h, --help - Display the help message for this command
Input/output types:
╭─#─┬──input──┬─output─╮
│ 0 │ nothing │ string │
╰───┴─────────┴────────╯
```
### Examples
## stor create
```nushell
❯ stor create --table-name nudb --columns {bool1: bool, int1: int, float1: float, str1: str, datetime1: datetime}
╭──────┬────────────────╮
│ nudb │ [list 0 items] │
╰──────┴────────────────╯
```
## stor insert
```nushell
❯ stor insert --table-name nudb --data-record {bool1: true, int1: 2, float1: 1.1, str1: fdncred, datetime1: 2023-04-17}
╭──────┬───────────────╮
│ nudb │ [table 1 row] │
╰──────┴───────────────╯
```
## stor open
```nushell
❯ stor open | table -e
╭──────┬────────────────────────────────────────────────────────────────────╮
│ │ ╭─#─┬id─┬bool1┬int1┬float1┬──str1───┬─────────datetime1──────────╮ │
│ nudb │ │ 0 │ 1 │ 1 │ 2 │ 1.10 │ fdncred │ 2023-04-17 00:00:00 +00:00 │ │
│ │ ╰───┴───┴─────┴────┴──────┴─────────┴────────────────────────────╯ │
╰──────┴────────────────────────────────────────────────────────────────────╯
```
## stor update
```nushell
❯ stor update --table-name nudb --update-record {str1: toby datetime1: 2021-04-17} --where-clause "bool1 = 1"
╭──────┬───────────────╮
│ nudb │ [table 1 row] │
╰──────┴───────────────╯
❯ stor open | table -e
╭──────┬─────────────────────────────────────────────────────────────────╮
│ │ ╭─#─┬id─┬bool1┬int1┬float1┬─str1─┬─────────datetime1──────────╮ │
│ nudb │ │ 0 │ 1 │ 1 │ 2 │ 1.10 │ toby │ 2021-04-17 00:00:00 +00:00 │ │
│ │ ╰───┴───┴─────┴────┴──────┴──────┴────────────────────────────╯ │
╰──────┴─────────────────────────────────────────────────────────────────╯
```
## insert another row
```nushell
❯ stor insert --table-name nudb --data-record {bool1: true, int1: 5, float1: 1.1, str1: fdncred, datetime1: 2023-04-17}
╭──────┬────────────────╮
│ nudb │ [table 2 rows] │
╰──────┴────────────────╯
❯ stor open | table -e
╭──────┬────────────────────────────────────────────────────────────────────╮
│ │ ╭─#─┬id─┬bool1┬int1┬float1┬──str1───┬─────────datetime1──────────╮ │
│ nudb │ │ 0 │ 1 │ 1 │ 2 │ 1.10 │ toby │ 2021-04-17 00:00:00 +00:00 │ │
│ │ │ 1 │ 2 │ 1 │ 5 │ 1.10 │ fdncred │ 2023-04-17 00:00:00 +00:00 │ │
│ │ ╰───┴───┴─────┴────┴──────┴─────────┴────────────────────────────╯ │
╰──────┴────────────────────────────────────────────────────────────────────╯
```
## stor delete (specific row(s))
```nushell
❯ stor delete --table-name nudb --where-clause "int1 == 5"
╭──────┬───────────────╮
│ nudb │ [table 1 row] │
╰──────┴───────────────╯
```
## insert multiple tables
```nushell
❯ stor create --table-name nudb1 --columns {bool1: bool, int1: int, float1: float, str1: str, datetime1: datetime}
╭───────┬────────────────╮
│ nudb │ [table 1 row] │
│ nudb1 │ [list 0 items] │
╰───────┴────────────────╯
❯ stor insert --table-name nudb1 --data-record {bool1: true, int1: 2, float1: 1.1, str1: fdncred, datetime1: 2023-04-17}
╭───────┬───────────────╮
│ nudb │ [table 1 row] │
│ nudb1 │ [table 1 row] │
╰───────┴───────────────╯
❯ stor create --table-name nudb2 --columns {bool1: bool, int1: int, float1: float, str1: str, datetime1: datetime}
╭───────┬────────────────╮
│ nudb │ [table 1 row] │
│ nudb1 │ [table 1 row] │
│ nudb2 │ [list 0 items] │
╰───────┴────────────────╯
❯ stor insert --table-name nudb2 --data-record {bool1: true, int1: 2, float1: 1.1, str1: fdncred, datetime1: 2023-04-17}
╭───────┬───────────────╮
│ nudb │ [table 1 row] │
│ nudb1 │ [table 1 row] │
│ nudb2 │ [table 1 row] │
╰───────┴───────────────╯
```
## stor delete (specific table)
```nushell
❯ stor delete --table-name nudb1
╭───────┬───────────────╮
│ nudb │ [table 1 row] │
│ nudb2 │ [table 1 row] │
╰───────┴───────────────╯
```
## stor reset (all tables are deleted)
```nushell
❯ stor reset
```
## stor export
```nushell
❯ stor export --file-name nudb.sqlite3
╭──────┬───────────────╮
│ nudb │ [table 1 row] │
╰──────┴───────────────╯
❯ open nudb.sqlite3 | table -e
╭──────┬────────────────────────────────────────────────────────────────────╮
│ │ ╭─#─┬id─┬bool1┬int1┬float1┬──str1───┬─────────datetime1──────────╮ │
│ nudb │ │ 0 │ 1 │ 1 │ 5 │ 1.10 │ fdncred │ 2023-04-17 00:00:00 +00:00 │ │
│ │ ╰───┴───┴─────┴────┴──────┴─────────┴────────────────────────────╯ │
╰──────┴────────────────────────────────────────────────────────────────────╯
❯ open nudb.sqlite3 | schema | table -e
╭────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ │ ╭──────┬──────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ tables │ │ │ ╭───────────────┬──────────────────────────────────────────────────────────────────────────────╮ │ │
│ │ │ nudb │ │ │ ╭─#─┬─cid─┬───name────┬─────type─────┬─notnull─┬───────default────────┬─pk─╮ │ │ │
│ │ │ │ │ columns │ │ 0 │ 0 │ id │ INTEGER │ 1 │ │ 1 │ │ │ │
│ │ │ │ │ │ │ 1 │ 1 │ bool1 │ BOOLEAN │ 0 │ │ 0 │ │ │ │
│ │ │ │ │ │ │ 2 │ 2 │ int1 │ INTEGER │ 0 │ │ 0 │ │ │ │
│ │ │ │ │ │ │ 3 │ 3 │ float1 │ REAL │ 0 │ │ 0 │ │ │ │
│ │ │ │ │ │ │ 4 │ 4 │ str1 │ VARCHAR(255) │ 0 │ │ 0 │ │ │ │
│ │ │ │ │ │ │ 5 │ 5 │ datetime1 │ DATETIME │ 0 │ STRFTIME('%Y-%m-%d │ 0 │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ %H:%M:%f', 'NOW') │ │ │ │ │
│ │ │ │ │ │ ╰─#─┴─cid─┴───name────┴─────type─────┴─notnull─┴───────default────────┴─pk─╯ │ │ │
│ │ │ │ │ constraints │ [list 0 items] │ │ │
│ │ │ │ │ foreign_keys │ [list 0 items] │ │ │
│ │ │ │ │ indexes │ [list 0 items] │ │ │
│ │ │ │ ╰───────────────┴──────────────────────────────────────────────────────────────────────────────╯ │ │
│ │ ╰──────┴──────────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
## Using with `query db`
```nushell
❯ stor open | query db "select * from nudb"
╭─#─┬id─┬bool1┬int1┬float1┬──str1───┬─────────datetime1──────────╮
│ 0 │ 1 │ 1 │ 5 │ 1.10 │ fdncred │ 2023-04-17 00:00:00 +00:00 │
╰───┴───┴─────┴────┴──────┴─────────┴────────────────────────────╯
```
## stor import
```nushell
❯ stor open
# note, nothing is returned. there is nothing in memory, atm.
❯ stor import --file-name nudb.sqlite3
╭──────┬───────────────╮
│ nudb │ [table 1 row] │
╰──────┴───────────────╯
❯ stor open | table -e
╭──────┬────────────────────────────────────────────────────────────────────╮
│ │ ╭─#─┬id─┬bool1┬int1┬float1┬──str1───┬─────────datetime1──────────╮ │
│ nudb │ │ 0 │ 1 │ 1 │ 5 │ 1.10 │ fdncred │ 2023-04-17 00:00:00 +00:00 │ │
│ │ ╰───┴───┴─────┴────┴──────┴─────────┴────────────────────────────╯ │
╰──────┴────────────────────────────────────────────────────────────────────╯
```
TODO:
- [x] `stor export` - Export a fully formed sqlite db file.
- [x] `stor import` - Imports a specified sqlite db file.
- [x] Perhaps feature-gate it with the sqlite feature
- [x] Update `query db` to work with the in-memory database
- [x] Remove `open --in-memory`
# 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 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.
-->
2023-11-29 17:02:46 +01:00
|
|
|
rusqlite = { version = "0.29", features = ["bundled", "backup"], optional = true }
|
2023-05-26 17:32:48 +02:00
|
|
|
same-file = "1.0"
|
2023-08-21 19:04:34 +02:00
|
|
|
serde = { version = "1.0", features = ["derive"] }
|
2023-04-26 15:15:42 +02:00
|
|
|
serde_json = "1.0"
|
2023-05-26 17:32:48 +02:00
|
|
|
serde_urlencoded = "0.7"
|
|
|
|
serde_yaml = "0.9"
|
|
|
|
sha2 = "0.10"
|
2023-05-18 18:37:20 +02:00
|
|
|
sysinfo = "0.29"
|
2023-08-04 20:50:47 +02:00
|
|
|
tabled = { version = "0.14.0", features = ["color"], default-features = false }
|
2023-09-18 07:50:17 +02:00
|
|
|
terminal_size = "0.3"
|
2023-05-26 17:32:48 +02:00
|
|
|
titlecase = "2.0"
|
2023-09-18 07:50:30 +02:00
|
|
|
toml = "0.8"
|
2023-05-26 17:32:48 +02:00
|
|
|
unicode-segmentation = "1.10"
|
2023-11-29 18:48:18 +01:00
|
|
|
ureq = { version = "2.9", default-features = false, features = ["charset", "gzip", "json", "native-tls"] }
|
2023-05-26 17:32:48 +02:00
|
|
|
url = "2.2"
|
Add `mktemp` command (#11005)
closes #10845
I've opened this a little prematurely to get some questions answered
before I cleanup the code.
As I started trying to better understand GNUs `mktemp` I've realized its
kind of peculiar and we might want to change its behavior to introduce
it to nushell.
#### quiet and dry run
Does it make sense to keep the `quiet` and `dry_run` flags? I don't
think so. The GNU documentation says this about the dry run flag "Using
the output of this command to create a new file is inherently unsafe, as
there is a window of time between generating the name and using it where
another process can create an object by the same name." So yeah why keep
it? As far as quiet goes, does it make sense to silence the errors in
nushell?
#### other confusing flags
According to the [gnu
docs](https://www.gnu.org/software/coreutils/manual/html_node/mktemp-invocation.html),
the `-t` flag is deprecated and the `-p`/ `--tempdir` are the same flag
with the only difference being `--tempdir` takes an optional path, Given
that, I've broken the `-p` away from `--tempdir`. Now there is one
switch `--tmpdir`/`-t` and one named param `--tmpdir-path`/`-p`.
GNU mktemp
```
-p DIR, --tmpdir[=DIR] interpret TEMPLATE relative to DIR; if DIR is not
specified, use $TMPDIR if set, else /tmp. With
this option, TEMPLATE must not be an absolute name;
unlike with -t, TEMPLATE may contain slashes, but
mktemp creates only the final component
-t interpret TEMPLATE as a single file name component,
relative to a directory: $TMPDIR, if set; else the
directory specified via -p; else /tmp [deprecated]
```
to
nushell mktemp
```
-p, --tmpdir-path <Filepath> # named param, must provide a path
-t, --tmpdir # a switch
```
Is this a terrible idea?
What should I do?
---------
Co-authored-by: Darren Schroeder <343840+fdncred@users.noreply.github.com>
2023-11-18 02:30:53 +01:00
|
|
|
uu_cp = "0.0.23"
|
|
|
|
uu_whoami = "0.0.23"
|
|
|
|
uu_mkdir = "0.0.23"
|
|
|
|
uu_mktemp = "0.0.23"
|
2023-11-20 20:38:41 +01:00
|
|
|
uuid = { version = "1.6", features = ["v4"] }
|
2023-10-09 14:31:50 +02:00
|
|
|
wax = { version = "0.6" }
|
2023-10-23 08:14:28 +02:00
|
|
|
which = { version = "5.0", optional = true }
|
2023-08-07 21:40:38 +02:00
|
|
|
bracoxide = "0.1.2"
|
2023-08-25 02:21:17 +02:00
|
|
|
chardetng = "0.1.17"
|
2021-05-12 03:01:31 +02:00
|
|
|
|
2022-10-07 20:54:36 +02:00
|
|
|
[target.'cfg(windows)'.dependencies]
|
2023-11-20 20:35:21 +01:00
|
|
|
winreg = "0.52"
|
2022-10-07 20:54:36 +02:00
|
|
|
|
2021-01-12 05:59:53 +01:00
|
|
|
[target.'cfg(unix)'.dependencies]
|
2023-02-11 19:59:11 +01:00
|
|
|
libc = "0.2"
|
2023-05-26 17:32:48 +02:00
|
|
|
umask = "2.1"
|
2023-09-04 22:41:28 +02:00
|
|
|
nix = { version = "0.27", default-features = false, features = ["user"] }
|
2021-01-12 05:59:53 +01:00
|
|
|
|
2023-11-20 21:22:35 +01:00
|
|
|
[target.'cfg(all(unix, not(target_os = "macos"), not(target_os = "android"), not(target_os = "ios")))'.dependencies]
|
|
|
|
procfs = "0.16.0"
|
|
|
|
|
2022-03-26 19:21:19 +01:00
|
|
|
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies.trash]
|
|
|
|
optional = true
|
2023-10-10 22:52:45 +02:00
|
|
|
version = "3.1"
|
2022-03-26 19:21:19 +01:00
|
|
|
|
2022-06-03 18:37:27 +02:00
|
|
|
[target.'cfg(windows)'.dependencies.windows]
|
2023-07-18 15:36:54 +02:00
|
|
|
features = [
|
|
|
|
"Win32_Foundation",
|
|
|
|
"Win32_Storage_FileSystem",
|
Improve `registry value` return types (#10806)
r? @fdncred
Last one, I hope. At least short of completely redesigning `registry
query`'s interface. (Which I wouldn't implement without asking around
first.)
# Description
User-Facing Changes has the general overview. Inline comments provide a
lot of justification on specific choices. Most of the type conversions
should be reasonably noncontroversial, but expanding `REG_EXPAND_SZ`
needs some justification. First, an example of the behavior there:
```shell
> # release nushell:
> version | select version commit_hash | to md --pretty
| version | commit_hash |
| ------- | ---------------------------------------- |
| 0.85.0 | a6f62e05ae5b4e9ba4027fbfffd21025a898783e |
> registry query --hkcu Environment TEMP | get value
%USERPROFILE%\AppData\Local\Temp
> # with this patch:
> version | select version commit_hash | to md --pretty
| version | commit_hash |
| ------- | ---------------------------------------- |
| 0.86.1 | 0c5a4c991f1a77bcbe5a86bc8f4469ecf1218fe9 |
> registry query --hkcu Environment TEMP | get value
C:\Users\CAD\AppData\Local\Temp
> # Microsoft CLI tooling behavior:
> ^pwsh -c `(Get-ItemProperty HKCU:\Environment).TEMP`
C:\Users\CAD\AppData\Local\Temp
> ^reg query HKCU\Environment /v TEMP
HKEY_CURRENT_USER\Environment
TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
```
As noted in the inline comments, I'm arguing that it makes more sense to
eagerly expand the %EnvironmentString% placeholders, as none of
Nushell's path functionality will interpret these placeholders. This
makes the behavior of `registry query` match the behavior of pwsh's
`Get-ItemProperty` registry access, and means that paths (the most
common use of `REG_EXPAND_SZ`) are actually usable.
This does *not* break nu_script's
[`update-path`](https://github.com/nushell/nu_scripts/blob/main/sourced/update-path.nu);
it will just be slightly inefficient as it will not find any
`%Placeholder%`s to manually expand anymore. But also, note that
`update-path` is currently *wrong*, as a path including
`%LocalAppData%Low` is perfectly valid and sometimes used (to go to
`Appdata\LocalLow`); expansion isn't done solely on a path segment
basis, as is implemented by `update-path`.
I believe that the type conversions implemented by this patch are
essentially always desired. But if we want to keep `registry query`
"pure", we could easily introduce a `registry get`[^get] which does the
more complete interpretation of registry types, and leave `registry
query` alone as doing the bare minimum. Or we could teach `path expand`
to do `ExpandEnvironmentStringsW`. But REG_EXPAND_SZ being the odd one
out of not getting its registry type semantics decoded by `registry
query` seems wrong.
[^get]: This is the potential redesign I alluded to at the top. One
potential change could be to make `registry get Environment` produce
`record<Path: string, TEMP: string, TMP: string>` instead of `registry
query`'s `table<name: string, value: string, type: string>`, the idea
being to make it feel as native as possible. We could even translate
between Nu's cell-path and registry paths -- cell paths with spaces do
actually work, if a bit awkwardly -- or even introduce lazy records so
the registry can be traversed with normal data manipulation ... but that
all seems a bit much.
# User-Facing Changes
- `registry query`'s produced `value` has changed. Specifically:
- ❗ Rows `where type == REG_EXPAND_SZ` now expand `%EnvironmentVarable%`
placeholders for you. For example, `registry query --hkcu Environment
TEMP | get value` returns `C:\Users\CAD\AppData\Local\Temp` instead of
`%USERPROFILE%\AppData\Local\Temp`.
- You can restore the old behavior and preserve the placeholders by
passing a new `--no-expand` switch.
- Rows `where type == REG_MULTI_SZ` now provide a `list<string>` value.
They previously had that same list, but `| str join "\n"`.
- Rows `where type == REG_DWORD_BIG_ENDIAN` now provide the correct
numeric value instead of a byte-swapped value.
- Rows `where type == REG_QWORD` now provide the correct numeric
value[^sign] instead of the value modulo 2<sup>32</sup>.
- Rows `where type == REG_LINK` now provide a string value of the link
target registry path instead of an internal debug string representation.
(This should never be visible, as links should be transparently
followed.)
- Rows `where type =~ RESOURCE` now provide a binary value instead of an
internal debug string representation.
[^sign]: Nu's `int` is a signed 64-bit integer. As such, values >=
2<sup>63</sup> will be reported as their negative two's compliment
value. This might sometimes be the correct interpretation -- the
registry does not distinguish between signed and unsigned integer values
-- but regedit and pwsh display all values as unsigned.
2023-10-23 14:21:27 +02:00
|
|
|
"Win32_System_Environment",
|
2023-07-18 15:36:54 +02:00
|
|
|
"Win32_System_SystemServices",
|
|
|
|
"Win32_Security",
|
2023-08-23 22:23:27 +02:00
|
|
|
"Win32_System_Threading",
|
2023-07-18 15:36:54 +02:00
|
|
|
]
|
2023-05-26 17:32:48 +02:00
|
|
|
version = "0.48"
|
2022-06-03 18:37:27 +02:00
|
|
|
|
2021-10-10 06:13:15 +02:00
|
|
|
[features]
|
2021-11-02 21:56:00 +01:00
|
|
|
plugin = ["nu-parser/plugin"]
|
2023-06-14 23:12:55 +02:00
|
|
|
sqlite = ["rusqlite"]
|
2023-02-11 19:59:11 +01:00
|
|
|
trash-support = ["trash"]
|
|
|
|
which-support = ["which"]
|
2021-01-12 05:59:53 +01:00
|
|
|
|
|
|
|
[dev-dependencies]
|
2023-12-14 18:14:47 +01:00
|
|
|
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.88.1" }
|
|
|
|
nu-test-support = { path = "../nu-test-support", version = "0.88.1" }
|
2023-06-14 23:12:55 +02:00
|
|
|
|
2023-05-26 17:32:48 +02:00
|
|
|
dirs-next = "2.0"
|
2023-09-18 07:50:08 +02:00
|
|
|
mockito = { version = "1.2", default-features = false }
|
2023-05-26 17:32:48 +02:00
|
|
|
quickcheck = "1.0"
|
|
|
|
quickcheck_macros = "1.0"
|
2023-08-08 19:11:05 +02:00
|
|
|
rstest = { version = "0.18", default-features = false }
|