diff --git a/Cargo.lock b/Cargo.lock index 75ff03c6d7..377883e8f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1125,9 +1125,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.16" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc", @@ -1907,9 +1907,9 @@ dependencies = [ [[package]] name = "fake" -version = "4.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206294f947d314ea224901e0b409c25465d1014ea0c3af27baaec861061a0426" +checksum = "b591050272097cc85b2f3c1cc4817ba4560057d10fcae6f7339f1cf622da0a0f" dependencies = [ "deunicode", "rand 0.9.0", @@ -1938,6 +1938,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "file-id" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bc904b9bbefcadbd8e3a9fb0d464a9b979de6324c03b3c663e8994f46a5be36" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "file_url" version = "0.2.3" @@ -2063,6 +2072,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "funty" version = "2.0.0" @@ -3028,6 +3046,26 @@ version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" +[[package]] +name = "inotify" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +dependencies = [ + "bitflags 2.9.0", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "inout" version = "0.1.4" @@ -3415,6 +3453,26 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "lazy-regex" version = "3.4.1" @@ -3756,6 +3814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3850,6 +3909,44 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "notify" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" +dependencies = [ + "bitflags 2.9.0", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.59.0", +] + +[[package]] +name = "notify-debouncer-full" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d88b1a7538054351c8258338df7c931a590513fb3745e8c15eb9ff4199b8d1" +dependencies = [ + "file-id", + "log", + "notify", + "notify-types", + "walkdir", +] + +[[package]] +name = "notify-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" + [[package]] name = "ntapi" version = "0.4.1" @@ -4366,6 +4463,8 @@ dependencies = [ "miette 7.5.0", "minijinja", "nix", + "notify", + "notify-debouncer-full", "once_cell", "parking_lot 0.12.3", "pep440_rs", @@ -4451,6 +4550,7 @@ dependencies = [ "uv-resolver", "uv-types", "uv-workspace", + "wax", "xxhash-rust", "zip", "zstd", @@ -4869,7 +4969,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.23", + "zerocopy 0.8.24", ] [[package]] @@ -5157,7 +5257,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.23", + "zerocopy 0.8.24", ] [[package]] @@ -6963,6 +7063,16 @@ dependencies = [ "xattr", ] +[[package]] +name = "tardar" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900c942f83b6a8b9998cc8f74ad3ffa24b7ff3c4279ea1c1c52d95dced9f3516" +dependencies = [ + "miette 5.10.0", + "vec1", +] + [[package]] name = "target-lexicon" version = "0.13.2" @@ -8566,6 +8676,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec1" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab68b56840f69efb0fefbe3ab6661499217ffdc58e2eef7c3f6f69835386322" + [[package]] name = "version-ranges" version = "0.1.1" @@ -8741,9 +8857,11 @@ checksum = "8d12a78aa0bab22d2f26ed1a96df7ab58e8a93506a3e20adb47c51a93b4e1357" dependencies = [ "const_format", "itertools 0.11.0", + "miette 5.10.0", "nom", "pori", "regex", + "tardar", "thiserror 1.0.69", "walkdir", ] @@ -9639,11 +9757,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ - "zerocopy-derive 0.8.23", + "zerocopy-derive 0.8.24", ] [[package]] @@ -9659,9 +9777,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 899585174b..099250ada1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -129,6 +129,7 @@ rattler_repodata_gateway = { version = "0.22.3", default-features = false } rattler_shell = { version = "0.22.24", default-features = false } rattler_solve = { version = "1.4.2", default-features = false } rattler_virtual_packages = { version = "2.0.8", default-features = false } +rayon = { version = "1.10.0" } # Bumping this to a higher version breaks the Windows path handling. url = "2.5.4" @@ -278,6 +279,8 @@ uv-pypi-types = { workspace = true } ctrlc = { workspace = true } fs-err = { workspace = true, features = ["tokio"] } +notify = "8.0.0" +notify-debouncer-full = "0.5.0" pixi_allocator = { workspace = true, optional = true } pixi_build_frontend = { workspace = true } pixi_build_types = { workspace = true } @@ -299,7 +302,7 @@ pixi_uv_conversions = { workspace = true } pypi_mapping = { workspace = true } pypi_modifiers = { workspace = true } rattler_virtual_packages = { workspace = true } -rayon = "1.10.0" +rayon = { workspace = true } regex = { workspace = true } reqwest = { workspace = true, features = [ "http2", @@ -342,6 +345,7 @@ uv-requirements-txt = { workspace = true } uv-resolver = { workspace = true } uv-types = { workspace = true } uv-workspace = { workspace = true } +wax = { workspace = true, features = ["miette"] } xxhash-rust = { workspace = true } zip = { workspace = true, features = ["deflate", "time"] } zstd = { workspace = true } diff --git a/docs/reference/cli/pixi.md b/docs/reference/cli/pixi.md index 12bacefe94..d4050a4d7a 100644 --- a/docs/reference/cli/pixi.md +++ b/docs/reference/cli/pixi.md @@ -20,6 +20,7 @@ pixi [OPTIONS] | [`upgrade`](pixi/upgrade.md) | Checks if there are newer versions of the dependencies and upgrades them in the lockfile and manifest file | | [`lock`](pixi/lock.md) | Solve environment and update the lock file without installing the environments | | [`run`](pixi/run.md) | Runs task in the pixi environment | +| [`watch`](pixi/watch.md) | Runs task in the pixi environment and watch files for changes | | [`exec`](pixi/exec.md) | Run a command and install it in a temporary environment | | [`shell`](pixi/shell.md) | Start a shell in a pixi environment, run `exit` to leave the shell | | [`shell-hook`](pixi/shell-hook.md) | Print the pixi environment activation script | diff --git a/docs/reference/cli/pixi/watch.md b/docs/reference/cli/pixi/watch.md new file mode 100644 index 0000000000..3d86533c6c --- /dev/null +++ b/docs/reference/cli/pixi/watch.md @@ -0,0 +1,73 @@ + +# [pixi](../pixi.md) watch + +## About +Runs task in the pixi environment and watch files for changes + +--8<-- "docs/reference/cli/pixi/watch_extender.md:description" + +## Usage +``` +pixi watch [OPTIONS] [TASK]... +``` + +## Arguments +- `` +: The pixi task or a task shell command you want to run in the workspace's environment, which can be an executable in the environment's PATH +
May be provided more than once. + +## Config Options +- `--tls-no-verify` +: Do not verify the TLS certificate of the server +- `--auth-file ` +: Path to the file containing the authentication token +- `--pypi-keyring-provider ` +: Specifies whether to use the keyring to look up credentials for PyPI +
**options**: `disabled`, `subprocess` +- `--concurrent-solves ` +: Max concurrent solves, default is the number of CPUs +- `--concurrent-downloads ` +: Max concurrent network requests, default is `50` +- `--force-activate` +: Do not use the environment activation cache. (default: true except in experimental mode) +- `--no-completion ` +: Do not source the autocompletion scripts from the environment +
**options**: `true`, `false` + +## Update Options +- `--no-install` +: Don't modify the environment, only modify the lock-file +- `--revalidate` +: Run the complete environment validation. This will reinstall a broken environment +- `--no-lockfile-update` +: Don't update lockfile, implies the no-install as well +- `--frozen` +: Install the environment as defined in the lockfile, doesn't update lockfile if it isn't up-to-date with the manifest file +
**env**: `PIXI_FROZEN` +- `--locked` +: Check if lockfile is up-to-date before installing the environment, aborts when lockfile isn't up-to-date with the manifest file +
**env**: `PIXI_LOCKED` +- `--environment (-e) ` +: The environment to run the task in +- `--clean-env` +: Use a clean environment to run the task +- `--skip-deps` +: Don't run the dependencies of the task ('depends-on' field in the task definition) +- `--dry-run (-n)` +: Run the task in dry-run mode (only print the command that would run) +- `--help` +: + +## Global Options +- `--manifest-path ` +: The path to `pixi.toml`, `pyproject.toml`, or the workspace directory + +## Description +Runs task in the pixi environment and watch files for changes. + +This command is used to run tasks in the pixi environment. The tasks are killed and ran again when the files specified in `inputs` change. It will activate the environment and run the task in the environment. It is using the deno_task_shell to run the task. + +`pixi watch` will also update the lockfile and install the environment if it is required. + + +--8<-- "docs/reference/cli/pixi/watch_extender.md:example" diff --git a/pixi.toml b/pixi.toml index d9a3e50fce..b426cafdc0 100644 --- a/pixi.toml +++ b/pixi.toml @@ -67,7 +67,7 @@ test-integration-extra-slow-ci = "pytest --numprocesses=auto --durations=0 --tim test-integration-fast = { cmd = "pytest --pixi-build=debug --numprocesses=auto --durations=0 --timeout=100 -m 'not slow and not extra_slow' tests/integration_python", depends-on = [ "build-debug", ] } -test-integration-slow = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=100 -m 'not extra_slow' tests/integration_python", depends-on = [ +test-integration-slow = { cmd = "pytest --numprocesses=auto --durations=0 --timeout=200 -m 'not extra_slow' tests/integration_python", depends-on = [ "build-release", ] } # pass the file to run as an argument to the task diff --git a/pixi_docs/Cargo.lock b/pixi_docs/Cargo.lock index d2900a58aa..ade701eb7c 100644 --- a/pixi_docs/Cargo.lock +++ b/pixi_docs/Cargo.lock @@ -1125,9 +1125,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.16" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc", @@ -1922,6 +1922,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "file-id" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bc904b9bbefcadbd8e3a9fb0d464a9b979de6324c03b3c663e8994f46a5be36" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "file_url" version = "0.2.3" @@ -2032,6 +2041,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "funty" version = "2.0.0" @@ -2981,6 +2999,26 @@ version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" +[[package]] +name = "inotify" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +dependencies = [ + "bitflags 2.9.0", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "inout" version = "0.1.4" @@ -3351,6 +3389,26 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "lazy-regex" version = "3.4.1" @@ -3667,6 +3725,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", + "log", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3744,6 +3803,44 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "notify" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" +dependencies = [ + "bitflags 2.9.0", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio", + "notify-types", + "walkdir", + "windows-sys 0.59.0", +] + +[[package]] +name = "notify-debouncer-full" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d88b1a7538054351c8258338df7c931a590513fb3745e8c15eb9ff4199b8d1" +dependencies = [ + "file-id", + "log", + "notify", + "notify-types", + "walkdir", +] + +[[package]] +name = "notify-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" + [[package]] name = "ntapi" version = "0.4.1" @@ -4218,6 +4315,8 @@ dependencies = [ "miette 7.5.0", "minijinja", "nix", + "notify", + "notify-debouncer-full", "once_cell", "parking_lot 0.12.3", "pep440_rs", @@ -4302,6 +4401,7 @@ dependencies = [ "uv-resolver", "uv-types", "uv-workspace", + "wax", "xxhash-rust", "zip", "zstd", @@ -4699,7 +4799,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.23", + "zerocopy 0.8.24", ] [[package]] @@ -4987,7 +5087,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.23", + "zerocopy 0.8.24", ] [[package]] @@ -6784,6 +6884,16 @@ dependencies = [ "xattr", ] +[[package]] +name = "tardar" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900c942f83b6a8b9998cc8f74ad3ffa24b7ff3c4279ea1c1c52d95dced9f3516" +dependencies = [ + "miette 5.10.0", + "vec1", +] + [[package]] name = "target-lexicon" version = "0.13.2" @@ -8351,6 +8461,12 @@ dependencies = [ "ryu", ] +[[package]] +name = "vec1" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab68b56840f69efb0fefbe3ab6661499217ffdc58e2eef7c3f6f69835386322" + [[package]] name = "version-ranges" version = "0.1.1" @@ -8535,9 +8651,11 @@ checksum = "8d12a78aa0bab22d2f26ed1a96df7ab58e8a93506a3e20adb47c51a93b4e1357" dependencies = [ "const_format", "itertools 0.11.0", + "miette 5.10.0", "nom", "pori", "regex", + "tardar", "thiserror 1.0.69", "walkdir", ] @@ -9433,11 +9551,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ - "zerocopy-derive 0.8.23", + "zerocopy-derive 0.8.24", ] [[package]] @@ -9453,9 +9571,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", diff --git a/src/cli/mod.rs b/src/cli/mod.rs index df93857f72..7509757f44 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -37,6 +37,7 @@ pub mod tree; pub mod update; pub mod upgrade; pub mod upload; +pub mod watch; pub mod workspace; #[derive(Parser, Debug)] @@ -142,6 +143,7 @@ pub enum Command { #[clap(visible_alias = "r")] Run(run::Args), + Watch(watch::Args), #[clap(visible_alias = "x")] Exec(exec::Args), #[clap(visible_alias = "s")] @@ -269,6 +271,7 @@ pub async fn execute_command(command: Command) -> miette::Result<()> { Command::Add(cmd) => add::execute(cmd).await, Command::Clean(cmd) => clean::execute(cmd).await, Command::Run(cmd) => run::execute(cmd).await, + Command::Watch(cmd) => watch::execute(cmd).await, Command::Global(cmd) => global::execute(cmd).await, Command::Auth(cmd) => rattler::cli::auth::execute(cmd).await.into_diagnostic(), Command::Install(cmd) => install::execute(cmd).await, diff --git a/src/cli/run.rs b/src/cli/run.rs index 6845e8f7b5..6487385de9 100644 --- a/src/cli/run.rs +++ b/src/cli/run.rs @@ -269,8 +269,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { ctrlc_should_exit_process.store(false, Ordering::Relaxed); // Execute the task itself within the command environment. If one of the tasks - // failed with a non-zero exit code, we exit this parent process with - // the same code. + // failed with a non-zero exit code, we exit this parent process with the same code. match execute_task(&executable_task, task_env).await { Ok(_) => { task_idx += 1; diff --git a/src/cli/watch.rs b/src/cli/watch.rs new file mode 100644 index 0000000000..62b3c0a43d --- /dev/null +++ b/src/cli/watch.rs @@ -0,0 +1,674 @@ +use std::collections::{HashMap, HashSet}; +use std::convert::identity; +use std::string::String; +use std::sync::{ + atomic::{AtomicBool, Ordering}, + Arc, +}; +use std::time::Duration; + +use clap::Parser; +use dialoguer::theme::ColorfulTheme; +use fancy_display::FancyDisplay; +use itertools::Itertools; +use miette::{Diagnostic, IntoDiagnostic}; +use pixi_config::{ConfigCli, ConfigCliActivation}; +use pixi_manifest::TaskName; +use thiserror::Error; +use tokio::sync::broadcast; +use tokio::task::LocalSet; +use tracing::{error, info, Level}; + +use crate::lock_file::LockFileDerivedData; +use crate::{ + cli::cli_config::{LockFileUpdateConfig, PrefixUpdateConfig, WorkspaceConfig}, + environment::sanity_check_project, + lock_file::UpdateLockFileOptions, + task::{ + get_task_env, watcher::FileWatcher, AmbiguousTask, CanSkip, ExecutableTask, + FailedToParseShellScript, InvalidWorkingDirectory, SearchEnvironments, TaskAndEnvironment, + TaskGraph, + }, + workspace::{errors::UnsupportedPlatformError, Environment}, + Workspace, WorkspaceLocator, +}; + +/// Runs task in the pixi environment and watch files for changes. +/// +/// This command is used to run tasks in the pixi environment. +/// The tasks are killed and ran again when the files specified in `inputs` change. +/// It will activate the environment and run the task in the environment. +/// It is using the deno_task_shell to run the task. +/// +/// `pixi watch` will also update the lockfile and install the environment if it is required. +#[derive(Parser, Debug, Default)] +#[clap(trailing_var_arg = true, disable_help_flag = true)] +pub struct Args { + /// The pixi task or a task shell command you want to run in the workspace's + /// environment, which can be an executable in the environment's PATH. + pub task: Vec, + + #[clap(flatten)] + pub workspace_config: WorkspaceConfig, + + #[clap(flatten)] + pub prefix_update_config: PrefixUpdateConfig, + + #[clap(flatten)] + pub lock_file_update_config: LockFileUpdateConfig, + + #[clap(flatten)] + pub config: ConfigCli, + + #[clap(flatten)] + pub activation_config: ConfigCliActivation, + + /// The environment to run the task in. + #[arg(long, short)] + pub environment: Option, + + /// Use a clean environment to run the task + /// + /// Using this flag will ignore your current shell environment and use bare + /// minimum environment to activate the pixi environment in. + #[arg(long)] + pub clean_env: bool, + + /// Don't run the dependencies of the task ('depends-on' field in the task + /// definition) + #[arg(long)] + pub skip_deps: bool, + + /// Run the task in dry-run mode (only print the command that would run) + #[clap(short = 'n', long)] + pub dry_run: bool, +} + +/// CLI entry point for `pixi watch` +/// When running the sigints are ignored and child can react to them. As it +/// pleases. +pub async fn execute(args: Args) -> miette::Result<()> { + let cli_config = args + .activation_config + .merge_config(args.config.clone().into()); + + // Load the workspace + let workspace = WorkspaceLocator::for_cli() + .with_search_start(args.workspace_config.workspace_locator_start()) + .locate()? + .with_cli_config(cli_config); + + // Extract the passed in environment name. + let environment = workspace.environment_from_name_or_env_var(args.environment.clone())?; + + // Find the environment to run the task in, if any were specified. + let explicit_environment = if args.environment.is_none() && environment.is_default() { + None + } else { + Some(environment.clone()) + }; + + // Print all available tasks if no task is provided + if args.task.is_empty() { + command_not_found(&workspace, explicit_environment); + return Ok(()); + } + + // Sanity check of prefix location + sanity_check_project(&workspace).await?; + + let best_platform = environment.best_platform(); + + // Ensure that the lock-file is up-to-date. + let lock_file = workspace + .update_lock_file(UpdateLockFileOptions { + lock_file_usage: args.lock_file_update_config.lock_file_usage(), + max_concurrent_solves: workspace.config().max_concurrent_solves(), + ..UpdateLockFileOptions::default() + }) + .await?; + + // Construct a task graph from the input arguments + let search_environment = SearchEnvironments::from_opt_env( + &workspace, + explicit_environment.clone(), + Some(best_platform), + ) + .with_disambiguate_fn(disambiguate_task_interactive); + + let task_graph = + TaskGraph::from_cmd_args(&workspace, &search_environment, args.task, args.skip_deps)?; + + // Currently only supporting a single task + let topological_order = task_graph.topological_order(); + if topological_order.len() > 1 && !args.skip_deps { + eprintln!( + "{}{}", + console::Emoji("🚫 ", ""), + console::style("Watch mode currently only supports single tasks without dependencies.") + .yellow() + .bold() + ); + return Ok(()); + } else if topological_order.is_empty() { + return Ok(()); + } + + // Get the single task + let task_id = topological_order[0]; + let executable_task = ExecutableTask::from_task_graph(&task_graph, task_id); + + // If the task is not executable (e.g. an alias), we can't proceed + if !executable_task.task().is_executable() { + eprintln!( + "{}{}", + console::Emoji("🚫 ", ""), + console::style("The specified task is not executable.") + .yellow() + .bold() + ); + return Ok(()); + } + + tracing::info!("Task graph: {}", task_graph); + + // Create a broadcast channel for cancellation signals + let (cancel_tx, _) = broadcast::channel::<()>(16); + let cancel_tx = Arc::new(cancel_tx); + + // Set up Ctrl+C handler + let ctrlc_should_exit_process = Arc::new(AtomicBool::new(true)); + let ctrlc_should_exit_process_clone = ctrlc_should_exit_process.clone(); + let cancel_tx_clone = cancel_tx.clone(); + + ctrlc::set_handler(move || { + reset_cursor(); + + // Send cancellation signal + let _ = cancel_tx_clone.send(()); + + // Give tasks a moment to handle cancellation signal + std::thread::sleep(std::time::Duration::from_millis(200)); + + // Exit the process if needed + if ctrlc_should_exit_process_clone.load(Ordering::Relaxed) { + exit_process_on_sigint(); + } + }) + .into_diagnostic()?; + + // Print dry-run message if dry-run mode is enabled + if args.dry_run { + eprintln!( + "{}{}", + console::Emoji("🌵 ", ""), + console::style("Dry-run mode enabled - no tasks will be executed.") + .yellow() + .bold(), + ); + eprintln!(); + + // Display the task that would be executed + if tracing::enabled!(Level::WARN) && !executable_task.task().is_custom() { + eprintln!( + "{}{}{}{}{}{}{}", + console::Emoji("✨ ", ""), + console::style("Pixi task (").bold(), + console::style(executable_task.name().unwrap_or("unnamed")) + .green() + .bold(), + // Only print environment if multiple environments are available + if workspace.environments().len() > 1 { + format!( + " in {}", + executable_task.run_environment.name().fancy_display() + ) + } else { + "".to_string() + }, + console::style("): ").bold(), + executable_task.display_command(), + if let Some(description) = executable_task.task().description() { + console::style(format!(": ({})", description)).yellow() + } else { + console::style("".to_string()).yellow() + } + ); + } + + return Ok(()); + } + + // If we don't have a command environment yet, we need to compute it + let command_env = get_task_env( + &executable_task.run_environment, + args.clean_env || executable_task.task().clean_env(), + Some(&lock_file.lock_file), + workspace.config().force_activate(), + workspace.config().experimental_activation_cache_usage(), + ) + .await?; + + // Display the task that will be executed + if tracing::enabled!(Level::WARN) && !executable_task.task().is_custom() { + eprintln!( + "{}{}{}{}{}{}{}", + console::Emoji("✨ ", ""), + console::style("Pixi task (").bold(), + console::style(executable_task.name().unwrap_or("unnamed")) + .green() + .bold(), + // Only print environment if multiple environments are available + if workspace.environments().len() > 1 { + format!( + " in {}", + executable_task.run_environment.name().fancy_display() + ) + } else { + "".to_string() + }, + console::style("): ").bold(), + executable_task.display_command(), + if let Some(description) = executable_task.task().description() { + console::style(format!(": ({})", description)).yellow() + } else { + console::style("".to_string()).yellow() + } + ); + } + + ctrlc_should_exit_process.store(false, Ordering::Relaxed); + + // Create a LocalSet for spawn_local + let local = LocalSet::new(); + + // Execute the task with file watching within the LocalSet + let task_result = local + .run_until(execute_task_with_watcher( + &executable_task, + &lock_file, + &command_env, + cancel_tx.clone(), + ctrlc_should_exit_process.clone(), + )) + .await; + + match task_result { + Ok(_) => {} + Err(TaskExecutionError::NonZeroExitCode(code)) => { + if code == 127 { + command_not_found(&workspace, explicit_environment); + } + std::process::exit(code); + } + Err(err) => return Err(err.into()), + } + + // Handle CTRL-C ourselves again + ctrlc_should_exit_process.store(true, Ordering::Relaxed); + + Ok(()) +} + +/// Called when a command was not found. +fn command_not_found<'p>(workspace: &'p Workspace, explicit_environment: Option>) { + let available_tasks: HashSet = + if let Some(explicit_environment) = explicit_environment { + explicit_environment.get_filtered_tasks() + } else { + workspace + .environments() + .into_iter() + .flat_map(|env| env.get_filtered_tasks()) + .collect() + }; + + if !available_tasks.is_empty() { + eprintln!( + "\nAvailable tasks:\n{}", + available_tasks + .into_iter() + .sorted() + .format_with("\n", |name, f| { + f(&format_args!("\t{}", name.fancy_display().bold())) + }) + ); + } +} + +#[derive(Debug, Error, Diagnostic)] +enum TaskExecutionError { + #[error("the script exited with a non-zero exit code {0}")] + NonZeroExitCode(i32), + + #[error(transparent)] + #[diagnostic(transparent)] + FailedToParseShellScript(#[from] FailedToParseShellScript), + + #[error(transparent)] + #[diagnostic(transparent)] + InvalidWorkingDirectory(#[from] InvalidWorkingDirectory), + + #[error(transparent)] + #[diagnostic(transparent)] + UnsupportedPlatformError(#[from] UnsupportedPlatformError), + + #[error("shell error: {error}")] + ShellError { error: String }, + + #[error("watcher error: {0}")] + #[diagnostic(code(pixi::watcher::error))] + WatcherError(String), + + #[error("cache error: {0}")] + CacheError(String), +} + +/// Execute a task with file watching using the notify-rs based watcher. +async fn execute_task_with_watcher( + task: &ExecutableTask<'_>, + lock_file: &LockFileDerivedData<'_>, + command_env: &HashMap, + cancel_tx: Arc>, + ctrlc_should_exit_process: Arc, +) -> Result<(), TaskExecutionError> { + let mut cancel_rx = cancel_tx.subscribe(); + ctrlc_should_exit_process.store(false, Ordering::Relaxed); + + let Some(script) = task.as_deno_script()? else { + return Err(TaskExecutionError::ShellError { + error: "No script to execute".to_string(), + }); + }; + let cwd = task.working_directory()?; + + // Get inputs directly from the task + let inputs = if let Some(execute) = task.task().as_execute() { + if let Some(inputs) = &execute.inputs { + inputs.clone() + } else { + Vec::new() + } + } else { + Vec::new() + }; + + let task_name = task.name().unwrap_or("unnamed").to_string(); + + let was_cancelled = Arc::new(AtomicBool::new(false)); + let was_cancelled_clone = was_cancelled.clone(); + + let script_clone = script.clone(); + let command_env_clone = command_env.clone(); + let cwd_clone = cwd.clone(); + + if inputs.is_empty() { + eprintln!( + "{}{}", + console::Emoji("⚠️ ", ""), + console::style("No inputs found. Task will run once and exit automatically") + .yellow() + .bold(), + ); + + let task_cache = match task + .can_skip(&lock_file.lock_file) + .await + .map_err(|e| TaskExecutionError::CacheError(e.to_string()))? + { + CanSkip::No(cache) => cache, + CanSkip::Yes => { + eprintln!( + "Task '{}' can be skipped (cache hit) 🚀", + console::style(task.name().unwrap_or("")).bold() + ); + return Ok(()); + } + }; + + // Update the task cache with the new hash + task.save_cache(lock_file, task_cache) + .await + .map_err(|e| TaskExecutionError::CacheError(e.to_string()))?; + + let status_code = deno_task_shell::execute( + script_clone, + command_env_clone, + &cwd_clone, + Default::default(), + Default::default(), + ) + .await; + + if status_code != 0 && !was_cancelled_clone.load(Ordering::SeqCst) { + tracing::error!("Task exited with status code: {}", status_code); + } + + return Ok(()); + } + + let mut task_handle = match task + .can_skip(&lock_file.lock_file) + .await + .map_err(|e| TaskExecutionError::CacheError(e.to_string()))? + { + CanSkip::No(cache) => { + let _ = task + .save_cache(lock_file, cache) + .await + .map_err(|e| TaskExecutionError::CacheError(e.to_string())); + + Some(tokio::task::spawn_local(async move { + let status_code = deno_task_shell::execute( + script_clone, + command_env_clone, + &cwd_clone, + Default::default(), + Default::default(), + ) + .await; + + if status_code != 0 && !was_cancelled_clone.load(Ordering::SeqCst) { + tracing::error!("Task exited with status code: {}", status_code); + } + + status_code + })) + } + CanSkip::Yes => { + eprintln!( + "Task '{}' can be skipped (cache hit) 🚀", + console::style(task.name().unwrap_or("")).bold() + ); + None + } + }; + + // Configure file watcher with debouncing + let debounce = Duration::from_millis(700); + + let root = if let Some(cwd) = task + .task() + .as_execute() + .expect("Task should be an execute task") + .cwd + .clone() + { + cwd + } else { + task.project().root().to_path_buf() + }; + + // Create the file watcher + let mut watcher = FileWatcher::new(&root, &inputs, debounce) + .await + .map_err(|e| TaskExecutionError::WatcherError(e.to_string()))?; + + loop { + tokio::select! { + // Handle Ctrl+C (SIGINT) + _ = cancel_rx.recv() => { + was_cancelled.store(true, Ordering::SeqCst); + + if task_handle.is_some() { + let handle = task_handle.take().expect("Task handle should be Some"); + handle.abort(); + } + + eprintln!( + "{}{}", + console::Emoji("🛑 ", ""), + console::style(format!("Task {} was terminated", task_name)) + .yellow() + .bold() + ); + break; + }, + + event = watcher.next() => { + match event { + Some(Ok(event)) => { + info!("Detected file change: {:?}", event.paths); + + was_cancelled.store(true, Ordering::SeqCst); + + if task_handle.is_some() { + let handle = task_handle.take().expect("Task handle should be Some"); + + // Abort the task handle to kill the thread + handle.abort(); + } + + // Reset the cancellation flag before starting a new task + was_cancelled.store(false, Ordering::SeqCst); + + eprintln!( + "{}{}{}{}", + console::Emoji("🔄 ", ""), + console::style("Reloading task: ").cyan().bold(), + console::style(task_name.clone()).green().bold(), + console::style(format!(" {}", task.display_command())).yellow() + ); + + let script_clone = script.clone(); + let command_env_clone = command_env.clone(); + let cwd_clone = cwd.clone(); + let was_cancelled_clone_for_task = was_cancelled.clone(); + + task_handle = match task.can_skip(&lock_file.lock_file).await + .map_err(|e| TaskExecutionError::CacheError(e.to_string()))? { + CanSkip::No(cache) => { + let _ = task.save_cache(lock_file, cache) + .await + .map_err(|e| TaskExecutionError::CacheError(e.to_string())); + + Some(tokio::task::spawn_local(async move { + let status_code = deno_task_shell::execute( + script_clone, + command_env_clone, + &cwd_clone, + Default::default(), + Default::default(), + ).await; + + if status_code != 0 && !was_cancelled_clone_for_task.load(Ordering::SeqCst) { + tracing::error!("Task exited with status code: {}", status_code); + } + + status_code + })) + } + CanSkip::Yes => { + eprintln!( + "Task '{}' can be skipped (cache hit) 🚀", + console::style(task.name().unwrap_or("")).bold() + ); + None + } + }; + } + Some(Err(e)) => { + error!("Error watching files: {}", e); + break; + } + None => { + error!("File watcher closed unexpectedly"); + break; + } + } + } + } + } + + ctrlc_should_exit_process.store(true, Ordering::Relaxed); + + // Check if the task is still running and get its result + if let Some(handle) = task_handle { + match handle.await { + Ok(code) if code != 0 && !was_cancelled.load(Ordering::SeqCst) => { + return Err(TaskExecutionError::NonZeroExitCode(code)); + } + Err(e) => { + tracing::error!("Error waiting for task: {}", e); + } + _ => {} + } + } + + Ok(()) +} + +/// Called to disambiguate between environments to run a task in. +fn disambiguate_task_interactive<'p>( + problem: &AmbiguousTask<'p>, +) -> Option> { + let environment_names = problem + .environments + .iter() + .map(|(env, _)| env.name()) + .collect_vec(); + let theme = ColorfulTheme { + active_item_style: console::Style::new().for_stderr().magenta(), + ..ColorfulTheme::default() + }; + + dialoguer::Select::with_theme(&theme) + .with_prompt(format!( + "The task '{}' {}can be run in multiple environments.\n\nPlease select an environment to run the task in:", + problem.task_name.fancy_display(), + if let Some(dependency) = &problem.depended_on_by { + format!("(depended on by '{}') ", dependency.0.fancy_display()) + } else { + String::new() + } + )) + .report(false) + .items(&environment_names) + .default(0) + .interact_opt() + .map_or(None, identity) + .map(|idx| problem.environments[idx].clone()) +} + +/// `dialoguer` doesn't clean up your term if it's aborted via e.g. `SIGINT` or +/// other exceptions: https://github.com/console-rs/dialoguer/issues/188. +/// +/// `dialoguer`, as a library, doesn't want to mess with signal handlers, +/// but we, as an application, are free to mess with signal handlers if we feel +/// like it, since we own the process. +/// This function was taken from https://github.com/dnjstrom/git-select-branch/blob/16c454624354040bc32d7943b9cb2e715a5dab92/src/main.rs#L119 +fn reset_cursor() { + let term = console::Term::stdout(); + let _ = term.show_cursor(); +} + +/// Exit the process with the appropriate exit code for a SIGINT. +fn exit_process_on_sigint() { + // https://learn.microsoft.com/en-us/cpp/c-runtime-library/signal-constants + #[cfg(target_os = "windows")] + std::process::exit(3); + + // POSIX compliant OSs: 128 + SIGINT (2) + #[cfg(not(target_os = "windows"))] + std::process::exit(130); +} diff --git a/src/task/executable_task.rs b/src/task/executable_task.rs index 9be8b33b8b..d787ccf04c 100644 --- a/src/task/executable_task.rs +++ b/src/task/executable_task.rs @@ -51,6 +51,9 @@ pub struct InvalidWorkingDirectory { #[derive(Debug, Error, Diagnostic)] pub enum TaskExecutionError { + #[error("the script exited with a non-zero exit code {0}")] + NonZeroExitCode(i32), + #[error(transparent)] InvalidWorkingDirectory(#[from] InvalidWorkingDirectory), diff --git a/src/task/mod.rs b/src/task/mod.rs index dce93537be..6f87a76d2c 100644 --- a/src/task/mod.rs +++ b/src/task/mod.rs @@ -4,6 +4,7 @@ mod file_hashes; mod task_environment; mod task_graph; mod task_hash; +pub mod watcher; pub use file_hashes::{FileHashes, FileHashesError}; pub use pixi_manifest::{Task, TaskName}; @@ -18,3 +19,4 @@ pub use task_environment::{ TaskDisambiguation, }; pub use task_graph::{TaskGraph, TaskGraphError, TaskId, TaskNode}; +pub use watcher::{FileEvent, FileWatchError, FileWatcher}; diff --git a/src/task/watcher.rs b/src/task/watcher.rs new file mode 100644 index 0000000000..a9a55cf759 --- /dev/null +++ b/src/task/watcher.rs @@ -0,0 +1,144 @@ +use std::{ + path::{Path, PathBuf}, + time::Duration, +}; + +use notify::{event::ModifyKind, EventKind, RecursiveMode}; +use notify_debouncer_full::new_debouncer; +use thiserror::Error; +use tokio::sync::mpsc::{self, Receiver}; +use tracing::{error, info}; +use wax::Glob; + +/// Errors that can occur when watching files. +#[derive(Debug, Error)] +pub enum FileWatchError { + /// An error occurred while watching files. + #[error("Error watching files")] + WatchError, + + /// An I/O error occurred. + #[error("I/O error: {0}")] + IoError(#[from] std::io::Error), + + /// Notify error. + #[error("Notify error: {0}")] + NotifyError(#[from] notify::Error), + + /// Pattern error. + #[error("Pattern error: {0}")] + PatternError(#[from] wax::BuildError), +} + +/// Represents a file change event +#[derive(Debug, Clone)] +pub struct FileEvent { + /// Paths that were changed + pub paths: Vec, +} + +/// Watches files for changes +pub struct FileWatcher { + rx: Receiver>, + // Keep the debouncer alive + _debouncer: Box, +} + +impl FileWatcher { + /// Creates a new file watcher + pub async fn new( + root: &Path, + patterns: &[impl AsRef], + debounce: Duration, + ) -> Result { + let (tx, rx) = mpsc::channel(100); + + // Create debouncer based on example + let (notify_tx, notify_rx) = std::sync::mpsc::channel(); + let mut debouncer = + new_debouncer(debounce, None, notify_tx).map_err(|_| FileWatchError::WatchError)?; + + // Process all input paths + for pattern in patterns { + let path = pattern.as_ref(); + let path_str = path.to_string_lossy(); + + info!("Processing glob pattern: {}", path_str); + + // Compile the glob pattern + let glob = Glob::new(&path_str)?; + + // Try to find existing files matching the pattern + for entry in glob.walk(root).flatten() { + let path = entry.path().to_path_buf(); + // Convert to absolute path if it's relative + let path = if path.is_absolute() { + path + } else { + root.join(path) + }; + + debouncer.watch(&path, RecursiveMode::NonRecursive)?; + } + } + + // Handle events from notify + let tx_clone = tx.clone(); + + tokio::spawn(async move { + for result in notify_rx { + match result { + Ok(events) => { + let events = events + .into_iter() + .filter(|event| match event.event.kind { + EventKind::Modify(kind) => !matches!(kind, ModifyKind::Metadata(_)), + EventKind::Create(_) | EventKind::Remove(_) => true, + _ => false, + }) + .collect::>(); + // Extract all paths from the events + let filtered_paths: Vec = events + .into_iter() + .flat_map(|event| event.event.paths) + .collect(); + + // Deduplicate paths + let mut unique_paths = std::collections::HashSet::new(); + let deduplicated_paths: Vec = filtered_paths + .into_iter() + .filter(|path| unique_paths.insert(path.clone())) + .collect(); + + if !deduplicated_paths.is_empty() { + if let Err(e) = tx_clone + .send(Ok(FileEvent { + paths: deduplicated_paths, + })) + .await + { + error!("Failed to send file event: {}", e); + } + } + } + Err(e) => { + error!("File watch error: {:?}", e); + if let Err(e) = tx_clone.send(Err(FileWatchError::WatchError)).await { + error!("Failed to send error event: {}", e); + } + } + } + } + }); + + Ok(Self { + rx, + _debouncer: Box::new(debouncer), + }) + } + + /// Returns the next file change event + pub async fn next(&mut self) -> Option> { + self.rx.recv().await + } +} diff --git a/tests/integration_python/test_auto_reload.py b/tests/integration_python/test_auto_reload.py new file mode 100644 index 0000000000..22ec1c3671 --- /dev/null +++ b/tests/integration_python/test_auto_reload.py @@ -0,0 +1,185 @@ +import select +import os +import signal +import subprocess +import time +from pathlib import Path +from typing import Any +from .common import EMPTY_BOILERPLATE_PROJECT + + +# Cross-platform process termination function +def terminate_process(process: subprocess.Popen[str], number_of_tasks: int) -> None: + """Terminate a process in a cross-platform way.""" + if os.name == "nt": # Windows + # On Windows, we can use terminate() which sends Ctrl+C + process.terminate() + else: # Unix (Linux, macOS) + # On Unix, we can use SIGINT directly + process.send_signal(signal.SIGINT) + time.sleep(0.5) + if process.poll() is None: + for _ in range(number_of_tasks): + process.kill() + process.wait(timeout=1) + + +def readline_with_timeout(process: subprocess.Popen[str], timeout: float = 5) -> str: + if process.stdout is None: + return "" + + if os.name == "nt": + # Windows doesn't support select on pipes, use a polling approach + start_time = time.time() + while time.time() - start_time < timeout: + if process.stdout.readable(): + line = process.stdout.readline() + if line: + return line.strip() + time.sleep(0.1) + return "" + else: + ready: list[Any] = [] + while not ready: + ready, _, _ = select.select([process.stdout], [], [], timeout) + return process.stdout.readline().strip() + + +def test_file_watching_and_rerunning(pixi: Path, tmp_pixi_workspace: Path) -> None: + manifest = tmp_pixi_workspace.joinpath("pixi.toml") + toml = f""" + {EMPTY_BOILERPLATE_PROJECT} + [tasks] + watch-test = {{ cmd = "echo Running with content: $(cat input.txt)", inputs = ["input.txt"] }} + """ + manifest.write_text(toml) + input_file = tmp_pixi_workspace.joinpath("input.txt") + input_file.write_text("initial content") + cmd = [str(pixi), "watch", "--manifest-path", str(manifest), "watch-test"] + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + cwd=str(tmp_pixi_workspace), + ) + + line = readline_with_timeout(process) + assert "initial content" in line, "Task didn't show initial content" + + input_file.write_text("updated content") + + line = readline_with_timeout(process) + assert "updated content" in line, "Task didn't show updated content" + terminate_process(process, 1) + + +def test_multiple_files_watching(pixi: Path, tmp_pixi_workspace: Path) -> None: + manifest = tmp_pixi_workspace.joinpath("pixi.toml") + toml = f""" + {EMPTY_BOILERPLATE_PROJECT} + [tasks] + watch-multiple = {{ cmd = "echo FILES: f1=$(cat file1.txt) f2=$(cat file2.txt)", inputs = ["file1.txt", "file2.txt"] }} + """ + manifest.write_text(toml) + file1 = tmp_pixi_workspace.joinpath("file1.txt") + file1.write_text("one") + file2 = tmp_pixi_workspace.joinpath("file2.txt") + file2.write_text("two") + cmd = [str(pixi), "watch", "--manifest-path", str(manifest), "watch-multiple"] + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + cwd=str(tmp_pixi_workspace), + ) + + line = readline_with_timeout(process) + assert "f1=one" in line and "f2=two" in line, "Task didn't show initial content from both files" + + file1.write_text("one-updated") + + line = readline_with_timeout(process) + assert "f1=one-updated" in line and "f2=two" in line, ( + "Task didn't show updated content from file1" + ) + terminate_process(process, 2) + + +def test_glob_pattern_watching(pixi: Path, tmp_pixi_workspace: Path) -> None: + manifest = tmp_pixi_workspace.joinpath("pixi.toml") + toml = f""" + {EMPTY_BOILERPLATE_PROJECT} + [tasks] + watch-glob = {{ cmd = "echo LOG_CONTENT=$(cat test.log)", inputs = ["*.log"] }} + """ + manifest.write_text(toml) + log_file = tmp_pixi_workspace.joinpath("test.log") + log_file.write_text("initial_data") + cmd = [str(pixi), "watch", "--manifest-path", str(manifest), "watch-glob"] + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + cwd=str(tmp_pixi_workspace), + ) + + # Wait for process to start and capture initial output + line = readline_with_timeout(process) + assert "initial_data" in line, "Task didn't show initial content" + + log_file.write_text("modified_data") + + line = readline_with_timeout(process) + assert "modified_data" in line, "Task didn't show modified content" + terminate_process(process, 1) + + +def test_empty_watched_files(pixi: Path, tmp_pixi_workspace: Path) -> None: + """Test behavior with empty inputs list (should run once and exit).""" + manifest = tmp_pixi_workspace.joinpath("pixi.toml") + toml = f""" + {EMPTY_BOILERPLATE_PROJECT} + [tasks] + watch-empty = {{ cmd = "echo Empty watched files", inputs = [] }} + """ + manifest.write_text(toml) + cmd = [str(pixi), "run", "--manifest-path", str(manifest), "watch-empty"] + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + cwd=str(tmp_pixi_workspace), + ) + stdout, stderr = process.communicate(timeout=3) + assert "Empty watched files" in stdout, "Task didn't execute" + if process.poll() is None: + process.kill() + process.wait(timeout=1) + + +def test_nonexistent_watched_file(pixi: Path, tmp_pixi_workspace: Path) -> None: + manifest = tmp_pixi_workspace.joinpath("pixi.toml") + toml = f""" + {EMPTY_BOILERPLATE_PROJECT} + [tasks] + watch-nonexistent = {{ cmd = "echo File created", inputs = ["does_not_exist_yet.txt"] }} + """ + manifest.write_text(toml) + cmd = [str(pixi), "run", "--manifest-path", str(manifest), "watch-nonexistent"] + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + cwd=str(tmp_pixi_workspace), + ) + + line = readline_with_timeout(process) + assert "File created" in line, "Task didn't run initially" + nonexistent_file = tmp_pixi_workspace.joinpath("does_not_exist_yet.txt") + nonexistent_file.write_text("now I exist") + terminate_process(process, 1) diff --git a/trampoline/Cargo.lock b/trampoline/Cargo.lock index 7f2080e4b3..03aa81ab98 100644 --- a/trampoline/Cargo.lock +++ b/trampoline/Cargo.lock @@ -51,9 +51,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -93,9 +93,9 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", @@ -153,7 +153,7 @@ dependencies = [ "async-trait", "cfg-if", "pin-project", - "rustix 0.38.41", + "rustix 0.38.44", "thiserror 1.0.69", "tokio", "windows-sys 0.52.0", @@ -183,7 +183,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.41", + "rustix 0.38.44", "slab", "tracing", "windows-sys 0.59.0", @@ -215,7 +215,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 0.38.41", + "rustix 0.38.44", "tracing", ] @@ -242,7 +242,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.41", + "rustix 0.38.44", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -369,7 +369,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "http-body 0.4.6", "lru", "once_cell", @@ -464,7 +464,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "once_cell", "p256", "percent-encoding", @@ -553,7 +553,7 @@ dependencies = [ "bytes-utils", "futures-core", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "http-body 0.4.6", "once_cell", "percent-encoding", @@ -571,7 +571,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.4.7", + "h2 0.4.8", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", @@ -615,7 +615,7 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", "once_cell", @@ -635,7 +635,7 @@ dependencies = [ "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "pin-project-lite", "tokio", "tracing", @@ -653,7 +653,7 @@ dependencies = [ "bytes-utils", "futures-core", "http 0.2.12", - "http 1.2.0", + "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", @@ -748,9 +748,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "blake2" @@ -794,15 +794,18 @@ dependencies = [ [[package]] name = "boxcar" -version = "0.2.7" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f839cdf7e2d3198ac6ca003fd8ebc61715755f41c1cad15ff13df67531e00ed" +checksum = "6740c6e2fc6360fa57c35214c7493826aee95993926092606f27c983b40837be" +dependencies = [ + "loom", +] [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -862,9 +865,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.1" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc", @@ -961,9 +964,9 @@ checksum = "e57e3272f0190c3f1584272d613719ba5fc7df7f4942fe542e63d949cf3a649b" [[package]] name = "console" -version = "0.15.10" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", "libc", @@ -1006,9 +1009,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1288,9 +1291,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -1347,9 +1350,9 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", "serde", @@ -1357,9 +1360,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", @@ -1374,15 +1377,15 @@ checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" dependencies = [ "serde", "typeid", @@ -1400,9 +1403,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -1411,9 +1414,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener", "pin-project-lite", @@ -1462,9 +1465,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -1517,7 +1520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c29c30684418547d476f0b48e84f4821639119c483b1eccd566c8cd0cd05f521" dependencies = [ "fs-err", - "rustix 0.38.41", + "rustix 0.38.44", "tokio", "windows-sys 0.52.0", ] @@ -1572,9 +1575,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "fastrand", "futures-core", @@ -1633,6 +1636,19 @@ dependencies = [ "byteorder", ] +[[package]] +name = "generator" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +dependencies = [ + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.58.0", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1707,9 +1723,9 @@ dependencies = [ [[package]] name = "google-cloud-metadata" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f945a208886a13d07636f38fb978da371d0abc3e34bad338124b9f8c135a8f" +checksum = "d901aeb453fd80e51d64df4ee005014f6cf39f2d736dd64f7239c132d9d39a6a" dependencies = [ "reqwest", "thiserror 1.0.69", @@ -1757,16 +1773,16 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.2.0", + "http 1.3.1", "indexmap 2.8.0", "slab", "tokio", @@ -1802,9 +1818,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -1858,11 +1874,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1878,9 +1894,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -1905,18 +1921,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] @@ -1927,7 +1943,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92baf25cf0b8c9246baecf3a444546360a97b569168fdf92563ee6a47829920c" dependencies = [ - "http 1.2.0", + "http 1.3.1", "http-serde", "reqwest", "serde", @@ -1940,15 +1956,15 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" dependencies = [ - "http 1.2.0", + "http 1.3.1", "serde", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1967,9 +1983,9 @@ dependencies = [ [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" @@ -1997,15 +2013,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.7", - "http 1.2.0", + "h2 0.4.8", + "http 1.3.1", "http-body 1.0.1", "httparse", "itoa", @@ -2033,19 +2049,19 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.2.0", - "hyper 1.5.1", + "http 1.3.1", + "hyper 1.6.0", "hyper-util", - "rustls 0.23.17", + "rustls 0.23.25", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.2", "tower-service", "webpki-roots", ] @@ -2059,9 +2075,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.6.0", "pin-project-lite", "socket2", "tokio", @@ -2255,7 +2271,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", "serde", ] @@ -2274,9 +2290,9 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", "generic-array", @@ -2296,9 +2312,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "itertools" @@ -2320,9 +2336,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" @@ -2367,11 +2383,11 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "9.3.0" +version = "9.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "js-sys", "pem", "ring", @@ -2391,7 +2407,7 @@ dependencies = [ "log", "secret-service", "security-framework 2.11.1", - "security-framework 3.0.1", + "security-framework 3.2.0", "windows-sys 0.59.0", "zbus", ] @@ -2461,16 +2477,16 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.10", ] [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" @@ -2480,9 +2496,9 @@ checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -2502,9 +2518,22 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.22" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] [[package]] name = "lru" @@ -2512,7 +2541,16 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.1", + "hashbrown 0.15.2", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", ] [[package]] @@ -2586,20 +2624,19 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -2617,7 +2654,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", @@ -2741,9 +2778,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -2756,9 +2793,9 @@ checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "option-ext" @@ -2848,7 +2885,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.10", "smallvec", "windows-targets 0.52.6", ] @@ -2861,9 +2898,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ "base64 0.22.1", "serde", @@ -2871,10 +2908,11 @@ dependencies = [ [[package]] name = "pep440_rs" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0922a442c78611fa8c5ed6065d2d898a820cf12fa90604217fdb2d01675efec7" +checksum = "31095ca1f396e3de32745f42b20deef7bc09077f918b085307e8eab6ddd8fb9c" dependencies = [ + "once_cell", "serde", "unicode-width 0.2.0", "unscanny", @@ -2911,9 +2949,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", "phf_shared", @@ -2921,9 +2959,9 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", "rand 0.8.5", @@ -2931,9 +2969,9 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", "phf_shared", @@ -2945,9 +2983,9 @@ dependencies = [ [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", "unicase", @@ -2955,18 +2993,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -3082,9 +3120,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" @@ -3109,16 +3147,16 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.41", + "rustix 0.38.44", "tracing", "windows-sys 0.59.0", ] [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] name = "powerfmt" @@ -3128,27 +3166,27 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy 0.8.24", ] [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -3188,34 +3226,36 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.17", + "rustls 0.23.25", "socket2", "thiserror 2.0.12", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" dependencies = [ "bytes", - "getrandom 0.2.15", - "rand 0.8.5", + "getrandom 0.3.2", + "rand 0.9.0", "ring", "rustc-hash", - "rustls 0.23.17", + "rustls 0.23.25", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -3226,9 +3266,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" dependencies = [ "cfg_aliases", "libc", @@ -3272,7 +3312,7 @@ checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.23", + "zerocopy 0.8.24", ] [[package]] @@ -3478,8 +3518,8 @@ dependencies = [ "tracing", "unicode-normalization", "which", - "windows", - "windows-registry 0.5.0", + "windows 0.60.0", + "windows-registry 0.5.1", ] [[package]] @@ -3498,7 +3538,7 @@ dependencies = [ "getrandom 0.3.2", "google-cloud-auth", "google-cloud-token", - "http 1.2.0", + "http 1.3.1", "itertools 0.14.0", "keyring", "netrc-rs", @@ -3575,7 +3615,7 @@ dependencies = [ "fs-err", "futures", "hex", - "http 1.2.0", + "http 1.3.1", "http-cache-semantics", "humansize", "humantime", @@ -3660,11 +3700,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] [[package]] @@ -3680,18 +3720,18 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", @@ -3700,14 +3740,14 @@ dependencies = [ [[package]] name = "reflink-copy" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b86038e146b9a61557e1a2e58cdf2eddc0b46ce141b55541b1c1b9f3189d618" +checksum = "78c81d000a2c524133cc00d2f92f019d399e57906c3b7119271a2495354fe895" dependencies = [ "cfg-if", "libc", - "rustix 1.0.2", - "windows", + "rustix 1.0.3", + "windows 0.61.1", ] [[package]] @@ -3718,8 +3758,17 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -3730,7 +3779,7 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] [[package]] @@ -3739,6 +3788,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.5" @@ -3747,9 +3802,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.14" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e327e510263980e231de548a33e63d34962d29ae61b467389a1a09627a254" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "async-compression", "base64 0.22.1", @@ -3757,12 +3812,12 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.7", - "http 1.2.0", + "h2 0.4.8", + "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", - "hyper-rustls 0.27.3", + "hyper 1.6.0", + "hyper-rustls 0.27.5", "hyper-util", "ipnet", "js-sys", @@ -3772,7 +3827,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.17", + "rustls 0.23.25", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -3781,7 +3836,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.2", "tokio-util", "tower", "tower-service", @@ -3802,7 +3857,7 @@ checksum = "64e8975513bd9a7a43aad01030e79b3498e05db14e9d945df6483e8cf9b8c4c4" dependencies = [ "anyhow", "async-trait", - "http 1.2.0", + "http 1.3.1", "reqwest", "serde", "thiserror 1.0.69", @@ -3819,8 +3874,8 @@ dependencies = [ "async-trait", "futures", "getrandom 0.2.15", - "http 1.2.0", - "hyper 1.5.1", + "http 1.3.1", + "hyper 1.6.0", "parking_lot 0.11.2", "reqwest", "reqwest-middleware", @@ -3853,15 +3908,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3896,9 +3950,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" @@ -3911,24 +3965,24 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys 0.9.3", @@ -3949,14 +4003,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.17" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.0", "subtle", "zeroize", ] @@ -3982,7 +4036,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.0.1", + "security-framework 3.2.0", ] [[package]] @@ -4005,9 +4059,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] @@ -4024,9 +4078,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" dependencies = [ "ring", "rustls-pki-types", @@ -4035,15 +4089,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" @@ -4054,6 +4108,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -4109,7 +4169,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -4118,11 +4178,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.0.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -4131,9 +4191,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -4184,9 +4244,9 @@ dependencies = [ [[package]] name = "serde_ignored" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e319a36d1b52126a0d608f24e93b2d81297091818cd70625fcf50a15d84ddf" +checksum = "566da67d80e92e009728b3731ff0e5360cb181432b8ca73ea30bb1d170700d76" dependencies = [ "serde", ] @@ -4206,9 +4266,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", @@ -4364,13 +4424,13 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple_asn1" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 1.0.69", + "thiserror 2.0.12", "time", ] @@ -4385,9 +4445,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" @@ -4420,20 +4480,14 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spki" version = "0.6.0" @@ -4540,14 +4594,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", - "rustix 1.0.2", + "rustix 1.0.3", "windows-sys 0.59.0", ] @@ -4644,9 +4698,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -4697,20 +4751,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.17", - "rustls-pki-types", + "rustls 0.23.25", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -4817,10 +4870,14 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", ] @@ -4839,15 +4896,15 @@ checksum = "41713888c5ccfd99979fcd1afd47b71652e331b3d4a0e19d30769e80fec76cce" [[package]] name = "typeid" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "uds_windows" @@ -4862,15 +4919,15 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -4953,9 +5010,9 @@ dependencies = [ [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-trait" @@ -5042,12 +5099,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] @@ -5128,9 +5186,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5148,9 +5206,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" dependencies = [ "rustls-pki-types", ] @@ -5163,7 +5221,7 @@ checksum = "2774c861e1f072b3aadc02f8ba886c26ad6321567ecc294c935434cad06f1283" dependencies = [ "either", "env_home", - "rustix 0.38.41", + "rustix 0.38.44", "winsafe", ] @@ -5189,17 +5247,40 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529" dependencies = [ - "windows-collections", + "windows-collections 0.1.1", "windows-core 0.60.1", - "windows-future", + "windows-future 0.1.1", + "windows-link", + "windows-numerics 0.1.1", +] + +[[package]] +name = "windows" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.0", + "windows-future 0.2.0", "windows-link", - "windows-numerics", + "windows-numerics 0.2.0", ] [[package]] @@ -5211,6 +5292,15 @@ dependencies = [ "windows-core 0.60.1", ] +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.0", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -5220,17 +5310,43 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.59.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.2", + "windows-strings 0.3.1", +] + +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", "windows-link", - "windows-result", - "windows-strings", + "windows-result 0.3.2", + "windows-strings 0.4.0", ] [[package]] @@ -5243,6 +5359,27 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" +dependencies = [ + "windows-core 0.61.0", + "windows-link", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-implement" version = "0.59.0" @@ -5254,11 +5391,33 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-interface" -version = "0.59.0" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26fd936d991781ea39e87c3a27285081e3c0da5ca0fcbc02d368cc6f52ff01" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", @@ -5267,9 +5426,9 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-numerics" @@ -5281,37 +5440,66 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.0", + "windows-link", +] + [[package]] name = "windows-registry" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result", - "windows-strings", + "windows-result 0.3.2", + "windows-strings 0.3.1", "windows-targets 0.53.0", ] [[package]] name = "windows-registry" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c44a98275e31bfd112bb06ba96c8ab13c03383a3753fdddd715406a1824c7e0" +checksum = "ad1da3e436dc7653dfdf3da67332e22bff09bb0e28b0239e1624499c7830842e" dependencies = [ "windows-link", - "windows-result", - "windows-strings", + "windows-result 0.3.2", + "windows-strings 0.4.0", ] [[package]] name = "windows-result" -version = "0.3.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-strings" version = "0.3.1" @@ -5321,6 +5509,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -5488,7 +5685,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] [[package]] @@ -5505,13 +5702,12 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xattr" -version = "1.3.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "linux-raw-sys 0.4.14", - "rustix 0.38.41", + "rustix 1.0.3", ] [[package]] @@ -5532,9 +5728,9 @@ checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -5544,9 +5740,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", @@ -5622,17 +5818,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", "zerocopy-derive 0.7.35", ] [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ - "zerocopy-derive 0.8.23", + "zerocopy-derive 0.8.24", ] [[package]] @@ -5648,9 +5843,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", @@ -5659,18 +5854,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", @@ -5708,9 +5903,9 @@ dependencies = [ [[package]] name = "zip" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938cc23ac49778ac8340e366ddc422b2227ea176edb447e23fc0627608dddadd" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" dependencies = [ "arbitrary", "crc32fast", @@ -5749,18 +5944,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/trampoline/binaries/pixi-trampoline-aarch64-apple-darwin.zst b/trampoline/binaries/pixi-trampoline-aarch64-apple-darwin.zst index 1d6c75287c..3d009f1de3 100644 Binary files a/trampoline/binaries/pixi-trampoline-aarch64-apple-darwin.zst and b/trampoline/binaries/pixi-trampoline-aarch64-apple-darwin.zst differ diff --git a/trampoline/binaries/pixi-trampoline-aarch64-pc-windows-msvc.exe.zst b/trampoline/binaries/pixi-trampoline-aarch64-pc-windows-msvc.exe.zst index cfc31e345b..1a929f5e14 100644 Binary files a/trampoline/binaries/pixi-trampoline-aarch64-pc-windows-msvc.exe.zst and b/trampoline/binaries/pixi-trampoline-aarch64-pc-windows-msvc.exe.zst differ diff --git a/trampoline/binaries/pixi-trampoline-aarch64-unknown-linux-musl.zst b/trampoline/binaries/pixi-trampoline-aarch64-unknown-linux-musl.zst index 9199561a35..6627312892 100644 Binary files a/trampoline/binaries/pixi-trampoline-aarch64-unknown-linux-musl.zst and b/trampoline/binaries/pixi-trampoline-aarch64-unknown-linux-musl.zst differ diff --git a/trampoline/binaries/pixi-trampoline-powerpc64le-unknown-linux-gnu.zst b/trampoline/binaries/pixi-trampoline-powerpc64le-unknown-linux-gnu.zst index c1dbc2a135..72aae4dcab 100644 Binary files a/trampoline/binaries/pixi-trampoline-powerpc64le-unknown-linux-gnu.zst and b/trampoline/binaries/pixi-trampoline-powerpc64le-unknown-linux-gnu.zst differ diff --git a/trampoline/binaries/pixi-trampoline-x86_64-apple-darwin.zst b/trampoline/binaries/pixi-trampoline-x86_64-apple-darwin.zst index 4781c6204e..067a4275e0 100644 Binary files a/trampoline/binaries/pixi-trampoline-x86_64-apple-darwin.zst and b/trampoline/binaries/pixi-trampoline-x86_64-apple-darwin.zst differ diff --git a/trampoline/binaries/pixi-trampoline-x86_64-pc-windows-msvc.exe.zst b/trampoline/binaries/pixi-trampoline-x86_64-pc-windows-msvc.exe.zst index 5d926e836f..f1c4f04b73 100644 Binary files a/trampoline/binaries/pixi-trampoline-x86_64-pc-windows-msvc.exe.zst and b/trampoline/binaries/pixi-trampoline-x86_64-pc-windows-msvc.exe.zst differ diff --git a/trampoline/binaries/pixi-trampoline-x86_64-unknown-linux-musl.zst b/trampoline/binaries/pixi-trampoline-x86_64-unknown-linux-musl.zst index 19e460fe8e..fdab95eb71 100644 Binary files a/trampoline/binaries/pixi-trampoline-x86_64-unknown-linux-musl.zst and b/trampoline/binaries/pixi-trampoline-x86_64-unknown-linux-musl.zst differ