From 9cf95352cb21b085c94a72d722550fb5a9e0331a Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Thu, 9 Jan 2025 18:20:42 -0800 Subject: [PATCH 01/15] build: Prepare v1.32 release. --- .yarn/versions/c89cc34c.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .yarn/versions/c89cc34c.yml diff --git a/.yarn/versions/c89cc34c.yml b/.yarn/versions/c89cc34c.yml new file mode 100644 index 00000000000..28fac241db0 --- /dev/null +++ b/.yarn/versions/c89cc34c.yml @@ -0,0 +1,9 @@ +releases: + "@moonrepo/cli": minor + "@moonrepo/core-linux-arm64-gnu": minor + "@moonrepo/core-linux-arm64-musl": minor + "@moonrepo/core-linux-x64-gnu": minor + "@moonrepo/core-linux-x64-musl": minor + "@moonrepo/core-macos-arm64": minor + "@moonrepo/core-macos-x64": minor + "@moonrepo/core-windows-x64-msvc": minor From 12d6f2ef301fd9e0169a6558f53be59f6aa8a85b Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Tue, 21 Jan 2025 22:53:30 -0800 Subject: [PATCH 02/15] deps: Update PDKs. (#1794) * First pass. * Remove serde_yaml. * Update features. * chore: Release * Update tests. --- Cargo.lock | 41 +++++-------------- Cargo.toml | 2 +- crates/app/Cargo.toml | 2 +- crates/cli/tests/run_test.rs | 4 +- ...ges_primary_hash_if_deps_hash_changes.snap | 8 ++-- ...nerates_unique_hashes_for_each_target.snap | 4 +- .../run_test__output_styles__hash.snap | 2 +- crates/codegen/Cargo.toml | 1 + crates/common/Cargo.toml | 2 +- crates/config/Cargo.toml | 10 ++--- crates/file-group/Cargo.toml | 4 +- crates/pdk-api/Cargo.toml | 6 +-- crates/pdk-test-utils/Cargo.toml | 4 +- crates/pdk/Cargo.toml | 4 +- crates/plugin/Cargo.toml | 2 +- crates/project/Cargo.toml | 4 +- crates/target/Cargo.toml | 4 +- crates/task/Cargo.toml | 6 +-- legacy/core/test-utils/Cargo.toml | 2 +- legacy/core/test-utils/src/sandbox.rs | 6 +-- legacy/deno/lang/Cargo.toml | 2 +- legacy/node/lang/Cargo.toml | 8 +++- legacy/node/lang/src/pnpm/mod.rs | 8 ++-- legacy/typescript/lang/Cargo.toml | 2 +- 24 files changed, 62 insertions(+), 76 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4bf4f50a53..8544d16f453 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "moon_common" -version = "0.0.10" +version = "0.0.11" dependencies = [ "compact_str", "dirs 6.0.0", @@ -3719,7 +3719,7 @@ dependencies = [ [[package]] name = "moon_config" -version = "0.0.12" +version = "0.0.13" dependencies = [ "httpmock", "indexmap 2.7.1", @@ -3736,7 +3736,7 @@ dependencies = [ "semver", "serde", "serde_json", - "serde_yaml", + "serde_yml", "serial_test", "starbase_sandbox", "tracing", @@ -3965,7 +3965,7 @@ dependencies = [ "rustc-hash", "serde", "serde_json", - "serde_yaml", + "serde_yml", "starbase_styles", "starbase_utils", "tracing", @@ -4043,7 +4043,7 @@ dependencies = [ [[package]] name = "moon_pdk" -version = "0.0.12" +version = "0.0.13" dependencies = [ "clap", "extism-pdk", @@ -4054,7 +4054,7 @@ dependencies = [ [[package]] name = "moon_pdk_api" -version = "0.0.12" +version = "0.0.13" dependencies = [ "moon_common", "moon_config", @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "moon_pdk_test_utils" -version = "0.0.13" +version = "0.0.14" dependencies = [ "extism", "moon_pdk_api", @@ -4408,7 +4408,7 @@ dependencies = [ [[package]] name = "moon_target" -version = "0.0.9" +version = "0.0.10" dependencies = [ "compact_str", "miette 7.4.0", @@ -4570,7 +4570,7 @@ dependencies = [ "predicates", "pretty_assertions", "rustc-hash", - "serde_yaml", + "serde_yml", "starbase_utils", ] @@ -6102,7 +6102,7 @@ dependencies = [ "serde", "serde_json", "serde_path_to_error", - "serde_yaml", + "serde_yml", "starbase_styles", "thiserror 2.0.11", "toml", @@ -6133,7 +6133,7 @@ dependencies = [ "semver", "serde", "serde_json", - "serde_yaml", + "serde_yml", "toml", "url", ] @@ -6256,19 +6256,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.7.1", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - [[package]] name = "serde_yml" version = "0.0.12" @@ -7498,12 +7485,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - [[package]] name = "untrusted" version = "0.9.0" diff --git a/Cargo.toml b/Cargo.toml index cc8699fcf25..76f2fd7329e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ serial_test = "3.2.0" semver = "1.0.25" serde = { version = "1.0.215", features = ["derive"] } serde_json = "1.0.137" -serde_yaml = "0.9.34" +serde_yml = "0.0.12" sha2 = "0.10.8" starbase = { version = "0.9.9" } starbase_archive = { version = "0.9.4", default-features = false, features = [ diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 9d72c6bd58a..0efffe40fad 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -64,7 +64,7 @@ starbase = { workspace = true } starbase_events = { workspace = true } starbase_shell = { workspace = true } starbase_styles = { workspace = true } -starbase_utils = { workspace = true } +starbase_utils = { workspace = true, features = ["editor-config"] } system_env = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } diff --git a/crates/cli/tests/run_test.rs b/crates/cli/tests/run_test.rs index 8bc3cea5bdc..cc010749165 100644 --- a/crates/cli/tests/run_test.rs +++ b/crates/cli/tests/run_test.rs @@ -710,11 +710,11 @@ mod hashing { // Hashes change because `.moon/workspace.yml` is different from `walk_strategy` assert_eq!( hash_vcs, - "3b3d2d556cfc82c7834975dbed40741e27541a30244dfdc4835edd9503539d55" + "2b8160e1fae996d3fcd1cf4ce888a7888a0e08d7b6d9d9f2adfecc356e86040b" ); assert_eq!( hash_glob, - "59ec46f239f4ad40e2bea9fb0cb26f69b55b985b027845e40f41db087e842f38" + "78edc25dadbeae8b2d41073611c686ead7f1c3690b887c45822faa4310cfb573" ); } } diff --git a/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap b/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap index 2547e5064a2..37ee59cb07a 100644 --- a/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap +++ b/crates/cli/tests/snapshots/run_test__dependencies__changes_primary_hash_if_deps_hash_changes.snap @@ -3,8 +3,8 @@ source: crates/cli/tests/run_test.rs expression: "[h1, h2, extract_hash_from_run(sandbox.path(), \"outputs:asDep\"),\nextract_hash_from_run(sandbox.path(), \"outputs:withDeps\")]" --- [ - "81670f2e4bc28898288815ee075a8653bb264bf8dcf7fa0246f87e50054c950f", - "1034518a27b7197ff81b5393a98270ca94283e26cdaf61ec370ccbcd5f92112c", - "c2f65dfed7824b8da4986ed97bf2c6c6ce1914b387da407da66c19f7c61571d8", - "e672d267073a26f1d9cf14eaa1136a02c3c588e93ba3792f8f7dc47c49b0cf24", + "9b83821644418128b97f4ca80ea38d073f7531d5704c09dc4ddf0118e3df8cbf", + "1e0aa381a5657c612d921b945b4ada7c2176b62ef9f336e4f7d9cab121a270f9", + "f01e61ef51d40759363813b476a8b3b53d8ecdbe3f575708388d50cbfc390d1b", + "b888471e3a4d5ebfd469efe4a77ab0d8dfe0655efc3f0743b94c3f8738cda5f7", ] diff --git a/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap b/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap index 1d7997818a9..9cece849814 100644 --- a/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap +++ b/crates/cli/tests/snapshots/run_test__dependencies__generates_unique_hashes_for_each_target.snap @@ -3,6 +3,6 @@ source: crates/cli/tests/run_test.rs expression: "[extract_hash_from_run(sandbox.path(), \"outputs:asDep\"),\nextract_hash_from_run(sandbox.path(), \"outputs:withDeps\")]" --- [ - "81670f2e4bc28898288815ee075a8653bb264bf8dcf7fa0246f87e50054c950f", - "1034518a27b7197ff81b5393a98270ca94283e26cdaf61ec370ccbcd5f92112c", + "9b83821644418128b97f4ca80ea38d073f7531d5704c09dc4ddf0118e3df8cbf", + "1e0aa381a5657c612d921b945b4ada7c2176b62ef9f336e4f7d9cab121a270f9", ] diff --git a/crates/cli/tests/snapshots/run_test__output_styles__hash.snap b/crates/cli/tests/snapshots/run_test__output_styles__hash.snap index 3424ec02abb..ef335f12f8b 100644 --- a/crates/cli/tests/snapshots/run_test__output_styles__hash.snap +++ b/crates/cli/tests/snapshots/run_test__output_styles__hash.snap @@ -10,4 +10,4 @@ expression: assert.output() Tasks: 2 completed Time: 100ms -f75fedb1391ec68b3bc9dcc5cd1908bb4ee36793de49fe538185fc077cd38149 +091875657f8b955944c45803b2e13d536f257648e04cca859a0c38700b94764f diff --git a/crates/codegen/Cargo.toml b/crates/codegen/Cargo.toml index 1858f9ba421..443f5b9d023 100644 --- a/crates/codegen/Cargo.toml +++ b/crates/codegen/Cargo.toml @@ -22,6 +22,7 @@ regex = { workspace = true } rustc-hash = { workspace = true } starbase_archive = { workspace = true } starbase_utils = { workspace = true, features = [ + "editor-config", "glob", "json", "net", diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 60f33795347..75646302fe3 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_common" -version = "0.0.10" +version = "0.0.11" edition = "2021" license = "MIT" description = "Common utilities." diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 8491f5bacb6..d0dbc390905 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_config" -version = "0.0.12" +version = "0.0.13" edition = "2021" license = "MIT" description = "Core workspace, project, and moon configuration." @@ -12,8 +12,8 @@ publish = true features = ["loader"] [dependencies] -moon_common = { version = "0.0.10", path = "../common" } -moon_target = { version = "0.0.9", path = "../target" } +moon_common = { version = "0.0.11", path = "../common" } +moon_target = { version = "0.0.10", path = "../target" } indexmap = { workspace = true } miette = { workspace = true } once_cell = { workspace = true } @@ -31,12 +31,12 @@ schematic = { workspace = true, features = [ "type_semver", "validate", "validate_url", - "yaml", + "yml", ] } semver = { workspace = true, features = ["serde"] } serde = { workspace = true } serde_json = { workspace = true } -serde_yaml = { workspace = true } +serde_yml = { workspace = true } version_spec = { workspace = true, features = ["schematic"] } warpgate_api = { workspace = true, features = ["schematic"] } diff --git a/crates/file-group/Cargo.toml b/crates/file-group/Cargo.toml index 341f7ecc570..10cb554541a 100644 --- a/crates/file-group/Cargo.toml +++ b/crates/file-group/Cargo.toml @@ -9,8 +9,8 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.0.10", path = "../common" } -moon_config = { version = "0.0.12", path = "../config" } +moon_common = { version = "0.0.11", path = "../common" } +moon_config = { version = "0.0.13", path = "../config" } common-path = "1.0.0" miette = { workspace = true } once_cell = { workspace = true } diff --git a/crates/pdk-api/Cargo.toml b/crates/pdk-api/Cargo.toml index a2c18e4a260..e6c7d78ddc2 100644 --- a/crates/pdk-api/Cargo.toml +++ b/crates/pdk-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_pdk_api" -version = "0.0.12" +version = "0.0.13" edition = "2021" license = "MIT" description = "Core APIs for creating moon WASM plugins." @@ -9,8 +9,8 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.0.10", path = "../common" } -moon_config = { version = "0.0.12", path = "../config" } +moon_common = { version = "0.0.11", path = "../common" } +moon_config = { version = "0.0.13", path = "../config" } rustc-hash = { workspace = true } schematic = { workspace = true, features = ["schema_serde"] } serde = { workspace = true } diff --git a/crates/pdk-test-utils/Cargo.toml b/crates/pdk-test-utils/Cargo.toml index dfb1b163e40..46cc94c9b84 100644 --- a/crates/pdk-test-utils/Cargo.toml +++ b/crates/pdk-test-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_pdk_test_utils" -version = "0.0.13" +version = "0.0.14" edition = "2021" license = "MIT" description = "Utilities for testing moon WASM plugins." @@ -9,7 +9,7 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_pdk_api = { version = "0.0.12", path = "../pdk-api" } +moon_pdk_api = { version = "0.0.13", path = "../pdk-api" } warpgate = { workspace = true } extism = { workspace = true } serde = { workspace = true } diff --git a/crates/pdk/Cargo.toml b/crates/pdk/Cargo.toml index 5116cd6f550..4c9d0629852 100644 --- a/crates/pdk/Cargo.toml +++ b/crates/pdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_pdk" -version = "0.0.12" +version = "0.0.13" edition = "2021" license = "MIT" description = "A plugin development kit for creating moon WASM plugins." @@ -9,7 +9,7 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_pdk_api = { version = "0.0.12", path = "../pdk-api" } +moon_pdk_api = { version = "0.0.13", path = "../pdk-api" } clap = { workspace = true, features = ["derive"] } extism-pdk = { workspace = true } serde = { workspace = true } diff --git a/crates/plugin/Cargo.toml b/crates/plugin/Cargo.toml index 2e10648e4a9..c02b1f9920b 100644 --- a/crates/plugin/Cargo.toml +++ b/crates/plugin/Cargo.toml @@ -11,7 +11,7 @@ publish = false [dependencies] moon_common = { path = "../common" } moon_env = { path = "../env" } -moon_pdk_api = { version = "0.0.12", path = "../pdk-api" } +moon_pdk_api = { version = "0.0.13", path = "../pdk-api" } moon_target = { path = "../target" } moon_workspace_graph = { path = "../workspace-graph" } async-trait = { workspace = true } diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index 73e2cc5cbed..a40e8ca936b 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -9,8 +9,8 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.0.10", path = "../common" } -moon_config = { version = "0.0.12", path = "../config" } +moon_common = { version = "0.0.11", path = "../common" } +moon_config = { version = "0.0.13", path = "../config" } moon_file_group = { version = "0.0.3", path = "../file-group" } moon_task = { version = "0.0.3", path = "../task" } miette = { workspace = true } diff --git a/crates/target/Cargo.toml b/crates/target/Cargo.toml index 415f6a97a22..d4e6442702e 100644 --- a/crates/target/Cargo.toml +++ b/crates/target/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moon_target" -version = "0.0.9" +version = "0.0.10" edition = "2021" license = "MIT" description = "Project + task target identifier." @@ -9,7 +9,7 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.0.10", path = "../common" } +moon_common = { version = "0.0.11", path = "../common" } compact_str = { workspace = true } miette = { workspace = true } once_cell = { workspace = true } diff --git a/crates/task/Cargo.toml b/crates/task/Cargo.toml index 2fb9619bf40..da1dbdc3d3e 100644 --- a/crates/task/Cargo.toml +++ b/crates/task/Cargo.toml @@ -9,9 +9,9 @@ repository = "https://github.com/moonrepo/moon" publish = true [dependencies] -moon_common = { version = "0.0.10", path = "../common" } -moon_config = { version = "0.0.12", path = "../config" } -moon_target = { version = "0.0.9", path = "../target" } +moon_common = { version = "0.0.11", path = "../common" } +moon_config = { version = "0.0.13", path = "../config" } +moon_target = { version = "0.0.10", path = "../target" } miette = { workspace = true } rustc-hash = { workspace = true } serde = { workspace = true } diff --git a/legacy/core/test-utils/Cargo.toml b/legacy/core/test-utils/Cargo.toml index 001ca84fca4..7cd8ad6f575 100644 --- a/legacy/core/test-utils/Cargo.toml +++ b/legacy/core/test-utils/Cargo.toml @@ -14,7 +14,7 @@ insta = "1.41.1" predicates = "3.1.3" pretty_assertions = "1.4.1" rustc-hash = { workspace = true } -serde_yaml = { workspace = true } +serde_yml = { workspace = true } starbase_utils = { workspace = true, features = ["glob"] } [lints] diff --git a/legacy/core/test-utils/src/sandbox.rs b/legacy/core/test-utils/src/sandbox.rs index 512cc24c316..f5d63eaff90 100644 --- a/legacy/core/test-utils/src/sandbox.rs +++ b/legacy/core/test-utils/src/sandbox.rs @@ -133,16 +133,16 @@ pub fn create_sandbox_with_config>( sandbox.create_file( ".moon/workspace.yml", - serde_yaml::to_string(&workspace_config.unwrap_or_default()).unwrap(), + serde_yml::to_string(&workspace_config.unwrap_or_default()).unwrap(), ); sandbox.create_file( ".moon/toolchain.yml", - serde_yaml::to_string(&toolchain_config.unwrap_or_default()).unwrap(), + serde_yml::to_string(&toolchain_config.unwrap_or_default()).unwrap(), ); if let Some(config) = tasks_config { - sandbox.create_file(".moon/tasks.yml", serde_yaml::to_string(&config).unwrap()); + sandbox.create_file(".moon/tasks.yml", serde_yml::to_string(&config).unwrap()); } sandbox diff --git a/legacy/deno/lang/Cargo.toml b/legacy/deno/lang/Cargo.toml index 643a1c118db..f3dc6981937 100644 --- a/legacy/deno/lang/Cargo.toml +++ b/legacy/deno/lang/Cargo.toml @@ -13,7 +13,7 @@ miette = { workspace = true } rustc-hash = { workspace = true } serde = { workspace = true } starbase_styles = { workspace = true } -starbase_utils = { workspace = true, features = ["json"] } +starbase_utils = { workspace = true, features = ["editor-config", "json"] } [lints] workspace = true diff --git a/legacy/node/lang/Cargo.toml b/legacy/node/lang/Cargo.toml index efbefa44828..71230d74e58 100644 --- a/legacy/node/lang/Cargo.toml +++ b/legacy/node/lang/Cargo.toml @@ -16,9 +16,13 @@ package-lock-json-parser = "0.4.0" rustc-hash = { workspace = true } serde = { workspace = true } serde_json = { workspace = true, features = ["preserve_order"] } -serde_yaml = { workspace = true } +serde_yml = { workspace = true } starbase_styles = { workspace = true } -starbase_utils = { workspace = true, features = ["json", "yaml"] } +starbase_utils = { workspace = true, features = [ + "editor-config", + "json", + "yaml", +] } tracing = { workspace = true } yarn-lock-parser = "0.10.0" diff --git a/legacy/node/lang/src/pnpm/mod.rs b/legacy/node/lang/src/pnpm/mod.rs index 14a3054900f..b9932fa2aa3 100644 --- a/legacy/node/lang/src/pnpm/mod.rs +++ b/legacy/node/lang/src/pnpm/mod.rs @@ -8,7 +8,7 @@ use dependency_path::PnpmDependencyPath; use moon_lang::{config_cache, LockfileDependencyVersions}; use rustc_hash::FxHashMap; use serde::{Deserialize, Serialize}; -use serde_yaml::Value; +use serde_yml::Value; use starbase_utils::yaml::read_file as read_yaml; use std::path::{Path, PathBuf}; @@ -91,7 +91,7 @@ mod tests { use super::*; use moon_test_utils::{assert_fs::prelude::*, create_temp_dir, pretty_assertions::assert_eq}; use moon_utils::string_vec; - use serde_yaml::{Mapping, Number}; + use serde_yml::{Mapping, Number}; #[test] fn parses_lockfile() { @@ -243,11 +243,11 @@ packages: .text() .unwrap(); - let _: PnpmLock = serde_yaml::from_str(&content).unwrap(); + let _: PnpmLock = serde_yml::from_str(&content).unwrap(); } #[test] fn parses_empty_lockfile() { - let _: PnpmLock = serde_yaml::from_str("lockfileVersion: '6.0'").unwrap(); + let _: PnpmLock = serde_yml::from_str("lockfileVersion: '6.0'").unwrap(); } } diff --git a/legacy/typescript/lang/Cargo.toml b/legacy/typescript/lang/Cargo.toml index a85b34d4b89..48730aa9a33 100644 --- a/legacy/typescript/lang/Cargo.toml +++ b/legacy/typescript/lang/Cargo.toml @@ -12,7 +12,7 @@ cached = { workspace = true } miette = { workspace = true } serde_json = { workspace = true, features = ["preserve_order"] } starbase_styles = { workspace = true } -starbase_utils = { workspace = true, features = ["json"] } +starbase_utils = { workspace = true, features = ["editor-config", "json"] } typescript_tsconfig_json = { version = "0.4.0", features = ["serialize"] } [dev-dependencies] From a043a505ea8fb357e62fbc986b4b6da05b1aa4ff Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sat, 25 Jan 2025 14:07:44 -0800 Subject: [PATCH 03/15] new: Support Depot for remote caching. (#1792) * Add settings. * More testing. * Get things working. * Add new action state. * Update impls. * Fix output. * Fix tests. * Fixes. * Change types. * Fix target state. * Improve errors. * Add backtrace. * Try from_str. * Fix tests. * More debugging. * Add docs. * Polish. * Bump versions. --- .github/workflows/moon.yml | 2 + .moon/workspace.yml | 33 +- .yarn/versions/c89cc34c.yml | 23 +- CHANGELOG.md | 12 + Cargo.lock | 2 + crates/config/src/workspace/remote_config.rs | 39 ++- crates/remote/Cargo.toml | 2 + crates/remote/src/action_state.rs | 145 ++++++++ crates/remote/src/compression.rs | 15 + crates/remote/src/fs_digest.rs | 18 +- crates/remote/src/grpc_remote_client.rs | 225 +++++++++--- crates/remote/src/grpc_tls.rs | 4 + crates/remote/src/lib.rs | 2 + crates/remote/src/remote_client.rs | 4 +- crates/remote/src/remote_error.rs | 11 +- crates/remote/src/remote_service.rs | 325 +++++++----------- .../task-expander/tests/task_expander_test.rs | 12 +- crates/task-runner/src/output_archiver.rs | 44 +-- crates/task-runner/src/output_hydrater.rs | 59 ++-- crates/task-runner/src/run_state.rs | 54 --- crates/task-runner/src/task_runner.rs | 162 ++++++--- .../task-runner/tests/output_archiver_test.rs | 62 +--- .../task-runner/tests/output_hydrater_test.rs | 33 +- crates/task-runner/tests/task_runner_test.rs | 104 ++---- packages/types/src/workspace-config.ts | 37 ++ website/docs/config/workspace.mdx | 48 +++ website/docs/guides/remote-cache.mdx | 25 ++ website/static/schemas/workspace.json | 60 ++++ 28 files changed, 951 insertions(+), 611 deletions(-) create mode 100644 crates/remote/src/action_state.rs diff --git a/.github/workflows/moon.yml b/.github/workflows/moon.yml index 993ae74b08b..2851a81003d 100644 --- a/.github/workflows/moon.yml +++ b/.github/workflows/moon.yml @@ -37,9 +37,11 @@ jobs: cache-base: '^(master|develop-)' - run: cargo run -- --color --log trace ci --base ${{ github.base_ref || 'master' }} env: + DEPOT_TOKEN: ${{ secrets.DEPOT_TOKEN }} MOON_NODE_VERSION: ${{ matrix.node-version }} MOONBASE_SECRET_KEY: ${{ secrets.MOONBASE_SECRET_KEY }} MOONBASE_ACCESS_KEY: ${{ secrets.MOONBASE_ACCESS_KEY }} + RUST_BACKTRACE: '1' - uses: moonrepo/run-report-action@v1 if: success() || failure() with: diff --git a/.moon/workspace.yml b/.moon/workspace.yml index a463d2809ea..3ab758bac69 100644 --- a/.moon/workspace.yml +++ b/.moon/workspace.yml @@ -35,17 +35,22 @@ docker: include: - '*.config.js' - '*.json' -# unstable_remote: -# host: 'http://0.0.0.0:8080' -# # host: 'grpc://0.0.0.0:9092' -# cache: -# compression: 'zstd' -# mtls: -# caCert: 'crates/remote/tests/__fixtures__/certs-local/ca.pem' -# clientCert: 'crates/remote/tests/__fixtures__/certs-local/client.pem' -# clientKey: 'crates/remote/tests/__fixtures__/certs-local/client.key' -# domain: 'localhost' -# tls: -# # assumeHttp2: true -# cert: 'crates/remote/tests/__fixtures__/certs-local/ca.pem' -# # domain: 'localhost' + +unstable_remote: + host: 'grpcs://cache.depot.dev' + auth: + token: 'DEPOT_TOKEN' + headers: + 'X-Depot-Org': '1xtpjd084j' + 'X-Depot-Project': '90xxfkst9n' + # cache: + # compression: 'zstd' + # mtls: + # caCert: 'crates/remote/tests/__fixtures__/certs-local/ca.pem' + # clientCert: 'crates/remote/tests/__fixtures__/certs-local/client.pem' + # clientKey: 'crates/remote/tests/__fixtures__/certs-local/client.key' + # domain: 'localhost' + # tls: + # # assumeHttp2: true + # cert: 'crates/remote/tests/__fixtures__/certs-local/client.pem' + # domain: 'localhost' diff --git a/.yarn/versions/c89cc34c.yml b/.yarn/versions/c89cc34c.yml index 28fac241db0..0e53606a2e7 100644 --- a/.yarn/versions/c89cc34c.yml +++ b/.yarn/versions/c89cc34c.yml @@ -1,9 +1,16 @@ releases: - "@moonrepo/cli": minor - "@moonrepo/core-linux-arm64-gnu": minor - "@moonrepo/core-linux-arm64-musl": minor - "@moonrepo/core-linux-x64-gnu": minor - "@moonrepo/core-linux-x64-musl": minor - "@moonrepo/core-macos-arm64": minor - "@moonrepo/core-macos-x64": minor - "@moonrepo/core-windows-x64-msvc": minor + '@moonrepo/cli': minor + '@moonrepo/core-linux-arm64-gnu': minor + '@moonrepo/core-linux-arm64-musl': minor + '@moonrepo/core-linux-x64-gnu': minor + '@moonrepo/core-linux-x64-musl': minor + '@moonrepo/core-macos-arm64': minor + '@moonrepo/core-macos-x64': minor + '@moonrepo/core-windows-x64-msvc': minor + '@moonrepo/types': minor + +declined: + - '@moonrepo/nx-compat' + - '@moonrepo/report' + - '@moonrepo/runtime' + - website diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ad00ae61c0..ff5fdea4a86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## Unreleased + +#### 🚀 Updates + +- Updated our unstable remote service (Bazel RE API) with new functionality: + - You can now use `http(s)` protocols for gRPC servers, instead of just `grpc(s)`. + - Added an `unstable_remote.api` setting, which can be used to inform the server's API format. + Defaults to `grpc`. + - Added an `unstable_remote.auth` setting, which can be used for HTTP Bearer/token Authorization + based endpoints. Can also be used to set headers for all requests. + - Added support for Depot cloud-based caching: https://depot.dev/docs/cache/overview + ## 1.31.3 #### 🐞 Fixes diff --git a/Cargo.lock b/Cargo.lock index 8544d16f453..26e4eb67fe1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4303,11 +4303,13 @@ version = "0.0.1" dependencies = [ "async-trait", "bazel-remote-apis", + "bincode", "chrono", "miette 7.4.0", "moon_action", "moon_common", "moon_config", + "moon_task", "reqwest", "rustc-hash", "scc", diff --git a/crates/config/src/workspace/remote_config.rs b/crates/config/src/workspace/remote_config.rs index 2faf86cf228..3642308d9e5 100644 --- a/crates/config/src/workspace/remote_config.rs +++ b/crates/config/src/workspace/remote_config.rs @@ -1,4 +1,5 @@ use crate::portable_path::FilePath; +use rustc_hash::FxHashMap; use schematic::{derive_enum, validate, Config, ConfigEnum, ValidateError, ValidateResult}; fn path_is_required( @@ -15,6 +16,27 @@ fn path_is_required( } derive_enum!( + /// The API format of the remote service. + #[derive(Copy, ConfigEnum, Default)] + pub enum RemoteApi { + /// gRPC endpoints. + #[default] + Grpc, + } +); + +/// Configures basic HTTP authentication. +#[derive(Clone, Config, Debug)] +pub struct RemoteAuthConfig { + /// HTTP headers to inject into every request. + pub headers: FxHashMap, + + /// The name of an environment variable to use as a bearer token. + pub token: Option, +} + +derive_enum!( + /// Supported blob compression levels. #[derive(Copy, ConfigEnum, Default)] pub enum RemoteCompression { /// No compression. @@ -81,6 +103,13 @@ pub struct RemoteMtlsConfig { /// Configures the remote service, powered by the Bazel Remote Execution API. #[derive(Clone, Config, Debug)] pub struct RemoteConfig { + /// The API format of the remote service. + pub api: RemoteApi, + + /// Connect to the host using basic HTTP authentication. + #[setting(nested)] + pub auth: Option, + /// Configures the action cache (AC) and content addressable cache (CAS). #[setting(nested)] pub cache: RemoteCacheConfig, @@ -101,11 +130,19 @@ pub struct RemoteConfig { } impl RemoteConfig { + pub fn is_bearer_auth(&self) -> bool { + self.auth.as_ref().is_some_and(|auth| auth.token.is_some()) + } + pub fn is_localhost(&self) -> bool { self.host.contains("localhost") || self.host.contains("0.0.0.0") } pub fn is_secure(&self) -> bool { - self.tls.is_some() || self.mtls.is_some() + self.is_bearer_auth() || self.tls.is_some() || self.mtls.is_some() + } + + pub fn is_secure_protocol(&self) -> bool { + self.host.starts_with("https") || self.host.starts_with("grpcs") } } diff --git a/crates/remote/Cargo.toml b/crates/remote/Cargo.toml index 1e7f184ae07..868ef3df692 100644 --- a/crates/remote/Cargo.toml +++ b/crates/remote/Cargo.toml @@ -8,8 +8,10 @@ publish = false moon_action = { path = "../action" } moon_common = { path = "../common" } moon_config = { path = "../config" } +moon_task = { path = "../task" } async-trait = { workspace = true } bazel-remote-apis = { version = "0.12.0", features = ["serde"] } +bincode = "1.3.3" chrono = { workspace = true } miette = { workspace = true } reqwest = { workspace = true, features = ["json"] } diff --git a/crates/remote/src/action_state.rs b/crates/remote/src/action_state.rs new file mode 100644 index 00000000000..d01199551be --- /dev/null +++ b/crates/remote/src/action_state.rs @@ -0,0 +1,145 @@ +use crate::fs_digest::*; +use bazel_remote_apis::build::bazel::remote::execution::v2::{ + command, platform, Action, ActionResult, Command, Digest, ExecutedActionMetadata, +}; +use miette::IntoDiagnostic; +use moon_action::Operation; +use moon_task::Task; +use std::collections::BTreeMap; +use std::path::Path; + +pub struct ActionState<'task> { + task: &'task Task, + + // RE API + pub action: Option, + pub action_result: Option, + pub command: Option, + pub digest: Digest, + + // To upload + pub blobs: Vec, +} + +impl ActionState<'_> { + pub fn new(digest: Digest, task: &Task) -> ActionState<'_> { + ActionState { + task, + action: None, + action_result: None, + command: None, + digest, + blobs: vec![], + } + } + + pub fn create_action_from_task(&mut self) { + let mut action = Action { + command_digest: Some(self.digest.clone()), + do_not_cache: !self.task.options.cache, + input_root_digest: None, // TODO? + ..Default::default() + }; + + // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/platform.md + if let Some(os_list) = &self.task.options.os { + let platform = action.platform.get_or_insert_default(); + + for os in os_list { + platform.properties.push(platform::Property { + name: "OSFamily".into(), + value: os.to_string(), + }); + } + } + + // Since we don't support (or plan to) remote execution, + // then we can ignore all the working directory logic + let mut command = Command { + arguments: vec![self.task.command.clone()], + output_paths: vec![], // TODO + ..Default::default() + }; + + command.arguments.extend(self.task.args.clone()); + + for (name, value) in BTreeMap::from_iter(self.task.env.clone()) { + command + .environment_variables + .push(command::EnvironmentVariable { name, value }); + } + + self.action = Some(action); + self.command = Some(command); + } + + pub fn create_action_result_from_operation( + &mut self, + operation: &Operation, + ) -> miette::Result<()> { + let mut result = ActionResult { + execution_metadata: Some(ExecutedActionMetadata { + worker: "moon".into(), + execution_start_timestamp: create_timestamp_from_naive(operation.started_at), + execution_completed_timestamp: operation + .finished_at + .and_then(create_timestamp_from_naive), + ..Default::default() + }), + ..Default::default() + }; + + if let Some(exec) = operation.get_output() { + result.exit_code = exec.exit_code.unwrap_or_default(); + + if let Some(stderr) = &exec.stderr { + let blob = Blob::new(stderr.as_bytes().to_owned()); + + result.stderr_digest = Some(blob.digest.clone()); + self.blobs.push(blob); + } + + if let Some(stdout) = &exec.stdout { + let blob = Blob::new(stdout.as_bytes().to_owned()); + + result.stdout_digest = Some(blob.digest.clone()); + self.blobs.push(blob); + } + } + + self.action_result = Some(result); + + Ok(()) + } + + pub fn set_action_result(&mut self, result: ActionResult) { + self.action_result = Some(result); + } + + pub fn compute_outputs(&mut self, workspace_root: &Path) -> miette::Result<()> { + let mut outputs = OutputDigests::default(); + + for path in self.task.get_output_files(workspace_root, true)? { + outputs.insert_relative_path(path, workspace_root)?; + } + + if let Some(result) = &mut self.action_result { + result.output_files = outputs.files; + result.output_symlinks = outputs.symlinks; + result.output_directories = outputs.dirs; + self.blobs.extend(outputs.blobs); + } + + Ok(()) + } + + pub fn get_command_as_bytes(&self) -> miette::Result> { + bincode::serialize(&self.command).into_diagnostic() + } + + pub fn prepare_for_upload(&mut self) -> Option<(ActionResult, Vec)> { + self.action_result + .take() + .map(|result| (result, self.blobs.drain(0..).collect::>())) + } +} diff --git a/crates/remote/src/compression.rs b/crates/remote/src/compression.rs index 669328df00a..3e7441c6224 100644 --- a/crates/remote/src/compression.rs +++ b/crates/remote/src/compression.rs @@ -23,6 +23,21 @@ pub fn get_compressor(compression: RemoteCompression) -> i32 { } } +#[allow(dead_code)] +pub fn get_compression_from_value(compressor: compressor::Value) -> RemoteCompression { + match compressor { + compressor::Value::Zstd => RemoteCompression::Zstd, + _ => RemoteCompression::None, + } +} + +pub fn get_compression_from_code(compressor: i32) -> RemoteCompression { + match compressor { + zstd if zstd == compressor::Value::Zstd as i32 => RemoteCompression::Zstd, + _ => RemoteCompression::None, + } +} + pub fn compress_blob(compression: RemoteCompression, bytes: Vec) -> miette::Result> { let result = match compression { RemoteCompression::None => Ok(bytes), diff --git a/crates/remote/src/fs_digest.rs b/crates/remote/src/fs_digest.rs index 1687a124cc9..8b07edd3236 100644 --- a/crates/remote/src/fs_digest.rs +++ b/crates/remote/src/fs_digest.rs @@ -3,7 +3,7 @@ use bazel_remote_apis::build::bazel::remote::execution::v2::{ Digest, NodeProperties, OutputDirectory, OutputFile, OutputSymlink, }; -use bazel_remote_apis::google::protobuf::{Timestamp, UInt32Value}; +use bazel_remote_apis::google::protobuf::Timestamp; use chrono::NaiveDateTime; use moon_common::path::{PathExt, WorkspaceRelativePathBuf}; use sha2::{Digest as Sha256Digest, Sha256}; @@ -14,7 +14,6 @@ use std::{ path::{Path, PathBuf}, time::{Duration, SystemTime, UNIX_EPOCH}, }; -use tracing::instrument; pub struct Blob { pub bytes: Vec, @@ -77,6 +76,7 @@ pub fn compute_node_properties(metadata: &Metadata) -> NodeProperties { #[cfg(unix)] { + use bazel_remote_apis::google::protobuf::UInt32Value; use std::os::unix::fs::PermissionsExt; props.unix_mode = Some(UInt32Value { @@ -157,20 +157,6 @@ impl OutputDigests { } } -#[instrument] -pub fn compute_digests_for_outputs( - paths: Vec, - workspace_root: &Path, -) -> miette::Result { - let mut result = OutputDigests::default(); - - for path in paths { - result.insert_relative_path(path, workspace_root)?; - } - - Ok(result) -} - fn apply_node_properties(path: &Path, props: &NodeProperties) -> miette::Result<()> { if let Some(mtime) = &props.mtime { let modified = Duration::new(mtime.seconds as u64, mtime.nanos as u32); diff --git a/crates/remote/src/grpc_remote_client.rs b/crates/remote/src/grpc_remote_client.rs index 456855c9ec9..e3d8bc32fa2 100644 --- a/crates/remote/src/grpc_remote_client.rs +++ b/crates/remote/src/grpc_remote_client.rs @@ -7,40 +7,95 @@ use bazel_remote_apis::build::bazel::remote::execution::v2::{ action_cache_client::ActionCacheClient, batch_update_blobs_request, capabilities_client::CapabilitiesClient, content_addressable_storage_client::ContentAddressableStorageClient, digest_function, - ActionResult, BatchReadBlobsRequest, BatchUpdateBlobsRequest, Digest, GetActionResultRequest, - GetCapabilitiesRequest, ServerCapabilities, UpdateActionResultRequest, + ActionResult, BatchReadBlobsRequest, BatchUpdateBlobsRequest, Digest, FindMissingBlobsRequest, + GetActionResultRequest, GetCapabilitiesRequest, ServerCapabilities, UpdateActionResultRequest, }; +use miette::IntoDiagnostic; use moon_common::color; -use moon_config::{RemoteCompression, RemoteConfig}; -use std::{error::Error, path::Path}; +use moon_config::RemoteConfig; +use std::{env, path::Path, str::FromStr}; use tonic::{ + metadata::{KeyAndValueRef, MetadataKey, MetadataMap, MetadataValue}, transport::{Channel, Endpoint}, - Code, + Code, Request, Status, }; use tracing::{trace, warn}; fn map_transport_error(error: tonic::transport::Error) -> RemoteError { + // dbg!(&error); RemoteError::GrpcConnectFailed { error: Box::new(error), } } fn map_status_error(error: tonic::Status) -> RemoteError { - match error.source() { - Some(src) => RemoteError::GrpcCallFailedViaSource { - error: src.to_string(), - }, - None => RemoteError::GrpcCallFailed { - error: Box::new(error), - }, + // dbg!(&error); + RemoteError::GrpcCallFailed { + error: Box::new(error), } } #[derive(Default)] pub struct GrpcRemoteClient { channel: Option, - compression: RemoteCompression, - instance_name: String, + config: RemoteConfig, + headers: MetadataMap, +} + +impl GrpcRemoteClient { + fn extract_headers(&mut self) -> miette::Result { + let mut enabled = true; + + if let Some(auth) = &self.config.auth { + for (key, value) in &auth.headers { + self.headers.insert( + MetadataKey::from_str(key).into_diagnostic()?, + MetadataValue::from_str(value).into_diagnostic()?, + ); + } + + if let Some(token_name) = &auth.token { + let token = env::var(token_name).unwrap_or_default(); + + if token.is_empty() { + enabled = false; + + warn!( + "Auth token {} does not exist, unable to authorize for remote service", + color::property(token_name) + ); + } else { + self.headers.insert( + MetadataKey::from_str("Authorization").into_diagnostic()?, + MetadataValue::from_str(&format!("Bearer {token}")).into_diagnostic()?, + ); + } + } + } + + Ok(enabled) + } + + fn inject_auth_headers(&self, mut req: Request<()>) -> Result, Status> { + if self.headers.is_empty() { + return Ok(req); + } + + let headers = req.metadata_mut(); + + for entry in self.headers.iter() { + match entry { + KeyAndValueRef::Ascii(key, value) => { + headers.insert(key.clone(), value.clone()); + } + KeyAndValueRef::Binary(key, value) => { + headers.insert_bin(key.clone(), value.clone()); + } + }; + } + + Ok(req) + } } #[async_trait::async_trait] @@ -49,7 +104,7 @@ impl RemoteClient for GrpcRemoteClient { &mut self, config: &RemoteConfig, workspace_root: &Path, - ) -> miette::Result<()> { + ) -> miette::Result { let host = &config.host; trace!( @@ -60,12 +115,22 @@ impl RemoteClient for GrpcRemoteClient { "(with mTLS)" } else if config.tls.is_some() { "(with TLS)" + } else if config.is_bearer_auth() { + "(with auth)" } else { "(insecure)" } ); - let mut endpoint = Endpoint::from_shared(host.to_owned()) + // Although we use a grpc(s) protocol for the host, + // tonic only supports http(s), so change it + let url = if let Some(suffix) = host.strip_prefix("grpc") { + format!("http{suffix}") + } else { + host.to_owned() + }; + + let mut endpoint = Endpoint::from_shared(url) .map_err(map_transport_error)? .user_agent("moon") .map_err(map_transport_error)? @@ -79,6 +144,10 @@ impl RemoteClient for GrpcRemoteClient { endpoint = endpoint .tls_config(create_tls_config(tls, workspace_root)?) .map_err(map_transport_error)?; + } else if config.is_secure_protocol() { + endpoint = endpoint + .tls_config(create_native_tls_config()?) + .map_err(map_transport_error)?; } if config.is_localhost() { @@ -92,22 +161,32 @@ impl RemoteClient for GrpcRemoteClient { ); } - self.channel = Some(endpoint.connect().await.map_err(map_transport_error)?); - self.compression = config.cache.compression; - self.instance_name = config.cache.instance_name.clone(); + self.config = config.to_owned(); + let enabled = self.extract_headers()?; + + // We can't inject auth headers into this initial connection, + // so defer the connection until a client is used + if self.config.is_bearer_auth() { + self.channel = Some(endpoint.connect_lazy()); + } else { + self.channel = Some(endpoint.connect().await.map_err(map_transport_error)?); + } - Ok(()) + Ok(enabled) } // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L452 async fn load_capabilities(&self) -> miette::Result { - let mut client = CapabilitiesClient::new(self.channel.clone().unwrap()); + let mut client = + CapabilitiesClient::with_interceptor(self.channel.clone().unwrap(), |req| { + self.inject_auth_headers(req) + }); trace!("Loading remote execution API capabilities from gRPC server"); let response = client .get_capabilities(GetCapabilitiesRequest { - instance_name: self.instance_name.clone(), + instance_name: self.config.cache.instance_name.clone(), }) .await .map_err(map_status_error)?; @@ -117,13 +196,16 @@ impl RemoteClient for GrpcRemoteClient { // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L170 async fn get_action_result(&self, digest: &Digest) -> miette::Result> { - let mut client = ActionCacheClient::new(self.channel.clone().unwrap()); + let mut client = + ActionCacheClient::with_interceptor(self.channel.clone().unwrap(), |req| { + self.inject_auth_headers(req) + }); trace!(hash = &digest.hash, "Checking for a cached action result"); match client .get_action_result(GetActionResultRequest { - instance_name: self.instance_name.clone(), + instance_name: self.config.cache.instance_name.clone(), action_digest: Some(digest.to_owned()), inline_stderr: true, inline_stdout: true, @@ -150,8 +232,20 @@ impl RemoteClient for GrpcRemoteClient { if matches!(status.code(), Code::NotFound) { trace!(hash = &digest.hash, "Cache miss on action result"); + Ok(None) + } + // If we hit an out of range error, the payload is larger than the grpc + // limit, and will fail the entire pipeline. Instead of letting that + // happen, let's just do a cache miss instead... + else if matches!(status.code(), Code::OutOfRange) { + trace!( + hash = &digest.hash, + "Cache miss because the expected payload is too large" + ); + Ok(None) } else { + // dbg!("get_action_result", digest); Err(map_status_error(status).into()) } } @@ -164,7 +258,10 @@ impl RemoteClient for GrpcRemoteClient { digest: &Digest, result: ActionResult, ) -> miette::Result> { - let mut client = ActionCacheClient::new(self.channel.clone().unwrap()); + let mut client = + ActionCacheClient::with_interceptor(self.channel.clone().unwrap(), |req| { + self.inject_auth_headers(req) + }); trace!( hash = &digest.hash, @@ -177,7 +274,7 @@ impl RemoteClient for GrpcRemoteClient { match client .update_action_result(UpdateActionResultRequest { - instance_name: self.instance_name.clone(), + instance_name: self.config.cache.instance_name.clone(), action_digest: Some(digest.to_owned()), action_result: Some(result), digest_function: digest_function::Value::Sha256 as i32, @@ -210,31 +307,55 @@ impl RemoteClient for GrpcRemoteClient { Ok(None) } else { + // dbg!("update_action_result", digest); Err(map_status_error(status).into()) } } } } + // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L351 + async fn find_missing_blobs(&self, blob_digests: Vec) -> miette::Result> { + let mut client = ContentAddressableStorageClient::with_interceptor( + self.channel.clone().unwrap(), + |req| self.inject_auth_headers(req), + ); + + match client + .find_missing_blobs(FindMissingBlobsRequest { + instance_name: self.config.cache.instance_name.clone(), + blob_digests, + digest_function: digest_function::Value::Sha256 as i32, + }) + .await + { + Ok(response) => Ok(response.into_inner().missing_blob_digests), + Err(status) => Err(map_status_error(status).into()), + } + } + // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L403 async fn batch_read_blobs( &self, digest: &Digest, blob_digests: Vec, ) -> miette::Result> { - let mut client = ContentAddressableStorageClient::new(self.channel.clone().unwrap()); + let mut client = ContentAddressableStorageClient::with_interceptor( + self.channel.clone().unwrap(), + |req| self.inject_auth_headers(req), + ); trace!( hash = &digest.hash, - compression = self.compression.to_string(), + compression = self.config.cache.compression.to_string(), "Downloading {} output blobs", blob_digests.len() ); let response = match client .batch_read_blobs(BatchReadBlobsRequest { - acceptable_compressors: get_acceptable_compressors(self.compression), - instance_name: self.instance_name.clone(), + acceptable_compressors: get_acceptable_compressors(self.config.cache.compression), + instance_name: self.config.cache.instance_name.clone(), digests: blob_digests, digest_function: digest_function::Value::Sha256 as i32, }) @@ -250,6 +371,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(vec![]) } else { + // dbg!("batch_read_blobs", digest); Err(map_status_error(status).into()) }; } @@ -260,11 +382,19 @@ impl RemoteClient for GrpcRemoteClient { for download in response.into_inner().responses { if let Some(status) = download.status { - if status.code != 0 { + let code = Code::from_i32(status.code); + + if !matches!(code, Code::Ok | Code::NotFound) { warn!( + hash = &digest.hash, details = ?status.details, + code = ?code, "Failed to download blob: {}", - status.message + if status.message.is_empty() { + code.to_string() + } else { + status.message + } ); } } @@ -272,7 +402,10 @@ impl RemoteClient for GrpcRemoteClient { if let Some(digest) = download.digest { blobs.push(Blob { digest, - bytes: decompress_blob(self.compression, download.data)?, + bytes: decompress_blob( + get_compression_from_code(download.compressor), + download.data, + )?, }); } @@ -295,11 +428,14 @@ impl RemoteClient for GrpcRemoteClient { digest: &Digest, blobs: Vec, ) -> miette::Result>> { - let mut client = ContentAddressableStorageClient::new(self.channel.clone().unwrap()); + let mut client = ContentAddressableStorageClient::with_interceptor( + self.channel.clone().unwrap(), + |req| self.inject_auth_headers(req), + ); trace!( hash = &digest.hash, - compression = self.compression.to_string(), + compression = self.config.cache.compression.to_string(), "Uploading {} output blobs", blobs.len() ); @@ -309,14 +445,14 @@ impl RemoteClient for GrpcRemoteClient { for blob in blobs { requests.push(batch_update_blobs_request::Request { digest: Some(blob.digest), - data: compress_blob(self.compression, blob.bytes)?, - compressor: get_compressor(self.compression), + data: compress_blob(self.config.cache.compression, blob.bytes)?, + compressor: get_compressor(self.config.cache.compression), }); } let response = match client .batch_update_blobs(BatchUpdateBlobsRequest { - instance_name: self.instance_name.clone(), + instance_name: self.config.cache.instance_name.clone(), requests, digest_function: digest_function::Value::Sha256 as i32, }) @@ -342,6 +478,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(vec![]) } else { + // dbg!("batch_update_blobs", digest); Err(map_status_error(status).into()) }; } @@ -352,11 +489,19 @@ impl RemoteClient for GrpcRemoteClient { for upload in response.into_inner().responses { if let Some(status) = upload.status { - if status.code != 0 { + let code = Code::from_i32(status.code); + + if !matches!(code, Code::Ok) { warn!( + hash = &digest.hash, details = ?status.details, + code = ?code, "Failed to upload blob: {}", - status.message + if status.message.is_empty() { + code.to_string() + } else { + status.message + } ); } } diff --git a/crates/remote/src/grpc_tls.rs b/crates/remote/src/grpc_tls.rs index b0c04437018..e6ac31db790 100644 --- a/crates/remote/src/grpc_tls.rs +++ b/crates/remote/src/grpc_tls.rs @@ -16,6 +16,10 @@ use tracing::trace; // - client `*.key` file // - domain name +pub fn create_native_tls_config() -> miette::Result { + Ok(ClientTlsConfig::new().with_enabled_roots()) +} + // https://github.com/hyperium/tonic/blob/master/examples/src/tls/client.rs pub fn create_tls_config( config: &RemoteTlsConfig, diff --git a/crates/remote/src/lib.rs b/crates/remote/src/lib.rs index 7042471680e..4afce306cd2 100644 --- a/crates/remote/src/lib.rs +++ b/crates/remote/src/lib.rs @@ -1,3 +1,4 @@ +mod action_state; mod compression; mod fs_digest; mod grpc_remote_client; @@ -8,6 +9,7 @@ mod remote_client; mod remote_error; mod remote_service; +pub use action_state::*; pub use bazel_remote_apis::build::bazel::remote::execution::v2::Digest; pub use fs_digest::*; pub use remote_error::*; diff --git a/crates/remote/src/remote_client.rs b/crates/remote/src/remote_client.rs index c83a9fbbd55..020011cf2b8 100644 --- a/crates/remote/src/remote_client.rs +++ b/crates/remote/src/remote_client.rs @@ -11,7 +11,7 @@ pub trait RemoteClient: Send + Sync { &mut self, config: &RemoteConfig, workspace_root: &Path, - ) -> miette::Result<()>; + ) -> miette::Result; async fn load_capabilities(&self) -> miette::Result; @@ -23,6 +23,8 @@ pub trait RemoteClient: Send + Sync { result: ActionResult, ) -> miette::Result>; + async fn find_missing_blobs(&self, blob_digests: Vec) -> miette::Result>; + async fn batch_read_blobs( &self, digest: &Digest, diff --git a/crates/remote/src/remote_error.rs b/crates/remote/src/remote_error.rs index 51217b3fbe5..aa83dfa6d09 100644 --- a/crates/remote/src/remote_error.rs +++ b/crates/remote/src/remote_error.rs @@ -5,15 +5,8 @@ use thiserror::Error; #[derive(Error, Debug, Diagnostic)] pub enum RemoteError { #[diagnostic(code(remote::grpc::call_failed))] - #[error("Failed to make gRPC call.")] - GrpcCallFailed { - #[source] - error: Box, - }, - - #[diagnostic(code(remote::grpc::call_failed))] - #[error("Failed to make gRPC call: {error}")] - GrpcCallFailedViaSource { error: String }, + #[error("Failed to make gRPC call.\n{}: {}", .error.code(), .error.message())] + GrpcCallFailed { error: Box }, #[diagnostic(code(remote::grpc::connect_failed))] #[error("Failed to connect to gRPC host.")] diff --git a/crates/remote/src/remote_service.rs b/crates/remote/src/remote_service.rs index 02e9e7b6b47..f8f2d47af69 100644 --- a/crates/remote/src/remote_service.rs +++ b/crates/remote/src/remote_service.rs @@ -2,15 +2,14 @@ use crate::compression::*; use crate::fs_digest::*; use crate::grpc_remote_client::GrpcRemoteClient; // use crate::http_remote_client::HttpRemoteClient; +use crate::action_state::ActionState; use crate::remote_client::RemoteClient; -use crate::RemoteError; use bazel_remote_apis::build::bazel::remote::execution::v2::{ - digest_function, ActionResult, Digest, ExecutedActionMetadata, ServerCapabilities, + digest_function, ActionResult, Digest, ServerCapabilities, }; use miette::IntoDiagnostic; -use moon_action::Operation; use moon_common::{color, is_ci}; -use moon_config::RemoteConfig; +use moon_config::{RemoteApi, RemoteCompression, RemoteConfig}; use rustc_hash::FxHashMap; use std::collections::BTreeMap; use std::path::{Path, PathBuf}; @@ -26,7 +25,6 @@ pub struct RemoteService { pub config: RemoteConfig, pub workspace_root: PathBuf, - action_results: scc::HashMap, cache_enabled: bool, capabilities: ServerCapabilities, client: Arc>, @@ -38,6 +36,10 @@ impl RemoteService { INSTANCE.get().cloned() } + pub fn is_enabled() -> bool { + INSTANCE.get().is_some_and(|remote| remote.cache_enabled) + } + #[instrument] pub async fn connect(config: &RemoteConfig, workspace_root: &Path) -> miette::Result<()> { if is_ci() && config.is_localhost() { @@ -55,38 +57,35 @@ impl RemoteService { ); info!("Please report any issues to GitHub or Discord"); - let mut client: Box = - if config.host.starts_with("http://") || config.host.starts_with("https://") { - // Box::new(HttpRemoteClient::default()) - return Err(RemoteError::NoHttpClient.into()); - } else if config.host.starts_with("grpc://") || config.host.starts_with("grpcs://") { - Box::new(GrpcRemoteClient::default()) - } else { - return Err(RemoteError::UnknownHostProtocol.into()); - }; - - client.connect_to_host(config, workspace_root).await?; + let mut client = match config.api { + RemoteApi::Grpc => Box::new(GrpcRemoteClient::default()), + }; let mut instance = Self { - action_results: scc::HashMap::default(), - capabilities: client.load_capabilities().await?, - cache_enabled: false, + cache_enabled: client.connect_to_host(config, workspace_root).await?, + capabilities: ServerCapabilities::default(), client: Arc::new(client), config: config.to_owned(), upload_requests: Arc::new(RwLock::new(vec![])), workspace_root: workspace_root.to_owned(), }; - instance.validate_capabilities()?; + instance.validate_capabilities().await?; let _ = INSTANCE.set(Arc::new(instance)); Ok(()) } - pub fn validate_capabilities(&mut self) -> miette::Result<()> { + pub async fn validate_capabilities(&mut self) -> miette::Result<()> { let host = &self.config.host; - let mut enabled = true; + let mut enabled = self.cache_enabled; + + if !enabled { + return Ok(()); + } + + self.capabilities = self.client.load_capabilities().await?; if let Some(cap) = &self.capabilities.cache_capabilities { let sha256_fn = digest_function::Value::Sha256 as i32; @@ -100,27 +99,32 @@ impl RemoteService { ); } - let compressor = get_compressor(self.config.cache.compression); + let compression = self.config.cache.compression; + let compressor = get_compressor(compression); - if !cap.supported_compressors.contains(&compressor) { + if compression != RemoteCompression::None + && !cap.supported_compressors.contains(&compressor) + { enabled = false; warn!( host, "Remote service does not support {} compression, but it has been configured and enabled through the {} setting", - compressor, - color::property("remote.cache.compression"), + compression, + color::property("unstable_remote.cache.compression"), ); } - if !cap.supported_batch_update_compressors.contains(&compressor) { + if compression != RemoteCompression::None + && !cap.supported_batch_update_compressors.contains(&compressor) + { enabled = false; warn!( host, "Remote service does not support {} compression for batching, but it has been configured and enabled through the {} setting", - compressor, - color::property("remote.cache.compression"), + compression, + color::property("unstable_remote.cache.compression"), ); } @@ -151,7 +155,8 @@ impl RemoteService { } pub fn get_max_batch_size(&self) -> i64 { - self.capabilities + let max = self + .capabilities .cache_capabilities .as_ref() .and_then(|cap| { @@ -161,104 +166,77 @@ impl RemoteService { Some(cap.max_batch_total_size_bytes) } }) - // grpc limit: 4mb - buffer - .unwrap_or(4194304 - (1024 * 10)) + // grpc limit: 4mb + .unwrap_or(4194304); + + // Subtract a chunk from the max size, because when down/uploading blobs, + // we need to account for the non-blob data in the request/response, like the + // compression level, digest strings, etc. All of these "add up" and can + // bump the total body size larger than the actual limit. Is there a better + // way to handle this? Probably... + max - (1024 * 10) } - #[instrument(skip(self))] - pub async fn is_operation_cached(&self, digest: &Digest) -> miette::Result { + #[instrument(skip(self, state))] + pub async fn is_action_cached( + &self, + state: &ActionState<'_>, + ) -> miette::Result> { if !self.cache_enabled { - return Ok(false); - } - - if self.action_results.contains_async(&digest.hash).await { - return Ok(true); - } - - if let Some(result) = self.client.get_action_result(digest).await? { - let _ = self - .action_results - .insert_async(digest.hash.clone(), result) - .await; - - return Ok(true); + return Ok(None); } - Ok(false) + self.client.get_action_result(&state.digest).await } - #[instrument(skip(self, operation))] - pub async fn save_operation( - &self, - digest: &Digest, - operation: &Operation, - ) -> miette::Result<()> { - if !self.cache_enabled || operation.has_failed() { + #[instrument(skip(self, state))] + pub async fn save_action(&self, state: &mut ActionState<'_>) -> miette::Result<()> { + if !self.cache_enabled { return Ok(()); } - let operation_label = operation.label().to_owned(); - - debug!( - hash = &digest.hash, - "Caching {} operation", - color::muted_light(&operation_label) - ); - - let result = self.create_action_result_from_operation(operation, None)?; - let digest = digest.to_owned(); - let client = Arc::clone(&self.client); - - self.upload_requests - .write() - .await - .push(tokio::spawn(async move { - if let Err(error) = client.update_action_result(&digest, result).await { - warn!( - hash = &digest.hash, - "Failed to cache {} operation: {}", - color::muted_light(operation_label), - color::muted_light(error.to_string()), - ); - } - })); + let missing = self + .client + .find_missing_blobs(vec![state.digest.clone()]) + .await?; + + if missing.contains(&state.digest) { + // Create on demand when needed, instead of always + state.create_action_from_task(); + + self.client + .batch_update_blobs( + &state.digest, + vec![Blob { + bytes: state.get_command_as_bytes()?, + digest: state.digest.clone(), + }], + ) + .await?; + } Ok(()) } - #[instrument(skip(self, operation, outputs))] - pub async fn save_operation_with_outputs( - &self, - digest: &Digest, - operation: &Operation, - mut outputs: OutputDigests, - ) -> miette::Result<()> { - if !self.cache_enabled || operation.has_failed() { + #[instrument(skip(self, state))] + pub async fn save_action_result(&self, state: &mut ActionState<'_>) -> miette::Result<()> { + if !self.cache_enabled { return Ok(()); } - let operation_label = operation.label().to_owned(); - - debug!( - hash = &digest.hash, - "Caching {} operation with outputs", - color::muted_light(&operation_label) - ); - - let mut result = self.create_action_result_from_operation(operation, Some(&mut outputs))?; - result.output_files = outputs.files; - result.output_symlinks = outputs.symlinks; - result.output_directories = outputs.dirs; + let Some((mut result, blobs)) = state.prepare_for_upload() else { + return Ok(()); + }; - let digest = digest.to_owned(); let client = Arc::clone(&self.client); + let digest = state.digest.clone(); let max_size = self.get_max_batch_size(); self.upload_requests .write() .await .push(tokio::spawn(async move { - if !outputs.blobs.is_empty() { + if !blobs.is_empty() { if let Some(metadata) = &mut result.execution_metadata { metadata.output_upload_start_timestamp = create_timestamp(SystemTime::now()); @@ -267,7 +245,7 @@ impl RemoteService { let upload_result = batch_upload_blobs( client.clone(), digest.clone(), - outputs.blobs, + blobs, max_size as usize, ) .await; @@ -285,8 +263,7 @@ impl RemoteService { if let Err(error) = client.update_action_result(&digest, result).await { warn!( hash = &digest.hash, - "Failed to cache {} operation: {}", - color::muted_light(operation_label), + "Failed to cache action result: {}", color::muted_light(error.to_string()), ); } @@ -295,65 +272,65 @@ impl RemoteService { Ok(()) } - #[instrument(skip(self, operation))] - pub async fn restore_operation( - &self, - digest: &Digest, - operation: &mut Operation, - ) -> miette::Result<()> { + #[instrument(skip(self, state))] + pub async fn restore_action_result(&self, state: &mut ActionState<'_>) -> miette::Result<()> { if !self.cache_enabled { return Ok(()); } - let Some(result) = self.action_results.get_async(&digest.hash).await else { + let Some(result) = &mut state.action_result else { return Ok(()); }; - let operation_label = operation.label().to_owned(); - let has_outputs = !result.output_files.is_empty() - || !result.output_symlinks.is_empty() - || !result.output_directories.is_empty(); - - if has_outputs { - debug!( - hash = &digest.hash, - "Restoring {} operation with outputs", - color::muted_light(&operation_label) - ); - } else { - debug!( - hash = &digest.hash, - "Restoring {} operation", - color::muted_light(&operation_label) - ); - } + batch_download_blobs( + self.client.clone(), + &state.digest, + result, + &self.workspace_root, + self.get_max_batch_size() as usize, + ) + .await?; - if let Some(output) = operation.get_output_mut() { - output.exit_code = Some(result.exit_code); + // The stderr/stdout blobs may not have been inlined, + // so we need to fetch them manually + let mut stdio_digests = vec![]; - if !result.stderr_raw.is_empty() { - output.set_stderr(String::from_utf8_lossy(&result.stderr_raw).into()); + if let Some(stderr_digest) = &result.stderr_digest { + if result.stderr_raw.is_empty() && stderr_digest.size_bytes > 0 { + stdio_digests.push(stderr_digest.to_owned()); } + } - if !result.stdout_raw.is_empty() { - output.set_stdout(String::from_utf8_lossy(&result.stdout_raw).into()); + if let Some(stdout_digest) = &result.stdout_digest { + if result.stdout_raw.is_empty() && stdout_digest.size_bytes > 0 { + stdio_digests.push(stdout_digest.to_owned()); } } - batch_download_blobs( - self.client.clone(), - digest, - &result, - &self.workspace_root, - self.get_max_batch_size() as usize, - ) - .await?; + if !stdio_digests.is_empty() { + for blob in self + .client + .batch_read_blobs(&state.digest, stdio_digests) + .await? + { + if result + .stderr_digest + .as_ref() + .is_some_and(|dig| dig == &blob.digest) + { + result.stderr_raw = blob.bytes; + continue; + } - debug!( - hash = &digest.hash, - "Restored {} operation", - color::muted_light(&operation_label) - ); + if result + .stdout_digest + .as_ref() + .is_some_and(|dig| dig == &blob.digest) + { + result.stdout_raw = blob.bytes; + } + } + } Ok(()) } @@ -368,46 +345,6 @@ impl RemoteService { let _ = future.await; } } - - fn create_action_result_from_operation( - &self, - operation: &Operation, - outputs: Option<&mut OutputDigests>, - ) -> miette::Result { - let mut result = ActionResult { - execution_metadata: Some(ExecutedActionMetadata { - worker: "moon".into(), - execution_start_timestamp: create_timestamp_from_naive(operation.started_at), - execution_completed_timestamp: operation - .finished_at - .and_then(create_timestamp_from_naive), - ..Default::default() - }), - ..Default::default() - }; - - if let Some(exec) = operation.get_output() { - result.exit_code = exec.exit_code.unwrap_or_default(); - - if let Some(outputs) = outputs { - if let Some(stderr) = &exec.stderr { - let blob = Blob::new(stderr.as_bytes().to_owned()); - - result.stderr_digest = Some(blob.digest.clone()); - outputs.blobs.push(blob); - } - - if let Some(stdout) = &exec.stdout { - let blob = Blob::new(stdout.as_bytes().to_owned()); - - result.stdout_digest = Some(blob.digest.clone()); - outputs.blobs.push(blob); - } - } - } - - Ok(result) - } } async fn batch_upload_blobs( @@ -557,7 +494,7 @@ fn partition_into_groups( // Try and find a partition that this item can go into for (index, group) in &groups { - if group.size + item_size < max_size { + if group.size + item_size <= max_size { index_to_use = *index; break; } @@ -568,12 +505,12 @@ fn partition_into_groups( index_to_use = groups.len() as i32; } - let entry = groups.entry(index_to_use).or_insert_with(|| Partition { + let group = groups.entry(index_to_use).or_insert_with(|| Partition { items: vec![], size: 0, }); - entry.size += item_size; - entry.items.push(item); + group.size += item_size; + group.items.push(item); } groups diff --git a/crates/task-expander/tests/task_expander_test.rs b/crates/task-expander/tests/task_expander_test.rs index a5c55a08a69..76d3f6220ee 100644 --- a/crates/task-expander/tests/task_expander_test.rs +++ b/crates/task-expander/tests/task_expander_test.rs @@ -26,9 +26,7 @@ mod task_expander { task.input_files.insert("project/source/out".into()); let context = create_context(sandbox.path()); - let task = TaskExpander::new(&project, &context) - .expand(&mut task) - .unwrap(); + let task = TaskExpander::new(&project, &context).expand(&task).unwrap(); assert!(task.input_files.is_empty()); assert_eq!( @@ -48,9 +46,7 @@ mod task_expander { task.input_globs.insert("project/source/out/**/*".into()); let context = create_context(sandbox.path()); - let task = TaskExpander::new(&project, &context) - .expand(&mut task) - .unwrap(); + let task = TaskExpander::new(&project, &context).expand(&task).unwrap(); assert!(task.input_globs.is_empty()); assert_eq!( @@ -72,9 +68,7 @@ mod task_expander { task.inputs = vec![InputPath::ProjectFile("dir".into())]; let context = create_context(sandbox.path()); - let task = TaskExpander::new(&project, &context) - .expand(&mut task) - .unwrap(); + let task = TaskExpander::new(&project, &context).expand(&task).unwrap(); assert!(task.input_files.is_empty()); assert_eq!( diff --git a/crates/task-runner/src/output_archiver.rs b/crates/task-runner/src/output_archiver.rs index 2541cc0ee1f..3d500672963 100644 --- a/crates/task-runner/src/output_archiver.rs +++ b/crates/task-runner/src/output_archiver.rs @@ -1,10 +1,9 @@ use crate::task_runner_error::TaskRunnerError; -use moon_action::Operation; use moon_api::Moonbase; use moon_app_context::AppContext; use moon_common::color; use moon_project::Project; -use moon_remote::{compute_digests_for_outputs, Digest, RemoteService}; +use moon_remote::{ActionState, RemoteService}; use moon_task::{TargetError, TargetScope, Task}; use starbase_archive::tar::TarPacker; use starbase_archive::Archiver; @@ -21,11 +20,11 @@ pub struct OutputArchiver<'task> { } impl OutputArchiver<'_> { - #[instrument(skip(self, operation))] + #[instrument(skip(self, remote_state))] pub async fn archive( &self, - digest: &Digest, - operation: Option<&Operation>, + hash: &str, + remote_state: Option<&mut ActionState<'_>>, ) -> miette::Result> { if !self.is_archivable()? { return Ok(None); @@ -40,34 +39,31 @@ impl OutputArchiver<'_> { } // If so, create and pack the archive! - let archive_file = self.app.cache_engine.hash.get_archive_path(&digest.hash); + let archive_file = self.app.cache_engine.hash.get_archive_path(hash); if !archive_file.exists() { if self.app.cache_engine.is_writable() { debug!( task_target = self.task.target.as_str(), - hash = &digest.hash, - "Archiving task outputs from project" + hash, "Archiving task outputs from project" ); - self.create_local_archive(&digest.hash, &archive_file)?; + self.create_local_archive(hash, &archive_file)?; if archive_file.exists() { - self.upload_to_remote_storage(&digest.hash, &archive_file) - .await?; + self.upload_to_remote_storage(hash, &archive_file).await?; } } else { debug!( task_target = self.task.target.as_str(), - hash = &digest.hash, - "Cache is not writable, skipping output archiving" + hash, "Cache is not writable, skipping output archiving" ); } } // Then cache the result in the remote service - if let Some(operation) = operation { - self.upload_to_remote_service(digest, operation).await?; + if let Some(state) = remote_state { + self.upload_to_remote_service(state).await?; } Ok(if archive_file.exists() { @@ -208,21 +204,13 @@ impl OutputArchiver<'_> { Ok(()) } - #[instrument(skip(self, operation))] - async fn upload_to_remote_service( - &self, - digest: &Digest, - operation: &Operation, - ) -> miette::Result<()> { + #[instrument(skip(self, state))] + async fn upload_to_remote_service(&self, state: &mut ActionState<'_>) -> miette::Result<()> { if let Some(remote) = RemoteService::session() { - let output_digests = compute_digests_for_outputs( - self.task.get_output_files(&self.app.workspace_root, true)?, - &self.app.workspace_root, - )?; + state.compute_outputs(&self.app.workspace_root)?; - remote - .save_operation_with_outputs(digest, operation, output_digests) - .await?; + remote.save_action(state).await?; + remote.save_action_result(state).await?; } Ok(()) diff --git a/crates/task-runner/src/output_hydrater.rs b/crates/task-runner/src/output_hydrater.rs index 209fa7b71a1..e4a4123cf85 100644 --- a/crates/task-runner/src/output_hydrater.rs +++ b/crates/task-runner/src/output_hydrater.rs @@ -1,9 +1,7 @@ -use crate::run_state::read_stdlog_state_files; -use moon_action::Operation; use moon_api::Moonbase; use moon_app_context::AppContext; use moon_common::color; -use moon_remote::{Digest, RemoteService}; +use moon_remote::{ActionState, RemoteService}; use moon_task::Task; use starbase_archive::tar::TarUnpacker; use starbase_archive::Archiver; @@ -25,75 +23,59 @@ pub struct OutputHydrater<'task> { } impl OutputHydrater<'_> { - #[instrument(skip(self, operation))] + #[instrument(skip(self, remote_state))] pub async fn hydrate( &self, from: HydrateFrom, - digest: &Digest, - operation: &mut Operation, + hash: &str, + remote_state: Option<&mut ActionState<'_>>, ) -> miette::Result { - let result = match from { + match from { // Only hydrate when the hash is different from the previous build, // as we can assume the outputs from the previous build still exist? HydrateFrom::PreviousOutput => Ok(true), // Based on the remote execution APIs - HydrateFrom::RemoteCache => self.download_from_remote_service(digest, operation).await, + HydrateFrom::RemoteCache => { + if let Some(state) = remote_state { + self.download_from_remote_service(state).await + } else { + Ok(false) + } + } // Otherwise write to local cache, then download archive from moonbase HydrateFrom::LocalCache | HydrateFrom::Moonbase => { - let archive_file = self.app.cache_engine.hash.get_archive_path(&digest.hash); + let archive_file = self.app.cache_engine.hash.get_archive_path(hash); let mut hydrated = false; if self.app.cache_engine.is_readable() { debug!( task_target = self.task.target.as_str(), - hash = &digest.hash, - "Hydrating cached outputs into project" + hash, "Hydrating cached outputs into project" ); // Attempt to download from remote cache to `.moon/outputs/` if !archive_file.exists() && matches!(from, HydrateFrom::Moonbase) { - self.download_from_remote_storage(&digest.hash, &archive_file) + self.download_from_remote_storage(hash, &archive_file) .await?; } // Otherwise hydrate the cached archive into the task's outputs if archive_file.exists() { - self.unpack_local_archive(&digest.hash, &archive_file)?; + self.unpack_local_archive(hash, &archive_file)?; hydrated = true } } else { debug!( task_target = self.task.target.as_str(), - hash = &digest.hash, - "Cache is not readable, skipping output hydration" + hash, "Cache is not readable, skipping output hydration" ); } Ok(hydrated) } - }; - - match result { - Ok(hydrated) => { - // If not from the remote cache, we need to read the - // locally cached stdout/stderr into the operation - // so that it can be replayed in the console - if !matches!(from, HydrateFrom::RemoteCache) { - read_stdlog_state_files( - self.app - .cache_engine - .state - .get_target_dir(&self.task.target), - operation, - )?; - } - - Ok(hydrated) - } - Err(error) => Err(error), } } @@ -150,14 +132,13 @@ impl OutputHydrater<'_> { Ok(()) } - #[instrument(skip(self, operation))] + #[instrument(skip(self, state))] async fn download_from_remote_service( &self, - digest: &Digest, - operation: &mut Operation, + state: &mut ActionState<'_>, ) -> miette::Result { if let Some(remote) = RemoteService::session() { - remote.restore_operation(digest, operation).await?; + remote.restore_action_result(state).await?; return Ok(true); } diff --git a/crates/task-runner/src/run_state.rs b/crates/task-runner/src/run_state.rs index 07d2abbc0a8..6cb7d9d83e2 100644 --- a/crates/task-runner/src/run_state.rs +++ b/crates/task-runner/src/run_state.rs @@ -1,7 +1,4 @@ -use moon_action::Operation; use moon_cache_item::cache_item; -use starbase_utils::fs; -use std::path::PathBuf; cache_item!( pub struct TaskRunCacheState { @@ -11,54 +8,3 @@ cache_item!( pub target: String, } ); - -pub fn read_stdlog_state_files( - state_dir: PathBuf, - operation: &mut Operation, -) -> miette::Result<()> { - if let Some(output) = operation.get_output_mut() { - let err_path = state_dir.join("stderr.log"); - let out_path = state_dir.join("stdout.log"); - - if err_path.exists() { - output.set_stderr(fs::read_file(err_path)?); - } - - if out_path.exists() { - output.set_stdout(fs::read_file(out_path)?); - } - } - - Ok(()) -} - -pub fn write_stdlog_state_files(state_dir: PathBuf, operation: &Operation) -> miette::Result<()> { - let err_path = state_dir.join("stderr.log"); - let out_path = state_dir.join("stdout.log"); - - if let Some(output) = operation.get_output() { - fs::write_file( - err_path, - output - .stderr - .as_ref() - .map(|log| log.as_bytes()) - .unwrap_or_default(), - )?; - - fs::write_file( - out_path, - output - .stdout - .as_ref() - .map(|log| log.as_bytes()) - .unwrap_or_default(), - )?; - } else { - // Ensure logs from a previous run are removed - fs::remove_file(err_path)?; - fs::remove_file(out_path)?; - } - - Ok(()) -} diff --git a/crates/task-runner/src/task_runner.rs b/crates/task-runner/src/task_runner.rs index 373293137c8..b01779a4dc7 100644 --- a/crates/task-runner/src/task_runner.rs +++ b/crates/task-runner/src/task_runner.rs @@ -13,7 +13,7 @@ use moon_console::TaskReportItem; use moon_platform::PlatformManager; use moon_process::ProcessError; use moon_project::Project; -use moon_remote::{Digest, RemoteService}; +use moon_remote::{ActionState, Digest, RemoteService}; use moon_task::Task; use moon_task_hasher::TaskHasher; use moon_time::{is_stale, now_millis}; @@ -39,10 +39,11 @@ pub struct TaskRunner<'task> { hydrater: OutputHydrater<'task>, // Public for testing - pub action_digest: Digest, pub cache: CacheItem, pub operations: OperationList, + pub remote_state: Option>, pub report_item: TaskReportItem, + pub target_state: Option, } impl<'task> TaskRunner<'task> { @@ -68,17 +69,15 @@ impl<'task> TaskRunner<'task> { Ok(Self { cache, archiver: OutputArchiver { app, project, task }, - action_digest: Digest { - hash: String::new(), - size_bytes: 0, - }, hydrater: OutputHydrater { app, task }, platform_manager: PlatformManager::read(), project, + remote_state: None, report_item: TaskReportItem { output_style: task.options.output_style, ..Default::default() }, + target_state: None, task, app, operations: OperationList::default(), @@ -96,7 +95,7 @@ impl<'task> TaskRunner<'task> { ) -> miette::Result> { // If a dependency has failed or been skipped, we should skip this task if !self.is_dependencies_complete(context)? { - self.skip(context)?; + self.skip()?; return Ok(None); } @@ -110,10 +109,8 @@ impl<'task> TaskRunner<'task> { let hash = self.generate_hash(context, node).await?; - self.report_item.hash = Some(hash.clone()); - // Exit early if this build has already been cached/hashed - if self.hydrate(context, &hash).await? { + if self.hydrate(&hash).await? { return Ok(Some(hash)); } @@ -152,6 +149,11 @@ impl<'task> TaskRunner<'task> { match result { Ok(maybe_hash) => { + context.set_target_state( + &self.task.target, + self.target_state.take().unwrap_or(TargetState::Passthrough), + ); + self.report_item.hash = maybe_hash.clone(); self.app.console.reporter.on_task_completed( @@ -168,6 +170,11 @@ impl<'task> TaskRunner<'task> { }) } Err(error) => { + context.set_target_state( + &self.task.target, + self.target_state.take().unwrap_or(TargetState::Failed), + ); + self.inject_failed_task_execution(Some(&error))?; self.app.console.reporter.on_task_completed( @@ -308,13 +315,15 @@ impl<'task> TaskRunner<'task> { } // Check if the outputs have been cached in the remote service - if let Some(remote) = RemoteService::session() { - if remote.is_operation_cached(&self.action_digest).await? { + if let (Some(state), Some(remote)) = (&mut self.remote_state, RemoteService::session()) { + if let Some(result) = remote.is_action_cached(state).await? { debug!( task_target = self.task.target.as_str(), hash, "Cache hit in remote service, will attempt to download output blobs" ); + state.set_action_result(result); + return Ok(Some(HydrateFrom::RemoteCache)); } } @@ -436,7 +445,7 @@ impl<'task> TaskRunner<'task> { hasher.hash_content(task_hasher.hash())?; - // Hash platform fields + // Hash toolchain fields trace!( task_target = self.task.target.as_str(), toolchains = ?self.task.toolchains.iter().map(|tc| tc.as_str()).collect::>(), @@ -459,11 +468,17 @@ impl<'task> TaskRunner<'task> { operation.finish(ActionStatus::Passed); self.operations.push(operation); - - self.action_digest = Digest { - hash: hash.clone(), - size_bytes: size_bytes as i64, - }; + self.report_item.hash = Some(hash.clone()); + + if RemoteService::is_enabled() { + self.remote_state = Some(ActionState::new( + Digest { + hash: hash.clone(), + size_bytes: size_bytes as i64, + }, + self.task, + )); + } debug!( task_target = self.task.target.as_str(), @@ -482,7 +497,7 @@ impl<'task> TaskRunner<'task> { ) -> miette::Result<()> { // If the task is a no-operation, we should exit early if self.task.is_no_op() { - self.skip_no_op(context)?; + self.skip_no_op()?; return Ok(()); } @@ -530,15 +545,20 @@ impl<'task> TaskRunner<'task> { executor.execute(context, &mut self.report_item).await? }; + // Persist the state locally and for the remote service if let Some(last_attempt) = result.attempts.get_last_execution() { self.persist_state(last_attempt)?; + + if let Some(state) = &mut self.remote_state { + state.create_action_result_from_operation(last_attempt)?; + } } // Extract the attempts from the result self.operations.merge(result.attempts); // Update the action state based on the result - context.set_target_state(&self.task.target, result.run_state); + self.target_state = Some(result.run_state); // If the execution as a whole failed, return the error. // We do this here instead of in `execute` so that we can @@ -564,8 +584,8 @@ impl<'task> TaskRunner<'task> { Ok(()) } - #[instrument(skip_all)] - pub fn skip(&mut self, context: &ActionContext) -> miette::Result<()> { + #[instrument(skip(self))] + pub fn skip(&mut self) -> miette::Result<()> { debug!(task_target = self.task.target.as_str(), "Skipping task"); self.operations.push(Operation::new_finished( @@ -573,13 +593,13 @@ impl<'task> TaskRunner<'task> { ActionStatus::Skipped, )); - context.set_target_state(&self.task.target, TargetState::Skipped); + self.target_state = Some(TargetState::Skipped); Ok(()) } - #[instrument(skip(self, context))] - pub fn skip_no_op(&mut self, context: &ActionContext) -> miette::Result<()> { + #[instrument(skip(self))] + pub fn skip_no_op(&mut self) -> miette::Result<()> { debug!( task_target = self.task.target.as_str(), "Skipping task as its a no-operation" @@ -590,10 +610,7 @@ impl<'task> TaskRunner<'task> { ActionStatus::Passed, )); - context.set_target_state( - &self.task.target, - TargetState::from_hash(self.report_item.hash.as_deref()), - ); + self.target_state = Some(TargetState::from_hash(self.report_item.hash.as_deref())); Ok(()) } @@ -609,7 +626,7 @@ impl<'task> TaskRunner<'task> { let archived = match self .archiver - .archive(&self.action_digest, self.operations.get_last_execution()) + .archive(hash, self.remote_state.as_mut()) .await? { Some(archive_file) => { @@ -640,8 +657,8 @@ impl<'task> TaskRunner<'task> { Ok(archived) } - #[instrument(skip(self, context))] - pub async fn hydrate(&mut self, context: &ActionContext, hash: &str) -> miette::Result { + #[instrument(skip(self))] + pub async fn hydrate(&mut self, hash: &str) -> miette::Result { let mut operation = Operation::output_hydration(); // Not cached @@ -667,7 +684,7 @@ impl<'task> TaskRunner<'task> { if !self .hydrater - .hydrate(from, &self.action_digest, &mut operation) + .hydrate(from, hash, self.remote_state.as_mut()) .await? { debug!(task_target = self.task.target.as_str(), "Did not hydrate"); @@ -688,7 +705,45 @@ impl<'task> TaskRunner<'task> { // Fill in these values since the command executor does not run! if let Some(output) = operation.get_output_mut() { output.command = Some(self.task.get_command_line()); - output.exit_code = Some(self.cache.data.exit_code); + + // If we received an action result from the remote cache, + // extract the logs from it + if let Some(result) = self + .remote_state + .as_ref() + .and_then(|state| state.action_result.as_ref()) + { + output.exit_code = Some(result.exit_code); + + if !result.stderr_raw.is_empty() { + output.set_stderr(String::from_utf8_lossy(&result.stderr_raw).into()); + } + + if !result.stdout_raw.is_empty() { + output.set_stdout(String::from_utf8_lossy(&result.stdout_raw).into()); + } + } + // If not from the remote cache, we need to read the locally + // cached stdout/stderr log files + else { + output.exit_code = Some(self.cache.data.exit_code); + + let state_dir = self + .app + .cache_engine + .state + .get_target_dir(&self.task.target); + let err_path = state_dir.join("stderr.log"); + let out_path = state_dir.join("stdout.log"); + + if err_path.exists() { + output.set_stderr(fs::read_file(err_path)?); + } + + if out_path.exists() { + output.set_stdout(fs::read_file(out_path)?); + } + } } // Then finalize the operation and target state @@ -699,9 +754,8 @@ impl<'task> TaskRunner<'task> { self.persist_state(&operation)?; - context.set_target_state(&self.task.target, TargetState::Passed(hash.to_owned())); - self.operations.push(operation); + self.target_state = Some(TargetState::Passed(hash.to_owned())); Ok(true) } @@ -748,16 +802,38 @@ impl<'task> TaskRunner<'task> { } fn persist_state(&mut self, operation: &Operation) -> miette::Result<()> { - write_stdlog_state_files( - self.app - .cache_engine - .state - .get_target_dir(&self.task.target), - operation, - )?; + let state_dir = self + .app + .cache_engine + .state + .get_target_dir(&self.task.target); + let err_path = state_dir.join("stderr.log"); + let out_path = state_dir.join("stdout.log"); if let Some(output) = operation.get_output() { self.cache.data.exit_code = output.get_exit_code(); + + fs::write_file( + err_path, + output + .stderr + .as_ref() + .map(|log| log.as_bytes()) + .unwrap_or_default(), + )?; + + fs::write_file( + out_path, + output + .stdout + .as_ref() + .map(|log| log.as_bytes()) + .unwrap_or_default(), + )?; + } else { + // Ensure logs from a previous run are removed + fs::remove_file(err_path)?; + fs::remove_file(out_path)?; } Ok(()) diff --git a/crates/task-runner/tests/output_archiver_test.rs b/crates/task-runner/tests/output_archiver_test.rs index 318d253e134..3f0286b26ab 100644 --- a/crates/task-runner/tests/output_archiver_test.rs +++ b/crates/task-runner/tests/output_archiver_test.rs @@ -1,7 +1,6 @@ mod utils; use moon_cache::CacheMode; -use moon_remote::Digest; use moon_task::Target; use starbase_archive::Archiver; use std::env; @@ -9,13 +8,6 @@ use std::fs; use std::sync::Arc; use utils::*; -fn stub_digest() -> Digest { - Digest { - hash: "hash123".into(), - size_bytes: 0, - } -} - mod output_archiver { use super::*; @@ -26,9 +18,8 @@ mod output_archiver { async fn does_nothing_if_no_outputs_in_task() { let container = TaskRunnerContainer::new("archive", "no-outputs").await; let archiver = container.create_archiver(); - let digest = stub_digest(); - assert!(archiver.archive(&digest, None).await.unwrap().is_none()); + assert!(archiver.archive("hash123", None).await.unwrap().is_none()); } #[tokio::test] @@ -36,9 +27,8 @@ mod output_archiver { async fn errors_if_outputs_not_created() { let container = TaskRunnerContainer::new("archive", "file-outputs").await; let archiver = container.create_archiver(); - let digest = stub_digest(); - archiver.archive(&digest, None).await.unwrap(); + archiver.archive("hash123", None).await.unwrap(); } #[tokio::test] @@ -47,9 +37,8 @@ mod output_archiver { container.sandbox.create_file("project/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - assert!(archiver.archive(&digest, None).await.unwrap().is_some()); + assert!(archiver.archive("hash123", None).await.unwrap().is_some()); assert!(container .sandbox .path() @@ -66,9 +55,8 @@ mod output_archiver { .create_file(".moon/cache/outputs/hash123.tar.gz", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); assert_eq!(fs::metadata(file).unwrap().len(), 0); } @@ -79,14 +67,13 @@ mod output_archiver { container.sandbox.create_file("project/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); container .app_context .cache_engine .force_mode(CacheMode::Off); - assert!(archiver.archive(&digest, None).await.unwrap().is_none()); + assert!(archiver.archive("hash123", None).await.unwrap().is_none()); env::remove_var("MOON_CACHE"); } @@ -97,14 +84,13 @@ mod output_archiver { container.sandbox.create_file("project/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); container .app_context .cache_engine .force_mode(CacheMode::Read); - assert!(archiver.archive(&digest, None).await.unwrap().is_none()); + assert!(archiver.archive("hash123", None).await.unwrap().is_none()); env::remove_var("MOON_CACHE"); } @@ -115,9 +101,8 @@ mod output_archiver { container.sandbox.create_file("project/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -133,9 +118,8 @@ mod output_archiver { container.sandbox.create_file("project/three.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -157,9 +141,8 @@ mod output_archiver { container.sandbox.create_file("project/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -181,9 +164,8 @@ mod output_archiver { container.sandbox.create_file("project/c.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -201,9 +183,8 @@ mod output_archiver { container.sandbox.create_file("project/c.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -219,9 +200,8 @@ mod output_archiver { container.sandbox.create_file("project/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -237,9 +217,8 @@ mod output_archiver { container.sandbox.create_file("project/c.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -255,9 +234,8 @@ mod output_archiver { container.sandbox.create_file("project/dir/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -273,9 +251,8 @@ mod output_archiver { container.sandbox.create_file("project/c/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -292,9 +269,8 @@ mod output_archiver { container.sandbox.create_file("project/dir/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -311,9 +287,8 @@ mod output_archiver { container.sandbox.create_file("shared/z.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); @@ -331,9 +306,8 @@ mod output_archiver { container.sandbox.create_file("project/file.txt", ""); let archiver = container.create_archiver(); - let digest = stub_digest(); - let file = archiver.archive(&digest, None).await.unwrap().unwrap(); + let file = archiver.archive("hash123", None).await.unwrap().unwrap(); let dir = container.sandbox.path().join("out"); Archiver::new(&dir, &file).unpack_from_ext().unwrap(); diff --git a/crates/task-runner/tests/output_hydrater_test.rs b/crates/task-runner/tests/output_hydrater_test.rs index 82b8fe2b1fa..80b3150f230 100644 --- a/crates/task-runner/tests/output_hydrater_test.rs +++ b/crates/task-runner/tests/output_hydrater_test.rs @@ -1,23 +1,10 @@ mod utils; -use moon_action::Operation; use moon_cache::CacheMode; -use moon_remote::Digest; use moon_task_runner::output_hydrater::HydrateFrom; use std::env; use utils::*; -fn stub_digest() -> Digest { - Digest { - hash: "hash123".into(), - size_bytes: 0, - } -} - -fn stub_operation() -> Operation { - Operation::output_hydration() -} - mod output_hydrater { use super::*; @@ -36,11 +23,9 @@ mod output_hydrater { async fn does_nothing_if_from_prev_outputs() { let container = TaskRunnerContainer::new("archive", "file-outputs").await; let hydrater = container.create_hydrator(); - let digest = stub_digest(); - let mut operation = stub_operation(); assert!(hydrater - .hydrate(HydrateFrom::PreviousOutput, &digest, &mut operation) + .hydrate(HydrateFrom::PreviousOutput, "hash123", None) .await .unwrap()); } @@ -53,8 +38,6 @@ mod output_hydrater { .create_file(".moon/cache/outputs/hash123.tar.gz", ""); let hydrater = container.create_hydrator(); - let digest = stub_digest(); - let mut operation = stub_operation(); container .app_context @@ -62,7 +45,7 @@ mod output_hydrater { .force_mode(CacheMode::Off); assert!(!hydrater - .hydrate(HydrateFrom::LocalCache, &digest, &mut operation) + .hydrate(HydrateFrom::LocalCache, "hash123", None) .await .unwrap()); @@ -77,8 +60,6 @@ mod output_hydrater { .create_file(".moon/cache/outputs/hash123.tar.gz", ""); let hydrater = container.create_hydrator(); - let digest = stub_digest(); - let mut operation = stub_operation(); container .app_context @@ -86,7 +67,7 @@ mod output_hydrater { .force_mode(CacheMode::Write); assert!(!hydrater - .hydrate(HydrateFrom::LocalCache, &digest, &mut operation) + .hydrate(HydrateFrom::LocalCache, "hash123", None) .await .unwrap()); @@ -101,11 +82,9 @@ mod output_hydrater { assert!(!container.sandbox.path().join("project/file.txt").exists()); let hydrater = container.create_hydrator(); - let digest = stub_digest(); - let mut operation = stub_operation(); hydrater - .hydrate(HydrateFrom::LocalCache, &digest, &mut operation) + .hydrate(HydrateFrom::LocalCache, "hash123", None) .await .unwrap(); @@ -124,11 +103,9 @@ mod output_hydrater { .exists()); let hydrater = container.create_hydrator(); - let digest = stub_digest(); - let mut operation = stub_operation(); hydrater - .hydrate(HydrateFrom::LocalCache, &digest, &mut operation) + .hydrate(HydrateFrom::LocalCache, "hash123", None) .await .unwrap(); diff --git a/crates/task-runner/tests/task_runner_test.rs b/crates/task-runner/tests/task_runner_test.rs index b4aa77a9dcd..45453ba0652 100644 --- a/crates/task-runner/tests/task_runner_test.rs +++ b/crates/task-runner/tests/task_runner_test.rs @@ -3,7 +3,6 @@ mod utils; use moon_action::ActionStatus; use moon_action_context::*; use moon_cache::CacheMode; -use moon_remote::Digest; use moon_task::Target; use moon_task_runner::output_hydrater::HydrateFrom; use moon_task_runner::TaskRunner; @@ -11,13 +10,6 @@ use moon_time::now_millis; use std::env; use utils::*; -fn stub_digest() -> Digest { - Digest { - hash: "hash123".into(), - size_bytes: 0, - } -} - mod task_runner { use super::*; @@ -709,7 +701,6 @@ mod task_runner { fn setup_exec_state(runner: &mut TaskRunner) { runner.report_item.hash = Some("hash123".into()); - runner.action_digest = stub_digest(); } #[tokio::test] @@ -726,11 +717,7 @@ mod task_runner { runner.execute(&context, &node).await.unwrap(); assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), + runner.target_state.as_ref().unwrap(), &TargetState::Passed("hash123".into()) ); } @@ -747,11 +734,7 @@ mod task_runner { runner.execute(&context, &node).await.unwrap(); assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), + runner.target_state.as_ref().unwrap(), &TargetState::Passthrough ); } @@ -770,14 +753,7 @@ mod task_runner { // Swallow panic so we can check operations let _ = runner.execute(&context, &node).await; - assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), - &TargetState::Failed - ); + assert_eq!(runner.target_state.as_ref().unwrap(), &TargetState::Failed); } #[tokio::test] @@ -895,9 +871,8 @@ mod task_runner { async fn creates_an_operation() { let container = TaskRunnerContainer::new("runner", "base").await; let mut runner = container.create_runner(); - let context = ActionContext::default(); - runner.skip(&context).unwrap(); + runner.skip().unwrap(); let operation = runner.operations.last().unwrap(); @@ -909,18 +884,10 @@ mod task_runner { async fn sets_skipped_state() { let container = TaskRunnerContainer::new("runner", "base").await; let mut runner = container.create_runner(); - let context = ActionContext::default(); - runner.skip(&context).unwrap(); + runner.skip().unwrap(); - assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), - &TargetState::Skipped - ); + assert_eq!(runner.target_state.as_ref().unwrap(), &TargetState::Skipped); } } @@ -931,9 +898,8 @@ mod task_runner { async fn creates_an_operation() { let container = TaskRunnerContainer::new("runner", "base").await; let mut runner = container.create_runner(); - let context = ActionContext::default(); - runner.skip_no_op(&context).unwrap(); + runner.skip_no_op().unwrap(); let operation = runner.operations.last().unwrap(); @@ -945,16 +911,11 @@ mod task_runner { async fn sets_passthrough_state() { let container = TaskRunnerContainer::new("runner", "base").await; let mut runner = container.create_runner(); - let context = ActionContext::default(); - runner.skip_no_op(&context).unwrap(); + runner.skip_no_op().unwrap(); assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), + runner.target_state.as_ref().unwrap(), &TargetState::Passthrough ); } @@ -962,17 +923,12 @@ mod task_runner { async fn sets_completed_state() { let container = TaskRunnerContainer::new("runner", "base").await; let mut runner = container.create_runner(); - let context = ActionContext::default(); runner.report_item.hash = Some("hash123".into()); - runner.skip_no_op(&context).unwrap(); + runner.skip_no_op().unwrap(); assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), + runner.target_state.as_ref().unwrap(), &TargetState::Passed("hash123".into()) ); } @@ -1046,8 +1002,7 @@ mod task_runner { let mut runner = container.create_runner(); - let context = ActionContext::default(); - let result = runner.hydrate(&context, "hash123").await.unwrap(); + let result = runner.hydrate("hash123").await.unwrap(); assert!(!result); @@ -1067,7 +1022,6 @@ mod task_runner { runner.cache.data.exit_code = 0; runner.cache.data.hash = "hash123".into(); - runner.action_digest = stub_digest(); } #[tokio::test] @@ -1077,8 +1031,7 @@ mod task_runner { setup_previous_state(&container, &mut runner); - let context = ActionContext::default(); - let result = runner.hydrate(&context, "hash123").await.unwrap(); + let result = runner.hydrate("hash123").await.unwrap(); assert!(result); @@ -1095,15 +1048,10 @@ mod task_runner { setup_previous_state(&container, &mut runner); - let context = ActionContext::default(); - runner.hydrate(&context, "hash123").await.unwrap(); + runner.hydrate("hash123").await.unwrap(); assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), + runner.target_state.as_ref().unwrap(), &TargetState::Passed("hash123".into()) ); } @@ -1113,11 +1061,9 @@ mod task_runner { use super::*; use std::fs; - fn setup_local_state(container: &TaskRunnerContainer, runner: &mut TaskRunner) { + fn setup_local_state(container: &TaskRunnerContainer, _runner: &mut TaskRunner) { container.sandbox.enable_git(); container.pack_archive(); - - runner.action_digest = stub_digest(); } #[tokio::test] @@ -1127,8 +1073,7 @@ mod task_runner { setup_local_state(&container, &mut runner); - let context = ActionContext::default(); - let result = runner.hydrate(&context, "hash123").await.unwrap(); + let result = runner.hydrate("hash123").await.unwrap(); assert!(result); @@ -1145,15 +1090,10 @@ mod task_runner { setup_local_state(&container, &mut runner); - let context = ActionContext::default(); - runner.hydrate(&context, "hash123").await.unwrap(); + runner.hydrate("hash123").await.unwrap(); assert_eq!( - context - .target_states - .get(&runner.task.target) - .unwrap() - .get(), + runner.target_state.as_ref().unwrap(), &TargetState::Passed("hash123".into()) ); } @@ -1165,8 +1105,7 @@ mod task_runner { setup_local_state(&container, &mut runner); - let context = ActionContext::default(); - runner.hydrate(&context, "hash123").await.unwrap(); + runner.hydrate("hash123").await.unwrap(); let output_file = container.sandbox.path().join("project/file.txt"); @@ -1181,8 +1120,7 @@ mod task_runner { setup_local_state(&container, &mut runner); - let context = ActionContext::default(); - let result = runner.hydrate(&context, "hash123").await.unwrap(); + let result = runner.hydrate("hash123").await.unwrap(); assert!(result); diff --git a/packages/types/src/workspace-config.ts b/packages/types/src/workspace-config.ts index dcd10a50991..a47e9186c1f 100644 --- a/packages/types/src/workspace-config.ts +++ b/packages/types/src/workspace-config.ts @@ -240,6 +240,18 @@ export interface RunnerConfig { logRunningCommand: boolean; } +/** The API format of the remote service. */ +export type RemoteApi = 'grpc'; + +/** Configures basic HTTP authentication. */ +export interface RemoteAuthConfig { + /** HTTP headers to inject into every request. */ + headers: Record; + /** The name of an environment variable to use as a bearer token. */ + token: string | null; +} + +/** Supported blob compression levels. */ export type RemoteCompression = 'none' | 'zstd'; /** Configures the action cache (AC) and content addressable cache (CAS). */ @@ -303,6 +315,15 @@ export interface RemoteTlsConfig { /** Configures the remote service, powered by the Bazel Remote Execution API. */ export interface RemoteConfig { + /** + * The API format of the remote service. + * + * @default 'grpc' + * @type {'grpc'} + */ + api: RemoteApi; + /** Connect to the host using basic HTTP authentication. */ + auth: RemoteAuthConfig | null; /** Configures the action cache (AC) and content addressable cache (CAS). */ cache: RemoteCacheConfig; /** @@ -645,6 +666,14 @@ export interface PartialRunnerConfig { logRunningCommand?: boolean | null; } +/** Configures basic HTTP authentication. */ +export interface PartialRemoteAuthConfig { + /** HTTP headers to inject into every request. */ + headers?: Record | null; + /** The name of an environment variable to use as a bearer token. */ + token?: string | null; +} + /** Configures the action cache (AC) and content addressable cache (CAS). */ export interface PartialRemoteCacheConfig { /** @@ -705,6 +734,14 @@ export interface PartialRemoteTlsConfig { /** Configures the remote service, powered by the Bazel Remote Execution API. */ export interface PartialRemoteConfig { + /** + * The API format of the remote service. + * + * @default 'grpc' + */ + api?: RemoteApi | null; + /** Connect to the host using basic HTTP authentication. */ + auth?: PartialRemoteAuthConfig | null; /** Configures the action cache (AC) and content addressable cache (CAS). */ cache?: PartialRemoteCacheConfig | null; /** diff --git a/website/docs/config/workspace.mdx b/website/docs/config/workspace.mdx index 54372833673..de7037670af 100644 --- a/website/docs/config/workspace.mdx +++ b/website/docs/config/workspace.mdx @@ -489,6 +489,54 @@ notifier: Configures a remote service, primarily for cloud-based caching of artifacts. Learn more about this in the [remote caching](../guides/remote-cache) guide. +### `api` + + + +The API format of the remote server. This format dictates which type of client moon uses for +communicating with. Defaults to `grpc`. + +```yaml title=".moon/workspace.yml" {2} +unstable_remote: + api: 'grpc' +``` + +### `auth` + + + +Configures authorization and authentication level features of our remote clients. + +#### `headers` + + + +A mapping of HTTP headers to include in all requests to the remote server. These headers are applied +to all [API formats and protocols](#api), not just HTTP. + +```yaml title=".moon/workspace.yml" {2-4} +unstable_remote: + auth: + headers: + 'X-Custom-Header': 'value' +``` + +#### `token` + + + +The name of an environment variable in which to extract a token for +[Bearer HTTP authorization](https://swagger.io/docs/specification/v3_0/authentication/bearer-authentication/). +An `Authorization` HTTP header will be included in all requests to the remote server. + +If the token does not exist, or is not enabled, remote caching will be disabled. + +```yaml title=".moon/workspace.yml" {2-4} +unstable_remote: + auth: + token: 'ENV_VAR_NAME' +``` + ### `cache` diff --git a/website/docs/guides/remote-cache.mdx b/website/docs/guides/remote-cache.mdx index 5246f49c35f..68e49465815 100644 --- a/website/docs/guides/remote-cache.mdx +++ b/website/docs/guides/remote-cache.mdx @@ -97,6 +97,31 @@ unstable_remote: domain: 'your-host.com' ``` +## Cloud-hosted: Depot + +If you'd prefer not to host your own solution, you could use +[Depot Cache](https://depot.dev/products/cache), a cloud-based caching solution. To make use of +Depot, follow these steps: + +- Create an account on [depot.dev](https://depot.dev) +- Create an organization +- Go to organization settings -> API tokens +- Create a new API token +- Add the token as a `DEPOT_TOKEN` environment variable to your moon pipelines + +Once these steps have been completed, you can enable remote caching in moon with the following +configuration. If your Depot account has more than 1 organization, you'll need to set the +`X-Depot-Org` header. + +```yaml title=".moon/workspace.yml" +unstable_remote: + host: 'grpcs://cache.depot.dev' + auth: + token: 'DEPOT_TOKEN' + headers: + 'X-Depot-Org': '' +``` + ## Cloud-hosted: moonbase This solution utilizes our [moonbase](/moonbase) service, which is a SaaS cloud offering hosted and diff --git a/website/static/schemas/workspace.json b/website/static/schemas/workspace.json index 6b034145f9c..58a61c5443a 100644 --- a/website/static/schemas/workspace.json +++ b/website/static/schemas/workspace.json @@ -513,6 +513,43 @@ "description": "Strategies and protocols for locating plugins.", "type": "string" }, + "RemoteApi": { + "description": "The API format of the remote service.", + "type": "string", + "enum": [ + "grpc" + ] + }, + "RemoteAuthConfig": { + "description": "Configures basic HTTP authentication.", + "type": "object", + "properties": { + "headers": { + "title": "headers", + "description": "HTTP headers to inject into every request.", + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + } + }, + "token": { + "title": "token", + "description": "The name of an environment variable to use as a bearer token.", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false + }, "RemoteCacheConfig": { "description": "Configures the action cache (AC) and content addressable cache (CAS).", "type": "object", @@ -537,6 +574,7 @@ "additionalProperties": false }, "RemoteCompression": { + "description": "Supported blob compression levels.", "type": "string", "enum": [ "none", @@ -547,6 +585,28 @@ "description": "Configures the remote service, powered by the Bazel Remote Execution API.", "type": "object", "properties": { + "api": { + "title": "api", + "description": "The API format of the remote service.", + "default": "grpc", + "allOf": [ + { + "$ref": "#/definitions/RemoteApi" + } + ] + }, + "auth": { + "title": "auth", + "description": "Connect to the host using basic HTTP authentication.", + "anyOf": [ + { + "$ref": "#/definitions/RemoteAuthConfig" + }, + { + "type": "null" + } + ] + }, "cache": { "title": "cache", "description": "Configures the action cache (AC) and content addressable cache (CAS).", From 308560b53e72b306f931b0dd2636635a3ff79f06 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sat, 25 Jan 2025 21:28:48 -0800 Subject: [PATCH 04/15] new: Add support for remote caching HTTP endpoints. (#1800) * Update deps. * Get AC working. * Add download. * Polish. * Add semaphore. --- CHANGELOG.md | 1 + Cargo.lock | 80 +++- crates/config/src/workspace/remote_config.rs | 6 +- crates/remote/Cargo.toml | 4 +- crates/remote/src/grpc_remote_client.rs | 20 +- crates/remote/src/http_endpoints.rs | 15 - crates/remote/src/http_remote_client.rs | 422 +++++++++++++++---- crates/remote/src/http_tls.rs | 67 +++ crates/remote/src/lib.rs | 4 +- crates/remote/src/remote_error.rs | 7 + crates/remote/src/remote_service.rs | 7 +- packages/types/src/workspace-config.ts | 6 +- website/docs/config/workspace.mdx | 17 +- website/static/schemas/workspace.json | 5 +- 14 files changed, 531 insertions(+), 130 deletions(-) delete mode 100644 crates/remote/src/http_endpoints.rs create mode 100644 crates/remote/src/http_tls.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index ff5fdea4a86..9e8b098983d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Added an `unstable_remote.auth` setting, which can be used for HTTP Bearer/token Authorization based endpoints. Can also be used to set headers for all requests. - Added support for Depot cloud-based caching: https://depot.dev/docs/cache/overview + - Added support for the HTTP protocol: https://bazel.build/remote/caching#http-caching ## 1.31.3 diff --git a/Cargo.lock b/Cargo.lock index 26e4eb67fe1..95c7bab9094 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -525,12 +525,13 @@ dependencies = [ [[package]] name = "bazel-remote-apis" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46db9efcc39bde78fa90c0d08d612888c09184ec1f875c04883d0e788f49da57" +checksum = "efc658a13a1834985220b35dc1bbcee7dd85422db47f612e04463ee5feb28159" dependencies = [ + "pbjson", + "pbjson-types", "prost", - "prost-types", "serde", "tonic", ] @@ -4799,6 +4800,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915" +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + [[package]] name = "native-tls" version = "0.2.12" @@ -5095,6 +5102,43 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pbjson" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pbjson-build" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" +dependencies = [ + "heck 0.5.0", + "itertools 0.13.0", + "prost", + "prost-types", +] + +[[package]] +name = "pbjson-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887" +dependencies = [ + "bytes", + "chrono", + "pbjson", + "pbjson-build", + "prost", + "prost-build", + "serde", +] + [[package]] name = "pep-508" version = "0.4.0" @@ -5372,6 +5416,16 @@ dependencies = [ "yansi", ] +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.96", +] + [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -5423,6 +5477,26 @@ dependencies = [ "prost-derive", ] +[[package]] +name = "prost-build" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" +dependencies = [ + "heck 0.5.0", + "itertools 0.13.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.96", + "tempfile", +] + [[package]] name = "prost-derive" version = "0.13.4" diff --git a/crates/config/src/workspace/remote_config.rs b/crates/config/src/workspace/remote_config.rs index 3642308d9e5..b1997e4cc96 100644 --- a/crates/config/src/workspace/remote_config.rs +++ b/crates/config/src/workspace/remote_config.rs @@ -19,9 +19,11 @@ derive_enum!( /// The API format of the remote service. #[derive(Copy, ConfigEnum, Default)] pub enum RemoteApi { - /// gRPC endpoints. + /// gRPC(S) endpoints. #[default] Grpc, + /// HTTP(S) endpoints. + Http, } ); @@ -36,7 +38,7 @@ pub struct RemoteAuthConfig { } derive_enum!( - /// Supported blob compression levels. + /// Supported blob compression levels for gRPC APIs. #[derive(Copy, ConfigEnum, Default)] pub enum RemoteCompression { /// No compression. diff --git a/crates/remote/Cargo.toml b/crates/remote/Cargo.toml index 868ef3df692..91e45cdea33 100644 --- a/crates/remote/Cargo.toml +++ b/crates/remote/Cargo.toml @@ -10,11 +10,11 @@ moon_common = { path = "../common" } moon_config = { path = "../config" } moon_task = { path = "../task" } async-trait = { workspace = true } -bazel-remote-apis = { version = "0.12.0", features = ["serde"] } +bazel-remote-apis = { version = "0.14.0", features = ["serde"] } bincode = "1.3.3" chrono = { workspace = true } miette = { workspace = true } -reqwest = { workspace = true, features = ["json"] } +reqwest = { workspace = true, features = ["json", "rustls-tls"] } rustc-hash = { workspace = true } scc = { workspace = true } serde = { workspace = true } diff --git a/crates/remote/src/grpc_remote_client.rs b/crates/remote/src/grpc_remote_client.rs index e3d8bc32fa2..670043c8ae4 100644 --- a/crates/remote/src/grpc_remote_client.rs +++ b/crates/remote/src/grpc_remote_client.rs @@ -19,7 +19,7 @@ use tonic::{ transport::{Channel, Endpoint}, Code, Request, Status, }; -use tracing::{trace, warn}; +use tracing::{debug, trace, warn}; fn map_transport_error(error: tonic::transport::Error) -> RemoteError { // dbg!(&error); @@ -107,7 +107,7 @@ impl RemoteClient for GrpcRemoteClient { ) -> miette::Result { let host = &config.host; - trace!( + debug!( instance = &config.cache.instance_name, "Connecting to gRPC host {} {}", color::url(host), @@ -292,6 +292,7 @@ impl RemoteClient for GrpcRemoteClient { if matches!(code, Code::InvalidArgument | Code::FailedPrecondition) { warn!( + hash = &digest.hash, code = ?code, "Failed to cache action result: {}", status.message() @@ -300,6 +301,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(None) } else if matches!(code, Code::ResourceExhausted) { warn!( + hash = &digest.hash, code = ?code, "Remote service is out of storage space: {}", status.message() @@ -387,6 +389,7 @@ impl RemoteClient for GrpcRemoteClient { if !matches!(code, Code::Ok | Code::NotFound) { warn!( hash = &digest.hash, + blob_hash = download.digest.as_ref().map(|d| &d.hash), details = ?status.details, code = ?code, "Failed to download blob: {}", @@ -433,20 +436,21 @@ impl RemoteClient for GrpcRemoteClient { |req| self.inject_auth_headers(req), ); + let compression = self.config.cache.compression; + let mut requests = vec![]; + trace!( hash = &digest.hash, - compression = self.config.cache.compression.to_string(), + compression = compression.to_string(), "Uploading {} output blobs", blobs.len() ); - let mut requests = vec![]; - for blob in blobs { requests.push(batch_update_blobs_request::Request { digest: Some(blob.digest), - data: compress_blob(self.config.cache.compression, blob.bytes)?, - compressor: get_compressor(self.config.cache.compression), + data: compress_blob(compression, blob.bytes)?, + compressor: get_compressor(compression), }); } @@ -471,6 +475,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(vec![]) } else if matches!(code, Code::ResourceExhausted) { warn!( + hash = &digest.hash, code = ?code, "Remote service exhausted resource: {}", status.message() @@ -494,6 +499,7 @@ impl RemoteClient for GrpcRemoteClient { if !matches!(code, Code::Ok) { warn!( hash = &digest.hash, + blob_hash = upload.digest.as_ref().map(|d| &d.hash), details = ?status.details, code = ?code, "Failed to upload blob: {}", diff --git a/crates/remote/src/http_endpoints.rs b/crates/remote/src/http_endpoints.rs deleted file mode 100644 index ffcdab41b7f..00000000000 --- a/crates/remote/src/http_endpoints.rs +++ /dev/null @@ -1,15 +0,0 @@ -use serde::Deserialize; - -#[allow(dead_code)] -#[derive(Deserialize)] -#[serde(rename_all = "PascalCase")] -pub struct StatusEndpoint { - curr_size: usize, - git_commit: String, - max_size: usize, - num_files: usize, - num_goroutines: usize, - reserved_size: usize, - server_time: usize, - uncompressed_size: usize, -} diff --git a/crates/remote/src/http_remote_client.rs b/crates/remote/src/http_remote_client.rs index d315ac5df2e..0ab833fc6a8 100644 --- a/crates/remote/src/http_remote_client.rs +++ b/crates/remote/src/http_remote_client.rs @@ -1,38 +1,108 @@ use crate::compression::*; use crate::fs_digest::Blob; -use crate::http_endpoints::*; +use crate::http_tls::*; use crate::remote_client::RemoteClient; use crate::remote_error::RemoteError; use bazel_remote_apis::build::bazel::remote::execution::v2::{ - action_cache_client::ActionCacheClient, batch_update_blobs_request, - capabilities_client::CapabilitiesClient, compressor, - content_addressable_storage_client::ContentAddressableStorageClient, digest_function, - ActionCacheUpdateCapabilities, ActionResult, BatchReadBlobsRequest, BatchUpdateBlobsRequest, - CacheCapabilities, Digest, ExecutionCapabilities, GetActionResultRequest, - GetCapabilitiesRequest, ServerCapabilities, UpdateActionResultRequest, + digest_function, ActionCacheUpdateCapabilities, ActionResult, CacheCapabilities, Digest, + ServerCapabilities, }; +use miette::IntoDiagnostic; use moon_common::color; use moon_config::{RemoteCompression, RemoteConfig}; +use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; use reqwest::Client; -use starbase_utils::json; -use std::{error::Error, path::Path, sync::OnceLock}; -use tonic::{ - transport::{Channel, Endpoint, Server}, - Code, -}; -use tracing::{trace, warn}; +use std::env; +use std::sync::Arc; +use std::time::Duration; +use std::{path::Path, sync::OnceLock}; +use tokio::sync::Semaphore; +use tracing::{debug, trace, warn}; -#[derive(Default)] pub struct HttpRemoteClient { - client: OnceLock, - compression: RemoteCompression, - host: String, - instance_name: String, + client: OnceLock>, + config: RemoteConfig, + + // Since HTTP doesn't support batching, we will most likely + // end up up/downloading too many files in parallel, triggering a + // "too many open files" OS error. To circumvent this, we + // will use a semaphore and limit the amount of parallels. + semaphore: Arc, +} + +impl Default for HttpRemoteClient { + fn default() -> Self { + Self { + client: OnceLock::new(), + config: RemoteConfig::default(), + semaphore: Arc::new(Semaphore::new(100)), + } + } } impl HttpRemoteClient { - fn get_client(&self) -> &Client { - self.client.get_or_init(|| Client::new()) + fn create_client(&self, workspace_root: &Path) -> miette::Result> { + let mut client = Client::builder() + .user_agent("moon") + .tcp_keepalive(Duration::from_secs(60)); + + if let Some(auth) = &self.config.auth { + let mut headers = HeaderMap::default(); + + for (key, value) in &auth.headers { + headers.insert( + HeaderName::from_bytes(key.as_bytes()).into_diagnostic()?, + HeaderValue::from_str(value).into_diagnostic()?, + ); + } + + if let Some(token_name) = &auth.token { + let token = env::var(token_name).unwrap_or_default(); + + if token.is_empty() { + warn!( + "Auth token {} does not exist, unable to authorize for remote service", + color::property(token_name) + ); + + return Ok(None); + } else { + let mut value = + HeaderValue::from_str(&format!("Bearer {token}")).into_diagnostic()?; + value.set_sensitive(true); + + headers.insert( + HeaderName::from_bytes("Authorization".as_bytes()).into_diagnostic()?, + value, + ); + } + } + + client = client.default_headers(headers); + } + + if let Some(mtls) = &self.config.mtls { + client = create_mtls_config(client, mtls, workspace_root)? + } else if let Some(tls) = &self.config.tls { + client = create_tls_config(client, tls, workspace_root)? + } else if self.config.is_secure_protocol() { + client = create_native_tls_config(client)?; + } + + let client = client.build().into_diagnostic()?; + + Ok(Some(client)) + } + + fn get_client(&self) -> Arc { + Arc::clone(self.client.get_or_init(|| Arc::new(Client::new()))) + } + + fn get_endpoint(&self, path: &str, hash: &str) -> String { + format!( + "{}/{}/{path}/{hash}", + self.config.host, self.config.cache.instance_name + ) } } @@ -41,16 +111,47 @@ impl RemoteClient for HttpRemoteClient { async fn connect_to_host( &mut self, config: &RemoteConfig, - _workspace_root: &Path, - ) -> miette::Result<()> { - self.compression = config.cache.compression; - self.host = config.host.clone(); - self.instance_name = config.cache.instance_name.clone(); + workspace_root: &Path, + ) -> miette::Result { + let host = &config.host; + + debug!( + instance = &config.cache.instance_name, + "Connecting to HTTP host {} {}", + color::url(host), + if config.mtls.is_some() { + "(with mTLS)" + } else if config.tls.is_some() { + "(with TLS)" + } else if config.is_bearer_auth() { + "(with auth)" + } else { + "(insecure)" + } + ); + + self.config = config.to_owned(); + + if self.config.cache.compression != RemoteCompression::None { + self.config.cache.compression = RemoteCompression::None; + + debug!("HTTP API does not support compression, disabling"); + } + + // Create client and abort early if not enabled + match self.create_client(workspace_root)? { + Some(client) => { + let _ = self.client.set(Arc::new(client)); + } + None => { + return Ok(false); + } + } // Ignore errors since this endpoint is non-standard if let Ok(response) = self .get_client() - .get(format!("{}/status", self.host)) + .get(format!("{}/status", self.config.host)) .send() .await { @@ -69,14 +170,14 @@ impl RemoteClient for HttpRemoteClient { } } - Ok(()) + Ok(true) } // HTTP API doesn't support capabilities, so we need to fake this // based on what `bazel-remote` supports async fn load_capabilities(&self) -> miette::Result { let digest_functions = vec![digest_function::Value::Sha256 as i32]; - let compressors = get_acceptable_compressors(self.compression); + let compressors = get_acceptable_compressors(RemoteCompression::None); Ok(ServerCapabilities { cache_capabilities: Some(CacheCapabilities { @@ -88,10 +189,7 @@ impl RemoteClient for HttpRemoteClient { supported_batch_update_compressors: compressors, ..Default::default() }), - execution_capabilities: Some(ExecutionCapabilities { - digest_functions, - ..Default::default() - }), + execution_capabilities: None, ..Default::default() }) } @@ -101,44 +199,41 @@ impl RemoteClient for HttpRemoteClient { match self .get_client() - .get(format!( - "{}/{}/ac/{}", - self.host, self.instance_name, digest.hash - )) + .get(self.get_endpoint("ac", &digest.hash)) .header("Accept", "application/json") - .header("Content-Type", "application/json") .send() .await { Ok(response) => { - dbg!("get_action_result", &response); - // let result = response.into_inner(); - // - dbg!(response.text().await.unwrap()); - - // trace!( - // hash = &digest.hash, - // files = result.output_files.len(), - // links = result.output_symlinks.len(), - // dirs = result.output_directories.len(), - // exit_code = result.exit_code, - // "Cache hit on action result" - // ); - - // Ok(Some(result)) - Ok(None) + if response.status().is_success() { + let result: ActionResult = + response + .json() + .await + .map_err(|error| RemoteError::HttpCallFailed { + error: Box::new(error), + })?; + + trace!( + hash = &digest.hash, + files = result.output_files.len(), + links = result.output_symlinks.len(), + dirs = result.output_directories.len(), + exit_code = result.exit_code, + "Cache hit on action result" + ); + + Ok(Some(result)) + } else { + trace!(hash = &digest.hash, "Cache miss on action result"); + + Ok(None) + } } - Err(error) => { - dbg!(&error); - // if matches!(status.code(), Code::NotFound) { - // trace!(hash = &digest.hash, "Cache miss on action result"); - - // Ok(None) - // } else { - // Err(map_status_error(status).into()) - // } - Ok(None) + Err(error) => Err(RemoteError::HttpCallFailed { + error: Box::new(error), } + .into()), } } @@ -156,33 +251,45 @@ impl RemoteClient for HttpRemoteClient { "Caching action result" ); - let mut data = json::format(&result, false)?; - - // Empty bytes arrays are not allowed - data = data.replace(r#""stdout_raw":[],"#, ""); - data = data.replace(r#""stderr_raw":[],"#, ""); - data = data.replace(r#""contents":[],"#, ""); - - dbg!(&result); - println!("{}", data); - - let res = self + match self .get_client() - .put(format!( - "{}/{}/ac/{}", - self.host, self.instance_name, digest.hash - )) - .header("Accept", "application/json") + .put(self.get_endpoint("ac", &digest.hash)) .header("Content-Type", "application/json") - .body(data) + .json(&result) .send() .await - .unwrap(); + { + Ok(response) => { + let status = response.status(); + + // Doesn't return a response body + // https://github.com/buchgr/bazel-remote/blob/master/server/http.go#L429 + if status.is_success() { + trace!(hash = &digest.hash, "Cached action result"); - dbg!("update_action_result", &res); - dbg!(res.text().await.unwrap()); + Ok(Some(result)) + } else { + warn!( + hash = &digest.hash, + code = status.as_u16(), + "Failed to cache action result: {}", + status + ); - Ok(None) + Ok(None) + } + } + Err(error) => Err(RemoteError::HttpCallFailed { + error: Box::new(error), + } + .into()), + } + } + + async fn find_missing_blobs(&self, blob_digests: Vec) -> miette::Result> { + // No way to query this information, + // so just assume all are missing? + Ok(blob_digests) } async fn batch_read_blobs( @@ -190,7 +297,75 @@ impl RemoteClient for HttpRemoteClient { digest: &Digest, blob_digests: Vec, ) -> miette::Result> { - Ok(vec![]) + trace!( + hash = &digest.hash, + compression = self.config.cache.compression.to_string(), + "Downloading {} output blobs", + blob_digests.len() + ); + + let mut requests = vec![]; + + for blob_digest in blob_digests { + let client = self.get_client(); + let action_hash = digest.hash.clone(); + let url = self.get_endpoint("cas", &blob_digest.hash); + let semaphore = self.semaphore.clone(); + + requests.push(tokio::spawn(async move { + let Ok(_permit) = semaphore.acquire().await else { + return None; + }; + + match client.get(url).send().await { + Ok(response) => { + let status = response.status(); + + if status.is_success() { + if let Ok(bytes) = response.bytes().await { + return Some(Blob { + digest: blob_digest, + bytes: bytes.to_vec(), + }); + } + } + + warn!( + hash = &action_hash, + blob_hash = &blob_digest.hash, + "Failed to download blob: {status}", + ); + } + Err(error) => { + warn!( + hash = &action_hash, + blob_hash = &blob_digest.hash, + "Failed to download blob: {error}", + ); + } + } + + None + })); + } + + let mut blobs = vec![]; + let total_count = requests.len(); + + for future in requests { + if let Ok(Some(blob)) = future.await { + blobs.push(blob); + } + } + + trace!( + hash = &digest.hash, + "Downloaded {} of {} output blobs", + blobs.len(), + total_count + ); + + Ok(blobs) } async fn batch_update_blobs( @@ -198,6 +373,79 @@ impl RemoteClient for HttpRemoteClient { digest: &Digest, blobs: Vec, ) -> miette::Result>> { - Ok(vec![]) + let compression = self.config.cache.compression; + let mut requests = vec![]; + + trace!( + hash = &digest.hash, + compression = compression.to_string(), + "Uploading {} output blobs", + blobs.len() + ); + + for blob in blobs { + let client = self.get_client(); + let action_hash = digest.hash.clone(); + let url = self.get_endpoint("cas", &blob.digest.hash); + let semaphore = self.semaphore.clone(); + + requests.push(tokio::spawn(async move { + let Ok(_permit) = semaphore.acquire().await else { + return None; + }; + + match client.put(url).body(blob.bytes).send().await { + Ok(response) => { + let status = response.status(); + + if status.is_success() { + return Some(blob.digest); + } + + warn!( + hash = &action_hash, + blob_hash = &blob.digest.hash, + "Failed to upload blob: {status}", + ); + } + Err(error) => { + warn!( + hash = &action_hash, + blob_hash = &blob.digest.hash, + "Failed to upload blob: {error}", + ); + } + } + + None + })); + } + + let mut digests = vec![]; + let mut uploaded_count = 0; + + for future in requests { + match future.await { + Ok(upload) => { + if upload.is_some() { + uploaded_count += 1; + } + + digests.push(upload); + } + _ => { + digests.push(None); + } + } + } + + trace!( + hash = &digest.hash, + "Uploaded {} of {} output blobs", + uploaded_count, + digests.len() + ); + + Ok(digests) } } diff --git a/crates/remote/src/http_tls.rs b/crates/remote/src/http_tls.rs new file mode 100644 index 00000000000..751db3c4258 --- /dev/null +++ b/crates/remote/src/http_tls.rs @@ -0,0 +1,67 @@ +use miette::IntoDiagnostic; +use moon_config::{RemoteMtlsConfig, RemoteTlsConfig}; +use reqwest::{Certificate, ClientBuilder, Identity}; +use starbase_utils::fs; +use std::path::Path; +use tracing::trace; + +pub fn create_native_tls_config(client: ClientBuilder) -> miette::Result { + Ok(client + .use_rustls_tls() + .tls_built_in_native_certs(true) + .https_only(true)) +} + +pub fn create_tls_config( + client: ClientBuilder, + config: &RemoteTlsConfig, + workspace_root: &Path, +) -> miette::Result { + let cert = workspace_root.join(&config.cert); + + trace!( + cert = ?cert, + "Configuring TLS", + ); + + let client = client + .use_rustls_tls() + .tls_built_in_native_certs(false) + .add_root_certificate(Certificate::from_pem(&fs::read_file_bytes(cert)?).into_diagnostic()?) + .https_only(true); + + Ok(client) +} + +pub fn create_mtls_config( + client: ClientBuilder, + config: &RemoteMtlsConfig, + workspace_root: &Path, +) -> miette::Result { + let client_cert = workspace_root.join(&config.client_cert); + let client_key = workspace_root.join(&config.client_key); + let ca_cert = workspace_root.join(&config.ca_cert); + + trace!( + client_cert = ?client_cert, + client_key = ?client_key, + ca_cert = ?ca_cert, + "Configuring mTLS", + ); + + // Is this correct? + let mut identity_buf = Vec::new(); + identity_buf.extend(fs::read_file_bytes(client_key)?); + identity_buf.extend(fs::read_file_bytes(client_cert)?); + + let client = client + .use_rustls_tls() + .tls_built_in_native_certs(false) + .add_root_certificate( + Certificate::from_pem(&fs::read_file_bytes(ca_cert)?).into_diagnostic()?, + ) + .identity(Identity::from_pem(&identity_buf).into_diagnostic()?) + .https_only(true); + + Ok(client) +} diff --git a/crates/remote/src/lib.rs b/crates/remote/src/lib.rs index 4afce306cd2..a0ffdecb6fb 100644 --- a/crates/remote/src/lib.rs +++ b/crates/remote/src/lib.rs @@ -3,8 +3,8 @@ mod compression; mod fs_digest; mod grpc_remote_client; mod grpc_tls; -// mod http_endpoints; -// mod http_remote_client; +mod http_remote_client; +mod http_tls; mod remote_client; mod remote_error; mod remote_service; diff --git a/crates/remote/src/remote_error.rs b/crates/remote/src/remote_error.rs index aa83dfa6d09..4e555b982db 100644 --- a/crates/remote/src/remote_error.rs +++ b/crates/remote/src/remote_error.rs @@ -15,6 +15,13 @@ pub enum RemoteError { error: Box, }, + #[diagnostic(code(remote::http::call_failed))] + #[error("Failed to make HTTP call.")] + HttpCallFailed { + #[source] + error: Box, + }, + #[diagnostic(code(remote::http::connect_failed))] #[error("Failed to connect to HTTP host ({code} {reason}).")] HttpConnectFailed { code: u16, reason: String }, diff --git a/crates/remote/src/remote_service.rs b/crates/remote/src/remote_service.rs index f8f2d47af69..a7001e39cdb 100644 --- a/crates/remote/src/remote_service.rs +++ b/crates/remote/src/remote_service.rs @@ -1,8 +1,8 @@ +use crate::action_state::ActionState; use crate::compression::*; use crate::fs_digest::*; use crate::grpc_remote_client::GrpcRemoteClient; -// use crate::http_remote_client::HttpRemoteClient; -use crate::action_state::ActionState; +use crate::http_remote_client::HttpRemoteClient; use crate::remote_client::RemoteClient; use bazel_remote_apis::build::bazel::remote::execution::v2::{ digest_function, ActionResult, Digest, ServerCapabilities, @@ -57,8 +57,9 @@ impl RemoteService { ); info!("Please report any issues to GitHub or Discord"); - let mut client = match config.api { + let mut client: Box = match config.api { RemoteApi::Grpc => Box::new(GrpcRemoteClient::default()), + RemoteApi::Http => Box::new(HttpRemoteClient::default()), }; let mut instance = Self { diff --git a/packages/types/src/workspace-config.ts b/packages/types/src/workspace-config.ts index a47e9186c1f..394eb60c635 100644 --- a/packages/types/src/workspace-config.ts +++ b/packages/types/src/workspace-config.ts @@ -241,7 +241,7 @@ export interface RunnerConfig { } /** The API format of the remote service. */ -export type RemoteApi = 'grpc'; +export type RemoteApi = 'grpc' | 'http'; /** Configures basic HTTP authentication. */ export interface RemoteAuthConfig { @@ -251,7 +251,7 @@ export interface RemoteAuthConfig { token: string | null; } -/** Supported blob compression levels. */ +/** Supported blob compression levels for gRPC APIs. */ export type RemoteCompression = 'none' | 'zstd'; /** Configures the action cache (AC) and content addressable cache (CAS). */ @@ -319,7 +319,7 @@ export interface RemoteConfig { * The API format of the remote service. * * @default 'grpc' - * @type {'grpc'} + * @type {'grpc' | 'http'} */ api: RemoteApi; /** Connect to the host using basic HTTP authentication. */ diff --git a/website/docs/config/workspace.mdx b/website/docs/config/workspace.mdx index de7037670af..e9315e18f33 100644 --- a/website/docs/config/workspace.mdx +++ b/website/docs/config/workspace.mdx @@ -494,7 +494,10 @@ in the [remote caching](../guides/remote-cache) guide. The API format of the remote server. This format dictates which type of client moon uses for -communicating with. Defaults to `grpc`. +communicating with. Supports the following: + +- `grpc` (default) - Uses the gRPC API: https://github.com/bazelbuild/remote-apis +- `http` - Uses the HTTP API: https://bazel.build/remote/caching#http-caching ```yaml title=".moon/workspace.yml" {2} unstable_remote: @@ -557,6 +560,12 @@ unstable_remote: compression: 'zstd' ``` +:::info + +Compression is only applied to gRPC based APIs, not HTTP. + +::: + #### `instanceName` @@ -578,12 +587,12 @@ unstable_remote: -The host URL to communicate with when uploading and download artifacts. Supports gRPC through the -`grpc://` and `grpcs://` protocols. This field is required! +The host URL to communicate with when uploading and downloading artifacts. Supports both +`grpc(s)://` and `http(s)://` protocols. This field is required! ```yaml title=".moon/workspace.yml" {2} unstable_remote: - host: 'grpc://your-host.com:9092' + host: 'grpcs://your-host.com:9092' ``` ### `mtls` diff --git a/website/static/schemas/workspace.json b/website/static/schemas/workspace.json index 58a61c5443a..a2b1152b894 100644 --- a/website/static/schemas/workspace.json +++ b/website/static/schemas/workspace.json @@ -517,7 +517,8 @@ "description": "The API format of the remote service.", "type": "string", "enum": [ - "grpc" + "grpc", + "http" ] }, "RemoteAuthConfig": { @@ -574,7 +575,7 @@ "additionalProperties": false }, "RemoteCompression": { - "description": "Supported blob compression levels.", + "description": "Supported blob compression levels for gRPC APIs.", "type": "string", "enum": [ "none", From 896fd4cbca8176e90ff2d89033e695facd1f20b4 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 26 Jan 2025 16:14:01 -0800 Subject: [PATCH 05/15] new: Add MOON_DEBUG_REMOTE. --- CHANGELOG.md | 2 + crates/remote/src/grpc_remote_client.rs | 73 ++++++++++++++----------- crates/remote/src/http_remote_client.rs | 42 ++++++++++---- 3 files changed, 76 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e8b098983d..962a14fa0a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ based endpoints. Can also be used to set headers for all requests. - Added support for Depot cloud-based caching: https://depot.dev/docs/cache/overview - Added support for the HTTP protocol: https://bazel.build/remote/caching#http-caching + - Added a `MOON_DEBUG_REMOTE` environment variable, which can be used to debug internal errors for + diagnosing connection/integration issues. ## 1.31.3 diff --git a/crates/remote/src/grpc_remote_client.rs b/crates/remote/src/grpc_remote_client.rs index 670043c8ae4..24fef0dec7e 100644 --- a/crates/remote/src/grpc_remote_client.rs +++ b/crates/remote/src/grpc_remote_client.rs @@ -13,32 +13,20 @@ use bazel_remote_apis::build::bazel::remote::execution::v2::{ use miette::IntoDiagnostic; use moon_common::color; use moon_config::RemoteConfig; +use starbase_utils::env::bool_var; use std::{env, path::Path, str::FromStr}; use tonic::{ metadata::{KeyAndValueRef, MetadataKey, MetadataMap, MetadataValue}, transport::{Channel, Endpoint}, Code, Request, Status, }; -use tracing::{debug, trace, warn}; - -fn map_transport_error(error: tonic::transport::Error) -> RemoteError { - // dbg!(&error); - RemoteError::GrpcConnectFailed { - error: Box::new(error), - } -} - -fn map_status_error(error: tonic::Status) -> RemoteError { - // dbg!(&error); - RemoteError::GrpcCallFailed { - error: Box::new(error), - } -} +use tracing::{debug, error, trace, warn}; #[derive(Default)] pub struct GrpcRemoteClient { channel: Option, config: RemoteConfig, + debug: bool, headers: MetadataMap, } @@ -96,6 +84,26 @@ impl GrpcRemoteClient { Ok(req) } + + fn map_status_error(&self, method: &str, error: tonic::Status) -> RemoteError { + if self.debug { + error!("{method}: {:#?}", error); + } + + RemoteError::GrpcCallFailed { + error: Box::new(error), + } + } + + fn map_transport_error(&self, method: &str, error: tonic::transport::Error) -> RemoteError { + if self.debug { + error!("{method}: {:#?}", error); + } + + RemoteError::GrpcConnectFailed { + error: Box::new(error), + } + } } #[async_trait::async_trait] @@ -105,6 +113,8 @@ impl RemoteClient for GrpcRemoteClient { config: &RemoteConfig, workspace_root: &Path, ) -> miette::Result { + self.debug = bool_var("MOON_DEBUG_REMOTE"); + let host = &config.host; debug!( @@ -131,23 +141,23 @@ impl RemoteClient for GrpcRemoteClient { }; let mut endpoint = Endpoint::from_shared(url) - .map_err(map_transport_error)? + .map_err(|error| self.map_transport_error("host", error))? .user_agent("moon") - .map_err(map_transport_error)? + .map_err(|error| self.map_transport_error("user_agent", error))? .keep_alive_while_idle(true); if let Some(mtls) = &config.mtls { endpoint = endpoint .tls_config(create_mtls_config(mtls, workspace_root)?) - .map_err(map_transport_error)?; + .map_err(|error| self.map_transport_error("tls", error))?; } else if let Some(tls) = &config.tls { endpoint = endpoint .tls_config(create_tls_config(tls, workspace_root)?) - .map_err(map_transport_error)?; + .map_err(|error| self.map_transport_error("mtls", error))?; } else if config.is_secure_protocol() { endpoint = endpoint .tls_config(create_native_tls_config()?) - .map_err(map_transport_error)?; + .map_err(|error| self.map_transport_error("auth", error))?; } if config.is_localhost() { @@ -169,7 +179,12 @@ impl RemoteClient for GrpcRemoteClient { if self.config.is_bearer_auth() { self.channel = Some(endpoint.connect_lazy()); } else { - self.channel = Some(endpoint.connect().await.map_err(map_transport_error)?); + self.channel = Some( + endpoint + .connect() + .await + .map_err(|error| self.map_transport_error("connect_to_host", error))?, + ); } Ok(enabled) @@ -189,7 +204,7 @@ impl RemoteClient for GrpcRemoteClient { instance_name: self.config.cache.instance_name.clone(), }) .await - .map_err(map_status_error)?; + .map_err(|error| self.map_status_error("load_capabilities", error))?; Ok(response.into_inner()) } @@ -245,8 +260,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(None) } else { - // dbg!("get_action_result", digest); - Err(map_status_error(status).into()) + Err(self.map_status_error("get_action_result", status).into()) } } } @@ -309,8 +323,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(None) } else { - // dbg!("update_action_result", digest); - Err(map_status_error(status).into()) + Err(self.map_status_error("update_action_result", status).into()) } } } @@ -332,7 +345,7 @@ impl RemoteClient for GrpcRemoteClient { .await { Ok(response) => Ok(response.into_inner().missing_blob_digests), - Err(status) => Err(map_status_error(status).into()), + Err(status) => Err(self.map_status_error("find_missing_blobs", status).into()), } } @@ -373,8 +386,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(vec![]) } else { - // dbg!("batch_read_blobs", digest); - Err(map_status_error(status).into()) + Err(self.map_status_error("batch_read_blobs", status).into()) }; } }; @@ -483,8 +495,7 @@ impl RemoteClient for GrpcRemoteClient { Ok(vec![]) } else { - // dbg!("batch_update_blobs", digest); - Err(map_status_error(status).into()) + Err(self.map_status_error("batch_update_blobs", status).into()) }; } }; diff --git a/crates/remote/src/http_remote_client.rs b/crates/remote/src/http_remote_client.rs index 0ab833fc6a8..c6c092e3887 100644 --- a/crates/remote/src/http_remote_client.rs +++ b/crates/remote/src/http_remote_client.rs @@ -12,16 +12,18 @@ use moon_common::color; use moon_config::{RemoteCompression, RemoteConfig}; use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; use reqwest::Client; +use starbase_utils::env::bool_var; use std::env; use std::sync::Arc; use std::time::Duration; use std::{path::Path, sync::OnceLock}; use tokio::sync::Semaphore; -use tracing::{debug, trace, warn}; +use tracing::{debug, error, trace, warn}; pub struct HttpRemoteClient { client: OnceLock>, config: RemoteConfig, + debug: bool, // Since HTTP doesn't support batching, we will most likely // end up up/downloading too many files in parallel, triggering a @@ -35,6 +37,7 @@ impl Default for HttpRemoteClient { Self { client: OnceLock::new(), config: RemoteConfig::default(), + debug: false, semaphore: Arc::new(Semaphore::new(100)), } } @@ -89,7 +92,9 @@ impl HttpRemoteClient { client = create_native_tls_config(client)?; } - let client = client.build().into_diagnostic()?; + let client = client + .build() + .map_err(|error| self.map_error("create_client", error))?; Ok(Some(client)) } @@ -104,6 +109,16 @@ impl HttpRemoteClient { self.config.host, self.config.cache.instance_name ) } + + fn map_error(&self, method: &str, error: reqwest::Error) -> RemoteError { + if self.debug { + error!("{method}: {:#?}", error); + } + + RemoteError::HttpCallFailed { + error: Box::new(error), + } + } } #[async_trait::async_trait] @@ -113,6 +128,8 @@ impl RemoteClient for HttpRemoteClient { config: &RemoteConfig, workspace_root: &Path, ) -> miette::Result { + self.debug = bool_var("MOON_DEBUG_REMOTE"); + let host = &config.host; debug!( @@ -230,10 +247,7 @@ impl RemoteClient for HttpRemoteClient { Ok(None) } } - Err(error) => Err(RemoteError::HttpCallFailed { - error: Box::new(error), - } - .into()), + Err(error) => Err(self.map_error("get_action_result", error).into()), } } @@ -279,10 +293,7 @@ impl RemoteClient for HttpRemoteClient { Ok(None) } } - Err(error) => Err(RemoteError::HttpCallFailed { - error: Box::new(error), - } - .into()), + Err(error) => Err(self.map_error("update_action_result", error).into()), } } @@ -305,6 +316,7 @@ impl RemoteClient for HttpRemoteClient { ); let mut requests = vec![]; + let debug_enabled = self.debug; for blob_digest in blob_digests { let client = self.get_client(); @@ -342,6 +354,10 @@ impl RemoteClient for HttpRemoteClient { blob_hash = &blob_digest.hash, "Failed to download blob: {error}", ); + + if debug_enabled { + trace!("read_blob: {:?}", error); + } } } @@ -383,6 +399,8 @@ impl RemoteClient for HttpRemoteClient { blobs.len() ); + let debug_enabled = self.debug; + for blob in blobs { let client = self.get_client(); let action_hash = digest.hash.clone(); @@ -414,6 +432,10 @@ impl RemoteClient for HttpRemoteClient { blob_hash = &blob.digest.hash, "Failed to upload blob: {error}", ); + + if debug_enabled { + trace!("update_blob: {:?}", error); + } } } From 3ee0de4d80ec994c096f693e5aba9704ce9449ac Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 26 Jan 2025 21:18:38 -0800 Subject: [PATCH 06/15] new: Enable cryptography for mTLS. (#1801) * Add dep. * Pull in nasm. * Add prebuilt. * Add prebuilt. * Need cmake. --- .github/workflows/rust.yml | 3 + Cargo.lock | 255 +++++++++++++++++++++------- crates/cli/src/main.rs | 7 +- crates/remote/Cargo.toml | 6 + crates/remote/src/remote_service.rs | 12 +- website/moon.yml | 2 + 6 files changed, 220 insertions(+), 65 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 0013b7a709e..9e44cca86d0 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -79,6 +79,7 @@ jobs: # SCCACHE_NO_DAEMON: 1 SCCACHE_REGION: us-east-2 SCCACHE_S3_SERVER_SIDE_ENCRYPTION: true + AWS_LC_SYS_PREBUILT_NASM: 1 steps: - uses: actions/checkout@v4 - uses: moonrepo/setup-rust@v1 @@ -93,6 +94,8 @@ jobs: proto-version: '0.45.1' # Keep in sync - uses: mozilla-actions/sccache-action@v0.0.5 if: ${{ vars.ENABLE_SCCACHE == 'true' }} + - uses: lukka/get-cmake@latest + if: ${{ runner.os == 'Windows' }} - name: Checking coverage status id: coverage shell: bash diff --git a/Cargo.lock b/Cargo.lock index 95c7bab9094..2342be831c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -429,6 +429,31 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "aws-lc-rs" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b7ddaa2c56a367ad27a094ad8ef4faacf8a617c2575acb2ba88949df999ca" +dependencies = [ + "aws-lc-sys", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71b2ddd3ada61a305e1d8bb6c005d1eaa7d14d903681edfc400406d523a9b491" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "paste", +] + [[package]] name = "axum" version = "0.7.5" @@ -545,6 +570,29 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.11.0", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.96", + "which", +] + [[package]] name = "binstall-tar" version = "0.4.42" @@ -855,6 +903,15 @@ dependencies = [ "serde", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -932,6 +989,17 @@ dependencies = [ "serde", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" version = "4.5.27" @@ -998,6 +1066,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aaa6b4b263a5d737e9bf6b7c09b72c41a5480aec4d7219af827f6564e950b6a5" +[[package]] +name = "cmake" +version = "0.1.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" +dependencies = [ + "cc", +] + [[package]] name = "cobs" version = "0.2.3" @@ -1162,7 +1239,7 @@ dependencies = [ "hashbrown 0.14.5", "log", "regalloc2", - "rustc-hash", + "rustc-hash 2.1.0", "smallvec", "target-lexicon", ] @@ -1857,6 +1934,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" version = "0.3.31" @@ -2199,6 +2282,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "http" version = "0.2.12" @@ -2943,6 +3035,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "leb128" version = "0.2.5" @@ -2961,6 +3059,16 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.48.5", +] + [[package]] name = "libm" version = "0.2.8" @@ -3278,7 +3386,7 @@ dependencies = [ "moon_target", "moon_time", "moon_toolchain", - "rustc-hash", + "rustc-hash 2.1.0", "serde", ] @@ -3290,7 +3398,7 @@ dependencies = [ "moon_affected", "moon_common", "moon_target", - "rustc-hash", + "rustc-hash 2.1.0", "scc", "serde", "tokio", @@ -3315,7 +3423,7 @@ dependencies = [ "moon_test_utils2", "moon_workspace_graph", "petgraph", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_sandbox", "thiserror 2.0.11", "tokio", @@ -3346,7 +3454,7 @@ dependencies = [ "moon_workspace_graph", "num_cpus", "petgraph", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "tokio", "tokio-util", @@ -3378,7 +3486,7 @@ dependencies = [ "moon_vcs_hooks", "moon_workspace_graph", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "scc", "serde", "starbase_utils", @@ -3398,7 +3506,7 @@ dependencies = [ "moon_task", "moon_test_utils2", "moon_workspace_graph", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "tokio", "tracing", @@ -3419,7 +3527,7 @@ dependencies = [ "moon_time", "proto_core", "reqwest", - "rustc-hash", + "rustc-hash 2.1.0", "semver", "serde", "starbase_utils", @@ -3500,7 +3608,7 @@ dependencies = [ "proto_installer", "regex", "reqwest", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "semver", "serde", @@ -3545,7 +3653,7 @@ dependencies = [ "cached", "miette 7.4.0", "moon_lang", - "rustc-hash", + "rustc-hash 2.1.0", "tracing", "yarn-lock-parser", ] @@ -3574,7 +3682,7 @@ dependencies = [ "moon_typescript_platform", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "serde", "starbase_styles", @@ -3596,7 +3704,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "scc", "starbase_utils", "tracing", @@ -3648,7 +3756,7 @@ dependencies = [ "moon_test_utils2", "moon_vcs", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "serial_test", "sigpipe", "starbase", @@ -3679,7 +3787,7 @@ dependencies = [ "moon_time", "once_cell", "regex", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_archive", "starbase_sandbox", "starbase_utils", @@ -3711,7 +3819,7 @@ dependencies = [ "miette 7.4.0", "regex", "relative-path", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "serde", "starbase_styles", @@ -3732,7 +3840,7 @@ dependencies = [ "proto_core", "regex", "rpkl", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "semver", "serde", @@ -3791,7 +3899,7 @@ dependencies = [ "moon_lang", "moon_logger", "moon_typescript_lang", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_styles", "starbase_utils", @@ -3819,7 +3927,7 @@ dependencies = [ "moon_typescript_platform", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "serde", ] @@ -3837,7 +3945,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_utils", "tracing", ] @@ -3873,7 +3981,7 @@ dependencies = [ "moon_config", "moon_pdk_api", "moon_plugin", - "rustc-hash", + "rustc-hash 2.1.0", "tracing", ] @@ -3898,7 +4006,7 @@ version = "0.0.1" dependencies = [ "miette 7.4.0", "petgraph", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_utils", ] @@ -3928,7 +4036,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "once_cell", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_styles", "tracing", ] @@ -3938,7 +4046,7 @@ name = "moon_lang" version = "0.0.1" dependencies = [ "miette 7.4.0", - "rustc-hash", + "rustc-hash 2.1.0", ] [[package]] @@ -3963,7 +4071,7 @@ dependencies = [ "nodejs_package_json", "package-lock-json-parser", "reqwest", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "serde_json", "serde_yml", @@ -3997,7 +4105,7 @@ dependencies = [ "moon_typescript_platform", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "serde", "starbase_styles", @@ -4019,7 +4127,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "scc", "starbase_styles", "starbase_utils", @@ -4059,7 +4167,7 @@ version = "0.0.13" dependencies = [ "moon_common", "moon_config", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "serde", "warpgate_api", @@ -4092,7 +4200,7 @@ dependencies = [ "moon_task", "moon_tool", "moon_toolchain", - "rustc-hash", + "rustc-hash 2.1.0", ] [[package]] @@ -4130,7 +4238,7 @@ dependencies = [ "moon_common", "moon_console", "once_cell", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_shell", "system_env", "thiserror 2.0.11", @@ -4163,7 +4271,7 @@ dependencies = [ "moon_task", "moon_task_builder", "moon_toolchain", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_sandbox", "tokio", "tracing", @@ -4188,7 +4296,7 @@ dependencies = [ "moon_common", "moon_config", "moon_project", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_sandbox", "starbase_utils", "thiserror 2.0.11", @@ -4211,7 +4319,7 @@ dependencies = [ "moon_test_utils2", "moon_workspace", "petgraph", - "rustc-hash", + "rustc-hash 2.1.0", "scc", "starbase_events", "starbase_sandbox", @@ -4230,7 +4338,7 @@ dependencies = [ "moon_lang", "moon_test_utils", "pep-508", - "rustc-hash", + "rustc-hash 2.1.0", ] [[package]] @@ -4255,7 +4363,7 @@ dependencies = [ "moon_tool", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_styles", "starbase_utils", @@ -4278,7 +4386,7 @@ dependencies = [ "moon_toolchain", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_styles", "starbase_utils", "tracing", @@ -4303,6 +4411,7 @@ name = "moon_remote" version = "0.0.1" dependencies = [ "async-trait", + "aws-lc-rs", "bazel-remote-apis", "bincode", "chrono", @@ -4312,13 +4421,14 @@ dependencies = [ "moon_config", "moon_task", "reqwest", - "rustc-hash", + "rustc-hash 2.1.0", "scc", "serde", "sha2", "starbase_utils", "thiserror 2.0.11", "tokio", + "tokio-rustls", "tonic", "tracing", "zstd", @@ -4335,7 +4445,7 @@ dependencies = [ "moon_lang", "moon_logger", "moon_test_utils", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_styles", "starbase_utils", @@ -4363,7 +4473,7 @@ dependencies = [ "moon_tool", "moon_utils", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_styles", "starbase_utils", @@ -4384,7 +4494,7 @@ dependencies = [ "moon_tool", "moon_toolchain", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_utils", "tracing", ] @@ -4433,7 +4543,7 @@ dependencies = [ "moon_config", "moon_target", "once_cell", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_sandbox", "starbase_utils", @@ -4459,7 +4569,7 @@ dependencies = [ "moon_task", "moon_task_args", "moon_toolchain", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_sandbox", "thiserror 2.0.11", "tokio", @@ -4482,7 +4592,7 @@ dependencies = [ "moon_time", "pathdiff", "regex", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_sandbox", "starbase_utils", "thiserror 2.0.11", @@ -4502,7 +4612,7 @@ dependencies = [ "moon_task", "moon_task_expander", "petgraph", - "rustc-hash", + "rustc-hash 2.1.0", "thiserror 2.0.11", "tracing", ] @@ -4519,7 +4629,7 @@ dependencies = [ "moon_task", "moon_test_utils2", "moon_vcs", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_sandbox", "starbase_utils", @@ -4572,7 +4682,7 @@ dependencies = [ "moon_config", "predicates", "pretty_assertions", - "rustc-hash", + "rustc-hash 2.1.0", "serde_yml", "starbase_utils", ] @@ -4621,7 +4731,7 @@ dependencies = [ "moon_process", "moon_toolchain", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_styles", "thiserror 2.0.11", "tokio", @@ -4649,7 +4759,7 @@ dependencies = [ "moon_pdk_api", "moon_plugin", "proto_core", - "rustc-hash", + "rustc-hash 2.1.0", "tokio", "tracing", ] @@ -4683,7 +4793,7 @@ dependencies = [ "moon_test_utils", "moon_typescript_lang", "moon_utils", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_styles", "starbase_utils", @@ -4724,7 +4834,7 @@ dependencies = [ "moon_process", "once_cell", "regex", - "rustc-hash", + "rustc-hash 2.1.0", "scc", "semver", "serde", @@ -4744,7 +4854,7 @@ dependencies = [ "moon_config", "moon_hash", "moon_vcs", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_sandbox", "starbase_utils", @@ -4772,7 +4882,7 @@ dependencies = [ "moon_vcs", "moon_workspace_graph", "petgraph", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "starbase_events", "starbase_utils", @@ -4857,7 +4967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "008b3dcf2b6ccd151efab4145717974b21588f105f2bc9004983b6cc2e00cf9e" dependencies = [ "indexmap 2.7.1", - "rustc-hash", + "rustc-hash 2.1.0", "semver", "serde", "serde_json", @@ -5536,7 +5646,7 @@ dependencies = [ "proto_shim", "regex", "reqwest", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "semver", "serde", @@ -5579,7 +5689,7 @@ version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1692357bb8d5b8f3e72ceeaa4de08a7061303af98a1431bc99cb2ecc7faa1bc6" dependencies = [ - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "semver", "serde", @@ -5630,7 +5740,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.1.0", "rustls", "socket2", "thiserror 1.0.69", @@ -5647,7 +5757,7 @@ dependencies = [ "bytes", "rand", "ring", - "rustc-hash", + "rustc-hash 2.1.0", "rustls", "slab", "thiserror 1.0.69", @@ -5777,7 +5887,7 @@ checksum = "12908dbeb234370af84d0579b9f68258a0f67e201412dd9a2814e6f45b2fc0f0" dependencies = [ "hashbrown 0.14.5", "log", - "rustc-hash", + "rustc-hash 2.1.0", "slice-group-by", "smallvec", ] @@ -6021,6 +6131,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.1.0" @@ -6048,6 +6164,7 @@ version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ + "aws-lc-rs", "log", "once_cell", "ring", @@ -6104,6 +6221,7 @@ version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -6638,7 +6756,7 @@ dependencies = [ "bzip2", "flate2", "miette 7.4.0", - "rustc-hash", + "rustc-hash 2.1.0", "starbase_styles", "starbase_utils", "thiserror 2.0.11", @@ -7207,12 +7325,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] @@ -7449,7 +7566,7 @@ dependencies = [ "clean-path", "indexmap 2.7.1", "relative-path", - "rustc-hash", + "rustc-hash 2.1.0", "serde", "serde_json", ] @@ -7736,7 +7853,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "440add01f721de08a49e9b2d2899ce79845c9994c60f8e1088b5b1c3676df127" dependencies = [ "anyhow", - "rustc-hash", + "rustc-hash 2.1.0", "schematic", "serde", "serde_json", @@ -8220,6 +8337,18 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "wiggle" version = "26.0.1" diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index b8025973ee3..b6d142a1216 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -13,6 +13,7 @@ use starbase::diagnostics::IntoDiagnostic; use starbase::tracing::TracingOptions; use starbase::{App, MainResult}; use starbase_styles::color; +use starbase_utils::env::bool_var; use starbase_utils::{dirs, string_vec}; use std::env; use std::process::{Command, ExitCode}; @@ -43,12 +44,16 @@ fn get_tracing_modules() -> Vec { // "rustls", ]; - if env::var("MOON_DEBUG_WASM").is_ok() { + if bool_var("MOON_DEBUG_WASM") { modules.push("extism".into()); } else { modules.push("extism::pdk".into()); } + if bool_var("MOON_DEBUG_REMOTE") { + modules.push("tonic".into()); + } + modules } diff --git a/crates/remote/Cargo.toml b/crates/remote/Cargo.toml index 91e45cdea33..4961a303f5b 100644 --- a/crates/remote/Cargo.toml +++ b/crates/remote/Cargo.toml @@ -31,5 +31,11 @@ tonic = { version = "0.12.3", default-features = false, features = [ tracing = { workspace = true } zstd = "0.13.2" +# Temporary until tonic v0.13 +aws-lc-rs = { version = "1.12.2", default-features = false, features = [ + "prebuilt-nasm", +] } +tokio-rustls = "0.26.1" + [lints] workspace = true diff --git a/crates/remote/src/remote_service.rs b/crates/remote/src/remote_service.rs index a7001e39cdb..28cfceec0b2 100644 --- a/crates/remote/src/remote_service.rs +++ b/crates/remote/src/remote_service.rs @@ -17,7 +17,7 @@ use std::sync::{Arc, OnceLock}; use std::time::SystemTime; use tokio::sync::RwLock; use tokio::task::{JoinHandle, JoinSet}; -use tracing::{debug, info, instrument, trace, warn}; +use tracing::{debug, error, info, instrument, trace, warn}; static INSTANCE: OnceLock> = OnceLock::new(); @@ -51,6 +51,16 @@ impl RemoteService { return Ok(()); } + // Required until tonic v0.13 + if tokio_rustls::rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .is_err() + { + error!("Failed to initialize cryptography for gRPC!"); + + return Ok(()); + } + info!( docs = "https://github.com/bazelbuild/remote-apis", "Remote service, powered by the Bazel Remote Execution API, is currently unstable" diff --git a/website/moon.yml b/website/moon.yml index d7ea32abf02..587f5149e9f 100644 --- a/website/moon.yml +++ b/website/moon.yml @@ -1,3 +1,5 @@ +# Bump + language: typescript type: application From b16feb28a8a3ea1e5b36f6481a3384cbc0734d60 Mon Sep 17 00:00:00 2001 From: element <547042+harlequin@users.noreply.github.com> Date: Tue, 28 Jan 2025 07:17:29 +0100 Subject: [PATCH 07/15] fix: Adapt remote git regex for templates (#1797) * Adapt remote git regex for templates * Fix test in codegen_test.rs * Update codegen_test.rs --- crates/codegen/src/codegen.rs | 4 ++-- crates/codegen/tests/codegen_test.rs | 5 ++--- crates/config/src/template/template_locator.rs | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/codegen/src/codegen.rs b/crates/codegen/src/codegen.rs index 72d6e127ead..74abe880e49 100644 --- a/crates/codegen/src/codegen.rs +++ b/crates/codegen/src/codegen.rs @@ -210,8 +210,8 @@ impl<'app> CodeGenerator<'app> { remote_url, revision, } => { - let base_url = remote_url.trim_start_matches('/').trim_end_matches(".git"); - let url = format!("https://{base_url}.git"); + let base_url = remote_url.trim_start_matches('/'); + let url = format!("https://{base_url}"); let template_location = self.moon_env.templates_dir.join(base_url); futures.push(spawn(clone_and_checkout_git_repository( diff --git a/crates/codegen/tests/codegen_test.rs b/crates/codegen/tests/codegen_test.rs index 26a5576d65b..58551376d23 100644 --- a/crates/codegen/tests/codegen_test.rs +++ b/crates/codegen/tests/codegen_test.rs @@ -119,7 +119,7 @@ mod codegen { let env = Arc::new(MoonEnvironment::new_testing(sandbox.path())); let config = GeneratorConfig { templates: vec![TemplateLocator::Git { - remote_url: "github.com/moonrepo/moon-configs".into(), + remote_url: "github.com/moonrepo/moon-configs.git".into(), revision: "master".into(), }], }; @@ -132,8 +132,7 @@ mod codegen { .templates_dir .join("github.com") .join("moonrepo") - .join("moon-configs") - .join(".git") + .join("moon-configs.git") .exists()); } diff --git a/crates/config/src/template/template_locator.rs b/crates/config/src/template/template_locator.rs index e0caf063865..3238b184c82 100644 --- a/crates/config/src/template/template_locator.rs +++ b/crates/config/src/template/template_locator.rs @@ -9,7 +9,7 @@ use std::fmt; use std::str::FromStr; static GIT: Lazy = Lazy::new(|| { - Regex::new("^(?[a-z0-9.]+/[a-zA-Z0-9-_./]+)#(?[a-z0-9-_.@]+)$").unwrap() + Regex::new("^(?[a-zA-Z@0-9.-]+/[a-zA-Z0-9-_./]+)#(?[a-z0-9-_.@]+)$").unwrap() }); static NPM: Lazy = Lazy::new(|| { From 4924e188745c304c86154aaf18cf8e4556a36cd9 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Tue, 28 Jan 2025 10:40:11 -0800 Subject: [PATCH 08/15] new: Add bytestream support and rework clients. (#1803) * Rework clients. * Rework headers. * Remove retry. * Filter uploads. * Add upload. * Improve errors. * Move blob. * Rework compression. * Add stream read. * Rework hashing. * Rework missing. * Polish. * Use 1%. --- .moon/workspace.yml | 4 + CHANGELOG.md | 6 + Cargo.lock | 18 +- crates/actions/src/actions/install_deps.rs | 2 +- crates/cache/src/cache_engine.rs | 2 +- crates/cache/src/hash_engine.rs | 8 +- crates/cache/tests/hash_engine_test.rs | 4 +- crates/config/src/workspace/remote_config.rs | 6 + crates/hash/src/hasher.rs | 7 + crates/remote/Cargo.toml | 12 +- crates/remote/src/action_state.rs | 22 +- crates/remote/src/blob.rs | 123 ++++++ crates/remote/src/compression.rs | 69 --- crates/remote/src/fs_digest.rs | 21 +- crates/remote/src/grpc_remote_client.rs | 438 ++++++++++++------- crates/remote/src/grpc_services.rs | 96 ++++ crates/remote/src/http_remote_client.rs | 138 +++--- crates/remote/src/lib.rs | 6 +- crates/remote/src/remote_client.rs | 75 +++- crates/remote/src/remote_service.rs | 167 ++++--- crates/task-runner/src/task_runner.rs | 12 +- crates/workspace/src/workspace_builder.rs | 2 +- 22 files changed, 825 insertions(+), 413 deletions(-) create mode 100644 crates/remote/src/blob.rs delete mode 100644 crates/remote/src/compression.rs create mode 100644 crates/remote/src/grpc_services.rs diff --git a/.moon/workspace.yml b/.moon/workspace.yml index 3ab758bac69..6651e99c5ee 100644 --- a/.moon/workspace.yml +++ b/.moon/workspace.yml @@ -37,14 +37,18 @@ docker: - '*.json' unstable_remote: + # DEPOT host: 'grpcs://cache.depot.dev' auth: token: 'DEPOT_TOKEN' headers: 'X-Depot-Org': '1xtpjd084j' 'X-Depot-Project': '90xxfkst9n' + # BAZEL-REMOTE + # host: 'grpc://0.0.0.0:9092' # cache: # compression: 'zstd' + # TLS TESTING # mtls: # caCert: 'crates/remote/tests/__fixtures__/certs-local/ca.pem' # clientCert: 'crates/remote/tests/__fixtures__/certs-local/client.pem' diff --git a/CHANGELOG.md b/CHANGELOG.md index 962a14fa0a5..0f9fca135e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,15 @@ based endpoints. Can also be used to set headers for all requests. - Added support for Depot cloud-based caching: https://depot.dev/docs/cache/overview - Added support for the HTTP protocol: https://bazel.build/remote/caching#http-caching + - Added support for the ByteStream API. + - Added timeout and concurrency limit to clients. - Added a `MOON_DEBUG_REMOTE` environment variable, which can be used to debug internal errors for diagnosing connection/integration issues. +#### 🐞 Fixes + +- Fixed lots of issues around remote caching. + ## 1.31.3 #### 🐞 Fixes diff --git a/Cargo.lock b/Cargo.lock index 2342be831c1..10582347a15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -380,9 +380,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -391,9 +391,9 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", @@ -579,7 +579,7 @@ dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.11.0", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -3066,7 +3066,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -4410,11 +4410,12 @@ dependencies = [ name = "moon_remote" version = "0.0.1" dependencies = [ + "async-stream", "async-trait", "aws-lc-rs", "bazel-remote-apis", - "bincode", "chrono", + "http 1.1.0", "miette 7.4.0", "moon_action", "moon_common", @@ -4429,8 +4430,11 @@ dependencies = [ "thiserror 2.0.11", "tokio", "tokio-rustls", + "tokio-util", "tonic", + "tower 0.4.13", "tracing", + "uuid", "zstd", ] diff --git a/crates/actions/src/actions/install_deps.rs b/crates/actions/src/actions/install_deps.rs index 07c76966e25..bfef10af2f1 100644 --- a/crates/actions/src/actions/install_deps.rs +++ b/crates/actions/src/actions/install_deps.rs @@ -242,7 +242,7 @@ async fn hash_manifests( } } - let (hash, _) = app_context.cache_engine.hash.save_manifest(hasher)?; + let hash = app_context.cache_engine.hash.save_manifest(&mut hasher)?; operation.meta.set_hash(&hash); operation.finish(ActionStatus::Passed); diff --git a/crates/cache/src/cache_engine.rs b/crates/cache/src/cache_engine.rs index 119c6e906b1..fe3c771ac84 100644 --- a/crates/cache/src/cache_engine.rs +++ b/crates/cache/src/cache_engine.rs @@ -154,7 +154,7 @@ impl CacheEngine { let name = fs::file_name(&path); let mut state = self.state.load_state::(&name)?; - let (hash, _) = self.hash.save_manifest_without_hasher(&name, data)?; + let hash = self.hash.save_manifest_without_hasher(&name, data)?; if hash != state.data.last_hash { let result = op().await?; diff --git a/crates/cache/src/hash_engine.rs b/crates/cache/src/hash_engine.rs index 412881f2f17..0e1bf8fd0f3 100644 --- a/crates/cache/src/hash_engine.rs +++ b/crates/cache/src/hash_engine.rs @@ -44,7 +44,7 @@ impl HashEngine { self.hashes_dir.join(format!("{hash}.json")) } - pub fn save_manifest(&self, mut hasher: ContentHasher) -> miette::Result<(String, usize)> { + pub fn save_manifest(&self, hasher: &mut ContentHasher) -> miette::Result { let hash = hasher.generate_hash()?; let path = self.get_manifest_path(&hash); @@ -54,17 +54,17 @@ impl HashEngine { fs::write_file(&path, data)?; - Ok((hash, data.len())) + Ok(hash) } pub fn save_manifest_without_hasher( &self, label: &str, content: T, - ) -> miette::Result<(String, usize)> { + ) -> miette::Result { let mut hasher = ContentHasher::new(label); hasher.hash_content(content)?; - self.save_manifest(hasher) + self.save_manifest(&mut hasher) } } diff --git a/crates/cache/tests/hash_engine_test.rs b/crates/cache/tests/hash_engine_test.rs index 0545bbf335f..f1a5883b9fa 100644 --- a/crates/cache/tests/hash_engine_test.rs +++ b/crates/cache/tests/hash_engine_test.rs @@ -23,7 +23,7 @@ fn saves_manifest() { }) .unwrap(); - let (hash, _) = engine.save_manifest(hasher).unwrap(); + let hash = engine.save_manifest(&mut hasher).unwrap(); assert_eq!( hash, @@ -48,7 +48,7 @@ fn saves_manifest_without_hasher() { let sandbox = create_empty_sandbox(); let engine = HashEngine::new(sandbox.path()).unwrap(); - let (hash, _) = engine + let hash = engine .save_manifest_without_hasher( "test", Content { diff --git a/crates/config/src/workspace/remote_config.rs b/crates/config/src/workspace/remote_config.rs index b1997e4cc96..3a5a76c21c3 100644 --- a/crates/config/src/workspace/remote_config.rs +++ b/crates/config/src/workspace/remote_config.rs @@ -49,6 +49,12 @@ derive_enum!( } ); +impl RemoteCompression { + pub fn is_enabled(&self) -> bool { + !matches!(self, Self::None) + } +} + /// Configures the action cache (AC) and content addressable cache (CAS). #[derive(Clone, Config, Debug)] pub struct RemoteCacheConfig { diff --git a/crates/hash/src/hasher.rs b/crates/hash/src/hasher.rs index 9caec8a6105..68990ed29ac 100644 --- a/crates/hash/src/hasher.rs +++ b/crates/hash/src/hasher.rs @@ -68,4 +68,11 @@ impl ContentHasher { Ok(self.content_cache.as_ref().unwrap()) } + + pub fn into_bytes(mut self) -> Vec { + match self.content_cache.take() { + Some(data) => data.into_bytes(), + None => vec![], + } + } } diff --git a/crates/remote/Cargo.toml b/crates/remote/Cargo.toml index 4961a303f5b..7a2252e318c 100644 --- a/crates/remote/Cargo.toml +++ b/crates/remote/Cargo.toml @@ -11,7 +11,6 @@ moon_config = { path = "../config" } moon_task = { path = "../task" } async-trait = { workspace = true } bazel-remote-apis = { version = "0.14.0", features = ["serde"] } -bincode = "1.3.3" chrono = { workspace = true } miette = { workspace = true } reqwest = { workspace = true, features = ["json", "rustls-tls"] } @@ -22,14 +21,21 @@ sha2 = { workspace = true } starbase_utils = { workspace = true, features = ["glob", "json"] } thiserror = { workspace = true } tokio = { workspace = true } +tokio-util = { workspace = true, features = ["io"] } +tracing = { workspace = true } +uuid = { workspace = true } +zstd = "0.13.2" + +# gRPC +async-stream = "0.3.6" +http = "1.1.0" tonic = { version = "0.12.3", default-features = false, features = [ "channel", "gzip", "tls", "tls-native-roots", ] } -tracing = { workspace = true } -zstd = "0.13.2" +tower = { version = "0.4.13", features = ["retry", "timeout"] } # Temporary until tonic v0.13 aws-lc-rs = { version = "1.12.2", default-features = false, features = [ diff --git a/crates/remote/src/action_state.rs b/crates/remote/src/action_state.rs index d01199551be..ca59850cab0 100644 --- a/crates/remote/src/action_state.rs +++ b/crates/remote/src/action_state.rs @@ -1,8 +1,8 @@ -use crate::fs_digest::*; +use crate::blob::*; +use crate::fs_digest::{create_timestamp_from_naive, OutputDigests}; use bazel_remote_apis::build::bazel::remote::execution::v2::{ command, platform, Action, ActionResult, Command, Digest, ExecutedActionMetadata, }; -use miette::IntoDiagnostic; use moon_action::Operation; use moon_task::Task; use std::collections::BTreeMap; @@ -17,8 +17,11 @@ pub struct ActionState<'task> { pub command: Option, pub digest: Digest, - // To upload + // Outputs to upload pub blobs: Vec, + + // Bytes of our hashed manifest + pub bytes: Vec, } impl ActionState<'_> { @@ -30,6 +33,7 @@ impl ActionState<'_> { command: None, digest, blobs: vec![], + bytes: vec![], } } @@ -57,7 +61,7 @@ impl ActionState<'_> { // then we can ignore all the working directory logic let mut command = Command { arguments: vec![self.task.command.clone()], - output_paths: vec![], // TODO + output_paths: vec![], // TODO? ..Default::default() }; @@ -93,14 +97,14 @@ impl ActionState<'_> { result.exit_code = exec.exit_code.unwrap_or_default(); if let Some(stderr) = &exec.stderr { - let blob = Blob::new(stderr.as_bytes().to_owned()); + let blob = Blob::from(stderr.as_bytes().to_owned()); result.stderr_digest = Some(blob.digest.clone()); self.blobs.push(blob); } if let Some(stdout) = &exec.stdout { - let blob = Blob::new(stdout.as_bytes().to_owned()); + let blob = Blob::from(stdout.as_bytes().to_owned()); result.stdout_digest = Some(blob.digest.clone()); self.blobs.push(blob); @@ -133,11 +137,7 @@ impl ActionState<'_> { Ok(()) } - pub fn get_command_as_bytes(&self) -> miette::Result> { - bincode::serialize(&self.command).into_diagnostic() - } - - pub fn prepare_for_upload(&mut self) -> Option<(ActionResult, Vec)> { + pub fn extract_for_upload(&mut self) -> Option<(ActionResult, Vec)> { self.action_result .take() .map(|result| (result, self.blobs.drain(0..).collect::>())) diff --git a/crates/remote/src/blob.rs b/crates/remote/src/blob.rs new file mode 100644 index 00000000000..a9626b4337f --- /dev/null +++ b/crates/remote/src/blob.rs @@ -0,0 +1,123 @@ +use crate::fs_digest::create_digest; +use crate::remote_error::RemoteError; +use bazel_remote_apis::build::bazel::remote::execution::v2::{compressor, Digest}; +use moon_config::RemoteCompression; + +#[derive(Clone)] +pub struct Blob { + pub bytes: Vec, + pub compressed: RemoteCompression, + pub digest: Digest, +} + +impl From> for Blob { + fn from(bytes: Vec) -> Self { + Self { + digest: create_digest(&bytes), + compressed: RemoteCompression::None, + bytes, + } + } +} + +impl Blob { + pub fn new(digest: Digest, bytes: Vec) -> Self { + Self { + digest, + compressed: RemoteCompression::None, + bytes, + } + } + + pub fn compress(&mut self, compression: RemoteCompression) -> miette::Result<()> { + self.compressed = compression; + + match compression { + RemoteCompression::None => { + // N/A + } + RemoteCompression::Zstd => { + self.bytes = zstd::encode_all(self.bytes.as_slice(), 1).map_err(|error| { + RemoteError::CompressFailed { + format: compression, + error: Box::new(error), + } + })? + } + }; + + Ok(()) + } + + pub fn compress_and_keep(&mut self, compression: RemoteCompression) -> miette::Result { + let uncompressed = self.clone(); + + self.compress(compression)?; + + Ok(uncompressed) + } + + pub fn decompress(&mut self) -> miette::Result<()> { + match self.compressed { + RemoteCompression::None => { + // N/A + } + RemoteCompression::Zstd => { + self.bytes = zstd::decode_all(self.bytes.as_slice()).map_err(|error| { + RemoteError::CompressFailed { + format: self.compressed, + error: Box::new(error), + } + })? + } + }; + + self.compressed = RemoteCompression::None; + + Ok(()) + } + + pub fn decompress_and_keep(&mut self) -> miette::Result { + let compressed = self.clone(); + + self.decompress()?; + + Ok(compressed) + } +} + +// bazel-remote uses zstd and the fastest compression: level 1 +// https://github.com/buchgr/bazel-remote/blob/master/cache/disk/zstdimpl/gozstd.go#L13 +// https://github.com/klauspost/compress/tree/master/zstd#status + +pub fn get_acceptable_compressors(compression: RemoteCompression) -> Vec { + let mut list = vec![compressor::Value::Identity as i32]; + + if compression == RemoteCompression::Zstd { + list.push(compressor::Value::Zstd as i32); + }; + + list +} + +pub fn get_compressor(compression: RemoteCompression) -> i32 { + match compression { + RemoteCompression::None => compressor::Value::Identity as i32, + RemoteCompression::Zstd => compressor::Value::Zstd as i32, + } +} + +#[allow(dead_code)] +pub fn get_compression_from_value(compressor: compressor::Value) -> RemoteCompression { + match compressor { + compressor::Value::Zstd => RemoteCompression::Zstd, + _ => RemoteCompression::None, + } +} + +pub fn get_compression_from_code(compressor: i32) -> RemoteCompression { + match compressor { + zstd if zstd == compressor::Value::Zstd as i32 => RemoteCompression::Zstd, + _ => RemoteCompression::None, + } +} diff --git a/crates/remote/src/compression.rs b/crates/remote/src/compression.rs deleted file mode 100644 index 3e7441c6224..00000000000 --- a/crates/remote/src/compression.rs +++ /dev/null @@ -1,69 +0,0 @@ -use crate::remote_error::RemoteError; -use bazel_remote_apis::build::bazel::remote::execution::v2::compressor; -use moon_config::RemoteCompression; - -// bazel-remote uses zstd and the fastest compression: level 1 -// https://github.com/buchgr/bazel-remote/blob/master/cache/disk/zstdimpl/gozstd.go#L13 -// https://github.com/klauspost/compress/tree/master/zstd#status - -pub fn get_acceptable_compressors(compression: RemoteCompression) -> Vec { - let mut list = vec![compressor::Value::Identity as i32]; - - if compression == RemoteCompression::Zstd { - list.push(compressor::Value::Zstd as i32); - }; - - list -} - -pub fn get_compressor(compression: RemoteCompression) -> i32 { - match compression { - RemoteCompression::None => compressor::Value::Identity as i32, - RemoteCompression::Zstd => compressor::Value::Zstd as i32, - } -} - -#[allow(dead_code)] -pub fn get_compression_from_value(compressor: compressor::Value) -> RemoteCompression { - match compressor { - compressor::Value::Zstd => RemoteCompression::Zstd, - _ => RemoteCompression::None, - } -} - -pub fn get_compression_from_code(compressor: i32) -> RemoteCompression { - match compressor { - zstd if zstd == compressor::Value::Zstd as i32 => RemoteCompression::Zstd, - _ => RemoteCompression::None, - } -} - -pub fn compress_blob(compression: RemoteCompression, bytes: Vec) -> miette::Result> { - let result = match compression { - RemoteCompression::None => Ok(bytes), - RemoteCompression::Zstd => zstd::encode_all(bytes.as_slice(), 1), - }; - - result.map_err(|error| { - RemoteError::CompressFailed { - format: compression, - error: Box::new(error), - } - .into() - }) -} - -pub fn decompress_blob(compression: RemoteCompression, bytes: Vec) -> miette::Result> { - let result = match compression { - RemoteCompression::None => Ok(bytes), - RemoteCompression::Zstd => zstd::decode_all(bytes.as_slice()), - }; - - result.map_err(|error| { - RemoteError::DecompressFailed { - format: compression, - error: Box::new(error), - } - .into() - }) -} diff --git a/crates/remote/src/fs_digest.rs b/crates/remote/src/fs_digest.rs index 8b07edd3236..c7a380bf695 100644 --- a/crates/remote/src/fs_digest.rs +++ b/crates/remote/src/fs_digest.rs @@ -1,5 +1,6 @@ // Note: Don't use `starbase_utils::fs` as it spams the logs far too much! +use crate::blob::Blob; use bazel_remote_apis::build::bazel::remote::execution::v2::{ Digest, NodeProperties, OutputDirectory, OutputFile, OutputSymlink, }; @@ -15,20 +16,6 @@ use std::{ time::{Duration, SystemTime, UNIX_EPOCH}, }; -pub struct Blob { - pub bytes: Vec, - pub digest: Digest, -} - -impl Blob { - pub fn new(bytes: Vec) -> Self { - Self { - digest: create_digest(&bytes), - bytes, - } - } -} - pub fn create_digest(bytes: &[u8]) -> Digest { let mut hasher = Sha256::default(); hasher.update(bytes); @@ -133,19 +120,19 @@ impl OutputDigests { }); } else if abs_path.is_file() { let bytes = fs::read(&abs_path).map_err(map_read_error)?; - let digest = create_digest(&bytes); let metadata = fs::metadata(&abs_path).map_err(map_read_error)?; let props = compute_node_properties(&metadata); + let blob = Blob::from(bytes); self.files.push(OutputFile { path: path_to_string(&abs_path), - digest: Some(digest.clone()), + digest: Some(blob.digest.clone()), is_executable: is_file_executable(&abs_path, &props), contents: vec![], node_properties: Some(props), }); - self.blobs.push(Blob { digest, bytes }); + self.blobs.push(blob); } else if abs_path.is_dir() { // TODO use the REAPI directory types for abs_file in glob::walk_files(abs_path, ["**/*"])? { diff --git a/crates/remote/src/grpc_remote_client.rs b/crates/remote/src/grpc_remote_client.rs index 24fef0dec7e..12c9dd7cec9 100644 --- a/crates/remote/src/grpc_remote_client.rs +++ b/crates/remote/src/grpc_remote_client.rs @@ -1,5 +1,5 @@ -use crate::compression::*; -use crate::fs_digest::Blob; +use crate::blob::*; +use crate::grpc_services::*; use crate::grpc_tls::*; use crate::remote_client::RemoteClient; use crate::remote_error::RemoteError; @@ -10,79 +10,80 @@ use bazel_remote_apis::build::bazel::remote::execution::v2::{ ActionResult, BatchReadBlobsRequest, BatchUpdateBlobsRequest, Digest, FindMissingBlobsRequest, GetActionResultRequest, GetCapabilitiesRequest, ServerCapabilities, UpdateActionResultRequest, }; -use miette::IntoDiagnostic; +use bazel_remote_apis::google::bytestream::{ + byte_stream_client::ByteStreamClient, ReadRequest, WriteRequest, +}; +use http::header::HeaderMap; use moon_common::color; use moon_config::RemoteConfig; use starbase_utils::env::bool_var; -use std::{env, path::Path, str::FromStr}; +use std::path::Path; +use std::sync::{Arc, OnceLock}; +use std::time::Duration; +use tokio::sync::Mutex; +use tokio_util::io::ReaderStream; use tonic::{ - metadata::{KeyAndValueRef, MetadataKey, MetadataMap, MetadataValue}, + codegen::tokio_stream::StreamExt, transport::{Channel, Endpoint}, - Code, Request, Status, + Code, Request, }; +use tower::{limit::ConcurrencyLimit, timeout::Timeout, ServiceBuilder}; use tracing::{debug, error, trace, warn}; +type LayeredService = Timeout>>; + #[derive(Default)] pub struct GrpcRemoteClient { channel: Option, config: RemoteConfig, debug: bool, - headers: MetadataMap, + uuid: OnceLock, + + ac_client: OnceLock>, + bs_client: OnceLock>, + cap_client: OnceLock>, + cas_client: OnceLock>, } impl GrpcRemoteClient { - fn extract_headers(&mut self) -> miette::Result { - let mut enabled = true; - - if let Some(auth) = &self.config.auth { - for (key, value) in &auth.headers { - self.headers.insert( - MetadataKey::from_str(key).into_diagnostic()?, - MetadataValue::from_str(value).into_diagnostic()?, - ); - } + fn create_clients(&mut self, headers: HeaderMap) { + let service: LayeredService = ServiceBuilder::new() + .timeout(Duration::from_secs(60 * 60)) + .concurrency_limit(150) + .layer(RequestHeadersLayer::new(headers)) + .service(self.channel.clone().unwrap()); - if let Some(token_name) = &auth.token { - let token = env::var(token_name).unwrap_or_default(); + let _ = self.ac_client.set(ActionCacheClient::new(service.clone())); - if token.is_empty() { - enabled = false; + let _ = self.bs_client.set(ByteStreamClient::new(service.clone())); - warn!( - "Auth token {} does not exist, unable to authorize for remote service", - color::property(token_name) - ); - } else { - self.headers.insert( - MetadataKey::from_str("Authorization").into_diagnostic()?, - MetadataValue::from_str(&format!("Bearer {token}")).into_diagnostic()?, - ); - } - } - } + let _ = self + .cap_client + .set(CapabilitiesClient::new(service.clone())); - Ok(enabled) + let _ = self + .cas_client + .set(ContentAddressableStorageClient::new(service)); } - fn inject_auth_headers(&self, mut req: Request<()>) -> Result, Status> { - if self.headers.is_empty() { - return Ok(req); - } + fn get_ac_client(&self) -> ActionCacheClient { + self.ac_client.get().unwrap().clone() + } - let headers = req.metadata_mut(); + fn get_bs_client(&self) -> ByteStreamClient { + self.bs_client.get().unwrap().clone() + } - for entry in self.headers.iter() { - match entry { - KeyAndValueRef::Ascii(key, value) => { - headers.insert(key.clone(), value.clone()); - } - KeyAndValueRef::Binary(key, value) => { - headers.insert_bin(key.clone(), value.clone()); - } - }; - } + fn get_cap_client(&self) -> CapabilitiesClient { + self.cap_client.get().unwrap().clone() + } - Ok(req) + fn get_cas_client(&self) -> ContentAddressableStorageClient { + self.cas_client.get().unwrap().clone() + } + + fn get_uuid(&self) -> &uuid::Uuid { + self.uuid.get_or_init(uuid::Uuid::new_v4) } fn map_status_error(&self, method: &str, error: tonic::Status) -> RemoteError { @@ -113,14 +114,10 @@ impl RemoteClient for GrpcRemoteClient { config: &RemoteConfig, workspace_root: &Path, ) -> miette::Result { - self.debug = bool_var("MOON_DEBUG_REMOTE"); - - let host = &config.host; - debug!( instance = &config.cache.instance_name, "Connecting to gRPC host {} {}", - color::url(host), + color::url(&config.host), if config.mtls.is_some() { "(with mTLS)" } else if config.tls.is_some() { @@ -132,12 +129,20 @@ impl RemoteClient for GrpcRemoteClient { } ); + self.debug = bool_var("MOON_DEBUG_REMOTE"); + self.config = config.to_owned(); + + // Extract headers and abort early if not enabled + let Some(headers) = self.extract_headers(config)? else { + return Ok(false); + }; + // Although we use a grpc(s) protocol for the host, // tonic only supports http(s), so change it - let url = if let Some(suffix) = host.strip_prefix("grpc") { + let url = if let Some(suffix) = self.config.host.strip_prefix("grpc") { format!("http{suffix}") } else { - host.to_owned() + self.config.host.to_owned() }; let mut endpoint = Endpoint::from_shared(url) @@ -171,9 +176,6 @@ impl RemoteClient for GrpcRemoteClient { ); } - self.config = config.to_owned(); - let enabled = self.extract_headers()?; - // We can't inject auth headers into this initial connection, // so defer the connection until a client is used if self.config.is_bearer_auth() { @@ -187,19 +189,17 @@ impl RemoteClient for GrpcRemoteClient { ); } - Ok(enabled) + self.create_clients(headers); + + Ok(true) } // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L452 async fn load_capabilities(&self) -> miette::Result { - let mut client = - CapabilitiesClient::with_interceptor(self.channel.clone().unwrap(), |req| { - self.inject_auth_headers(req) - }); - trace!("Loading remote execution API capabilities from gRPC server"); - let response = client + let response = self + .get_cap_client() .get_capabilities(GetCapabilitiesRequest { instance_name: self.config.cache.instance_name.clone(), }) @@ -210,18 +210,20 @@ impl RemoteClient for GrpcRemoteClient { } // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L170 - async fn get_action_result(&self, digest: &Digest) -> miette::Result> { - let mut client = - ActionCacheClient::with_interceptor(self.channel.clone().unwrap(), |req| { - self.inject_auth_headers(req) - }); - - trace!(hash = &digest.hash, "Checking for a cached action result"); + async fn get_action_result( + &self, + action_digest: &Digest, + ) -> miette::Result> { + trace!( + hash = &action_digest.hash, + "Checking for a cached action result" + ); - match client + match self + .get_ac_client() .get_action_result(GetActionResultRequest { instance_name: self.config.cache.instance_name.clone(), - action_digest: Some(digest.to_owned()), + action_digest: Some(action_digest.to_owned()), inline_stderr: true, inline_stdout: true, digest_function: digest_function::Value::Sha256 as i32, @@ -233,7 +235,7 @@ impl RemoteClient for GrpcRemoteClient { let result = response.into_inner(); trace!( - hash = &digest.hash, + hash = &action_digest.hash, files = result.output_files.len(), links = result.output_symlinks.len(), dirs = result.output_directories.len(), @@ -245,7 +247,7 @@ impl RemoteClient for GrpcRemoteClient { } Err(status) => { if matches!(status.code(), Code::NotFound) { - trace!(hash = &digest.hash, "Cache miss on action result"); + trace!(hash = &action_digest.hash, "Cache miss on action result"); Ok(None) } @@ -254,7 +256,7 @@ impl RemoteClient for GrpcRemoteClient { // happen, let's just do a cache miss instead... else if matches!(status.code(), Code::OutOfRange) { trace!( - hash = &digest.hash, + hash = &action_digest.hash, "Cache miss because the expected payload is too large" ); @@ -269,16 +271,11 @@ impl RemoteClient for GrpcRemoteClient { // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L193 async fn update_action_result( &self, - digest: &Digest, + action_digest: &Digest, result: ActionResult, ) -> miette::Result> { - let mut client = - ActionCacheClient::with_interceptor(self.channel.clone().unwrap(), |req| { - self.inject_auth_headers(req) - }); - trace!( - hash = &digest.hash, + hash = &action_digest.hash, files = result.output_files.len(), links = result.output_symlinks.len(), dirs = result.output_directories.len(), @@ -286,10 +283,11 @@ impl RemoteClient for GrpcRemoteClient { "Caching action result" ); - match client + match self + .get_ac_client() .update_action_result(UpdateActionResultRequest { instance_name: self.config.cache.instance_name.clone(), - action_digest: Some(digest.to_owned()), + action_digest: Some(action_digest.to_owned()), action_result: Some(result), digest_function: digest_function::Value::Sha256 as i32, ..Default::default() @@ -297,7 +295,7 @@ impl RemoteClient for GrpcRemoteClient { .await { Ok(response) => { - trace!(hash = &digest.hash, "Cached action result"); + trace!(hash = &action_digest.hash, "Cached action result"); Ok(Some(response.into_inner())) } @@ -306,19 +304,19 @@ impl RemoteClient for GrpcRemoteClient { if matches!(code, Code::InvalidArgument | Code::FailedPrecondition) { warn!( - hash = &digest.hash, + hash = &action_digest.hash, code = ?code, "Failed to cache action result: {}", - status.message() + color::muted_light(status.message()), ); Ok(None) } else if matches!(code, Code::ResourceExhausted) { warn!( - hash = &digest.hash, + hash = &action_digest.hash, code = ?code, "Remote service is out of storage space: {}", - status.message() + color::muted_light(status.message()), ); Ok(None) @@ -331,12 +329,8 @@ impl RemoteClient for GrpcRemoteClient { // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L351 async fn find_missing_blobs(&self, blob_digests: Vec) -> miette::Result> { - let mut client = ContentAddressableStorageClient::with_interceptor( - self.channel.clone().unwrap(), - |req| self.inject_auth_headers(req), - ); - - match client + match self + .get_cas_client() .find_missing_blobs(FindMissingBlobsRequest { instance_name: self.config.cache.instance_name.clone(), blob_digests, @@ -352,22 +346,18 @@ impl RemoteClient for GrpcRemoteClient { // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L403 async fn batch_read_blobs( &self, - digest: &Digest, + action_digest: &Digest, blob_digests: Vec, ) -> miette::Result> { - let mut client = ContentAddressableStorageClient::with_interceptor( - self.channel.clone().unwrap(), - |req| self.inject_auth_headers(req), - ); - trace!( - hash = &digest.hash, + hash = &action_digest.hash, compression = self.config.cache.compression.to_string(), "Downloading {} output blobs", blob_digests.len() ); - let response = match client + let response = match self + .get_cas_client() .batch_read_blobs(BatchReadBlobsRequest { acceptable_compressors: get_acceptable_compressors(self.config.cache.compression), instance_name: self.config.cache.instance_name.clone(), @@ -376,11 +366,11 @@ impl RemoteClient for GrpcRemoteClient { }) .await { - Ok(res) => res, + Ok(response) => response, Err(status) => { return if matches!(status.code(), Code::InvalidArgument) { warn!( - hash = &digest.hash, + hash = &action_digest.hash, "Attempted to download more blobs than the allowed limit" ); @@ -400,35 +390,33 @@ impl RemoteClient for GrpcRemoteClient { if !matches!(code, Code::Ok | Code::NotFound) { warn!( - hash = &digest.hash, + hash = &action_digest.hash, blob_hash = download.digest.as_ref().map(|d| &d.hash), details = ?status.details, code = ?code, "Failed to download blob: {}", - if status.message.is_empty() { + color::muted_light(if status.message.is_empty() { code.to_string() } else { status.message - } + }), ); } } if let Some(digest) = download.digest { - blobs.push(Blob { - digest, - bytes: decompress_blob( - get_compression_from_code(download.compressor), - download.data, - )?, - }); + let mut blob = Blob::new(digest, download.data); + blob.compressed = get_compression_from_code(download.compressor); + blob.decompress()?; + + blobs.push(blob); } total_count += 1; } trace!( - hash = &digest.hash, + hash = &action_digest.hash, "Downloaded {} of {} output blobs", blobs.len(), total_count @@ -437,60 +425,132 @@ impl RemoteClient for GrpcRemoteClient { Ok(blobs) } + async fn stream_read_blob( + &self, + action_digest: &Digest, + blob_digest: Digest, + ) -> miette::Result> { + trace!( + hash = &action_digest.hash, + blob_hash = &blob_digest.hash, + "Streaming download output blob" + ); + + let resource_name = format!( + "{}/blobs/{}/{}", + self.config.cache.instance_name, blob_digest.hash, blob_digest.size_bytes, + ); + + let response = match self + .get_bs_client() + .read(ReadRequest { + resource_name, + read_offset: 0, + read_limit: 0, + }) + .await + { + Ok(response) => response, + Err(status) => { + return if matches!(status.code(), Code::NotFound) { + Ok(None) + } else { + Err(self.map_status_error("stream_read_blob", status).into()) + }; + } + }; + + let mut stream = response.into_inner(); + let mut bytes = Vec::new(); + + while let Some(chunk) = stream.next().await { + match chunk { + Ok(data) => { + bytes.extend(data.data); + } + Err(error) => { + warn!( + hash = &action_digest.hash, + blob_hash = &blob_digest.hash, + "Failed to stream download blob: {}", + color::muted_light(error.to_string()), + ); + + return Ok(None); + } + } + } + + let blob = Blob::from(bytes); + + if blob.digest != blob_digest { + warn!( + hash = &action_digest.hash, + blob_hash = &blob_digest.hash, + "Failed to download blob, mismatched blob digests, received unexpected hash {}", + blob.digest.hash + ); + + return Ok(None); + } + + Ok(Some(blob)) + } + // https://github.com/bazelbuild/remote-apis/blob/main/build/bazel/remote/execution/v2/remote_execution.proto#L379 async fn batch_update_blobs( &self, - digest: &Digest, - blobs: Vec, + action_digest: &Digest, + mut blobs: Vec, ) -> miette::Result>> { - let mut client = ContentAddressableStorageClient::with_interceptor( - self.channel.clone().unwrap(), - |req| self.inject_auth_headers(req), - ); - let compression = self.config.cache.compression; - let mut requests = vec![]; + + if compression.is_enabled() { + for blob in blobs.iter_mut() { + blob.compress(compression)?; + } + } trace!( - hash = &digest.hash, + hash = &action_digest.hash, compression = compression.to_string(), "Uploading {} output blobs", blobs.len() ); - for blob in blobs { - requests.push(batch_update_blobs_request::Request { - digest: Some(blob.digest), - data: compress_blob(compression, blob.bytes)?, - compressor: get_compressor(compression), - }); - } - - let response = match client + let response = match self + .get_cas_client() .batch_update_blobs(BatchUpdateBlobsRequest { instance_name: self.config.cache.instance_name.clone(), - requests, + requests: blobs + .into_iter() + .map(|blob| batch_update_blobs_request::Request { + digest: Some(blob.digest), + data: blob.bytes, + compressor: get_compressor(compression), + }) + .collect(), digest_function: digest_function::Value::Sha256 as i32, }) .await { - Ok(res) => res, + Ok(response) => response, Err(status) => { let code = status.code(); return if matches!(code, Code::InvalidArgument) { warn!( - hash = &digest.hash, + hash = &action_digest.hash, "Attempted to upload more blobs than the allowed limit" ); Ok(vec![]) } else if matches!(code, Code::ResourceExhausted) { warn!( - hash = &digest.hash, + hash = &action_digest.hash, code = ?code, "Remote service exhausted resource: {}", - status.message() + color::muted_light(status.message()), ); Ok(vec![]) @@ -509,16 +569,16 @@ impl RemoteClient for GrpcRemoteClient { if !matches!(code, Code::Ok) { warn!( - hash = &digest.hash, - blob_hash = upload.digest.as_ref().map(|d| &d.hash), + hash = &action_digest.hash, + blob_hash = upload.digest.as_ref().map(|dig| &dig.hash), details = ?status.details, code = ?code, "Failed to upload blob: {}", - if status.message.is_empty() { + color::muted_light(if status.message.is_empty() { code.to_string() } else { status.message - } + }), ); } } @@ -531,7 +591,7 @@ impl RemoteClient for GrpcRemoteClient { } trace!( - hash = &digest.hash, + hash = &action_digest.hash, "Uploaded {} of {} output blobs", uploaded_count, digests.len() @@ -539,4 +599,86 @@ impl RemoteClient for GrpcRemoteClient { Ok(digests) } + + async fn stream_update_blob( + &self, + action_digest: &Digest, + blob: Blob, + ) -> miette::Result> { + trace!( + hash = &action_digest.hash, + blob_hash = &blob.digest.hash, + "Streaming upload output blob" + ); + + let resource_name = format!( + "{}/uploads/{}/blobs/{}/{}", + self.config.cache.instance_name, + self.get_uuid(), + blob.digest.hash, + blob.digest.size_bytes, + ); + let total_bytes = blob.digest.size_bytes; + let stream_error = Arc::new(Mutex::new(None)); + let stream_error_clone = stream_error.clone(); + + let stream = async_stream::stream! { + let reader = ReaderStream::new(blob.bytes.as_slice()); + let mut written_bytes: i64 = 0; + + for await read_result in reader { + match read_result { + Ok(chunk) => { + let write_offset = written_bytes; + written_bytes += chunk.len() as i64; + + yield WriteRequest { + resource_name: resource_name.clone(), + write_offset, + finish_write: written_bytes >= total_bytes, + data: chunk.to_vec(), + } + }, + Err(error) => { + *stream_error_clone.lock().await = Some(error); + }, + } + } + }; + + let result = self.get_bs_client().write(Request::new(stream)).await; + + if let Some(ref error) = *stream_error.lock().await { + warn!( + hash = &action_digest.hash, + blob_hash = &blob.digest.hash, + "Failed to stream upload blob: {}", + color::muted_light(error.to_string()), + ); + + return Ok(None); + } + + match result { + Ok(response) => { + let result = response.into_inner(); + + if result.committed_size != -1 && result.committed_size < total_bytes { + warn!( + hash = &action_digest.hash, + blob_hash = &blob.digest.hash, + "Failed to upload blob, streamed bytes was {}, but we required {total_bytes}", + result.committed_size + ); + + return Ok(None); + } + } + Err(status) => { + return Err(self.map_status_error("stream_update_blob", status).into()); + } + }; + + Ok(Some(blob.digest)) + } } diff --git a/crates/remote/src/grpc_services.rs b/crates/remote/src/grpc_services.rs new file mode 100644 index 00000000000..dcf27a2c29d --- /dev/null +++ b/crates/remote/src/grpc_services.rs @@ -0,0 +1,96 @@ +use http::{header::HeaderMap, Request}; +// use std::future::Future; +use std::task::{Context, Poll}; +// use tower::retry::Policy; +use tower::{Layer, Service}; + +// TODO: blocked +// https://github.com/hyperium/tonic/issues/733 +// https://github.com/tower-rs/tower/pull/790 +// https://github.com/tower-rs/tower/issues/682 + +// pub struct RetryPolicy(u8); + +// impl Policy, Response, E> for RetryPolicy { +// // type Future = future::Ready<()>; +// type Future: Future; + +// fn retry( +// &mut self, +// req: &mut Request, +// result: &mut Result, E>, +// ) -> Option { +// match result { +// Ok(_) => { +// // Treat all `Response`s as success, +// // so don't retry... +// None +// } +// Err(_) => { +// // Treat all errors as failures... +// // But we limit the number of attempts... +// if self.0 > 0 { +// // Try again! +// self.0 -= 1; +// Some(future::ready(())) +// } else { +// // Used all our attempts, no retry... +// None +// } +// } +// } +// } + +// fn clone_request(&mut self, req: &Request) -> Option> { +// Some(req.clone()) +// } +// } + +#[derive(Debug)] +pub struct RequestHeadersLayer { + headers: HeaderMap, +} + +impl RequestHeadersLayer { + pub fn new(headers: HeaderMap) -> Self { + RequestHeadersLayer { headers } + } +} + +impl Layer for RequestHeadersLayer { + type Service = RequestHeaders; + + fn layer(&self, inner: S) -> Self::Service { + RequestHeaders { + inner, + headers: self.headers.clone(), + } + } +} + +#[derive(Clone)] +pub struct RequestHeaders { + inner: S, + headers: HeaderMap, +} + +impl Service> for RequestHeaders +where + S: Service>, +{ + type Response = S::Response; + type Error = S::Error; + type Future = S::Future; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.inner.poll_ready(cx) + } + + fn call(&mut self, mut req: Request) -> Self::Future { + if !self.headers.is_empty() { + req.headers_mut().extend(self.headers.clone()); + } + + self.inner.call(req) + } +} diff --git a/crates/remote/src/http_remote_client.rs b/crates/remote/src/http_remote_client.rs index c6c092e3887..e1750f247ca 100644 --- a/crates/remote/src/http_remote_client.rs +++ b/crates/remote/src/http_remote_client.rs @@ -1,5 +1,4 @@ -use crate::compression::*; -use crate::fs_digest::Blob; +use crate::blob::*; use crate::http_tls::*; use crate::remote_client::RemoteClient; use crate::remote_error::RemoteError; @@ -7,13 +6,11 @@ use bazel_remote_apis::build::bazel::remote::execution::v2::{ digest_function, ActionCacheUpdateCapabilities, ActionResult, CacheCapabilities, Digest, ServerCapabilities, }; -use miette::IntoDiagnostic; use moon_common::color; use moon_config::{RemoteCompression, RemoteConfig}; -use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; +use reqwest::header::HeaderMap; use reqwest::Client; use starbase_utils::env::bool_var; -use std::env; use std::sync::Arc; use std::time::Duration; use std::{path::Path, sync::OnceLock}; @@ -44,45 +41,11 @@ impl Default for HttpRemoteClient { } impl HttpRemoteClient { - fn create_client(&self, workspace_root: &Path) -> miette::Result> { + fn create_client(&self, workspace_root: &Path, headers: HeaderMap) -> miette::Result { let mut client = Client::builder() .user_agent("moon") - .tcp_keepalive(Duration::from_secs(60)); - - if let Some(auth) = &self.config.auth { - let mut headers = HeaderMap::default(); - - for (key, value) in &auth.headers { - headers.insert( - HeaderName::from_bytes(key.as_bytes()).into_diagnostic()?, - HeaderValue::from_str(value).into_diagnostic()?, - ); - } - - if let Some(token_name) = &auth.token { - let token = env::var(token_name).unwrap_or_default(); - - if token.is_empty() { - warn!( - "Auth token {} does not exist, unable to authorize for remote service", - color::property(token_name) - ); - - return Ok(None); - } else { - let mut value = - HeaderValue::from_str(&format!("Bearer {token}")).into_diagnostic()?; - value.set_sensitive(true); - - headers.insert( - HeaderName::from_bytes("Authorization".as_bytes()).into_diagnostic()?, - value, - ); - } - } - - client = client.default_headers(headers); - } + .tcp_keepalive(Duration::from_secs(60)) + .default_headers(headers); if let Some(mtls) = &self.config.mtls { client = create_mtls_config(client, mtls, workspace_root)? @@ -96,7 +59,7 @@ impl HttpRemoteClient { .build() .map_err(|error| self.map_error("create_client", error))?; - Ok(Some(client)) + Ok(client) } fn get_client(&self) -> Arc { @@ -128,14 +91,10 @@ impl RemoteClient for HttpRemoteClient { config: &RemoteConfig, workspace_root: &Path, ) -> miette::Result { - self.debug = bool_var("MOON_DEBUG_REMOTE"); - - let host = &config.host; - debug!( instance = &config.cache.instance_name, "Connecting to HTTP host {} {}", - color::url(host), + color::url(&config.host), if config.mtls.is_some() { "(with mTLS)" } else if config.tls.is_some() { @@ -148,6 +107,12 @@ impl RemoteClient for HttpRemoteClient { ); self.config = config.to_owned(); + self.debug = bool_var("MOON_DEBUG_REMOTE"); + + // Extract headers and abort early if not enabled + let Some(headers) = self.extract_headers(config)? else { + return Ok(false); + }; if self.config.cache.compression != RemoteCompression::None { self.config.cache.compression = RemoteCompression::None; @@ -155,19 +120,11 @@ impl RemoteClient for HttpRemoteClient { debug!("HTTP API does not support compression, disabling"); } - // Create client and abort early if not enabled - match self.create_client(workspace_root)? { - Some(client) => { - let _ = self.client.set(Arc::new(client)); - } - None => { - return Ok(false); - } - } + // Create the client + let client = self.create_client(workspace_root, headers)?; // Ignore errors since this endpoint is non-standard - if let Ok(response) = self - .get_client() + if let Ok(response) = client .get(format!("{}/status", self.config.host)) .send() .await @@ -187,6 +144,8 @@ impl RemoteClient for HttpRemoteClient { } } + let _ = self.client.set(Arc::new(client)); + Ok(true) } @@ -211,12 +170,18 @@ impl RemoteClient for HttpRemoteClient { }) } - async fn get_action_result(&self, digest: &Digest) -> miette::Result> { - trace!(hash = &digest.hash, "Checking for a cached action result"); + async fn get_action_result( + &self, + action_digest: &Digest, + ) -> miette::Result> { + trace!( + hash = &action_digest.hash, + "Checking for a cached action result" + ); match self .get_client() - .get(self.get_endpoint("ac", &digest.hash)) + .get(self.get_endpoint("ac", &action_digest.hash)) .header("Accept", "application/json") .send() .await @@ -232,7 +197,7 @@ impl RemoteClient for HttpRemoteClient { })?; trace!( - hash = &digest.hash, + hash = &action_digest.hash, files = result.output_files.len(), links = result.output_symlinks.len(), dirs = result.output_directories.len(), @@ -242,7 +207,7 @@ impl RemoteClient for HttpRemoteClient { Ok(Some(result)) } else { - trace!(hash = &digest.hash, "Cache miss on action result"); + trace!(hash = &action_digest.hash, "Cache miss on action result"); Ok(None) } @@ -253,11 +218,11 @@ impl RemoteClient for HttpRemoteClient { async fn update_action_result( &self, - digest: &Digest, + action_digest: &Digest, result: ActionResult, ) -> miette::Result> { trace!( - hash = &digest.hash, + hash = &action_digest.hash, files = result.output_files.len(), links = result.output_symlinks.len(), dirs = result.output_directories.len(), @@ -267,7 +232,7 @@ impl RemoteClient for HttpRemoteClient { match self .get_client() - .put(self.get_endpoint("ac", &digest.hash)) + .put(self.get_endpoint("ac", &action_digest.hash)) .header("Content-Type", "application/json") .json(&result) .send() @@ -279,15 +244,15 @@ impl RemoteClient for HttpRemoteClient { // Doesn't return a response body // https://github.com/buchgr/bazel-remote/blob/master/server/http.go#L429 if status.is_success() { - trace!(hash = &digest.hash, "Cached action result"); + trace!(hash = &action_digest.hash, "Cached action result"); Ok(Some(result)) } else { warn!( - hash = &digest.hash, + hash = &action_digest.hash, code = status.as_u16(), "Failed to cache action result: {}", - status + color::muted_light(status.to_string()), ); Ok(None) @@ -305,11 +270,11 @@ impl RemoteClient for HttpRemoteClient { async fn batch_read_blobs( &self, - digest: &Digest, + action_digest: &Digest, blob_digests: Vec, ) -> miette::Result> { trace!( - hash = &digest.hash, + hash = &action_digest.hash, compression = self.config.cache.compression.to_string(), "Downloading {} output blobs", blob_digests.len() @@ -320,7 +285,7 @@ impl RemoteClient for HttpRemoteClient { for blob_digest in blob_digests { let client = self.get_client(); - let action_hash = digest.hash.clone(); + let action_hash = action_digest.hash.clone(); let url = self.get_endpoint("cas", &blob_digest.hash); let semaphore = self.semaphore.clone(); @@ -335,24 +300,23 @@ impl RemoteClient for HttpRemoteClient { if status.is_success() { if let Ok(bytes) = response.bytes().await { - return Some(Blob { - digest: blob_digest, - bytes: bytes.to_vec(), - }); + return Some(Blob::new(blob_digest, bytes.to_vec())); } } warn!( hash = &action_hash, blob_hash = &blob_digest.hash, - "Failed to download blob: {status}", + "Failed to download blob: {}", + color::muted_light(status.to_string()), ); } Err(error) => { warn!( hash = &action_hash, blob_hash = &blob_digest.hash, - "Failed to download blob: {error}", + "Failed to download blob: {}", + color::muted_light(error.to_string()), ); if debug_enabled { @@ -375,7 +339,7 @@ impl RemoteClient for HttpRemoteClient { } trace!( - hash = &digest.hash, + hash = &action_digest.hash, "Downloaded {} of {} output blobs", blobs.len(), total_count @@ -386,14 +350,14 @@ impl RemoteClient for HttpRemoteClient { async fn batch_update_blobs( &self, - digest: &Digest, + action_digest: &Digest, blobs: Vec, ) -> miette::Result>> { let compression = self.config.cache.compression; let mut requests = vec![]; trace!( - hash = &digest.hash, + hash = &action_digest.hash, compression = compression.to_string(), "Uploading {} output blobs", blobs.len() @@ -403,7 +367,7 @@ impl RemoteClient for HttpRemoteClient { for blob in blobs { let client = self.get_client(); - let action_hash = digest.hash.clone(); + let action_hash = action_digest.hash.clone(); let url = self.get_endpoint("cas", &blob.digest.hash); let semaphore = self.semaphore.clone(); @@ -423,14 +387,16 @@ impl RemoteClient for HttpRemoteClient { warn!( hash = &action_hash, blob_hash = &blob.digest.hash, - "Failed to upload blob: {status}", + "Failed to upload blob: {}", + color::muted_light(status.to_string()), ); } Err(error) => { warn!( hash = &action_hash, blob_hash = &blob.digest.hash, - "Failed to upload blob: {error}", + "Failed to upload blob: {}", + color::muted_light(error.to_string()), ); if debug_enabled { @@ -462,7 +428,7 @@ impl RemoteClient for HttpRemoteClient { } trace!( - hash = &digest.hash, + hash = &action_digest.hash, "Uploaded {} of {} output blobs", uploaded_count, digests.len() diff --git a/crates/remote/src/lib.rs b/crates/remote/src/lib.rs index a0ffdecb6fb..883164d3208 100644 --- a/crates/remote/src/lib.rs +++ b/crates/remote/src/lib.rs @@ -1,7 +1,8 @@ mod action_state; -mod compression; +mod blob; mod fs_digest; mod grpc_remote_client; +mod grpc_services; mod grpc_tls; mod http_remote_client; mod http_tls; @@ -17,7 +18,4 @@ pub use remote_service::*; // TODO: // - Other digest functions besides sha256 -// - Proper error handling // - Directory blob types -// - Write/read bytestream for large blobs -// - TLS/mTLS issues diff --git a/crates/remote/src/remote_client.rs b/crates/remote/src/remote_client.rs index 020011cf2b8..36500e1443b 100644 --- a/crates/remote/src/remote_client.rs +++ b/crates/remote/src/remote_client.rs @@ -1,12 +1,52 @@ -use crate::fs_digest::Blob; +use crate::blob::Blob; use bazel_remote_apis::build::bazel::remote::execution::v2::{ ActionResult, Digest, ServerCapabilities, }; +use http::header::{HeaderMap, HeaderName, HeaderValue}; +use miette::IntoDiagnostic; use moon_config::RemoteConfig; use std::path::Path; +use tracing::warn; #[async_trait::async_trait] pub trait RemoteClient: Send + Sync { + fn extract_headers(&self, config: &RemoteConfig) -> miette::Result> { + let mut headers = HeaderMap::default(); + + if let Some(auth) = &config.auth { + for (key, value) in &auth.headers { + headers.insert( + HeaderName::from_bytes(key.as_bytes()).into_diagnostic()?, + HeaderValue::from_str(value).into_diagnostic()?, + ); + } + + if let Some(token_name) = &auth.token { + let token = std::env::var(token_name).unwrap_or_default(); + + if token.is_empty() { + warn!( + "Auth token {} does not exist, unable to authorize for remote service", + moon_common::color::property(token_name) + ); + + return Ok(None); + } else { + let mut value = + HeaderValue::from_str(&format!("Bearer {token}")).into_diagnostic()?; + value.set_sensitive(true); + + headers.insert( + HeaderName::from_bytes("Authorization".as_bytes()).into_diagnostic()?, + value, + ); + } + } + } + + Ok(Some(headers)) + } + async fn connect_to_host( &mut self, config: &RemoteConfig, @@ -15,11 +55,14 @@ pub trait RemoteClient: Send + Sync { async fn load_capabilities(&self) -> miette::Result; - async fn get_action_result(&self, digest: &Digest) -> miette::Result>; + async fn get_action_result( + &self, + action_digest: &Digest, + ) -> miette::Result>; async fn update_action_result( &self, - digest: &Digest, + action_digest: &Digest, result: ActionResult, ) -> miette::Result>; @@ -27,13 +70,35 @@ pub trait RemoteClient: Send + Sync { async fn batch_read_blobs( &self, - digest: &Digest, + action_digest: &Digest, blob_digests: Vec, ) -> miette::Result>; + async fn stream_read_blob( + &self, + action_digest: &Digest, + blob_digest: Digest, + ) -> miette::Result> { + let mut result = self + .batch_read_blobs(action_digest, vec![blob_digest]) + .await?; + + Ok(Some(result.remove(0))) + } + async fn batch_update_blobs( &self, - digest: &Digest, + action_digest: &Digest, blobs: Vec, ) -> miette::Result>>; + + async fn stream_update_blob( + &self, + action_digest: &Digest, + blob: Blob, + ) -> miette::Result> { + let mut result = self.batch_update_blobs(action_digest, vec![blob]).await?; + + Ok(result.remove(0)) + } } diff --git a/crates/remote/src/remote_service.rs b/crates/remote/src/remote_service.rs index 28cfceec0b2..9a7621ac30f 100644 --- a/crates/remote/src/remote_service.rs +++ b/crates/remote/src/remote_service.rs @@ -1,5 +1,5 @@ use crate::action_state::ActionState; -use crate::compression::*; +use crate::blob::*; use crate::fs_digest::*; use crate::grpc_remote_client::GrpcRemoteClient; use crate::http_remote_client::HttpRemoteClient; @@ -56,7 +56,7 @@ impl RemoteService { .install_default() .is_err() { - error!("Failed to initialize cryptography for gRPC!"); + error!("Failed to initialize cryptography for TLS/mTLS!"); return Ok(()); } @@ -120,7 +120,7 @@ impl RemoteService { warn!( host, - "Remote service does not support {} compression, but it has been configured and enabled through the {} setting", + "Remote service does not support {} compression for streaming, but it has been configured and enabled through the {} setting", compression, color::property("unstable_remote.cache.compression"), ); @@ -184,8 +184,9 @@ impl RemoteService { // we need to account for the non-blob data in the request/response, like the // compression level, digest strings, etc. All of these "add up" and can // bump the total body size larger than the actual limit. Is there a better - // way to handle this? Probably... - max - (1024 * 10) + // way to handle this? Probably, but for now, just reduce the size by 1%, + // which is about 42k bytes. + max - (max as f64 * 0.01) as i64 } #[instrument(skip(self, state))] @@ -212,16 +213,15 @@ impl RemoteService { .await?; if missing.contains(&state.digest) { - // Create on demand when needed, instead of always - state.create_action_from_task(); - + // This is where moon differs from the Bazel RE API. In Bazel, + // we would serialize + hash the `Action` and `Command` types, + // and upload those. But those types do not match how our hashing + // works, so instead, we're uploading the bytes of our internal + // hash manifests. Hopefully this doesn't cause issues! self.client .batch_update_blobs( &state.digest, - vec![Blob { - bytes: state.get_command_as_bytes()?, - digest: state.digest.clone(), - }], + vec![Blob::new(state.digest.clone(), state.bytes.clone())], ) .await?; } @@ -235,7 +235,7 @@ impl RemoteService { return Ok(()); } - let Some((mut result, blobs)) = state.prepare_for_upload() else { + let Some((mut result, blobs)) = state.extract_for_upload() else { return Ok(()); }; @@ -261,6 +261,7 @@ impl RemoteService { ) .await; + // Don't save the action result if some of the blobs failed to upload if upload_result.is_err() || upload_result.is_ok_and(|res| !res) { return; } @@ -360,26 +361,67 @@ impl RemoteService { async fn batch_upload_blobs( client: Arc>, - digest: Digest, - blobs: Vec, + action_digest: Digest, + mut blobs: Vec, max_size: usize, ) -> miette::Result { + let missing_digests = client + .find_missing_blobs(blobs.iter().map(|blob| blob.digest.clone()).collect()) + .await?; + + // All blobs already exist in CAS + if missing_digests.is_empty() { + return Ok(true); + } + + // Otherwise, reduce down the blobs list + blobs.retain(|blob| missing_digests.contains(&blob.digest)); + let blob_groups = partition_into_groups(blobs, max_size, |blob| blob.bytes.len()); if blob_groups.is_empty() { - return Ok(false); + return Ok(true); } let group_total = blob_groups.len(); let mut set = JoinSet::default(); - for (group_index, group) in blob_groups.into_iter() { + for (group_index, mut group) in blob_groups.into_iter() { let client = Arc::clone(&client); - let digest = digest.to_owned(); + let action_digest = action_digest.to_owned(); + + // Streaming + if group.stream { + set.spawn(async move { + match client + .stream_update_blob(&action_digest, group.items.remove(0)) + .await + { + Ok(result) => { + if result.is_some() { + return true; + } + } + Err(error) => { + warn!( + hash = &action_digest.hash, + group = group_index + 1, + "Failed to stream upload blob: {}", + color::muted_light(error.to_string()), + ); + } + }; + false + }); + + continue; + } + + // Not streaming if group_total > 1 { trace!( - hash = &digest.hash, + hash = &action_digest.hash, blobs = group.items.len(), size = group.size, max_size, @@ -390,18 +432,23 @@ async fn batch_upload_blobs( } set.spawn(async move { - if let Err(error) = client.batch_update_blobs(&digest, group.items).await { - warn!( - hash = &digest.hash, - group = group_index + 1, - "Failed to upload blobs: {}", - color::muted_light(error.to_string()), - ); - - return false; - } + match client.batch_update_blobs(&action_digest, group.items).await { + Ok(result) => { + if result.into_iter().all(|res| res.is_some()) { + return true; + } + } + Err(error) => { + warn!( + hash = &action_digest.hash, + group = group_index + 1, + "Failed to upload blobs: {}", + color::muted_light(error.to_string()), + ); + } + }; - true + false }); } @@ -412,23 +459,24 @@ async fn batch_upload_blobs( async fn batch_download_blobs( client: Arc>, - digest: &Digest, + action_digest: &Digest, result: &ActionResult, workspace_root: &Path, max_size: usize, ) -> miette::Result<()> { let mut file_map = FxHashMap::default(); - let mut digests = vec![]; + let mut blob_digests = vec![]; // TODO support directories for file in &result.output_files { if let Some(digest) = &file.digest { file_map.insert(&digest.hash, file); - digests.push(digest.to_owned()); + blob_digests.push(digest.to_owned()); } } - let digest_groups = partition_into_groups(digests, max_size, |dig| dig.size_bytes as usize); + let digest_groups = + partition_into_groups(blob_digests, max_size, |dig| dig.size_bytes as usize); if digest_groups.is_empty() { return Ok(()); @@ -437,13 +485,32 @@ async fn batch_download_blobs( let group_total = digest_groups.len(); let mut set = JoinSet::>>::default(); - for (group_index, group) in digest_groups.into_iter() { + for (group_index, mut group) in digest_groups.into_iter() { let client = Arc::clone(&client); - let digest = digest.to_owned(); + let action_digest = action_digest.to_owned(); + + // Streaming + if group.stream { + set.spawn(async move { + let mut blobs = vec![]; + + if let Some(blob) = client + .stream_read_blob(&action_digest, group.items.remove(0)) + .await? + { + blobs.push(blob); + } + + Ok(blobs) + }); + continue; + } + + // Not streaming if group_total > 1 { trace!( - hash = &digest.hash, + hash = &action_digest.hash, blobs = group.items.len(), size = group.size, max_size, @@ -453,7 +520,7 @@ async fn batch_download_blobs( ); } - set.spawn(async move { client.batch_read_blobs(&digest, group.items).await }); + set.spawn(async move { client.batch_read_blobs(&action_digest, group.items).await }); } while let Some(res) = set.join_next().await { @@ -480,6 +547,7 @@ async fn batch_download_blobs( struct Partition { pub items: Vec, pub size: usize, + pub stream: bool, } fn partition_into_groups( @@ -492,22 +560,19 @@ fn partition_into_groups( for item in items { let item_size = get_size(&item); let mut index_to_use = -1; + let mut stream = false; + // Item is too large, must be streamed if item_size >= max_size { - warn!( - size = item_size, - max_size, - "Encountered a blob larger than the max size; this is currently not supported until we support the ByteStream API; aborting" - ); - - return BTreeMap::default(); + stream = true; } - // Try and find a partition that this item can go into - for (index, group) in &groups { - if group.size + item_size <= max_size { - index_to_use = *index; - break; + else { + for (index, group) in &groups { + if !group.stream && (group.size + item_size) <= max_size { + index_to_use = *index; + break; + } } } @@ -519,8 +584,10 @@ fn partition_into_groups( let group = groups.entry(index_to_use).or_insert_with(|| Partition { items: vec![], size: 0, + stream: false, }); group.size += item_size; + group.stream = stream; group.items.push(item); } diff --git a/crates/task-runner/src/task_runner.rs b/crates/task-runner/src/task_runner.rs index b01779a4dc7..f20aff3de6f 100644 --- a/crates/task-runner/src/task_runner.rs +++ b/crates/task-runner/src/task_runner.rs @@ -462,7 +462,7 @@ impl<'task> TaskRunner<'task> { ) .await?; - let (hash, size_bytes) = hash_engine.save_manifest(hasher)?; + let hash = hash_engine.save_manifest(&mut hasher)?; operation.meta.set_hash(&hash); operation.finish(ActionStatus::Passed); @@ -471,13 +471,17 @@ impl<'task> TaskRunner<'task> { self.report_item.hash = Some(hash.clone()); if RemoteService::is_enabled() { - self.remote_state = Some(ActionState::new( + let bytes = hasher.into_bytes(); + let mut state = ActionState::new( Digest { hash: hash.clone(), - size_bytes: size_bytes as i64, + size_bytes: bytes.len() as i64, }, self.task, - )); + ); + state.bytes = bytes; + + self.remote_state = Some(state); } debug!( diff --git a/crates/workspace/src/workspace_builder.rs b/crates/workspace/src/workspace_builder.rs index 14bbaf7d0de..7ff3927fb2a 100644 --- a/crates/workspace/src/workspace_builder.rs +++ b/crates/workspace/src/workspace_builder.rs @@ -136,7 +136,7 @@ impl<'app> WorkspaceBuilder<'app> { graph_contents.add_configs(graph.hash_required_configs().await?); graph_contents.gather_env(); - let (hash, _) = cache_engine + let hash = cache_engine .hash .save_manifest_without_hasher("Workspace graph", &graph_contents)?; From 697a02d8b472a294009c2d107ecb0b69eb109ce5 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Tue, 28 Jan 2025 18:26:28 -0800 Subject: [PATCH 09/15] new: Enable Pkl without an experiment. (#1804) * Remove restrictions. * Fix tests. * Add pkl docs. * Update labels. --- CHANGELOG.md | 3 + Cargo.lock | 13 +- Cargo.toml | 6 +- crates/app/Cargo.toml | 1 - crates/app/src/app.rs | 13 -- crates/app/src/app_error.rs | 8 - crates/app/src/session.rs | 2 - crates/app/src/systems/analyze.rs | 11 +- .../task_test__can_show_internal.snap | 2 +- .../snapshots/task_test__shows_inputs.snap | 2 +- .../snapshots/task_test__shows_outputs.snap | 2 +- crates/common/src/helpers.rs | 14 -- crates/common/src/lib.rs | 2 - crates/config/src/config_finder.rs | 36 +--- crates/config/src/config_loader.rs | 6 - crates/config/src/inherited_tasks_config.rs | 2 + .../tests/inherited_tasks_config_test.rs | 2 +- crates/config/tests/project_config_test.rs | 2 +- crates/config/tests/template_config_test.rs | 2 +- crates/config/tests/toolchain_config_test.rs | 2 +- crates/config/tests/workspace_config_test.rs | 2 +- .../project-graph/tests/project_graph_test.rs | 4 +- crates/task-builder/src/tasks_builder.rs | 8 +- .../task-builder/tests/tasks_builder_test.rs | 66 +++--- justfile | 2 +- website/blog/2024-10-07_moon-v1.29.mdx | 2 +- website/docs/config/project.mdx | 8 +- website/docs/config/tasks.mdx | 9 +- website/docs/config/template.mdx | 8 +- website/docs/config/toolchain.mdx | 8 +- website/docs/config/workspace.mdx | 8 +- website/docs/guides/pkl-config.mdx | 191 ++++++++++++++++++ website/sidebars.ts | 1 + 33 files changed, 294 insertions(+), 154 deletions(-) delete mode 100644 crates/common/src/helpers.rs create mode 100644 website/docs/guides/pkl-config.mdx diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f9fca135e4..de614a250d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ #### 🚀 Updates +- Updated Pkl (`.pkl`) based configuration to always be enabled, and is no longer hidden behind an + experimental flag. + - Added official documentation: https://moonrepo.dev/docs/guides/pkl-config - Updated our unstable remote service (Bazel RE API) with new functionality: - You can now use `http(s)` protocols for gRPC servers, instead of just `grpc(s)`. - Added an `unstable_remote.api` setting, which can be used to inform the server's API format. diff --git a/Cargo.lock b/Cargo.lock index 10582347a15..f498595e910 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1025,9 +1025,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.42" +version = "4.5.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a7e468e750fa4b6be660e8b5651ad47372e8fb114030b594c2d75d48c5ffd0" +checksum = "0952013545c9c6dca60f491602655b795c6c062ab180c9cb0bccb83135461861" dependencies = [ "clap", ] @@ -3619,7 +3619,6 @@ dependencies = [ "starbase_shell", "starbase_styles", "starbase_utils", - "system_env", "tera", "thiserror 2.0.11", "tiny_http", @@ -6284,9 +6283,9 @@ dependencies = [ [[package]] name = "schematic" -version = "0.17.10" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5780c4ee657b40b2422f965d4f7525be233dab38c3b624bf446888d62e24b19" +checksum = "365f270caf8e8539eaad997c3800bfe0159e664eab1da87ca8043f527234539e" dependencies = [ "garde", "indexmap 2.7.1", @@ -6402,9 +6401,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.137" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "indexmap 2.7.1", "itoa", diff --git a/Cargo.toml b/Cargo.toml index 76f2fd7329e..5df5f29320c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ clap = { version = "4.5.27", default-features = false, features = [ "std", "error-context", ] } -clap_complete = "4.5.42" +clap_complete = "4.5.43" compact_str = { version = "0.8.1", default-features = false, features = [ "serde", ] } @@ -55,13 +55,13 @@ reqwest = { version = "0.12.12", default-features = false, features = [ ] } rustc-hash = "2.1.0" scc = "2.2.5" -schematic = { version = "0.17.10", default-features = false, features = [ +schematic = { version = "0.17.11", default-features = false, features = [ "schema", ] } serial_test = "3.2.0" semver = "1.0.25" serde = { version = "1.0.215", features = ["derive"] } -serde_json = "1.0.137" +serde_json = "1.0.138" serde_yml = "0.0.12" sha2 = "0.10.8" starbase = { version = "0.9.9" } diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 0efffe40fad..9c5fc91a522 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -65,7 +65,6 @@ starbase_events = { workspace = true } starbase_shell = { workspace = true } starbase_styles = { workspace = true } starbase_utils = { workspace = true, features = ["editor-config"] } -system_env = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } diff --git a/crates/app/src/app.rs b/crates/app/src/app.rs index 0bc67d11796..7ca68fe4bd2 100644 --- a/crates/app/src/app.rs +++ b/crates/app/src/app.rs @@ -286,15 +286,6 @@ pub struct Cli { )] pub dump: bool, - #[arg( - long = "experimentPklConfig", - global = true, - env = "MOON_EXPERIMENT_PKL_CONFIG", - help = "Enable support for the Pkl (.pkl) configuration format", - help_heading = "Experiments" - )] - pub experiment_pkl: bool, - #[arg( long, global = true, @@ -351,9 +342,5 @@ impl Cli { env::set_var("EXTISM_MEMDUMP", "wasm-plugin.mem"); env::set_var("EXTISM_COREDUMP", "wasm-plugin.core"); } - - if self.experiment_pkl { - env::set_var("MOON_EXPERIMENT_PKL_CONFIG", "true"); - } } } diff --git a/crates/app/src/app_error.rs b/crates/app/src/app_error.rs index 7df1e18458c..312187eaf20 100644 --- a/crates/app/src/app_error.rs +++ b/crates/app/src/app_error.rs @@ -48,14 +48,6 @@ pub enum AppError { #[error("Unable to determine your current working directory.")] MissingWorkingDir, - #[diagnostic(code(app::pkl_required))] - #[error( - "Pkl configuration requires the {} binary to be installed and available.\nLearn more: {}", - "pkl".style(Style::Shell), - "https://pkl-lang.org/main/current/pkl-cli/index.html".style(Style::Url) - )] - PklRequired, - #[diagnostic(code(app::extensions::unknown_id))] #[error( "The extension {} does not exist. Configure the {} setting in {} and try again.", diff --git a/crates/app/src/session.rs b/crates/app/src/session.rs index bf9421b60c2..e7faa5c8e36 100644 --- a/crates/app/src/session.rs +++ b/crates/app/src/session.rs @@ -286,8 +286,6 @@ impl AppSession for CliSession { analyze::validate_version_constraint(constraint, &self.cli_version)?; } - analyze::check_pkl_install()?; - if self.requires_workspace_setup() { let cache_engine = self.get_cache_engine()?; diff --git a/crates/app/src/systems/analyze.rs b/crates/app/src/systems/analyze.rs index 63b2866bfaf..d1dccf5da5d 100644 --- a/crates/app/src/systems/analyze.rs +++ b/crates/app/src/systems/analyze.rs @@ -2,7 +2,7 @@ use crate::app_error::AppError; use moon_actions::utils::should_skip_action; use moon_bun_platform::BunPlatform; use moon_cache::CacheEngine; -use moon_common::{consts::PROTO_CLI_VERSION, is_test_env, path::exe_name, supports_pkl_configs}; +use moon_common::{consts::PROTO_CLI_VERSION, is_test_env, path::exe_name}; use moon_config::{BunConfig, PlatformType, ToolchainConfig}; use moon_console::{Checkpoint, Console}; use moon_deno_platform::DenoPlatform; @@ -34,15 +34,6 @@ pub fn validate_version_constraint(constraint: &VersionReq, version: &Version) - Ok(None) } -#[instrument] -pub fn check_pkl_install() -> AppResult { - if supports_pkl_configs() && system_env::find_command_on_path("pkl").is_none() { - return Err(AppError::PklRequired.into()); - } - - Ok(None) -} - #[instrument(skip_all)] pub async fn install_proto( console: &Console, diff --git a/crates/cli/tests/snapshots/task_test__can_show_internal.snap b/crates/cli/tests/snapshots/task_test__can_show_internal.snap index 79b2b503d30..93e2fc03909 100644 --- a/crates/cli/tests/snapshots/task_test__can_show_internal.snap +++ b/crates/cli/tests/snapshots/task_test__can_show_internal.snap @@ -19,5 +19,5 @@ Runs in CI: Yes INPUTS - - .moon/*.yml + - .moon/*.{pkl,yml} - tasks/**/* diff --git a/crates/cli/tests/snapshots/task_test__shows_inputs.snap b/crates/cli/tests/snapshots/task_test__shows_inputs.snap index d2ee3896d31..34dc1d74af9 100644 --- a/crates/cli/tests/snapshots/task_test__shows_inputs.snap +++ b/crates/cli/tests/snapshots/task_test__shows_inputs.snap @@ -18,5 +18,5 @@ Runs in CI: Yes INPUTS - - .moon/*.yml + - .moon/*.{pkl,yml} - tasks/tests/**/* diff --git a/crates/cli/tests/snapshots/task_test__shows_outputs.snap b/crates/cli/tests/snapshots/task_test__shows_outputs.snap index fb57f2356a4..01c34990174 100644 --- a/crates/cli/tests/snapshots/task_test__shows_outputs.snap +++ b/crates/cli/tests/snapshots/task_test__shows_outputs.snap @@ -18,7 +18,7 @@ Runs in CI: Yes INPUTS - - .moon/*.yml + - .moon/*.{pkl,yml} - tasks/**/* OUTPUTS diff --git a/crates/common/src/helpers.rs b/crates/common/src/helpers.rs deleted file mode 100644 index e15dcd96774..00000000000 --- a/crates/common/src/helpers.rs +++ /dev/null @@ -1,14 +0,0 @@ -use std::sync::OnceLock; - -pub fn enable_pkl_configs() { - std::env::set_var("MOON_EXPERIMENT_PKL_CONFIG", "true"); -} - -pub fn supports_pkl_configs() -> bool { - static PKL_CACHE: OnceLock = OnceLock::new(); - - *PKL_CACHE.get_or_init(|| { - std::env::var("MOON_EXPERIMENT_PKL_CONFIG") - .is_ok_and(|value| value == "1" || value == "true") - }) -} diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 7a1b2595527..744d10dd98f 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -1,7 +1,6 @@ pub mod consts; #[cfg(not(target_arch = "wasm32"))] mod env; -mod helpers; mod id; mod macros; pub mod path; @@ -9,6 +8,5 @@ pub mod serde; #[cfg(not(target_arch = "wasm32"))] pub use env::*; -pub use helpers::*; pub use id::*; pub use starbase_styles::*; diff --git a/crates/config/src/config_finder.rs b/crates/config/src/config_finder.rs index 9108362874d..8ede8d805e8 100644 --- a/crates/config/src/config_finder.rs +++ b/crates/config/src/config_finder.rs @@ -1,27 +1,12 @@ use moon_common::consts::CONFIG_DIRNAME; -use moon_common::supports_pkl_configs; use schematic::ConfigError; use std::fs; use std::path::{Path, PathBuf}; -#[derive(Clone, Debug)] -pub struct ConfigFinder { - pkl: bool, -} - -impl Default for ConfigFinder { - fn default() -> Self { - Self { - pkl: supports_pkl_configs(), - } - } -} +#[derive(Clone, Debug, Default)] +pub struct ConfigFinder; impl ConfigFinder { - pub fn with_pkl() -> Self { - Self { pkl: true } - } - pub fn get_project_files(&self, project_root: &Path) -> Vec { self.get_project_file_names() .into_iter() @@ -90,24 +75,13 @@ impl ConfigFinder { } label.push_str(name); - - if self.pkl { - label.push_str(".{plk,yml}"); - } else { - label.push_str(".yml"); - } + label.push_str(".{pkl,yml}"); label } pub fn get_file_names(&self, name: &str) -> Vec { - let mut files = vec![format!("{name}.yml")]; - - if self.pkl { - files.push(format!("{name}.pkl")); - } - - files + vec![format!("{name}.yml"), format!("{name}.pkl")] } pub fn get_from_dir(&self, dir: PathBuf) -> miette::Result> { @@ -137,7 +111,7 @@ impl ConfigFinder { // so avoid failing when trying to parse it as a config if path .extension() - .is_some_and(|ext| ext == "yml" || ext == "yaml" || self.pkl && ext == "pkl") + .is_some_and(|ext| ext == "yml" || ext == "yaml" || ext == "pkl") { files.push(path); } diff --git a/crates/config/src/config_loader.rs b/crates/config/src/config_loader.rs index 1e5d2191ca3..cd686acfc11 100644 --- a/crates/config/src/config_loader.rs +++ b/crates/config/src/config_loader.rs @@ -20,12 +20,6 @@ pub struct ConfigLoader { } impl ConfigLoader { - pub fn with_pkl() -> Self { - Self { - finder: ConfigFinder::with_pkl(), - } - } - pub fn create_project_loader>( &self, project_root: P, diff --git a/crates/config/src/inherited_tasks_config.rs b/crates/config/src/inherited_tasks_config.rs index 49a419fdea3..da9bfe440e3 100644 --- a/crates/config/src/inherited_tasks_config.rs +++ b/crates/config/src/inherited_tasks_config.rs @@ -172,6 +172,8 @@ impl InheritedTasksManager { let name = if valid_names.iter().any(|n| n == name) { "*" + } else if let Some(stripped_name) = name.strip_suffix(".yaml") { + stripped_name } else if let Some(stripped_name) = name.strip_suffix(".yml") { stripped_name } else if let Some(stripped_name) = name.strip_suffix(".pkl") { diff --git a/crates/config/tests/inherited_tasks_config_test.rs b/crates/config/tests/inherited_tasks_config_test.rs index 5d78f41b7e1..4fb57e91d4e 100644 --- a/crates/config/tests/inherited_tasks_config_test.rs +++ b/crates/config/tests/inherited_tasks_config_test.rs @@ -1101,7 +1101,7 @@ mod task_manager { #[test] fn loads_pkl() { let config = test_config(locate_fixture("pkl"), |path| { - ConfigLoader::with_pkl().load_tasks_config_from_path(path.join(".moon/tasks.pkl")) + ConfigLoader::default().load_tasks_config_from_path(path.join(".moon/tasks.pkl")) }); assert_eq!( diff --git a/crates/config/tests/project_config_test.rs b/crates/config/tests/project_config_test.rs index fc74c810ddf..fb03f26d938 100644 --- a/crates/config/tests/project_config_test.rs +++ b/crates/config/tests/project_config_test.rs @@ -647,7 +647,7 @@ workspace: #[allow(deprecated)] fn loads_pkl() { let config = test_config(locate_fixture("pkl"), |path| { - ConfigLoader::with_pkl().load_project_config(path) + ConfigLoader::default().load_project_config(path) }); assert_eq!( diff --git a/crates/config/tests/template_config_test.rs b/crates/config/tests/template_config_test.rs index 4bc92cd9029..b03a08f1489 100644 --- a/crates/config/tests/template_config_test.rs +++ b/crates/config/tests/template_config_test.rs @@ -391,7 +391,7 @@ variables: #[test] fn loads_pkl() { let config = test_config(locate_fixture("pkl"), |path| { - ConfigLoader::with_pkl().load_template_config(path) + ConfigLoader::default().load_template_config(path) }); assert_eq!( diff --git a/crates/config/tests/toolchain_config_test.rs b/crates/config/tests/toolchain_config_test.rs index bc07750dd20..709da9ef5f7 100644 --- a/crates/config/tests/toolchain_config_test.rs +++ b/crates/config/tests/toolchain_config_test.rs @@ -1455,7 +1455,7 @@ typescript: fn loads_pkl() { let mut config = test_config(locate_fixture("pkl"), |path| { let proto = ProtoConfig::default(); - ConfigLoader::with_pkl().load_toolchain_config(path, &proto) + ConfigLoader::default().load_toolchain_config(path, &proto) }); assert_eq!( diff --git a/crates/config/tests/workspace_config_test.rs b/crates/config/tests/workspace_config_test.rs index 7351b988464..5908abfca80 100644 --- a/crates/config/tests/workspace_config_test.rs +++ b/crates/config/tests/workspace_config_test.rs @@ -855,7 +855,7 @@ extensions: #[test] fn loads_pkl() { let config = test_config(locate_fixture("pkl"), |path| { - ConfigLoader::with_pkl().load_workspace_config(path) + ConfigLoader::default().load_workspace_config(path) }); assert_eq!( diff --git a/crates/project-graph/tests/project_graph_test.rs b/crates/project-graph/tests/project_graph_test.rs index 39cb8738a39..57f00bb8ae8 100644 --- a/crates/project-graph/tests/project_graph_test.rs +++ b/crates/project-graph/tests/project_graph_test.rs @@ -687,7 +687,7 @@ mod project_graph { assert_eq!( task.input_globs, FxHashSet::from_iter([ - WorkspaceRelativePathBuf::from(".moon/*.yml"), + WorkspaceRelativePathBuf::from(".moon/*.{pkl,yml}"), WorkspaceRelativePathBuf::from("project/global.*") ]) ); @@ -737,7 +737,7 @@ mod project_graph { assert_eq!( task.input_globs, FxHashSet::from_iter([ - WorkspaceRelativePathBuf::from(".moon/*.yml"), + WorkspaceRelativePathBuf::from(".moon/*.{pkl,yml}"), WorkspaceRelativePathBuf::from("tasks/file.*"), ]) ); diff --git a/crates/task-builder/src/tasks_builder.rs b/crates/task-builder/src/tasks_builder.rs index eb57af7a4fa..68489613f68 100644 --- a/crates/task-builder/src/tasks_builder.rs +++ b/crates/task-builder/src/tasks_builder.rs @@ -2,7 +2,7 @@ use crate::tasks_builder_error::TasksBuilderError; use moon_common::path::{is_root_level_source, WorkspaceRelativePath}; -use moon_common::{color, supports_pkl_configs, Id}; +use moon_common::{color, Id}; use moon_config::{ is_glob_like, InheritedTasksConfig, InputPath, ProjectConfig, ProjectWorkspaceInheritedTasksConfig, TaskArgs, TaskConfig, TaskDependency, @@ -722,11 +722,7 @@ impl<'proj> TasksBuilder<'proj> { .map(|dep| (*dep).to_owned()) .collect::>(); - global_inputs.push(InputPath::WorkspaceGlob(".moon/*.yml".into())); - - if supports_pkl_configs() { - global_inputs.push(InputPath::WorkspaceGlob(".moon/*.pkl".into())); - } + global_inputs.push(InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into())); if let Some(env_files) = &options.env_files { global_inputs.extend(env_files.to_owned()); diff --git a/crates/task-builder/tests/tasks_builder_test.rs b/crates/task-builder/tests/tasks_builder_test.rs index 0a46fa49901..26f4b42f014 100644 --- a/crates/task-builder/tests/tasks_builder_test.rs +++ b/crates/task-builder/tests/tasks_builder_test.rs @@ -128,7 +128,7 @@ mod tasks_builder { build.inputs, vec![ InputPath::ProjectFile("abc".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert_eq!(build.outputs, vec![OutputPath::ProjectFile("out".into())]); @@ -141,7 +141,7 @@ mod tasks_builder { run.inputs, vec![ InputPath::ProjectFile("xyz".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert_eq!(run.outputs, vec![]); @@ -154,7 +154,7 @@ mod tasks_builder { test.inputs, vec![ InputPath::ProjectGlob("**/*".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(!test.state.local_only); @@ -175,7 +175,7 @@ mod tasks_builder { build.inputs, vec![ InputPath::ProjectFile("abc".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert_eq!(build.outputs, vec![OutputPath::ProjectFile("out".into())]); @@ -188,7 +188,7 @@ mod tasks_builder { run.inputs, vec![ InputPath::ProjectFile("xyz".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert_eq!(run.outputs, vec![]); @@ -927,7 +927,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectGlob("**/*".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(!task.state.empty_inputs); @@ -936,7 +936,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![InputPath::WorkspaceGlob(".moon/*.yml".into())] + vec![InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into())] ); assert!(task.state.empty_inputs); @@ -946,7 +946,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectGlob("local/*".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(!task.state.empty_inputs); @@ -961,7 +961,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![InputPath::WorkspaceGlob(".moon/*.yml".into())] + vec![InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into())] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -970,7 +970,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![InputPath::WorkspaceGlob(".moon/*.yml".into())] + vec![InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into())] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -981,7 +981,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectGlob("local/*".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()) + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()) ] ); assert!(!task.state.empty_inputs); @@ -999,7 +999,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectGlob("**/*".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()) + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()) ] ); assert!(!task.state.empty_inputs); @@ -1009,7 +1009,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![InputPath::WorkspaceGlob(".moon/*.yml".into())] + vec![InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into())] ); assert!(task.state.empty_inputs); assert!(task.state.root_level); @@ -1020,7 +1020,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectGlob("local/*".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()) + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()) ] ); assert!(!task.state.empty_inputs); @@ -1039,7 +1039,7 @@ mod tasks_builder { vec![ InputPath::ProjectGlob("src/**/*".into()), InputPath::WorkspaceFile("workspace-local".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(!task.state.empty_inputs); @@ -1050,7 +1050,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectFile("local.json".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(!task.state.empty_inputs); @@ -1059,7 +1059,7 @@ mod tasks_builder { assert_eq!( task.inputs, - vec![InputPath::WorkspaceGlob(".moon/*.yml".into())] + vec![InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into())] ); assert!(task.state.empty_inputs); } @@ -1105,7 +1105,7 @@ mod tasks_builder { vec![ InputPath::ProjectFile("global".into()), InputPath::ProjectFile("local".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1158,7 +1158,7 @@ mod tasks_builder { vec![ InputPath::ProjectFile("global".into()), InputPath::ProjectFile("local".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1211,7 +1211,7 @@ mod tasks_builder { vec![ InputPath::ProjectFile("local".into()), InputPath::ProjectFile("global".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1264,7 +1264,7 @@ mod tasks_builder { vec![ InputPath::ProjectFile("local".into()), InputPath::ProjectFile("global".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1314,7 +1314,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectFile("local".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1358,7 +1358,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectFile("local".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1459,7 +1459,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectFile("global".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1505,7 +1505,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectFile("global".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1550,7 +1550,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectFile("global".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1594,7 +1594,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectFile("global".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-merge.yml".into()), ] ); @@ -1858,7 +1858,7 @@ mod tasks_builder { InputPath::ProjectGlob("**/*".into()), InputPath::ProjectGlob("project/**/*".into()), InputPath::WorkspaceFile("workspace.json".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(!task.state.empty_inputs); @@ -1875,7 +1875,7 @@ mod tasks_builder { vec![ InputPath::ProjectGlob("project/**/*".into()), InputPath::WorkspaceFile("workspace.json".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(task.state.empty_inputs); @@ -1893,7 +1893,7 @@ mod tasks_builder { InputPath::ProjectGlob("local/*".into()), InputPath::ProjectGlob("project/**/*".into()), InputPath::WorkspaceFile("workspace.json".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); assert!(!task.state.empty_inputs); @@ -2012,7 +2012,7 @@ mod tasks_builder { task.inputs, vec![ InputPath::ProjectGlob("src/**/*".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), ] ); } @@ -2055,7 +2055,7 @@ mod tasks_builder { InputPath::ProjectFile("global-extender".into()), InputPath::ProjectFile("local-base".into()), InputPath::ProjectFile("local-extender".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-extends.yml".into()), ] ); @@ -2078,7 +2078,7 @@ mod tasks_builder { vec![ InputPath::ProjectFile("global-base".into()), InputPath::ProjectFile("local-extender".into()), - InputPath::WorkspaceGlob(".moon/*.yml".into()), + InputPath::WorkspaceGlob(".moon/*.{pkl,yml}".into()), InputPath::WorkspaceFile("global/tasks/tag-extends.yml".into()), ] ); diff --git a/justfile b/justfile index 45173d10c6b..6becd1f7254 100644 --- a/justfile +++ b/justfile @@ -32,7 +32,7 @@ lint-fix: # TESTING test $MOON_TEST="true" name="": - cargo nextest run --workspace --config-file ./.cargo/nextest.toml {{name}} + cargo nextest run --workspace --no-fail-fast --config-file ./.cargo/nextest.toml {{name}} test-ci $MOON_TEST="true": cargo nextest run --workspace --config-file ./.cargo/nextest.toml --profile ci diff --git a/website/blog/2024-10-07_moon-v1.29.mdx b/website/blog/2024-10-07_moon-v1.29.mdx index 467d5f045ab..45aacbff720 100644 --- a/website/blog/2024-10-07_moon-v1.29.mdx +++ b/website/blog/2024-10-07_moon-v1.29.mdx @@ -298,7 +298,7 @@ interested in trying out Pkl, you can with the following: - [Install `pkl` onto `PATH`](https://pkl-lang.org/main/current/pkl-cli/index.html#installation). Pkl uses a client-server communication model. - Can also be installed with proto: - `proto plugin add https://raw.githubusercontent.com/milesj/proto-plugins/refs/heads/master/pkl.toml` + `proto plugin add pkl https://raw.githubusercontent.com/milesj/proto-plugins/refs/heads/master/pkl.toml` - Use the `.pkl` file extension instead of `.yml`. - Pass the `--experimentPklConfig` CLI option, or set the `MOON_EXPERIMENT_PKL_CONFIG` environment variable. diff --git a/website/docs/config/project.mdx b/website/docs/config/project.mdx index c24c578d683..1006db39a1c 100644 --- a/website/docs/config/project.mdx +++ b/website/docs/config/project.mdx @@ -1,5 +1,5 @@ --- -title: moon.yml +title: moon.{pkl,yml} toc_max_heading_level: 6 --- @@ -15,6 +15,12 @@ exist in a project's root, as configured in [`projects`](./workspace#projects). $schema: 'https://moonrepo.dev/schemas/project.json' ``` +:::info + +Project configuration can also be written in [Pkl](../guides/pkl-config) instead of YAML. + +::: + ## `dependsOn` diff --git a/website/docs/config/tasks.mdx b/website/docs/config/tasks.mdx index 31d882cec77..1b0386d2641 100644 --- a/website/docs/config/tasks.mdx +++ b/website/docs/config/tasks.mdx @@ -1,6 +1,5 @@ --- -title: .moon/tasks.yml, .moon/tasks/**/*.yml -sidebar_label: .moon/tasks... +title: .moon/tasks[/**/*].{pkl,yml} --- import HeadingApiLink from '@site/src/components/Docs/HeadingApiLink'; @@ -16,6 +15,12 @@ Projects can override or merge with these settings within their respective [`moo $schema: 'https://moonrepo.dev/schemas/tasks.json' ``` +:::info + +Inherited tasks configuration can also be written in [Pkl](../guides/pkl-config) instead of YAML. + +::: + ## `extends` diff --git a/website/docs/config/template.mdx b/website/docs/config/template.mdx index b4b56f96656..92b97b5ca9c 100644 --- a/website/docs/config/template.mdx +++ b/website/docs/config/template.mdx @@ -1,5 +1,5 @@ --- -title: template.yml +title: template.{pkl,yml} toc_max_heading_level: 6 --- @@ -14,6 +14,12 @@ The `template.yml` file configures metadata and variables for a template, $schema: 'https://moonrepo.dev/schemas/template.json' ``` +:::info + +Template configuration can also be written in [Pkl](../guides/pkl-config) instead of YAML. + +::: + ## `id` diff --git a/website/docs/config/toolchain.mdx b/website/docs/config/toolchain.mdx index 866e8a7e326..b914216ff7f 100644 --- a/website/docs/config/toolchain.mdx +++ b/website/docs/config/toolchain.mdx @@ -1,5 +1,5 @@ --- -title: .moon/toolchain.yml +title: .moon/toolchain.{pkl,yml} toc_max_heading_level: 6 --- @@ -19,6 +19,12 @@ Managing tool version's within the toolchain ensures a deterministic environment $schema: 'https://moonrepo.dev/schemas/toolchain.json' ``` +:::info + +Toolchain configuration can also be written in [Pkl](../guides/pkl-config) instead of YAML. + +::: + ## `extends` diff --git a/website/docs/config/workspace.mdx b/website/docs/config/workspace.mdx index e9315e18f33..add9ceaefe3 100644 --- a/website/docs/config/workspace.mdx +++ b/website/docs/config/workspace.mdx @@ -1,5 +1,5 @@ --- -title: .moon/workspace.yml +title: .moon/workspace.{pkl,yml} toc_max_heading_level: 6 --- @@ -16,6 +16,12 @@ _required_. $schema: 'https://moonrepo.dev/schemas/workspace.json' ``` +:::info + +Workspace configuration can also be written in [Pkl](../guides/pkl-config) instead of YAML. + +::: + ## `extends` diff --git a/website/docs/guides/pkl-config.mdx b/website/docs/guides/pkl-config.mdx new file mode 100644 index 00000000000..7c943ad601d --- /dev/null +++ b/website/docs/guides/pkl-config.mdx @@ -0,0 +1,191 @@ +--- +title: Pkl configuration +--- + +import VersionLabel from '@site/src/components/Docs/VersionLabel'; + + + +While YAML is our official configuration format, we want to support dynamic formats, and as such, +have added support for Pkl. What is Pkl? If you haven't heard of Pkl yet, +[Pkl is a programmable configuration format by Apple](https://pkl-lang.org/). We like Pkl, as it +meets the following requirements: + +- Is easy to read and write. +- Is dynamic and programmable (loops, variables, etc). +- Has type-safety / built-in schema support. +- Has Rust serde integration. + +The primary requirement that we are hoping to achieve is supporting a configuration format that is +_programmable_. We want something that has native support for variables, loops, conditions, and +more, so that you could curate and compose your configuration very easily. Hacking this +functionality into YAML is a terrible user experience in our opinion! + +## Installing Pkl + +Pkl utilizes a client-server architecture, which means that the `pkl` binary must exist in the +environment for parsing and evaluating `.pkl` files. Jump over to the +[official documentation for instructions on how to install Pkl](https://pkl-lang.org/main/current/pkl-cli/index.html#installation). + +If you are using [proto](/proto), you can install Pkl with the following commands. + +```shell +proto plugin add pkl https://raw.githubusercontent.com/milesj/proto-plugins/refs/heads/master/pkl.toml +proto install pkl --pin +``` + +## Using Pkl + +To start using Pkl in moon, simply: + +- Install [Pkl](#installing-pkl) and the + [VS Code extension](https://pkl-lang.org/vscode/current/index.html) +- Create configs with the `.pkl` extension instead of `.yml` + +:::info + +We highly suggest reading the Pkl +[language reference](https://pkl-lang.org/main/current/language-reference/index.html), the +[standard library](https://pkl-lang.org/main/current/standard-library.html), or looking at our +[example configurations](#example-configs) when using Pkl. + +::: + +### Caveats and restrictions + +Since this is an entirely new configuration format that is quite dynamic compared to YAML, there are +some key differences to be aware of! + +- Only files are supported. Cannot use or extend from URLs. + +- Each `.pkl` file is evaluated in isolation (loops are processed, variables assigned, etc). This + means that task inheritance and file merging cannot extend or infer this native functionality. + +- `default` is a + [special feature](https://pkl-lang.org/main/current/language-reference/index.html#default-element) + in Pkl and cannot be used as a setting name. This only applies to + [`template.yml`](../config/template#default), but can be worked around by using `defaultValue` + instead. + +```pkl title="template.yml" +variables { + ["age"] { + type = "number" + prompt = "Age?" + defaultValue = 0 +} +``` + +- `local` is also a reserved word in Pkl. It can be worked around by escaping it with backticks, or + you can simply use the [`preset` setting](../config/project#preset) instead. + +```pkl +tasks { + ["example"] { + `local` = true + # Or + preset = "server" + } +} +``` + +## Example configs + +### `.moon/workspace.yml` + +```pkl +projects { + globs = List("apps/*", "packages/*") + sources { + ["root"] = "." + } +} + +vcs { + defaultBranch = "master" +} +``` + +### `.moon/toolchain.yml` + +```pkl +node { + version = "20.15.0" + packageManager = "yarn" + yarn { + version = "4.3.1" + } + addEnginesConstraint = false + inferTasksFromScripts = false +} +``` + +### `moon.yml` + +```pkl +type = "application" +language = "typescript" +dependsOn = List("client", "ui") + +tasks { + ["build"] { + command = "docusaurus build" + deps = List("^:build") + outputs = List("build") + options { + interactive = true + retryCount = 3 + } + } + ["typecheck"] { + command = "tsc --build" + inputs = new Listing { + "@globs(sources)" + "@globs(tests)" + "tsconfig.json" + "/tsconfig.options.json" + } + } +} +``` + +## Example functionality + +### Loops and conditionals + +```pkl +tasks { + for (_os in List("linux", "macos", "windows")) { + ["build-\(_os)"] { + command = "cargo" + args = List( + "--target", + if (_os == "linux") "x86_64-unknown-linux-gnu" + else if (_os == "macos") "x86_64-apple-darwin" + else "i686-pc-windows-msvc", + "--verbose" + ) + options { + os = _os + } + } + } +} +``` + +### Local variables + +```pkl +local _sharedInputs = List("src/**/*") + +tasks { + ["test"] { + // ... + inputs = List("tests/**/*") + _sharedInputs + } + ["lint"] { + // ... + inputs = List("**/*.graphql") + _sharedInputs + } +} +``` diff --git a/website/sidebars.ts b/website/sidebars.ts index d7486c7e8f4..899e127aef7 100644 --- a/website/sidebars.ts +++ b/website/sidebars.ts @@ -209,6 +209,7 @@ const sidebars: SidebarsConfig = { 'guides/extensions', 'guides/offline-mode', 'guides/open-source', + 'guides/pkl-config', 'guides/remote-cache', 'guides/root-project', 'guides/sharing-config', From 7824c0ccbc7cdf0ccd405060d59e050c2a48890a Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Wed, 29 Jan 2025 11:12:19 -0800 Subject: [PATCH 10/15] new: Support multiple package workspaces. (#1806) * Update platform. * Fix lints. * Update type. * Rework rust check. * Fix lints. --- CHANGELOG.md | 3 + .../action-graph/src/action_graph_builder.rs | 8 ++- .../action-graph/tests/action_graph_test.rs | 39 ++++++++---- crates/action-pipeline/src/action_runner.rs | 2 + .../action-pipeline/tests/report_estimate.rs | 4 ++ crates/action/src/action_node.rs | 20 ++++-- crates/actions/src/actions/install_deps.rs | 15 +++-- crates/cli/tests/run_bun_test.rs | 62 +++++++++---------- crates/config/src/config_finder.rs | 5 +- justfile | 2 +- legacy/bun/platform/src/bun_platform.rs | 30 ++++++++- legacy/core/platform/src/platform.rs | 14 ++++- legacy/node/lang/src/node.rs | 37 ++++++++++- legacy/node/platform/src/node_platform.rs | 39 ++++++++++-- legacy/python/platform/src/python_platform.rs | 11 +++- legacy/rust/platform/src/rust_platform.rs | 48 +++++++++++--- packages/types/src/pipeline.ts | 1 + 17 files changed, 261 insertions(+), 79 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de614a250d8..4b13413e713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ #### 🚀 Updates +- Added unstable support for multiple package workspaces when installing dependencies. - Updated Pkl (`.pkl`) based configuration to always be enabled, and is no longer hidden behind an experimental flag. - Added official documentation: https://moonrepo.dev/docs/guides/pkl-config @@ -19,6 +20,8 @@ - Added timeout and concurrency limit to clients. - Added a `MOON_DEBUG_REMOTE` environment variable, which can be used to debug internal errors for diagnosing connection/integration issues. +- Improved the Rust toolchain. + - The root-level project is now properly taken into account when detecting the package workspaces. #### 🐞 Fixes diff --git a/crates/action-graph/src/action_graph_builder.rs b/crates/action-graph/src/action_graph_builder.rs index 06b4684d014..7a93d3b9a59 100644 --- a/crates/action-graph/src/action_graph_builder.rs +++ b/crates/action-graph/src/action_graph_builder.rs @@ -175,6 +175,7 @@ impl<'app> ActionGraphBuilder<'app> { .map(|t| &t.toolchains) .unwrap_or_else(|| &project.toolchains); let mut primary_toolchain = toolchains[0].to_owned(); + let mut packages_root = WorkspaceRelativePathBuf::default(); // If Bun and Node.js are enabled, they will both attempt to install // dependencies in the target root. We need to avoid this problem, @@ -195,7 +196,11 @@ impl<'app> ActionGraphBuilder<'app> { // If project is NOT in the package manager workspace, then we should // install dependencies in the project, not the workspace root. if let Ok(platform) = self.platform_manager.get_by_toolchain(&primary_toolchain) { - if !platform.is_project_in_dependency_workspace(project.source.as_str())? { + packages_root = platform.find_dependency_workspace_root(project.source.as_str())?; + + if !platform + .is_project_in_dependency_workspace(&packages_root, project.source.as_str())? + { in_project = true; debug!( @@ -213,6 +218,7 @@ impl<'app> ActionGraphBuilder<'app> { } else { ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { runtime: self.get_runtime(project, &primary_toolchain, false), + root: packages_root, }) }; diff --git a/crates/action-graph/tests/action_graph_test.rs b/crates/action-graph/tests/action_graph_test.rs index cd02a2833cb..9985f63bed5 100644 --- a/crates/action-graph/tests/action_graph_test.rs +++ b/crates/action-graph/tests/action_graph_test.rs @@ -128,7 +128,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }) ] ); @@ -155,7 +156,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }) ] ); @@ -184,7 +186,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::install_project_deps(InstallProjectDepsNode { project: Id::raw("out"), @@ -222,7 +225,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }) ] ); @@ -244,7 +248,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }) ] ); @@ -278,7 +283,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), @@ -318,7 +324,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), @@ -508,7 +515,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), @@ -574,7 +582,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), @@ -631,7 +640,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), @@ -697,7 +707,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), @@ -763,7 +774,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), @@ -843,7 +855,8 @@ mod action_graph { runtime: create_node_runtime() }), ActionNode::install_workspace_deps(InstallWorkspaceDepsNode { - runtime: create_node_runtime() + runtime: create_node_runtime(), + root: WorkspaceRelativePathBuf::new(), }), ActionNode::sync_project(SyncProjectNode { project: Id::raw("bar"), diff --git a/crates/action-pipeline/src/action_runner.rs b/crates/action-pipeline/src/action_runner.rs index 7c679b2b2f0..8dd9a1119da 100644 --- a/crates/action-pipeline/src/action_runner.rs +++ b/crates/action-pipeline/src/action_runner.rs @@ -120,6 +120,7 @@ pub async fn run_action( workspace_graph.clone(), &inner.runtime, None, + Some(&inner.root), ) .await; @@ -151,6 +152,7 @@ pub async fn run_action( workspace_graph.clone(), &inner.runtime, Some(&project), + None, ) .await; diff --git a/crates/action-pipeline/tests/report_estimate.rs b/crates/action-pipeline/tests/report_estimate.rs index 4c9aa749a82..2cf58c37664 100644 --- a/crates/action-pipeline/tests/report_estimate.rs +++ b/crates/action-pipeline/tests/report_estimate.rs @@ -1,5 +1,6 @@ use moon_action::*; use moon_action_pipeline::reports::estimate::{Estimate, TaskEstimate}; +use moon_common::path::WorkspaceRelativePathBuf; use moon_toolchain::Runtime; use rustc_hash::FxHashMap; use std::sync::Arc; @@ -131,6 +132,7 @@ mod estimate { node: Arc::new(ActionNode::install_workspace_deps( InstallWorkspaceDepsNode { runtime: Runtime::system(), + root: WorkspaceRelativePathBuf::new(), }, )), ..Action::default() @@ -205,6 +207,7 @@ mod estimate { node: Arc::new(ActionNode::install_workspace_deps( InstallWorkspaceDepsNode { runtime: Runtime::system(), + root: WorkspaceRelativePathBuf::new(), }, )), ..Action::default() @@ -280,6 +283,7 @@ mod estimate { node: Arc::new(ActionNode::install_workspace_deps( InstallWorkspaceDepsNode { runtime: Runtime::system(), + root: WorkspaceRelativePathBuf::new(), }, )), ..Action::default() diff --git a/crates/action/src/action_node.rs b/crates/action/src/action_node.rs index daab376cb40..a7923ea2296 100644 --- a/crates/action/src/action_node.rs +++ b/crates/action/src/action_node.rs @@ -1,3 +1,4 @@ +use moon_common::path::WorkspaceRelativePathBuf; use moon_common::Id; use moon_target::Target; use moon_toolchain::Runtime; @@ -6,12 +7,15 @@ use serde::Serialize; use std::hash::{Hash, Hasher}; #[derive(Clone, Debug, Eq, PartialEq, Serialize)] -pub struct RuntimeNode { +pub struct SetupToolchainNode { pub runtime: Runtime, } -pub type InstallWorkspaceDepsNode = RuntimeNode; -pub type SetupToolchainNode = RuntimeNode; +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +pub struct InstallWorkspaceDepsNode { + pub runtime: Runtime, + pub root: WorkspaceRelativePathBuf, +} #[derive(Clone, Debug, Eq, PartialEq, Serialize)] pub struct ScopedRuntimeNode { @@ -156,7 +160,15 @@ impl ActionNode { pub fn label(&self) -> String { match self { Self::InstallWorkspaceDeps(inner) => { - format!("InstallWorkspaceDeps({})", inner.runtime.target()) + if inner.root.as_str().is_empty() { + format!("InstallWorkspaceDeps({})", inner.runtime.target()) + } else { + format!( + "InstallWorkspaceDeps({}, {})", + inner.runtime.target(), + inner.root + ) + } } Self::InstallProjectDeps(inner) => { format!( diff --git a/crates/actions/src/actions/install_deps.rs b/crates/actions/src/actions/install_deps.rs index bfef10af2f1..3d60e1671ff 100644 --- a/crates/actions/src/actions/install_deps.rs +++ b/crates/actions/src/actions/install_deps.rs @@ -3,7 +3,7 @@ use moon_action::{Action, ActionStatus, Operation}; use moon_action_context::ActionContext; use moon_app_context::AppContext; use moon_cache_item::cache_item; -use moon_common::path::encode_component; +use moon_common::path::{encode_component, WorkspaceRelativePath}; use moon_common::{color, is_ci, Id}; use moon_platform::{BoxedPlatform, PlatformManager, Runtime}; use moon_project::Project; @@ -30,6 +30,7 @@ pub async fn install_deps( workspace_graph: WorkspaceGraph, runtime: &Runtime, project: Option<&Project>, + packages_root: Option<&WorkspaceRelativePath>, ) -> miette::Result { if runtime.is_system() { return Ok(ActionStatus::Skipped); @@ -123,7 +124,13 @@ pub async fn install_deps( .as_ref() .is_some_and(|hash| hash != &state.data.last_hash) { - let working_dir = project.map_or(&app_context.workspace_root, |proj| &proj.root); + let working_dir = match project { + Some(proj) => proj.root.clone(), + None => match packages_root { + Some(pr) => pr.to_logical_path(&app_context.workspace_root), + None => app_context.workspace_root.clone(), + }, + }; // To avoid nested installs caused by child processes, we set this environment // variable with the current process ID and compare against it. If the IDs are @@ -134,12 +141,12 @@ pub async fn install_deps( debug!( "Installing {} dependencies in {}", log_label, - color::path(working_dir) + color::path(&working_dir) ); action.operations.extend( platform - .install_deps(&action_context, runtime, working_dir) + .install_deps(&action_context, runtime, &working_dir) .await?, ); diff --git a/crates/cli/tests/run_bun_test.rs b/crates/cli/tests/run_bun_test.rs index e1a808576de..04e67f7a0df 100644 --- a/crates/cli/tests/run_bun_test.rs +++ b/crates/cli/tests/run_bun_test.rs @@ -1,39 +1,37 @@ -use moon_config::PartialBunConfig; -use moon_test_utils::{ - assert_snapshot, create_sandbox, create_sandbox_with_config, get_bun_fixture_configs, - predicates::prelude::*, Sandbox, -}; -use std::fs; - -fn bun_sandbox() -> Sandbox { - bun_sandbox_with_config(|_| {}) -} - -fn bun_sandbox_with_config(callback: C) -> Sandbox -where - C: FnOnce(&mut PartialBunConfig), -{ - let (workspace_config, mut toolchain_config, tasks_config) = get_bun_fixture_configs(); - - if let Some(bun_config) = &mut toolchain_config.bun { - callback(bun_config); +// These are very flaky in CI, as they error with "Text file busy" nonstop +#[cfg(not(target_os = "linux"))] +mod bun { + use moon_config::PartialBunConfig; + use moon_test_utils::{ + assert_snapshot, create_sandbox, create_sandbox_with_config, get_bun_fixture_configs, + predicates::prelude::*, Sandbox, + }; + use std::fs; + + fn bun_sandbox() -> Sandbox { + bun_sandbox_with_config(|_| {}) } - let sandbox = create_sandbox_with_config( - "bun", - Some(workspace_config), - Some(toolchain_config), - Some(tasks_config), - ); + fn bun_sandbox_with_config(callback: C) -> Sandbox + where + C: FnOnce(&mut PartialBunConfig), + { + let (workspace_config, mut toolchain_config, tasks_config) = get_bun_fixture_configs(); - sandbox.enable_git(); - sandbox -} + if let Some(bun_config) = &mut toolchain_config.bun { + callback(bun_config); + } -// These are very flaky in CI, as they error with "Text file busy" nonstop -#[cfg(not(target_os = "linux"))] -mod bun { - use super::*; + let sandbox = create_sandbox_with_config( + "bun", + Some(workspace_config), + Some(toolchain_config), + Some(tasks_config), + ); + + sandbox.enable_git(); + sandbox + } #[test] fn runs_self() { diff --git a/crates/config/src/config_finder.rs b/crates/config/src/config_finder.rs index 8ede8d805e8..f2a517a1424 100644 --- a/crates/config/src/config_finder.rs +++ b/crates/config/src/config_finder.rs @@ -4,7 +4,9 @@ use std::fs; use std::path::{Path, PathBuf}; #[derive(Clone, Debug, Default)] -pub struct ConfigFinder; +pub struct ConfigFinder { + _ignored: bool, +} impl ConfigFinder { pub fn get_project_files(&self, project_root: &Path) -> Vec { @@ -84,6 +86,7 @@ impl ConfigFinder { vec![format!("{name}.yml"), format!("{name}.pkl")] } + #[allow(clippy::only_used_in_recursion)] pub fn get_from_dir(&self, dir: PathBuf) -> miette::Result> { let mut files = vec![]; diff --git a/justfile b/justfile index 6becd1f7254..a352a92a7d3 100644 --- a/justfile +++ b/justfile @@ -24,7 +24,7 @@ format-check: cargo fmt --all --check lint: - cargo clippy --workspace --all-targets + cargo clippy --workspace --all-targets -- -D warnings lint-fix: cargo clippy --workspace --all-targets --fix --allow-dirty --allow-staged diff --git a/legacy/bun/platform/src/bun_platform.rs b/legacy/bun/platform/src/bun_platform.rs index 37db27e467b..df2d0e60381 100644 --- a/legacy/bun/platform/src/bun_platform.rs +++ b/legacy/bun/platform/src/bun_platform.rs @@ -1,9 +1,12 @@ use crate::actions; use crate::infer_tasks_from_scripts; +use miette::IntoDiagnostic; use moon_action::Operation; use moon_action_context::ActionContext; use moon_bun_tool::{get_bun_env_paths, BunTool}; use moon_common::path::is_root_level_source; +use moon_common::path::WorkspaceRelativePath; +use moon_common::path::WorkspaceRelativePathBuf; use moon_common::Id; use moon_config::{ BunConfig, DependencyConfig, DependencyScope, DependencySource, HasherConfig, PlatformType, @@ -13,7 +16,7 @@ use moon_config::{ use moon_console::Console; use moon_hash::{ContentHasher, DepsHash}; use moon_logger::debug; -use moon_node_lang::node::get_package_manager_workspaces; +use moon_node_lang::node::{find_package_manager_workspaces_root, get_package_manager_workspaces}; use moon_node_lang::PackageJsonCache; use moon_platform::{Platform, Runtime, RuntimeReq}; use moon_process::Command; @@ -115,7 +118,26 @@ impl Platform for BunPlatform { // PROJECT GRAPH - fn is_project_in_dependency_workspace(&self, project_source: &str) -> miette::Result { + fn find_dependency_workspace_root( + &self, + starting_dir: &str, + ) -> miette::Result { + let root = + find_package_manager_workspaces_root(self.workspace_root.join(starting_dir), false)? + .unwrap_or(self.packages_root.clone()); + + if let Ok(root) = root.strip_prefix(&self.workspace_root) { + return WorkspaceRelativePathBuf::from_path(root).into_diagnostic(); + } + + Ok(WorkspaceRelativePathBuf::default()) + } + + fn is_project_in_dependency_workspace( + &self, + deps_root: &WorkspaceRelativePath, + project_source: &str, + ) -> miette::Result { let mut in_workspace = false; // Single version policy / only a root package.json @@ -128,7 +150,9 @@ impl Platform for BunPlatform { return Ok(true); } - if let Some(globs) = get_package_manager_workspaces(self.packages_root.clone())? { + if let Some(globs) = + get_package_manager_workspaces(deps_root.to_logical_path(&self.workspace_root), false)? + { in_workspace = GlobSet::new(&globs)?.matches(project_source); } diff --git a/legacy/core/platform/src/platform.rs b/legacy/core/platform/src/platform.rs index ad38181bb2a..aac37a6afa2 100644 --- a/legacy/core/platform/src/platform.rs +++ b/legacy/core/platform/src/platform.rs @@ -1,6 +1,7 @@ use async_trait::async_trait; use moon_action::Operation; use moon_action_context::ActionContext; +use moon_common::path::{WorkspaceRelativePath, WorkspaceRelativePathBuf}; use moon_common::Id; use moon_config::{ DependencyConfig, HasherConfig, PlatformType, ProjectConfig, ProjectsAliasesList, @@ -30,9 +31,20 @@ pub trait Platform: Send + Sync { // PROJECT GRAPH + fn find_dependency_workspace_root( + &self, + starting_dir: &str, + ) -> miette::Result { + Ok(WorkspaceRelativePathBuf::new()) + } + /// Determine if the provided project is within the platform's dependency manager /// workspace (not to be confused with moon's workspace). - fn is_project_in_dependency_workspace(&self, project_source: &str) -> miette::Result { + fn is_project_in_dependency_workspace( + &self, + deps_root: &WorkspaceRelativePath, + project_source: &str, + ) -> miette::Result { Ok(false) } diff --git a/legacy/node/lang/src/node.rs b/legacy/node/lang/src/node.rs index a3554715497..def66a2287d 100644 --- a/legacy/node/lang/src/node.rs +++ b/legacy/node/lang/src/node.rs @@ -22,10 +22,13 @@ pub fn extend_node_path>(value: T) -> String { #[cached(result)] pub fn get_package_manager_workspaces( packages_root: PathBuf, + check_pnpm: bool, ) -> miette::Result>> { - if let Some(pnpm_workspace) = PnpmWorkspace::read(packages_root.clone())? { - if !pnpm_workspace.packages.is_empty() { - return Ok(Some(pnpm_workspace.packages)); + if check_pnpm { + if let Some(pnpm_workspace) = PnpmWorkspace::read(packages_root.clone())? { + if !pnpm_workspace.packages.is_empty() { + return Ok(Some(pnpm_workspace.packages)); + } } } @@ -50,3 +53,31 @@ pub fn get_package_manager_workspaces( Ok(None) } + +#[cached(result)] +pub fn find_package_manager_workspaces_root( + starting_dir: PathBuf, + check_pnpm: bool, +) -> miette::Result> { + let mut current_dir = Some(starting_dir.as_path()); + + while let Some(dir) = current_dir { + if check_pnpm { + if let Some(pnpm_workspace) = PnpmWorkspace::read(dir)? { + if !pnpm_workspace.packages.is_empty() { + return Ok(Some(dir.to_path_buf())); + } + } + } + + if let Some(package_json) = PackageJsonCache::read(dir)? { + if package_json.data.workspaces.is_some() { + return Ok(Some(dir.to_path_buf())); + } + } + + current_dir = dir.parent(); + } + + Ok(None) +} diff --git a/legacy/node/platform/src/node_platform.rs b/legacy/node/platform/src/node_platform.rs index 7477bbf2525..6bb20cb7957 100644 --- a/legacy/node/platform/src/node_platform.rs +++ b/legacy/node/platform/src/node_platform.rs @@ -1,18 +1,21 @@ use crate::actions; use crate::infer_tasks_from_scripts; +use miette::IntoDiagnostic; use moon_action::Operation; use moon_action_context::ActionContext; use moon_common::path::is_root_level_source; +use moon_common::path::WorkspaceRelativePath; +use moon_common::path::WorkspaceRelativePathBuf; use moon_common::Id; use moon_config::{ - DependencyConfig, DependencyScope, DependencySource, HasherConfig, NodeConfig, PlatformType, - ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, TaskConfig, TasksConfigsMap, - TypeScriptConfig, UnresolvedVersionSpec, + DependencyConfig, DependencyScope, DependencySource, HasherConfig, NodeConfig, + NodePackageManager, PlatformType, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, + TaskConfig, TasksConfigsMap, TypeScriptConfig, UnresolvedVersionSpec, }; use moon_console::Console; use moon_hash::{ContentHasher, DepsHash}; use moon_logger::debug; -use moon_node_lang::node::get_package_manager_workspaces; +use moon_node_lang::node::{find_package_manager_workspaces_root, get_package_manager_workspaces}; use moon_node_lang::PackageJsonCache; use moon_node_tool::get_node_env_paths; use moon_node_tool::NodeTool; @@ -116,7 +119,28 @@ impl Platform for NodePlatform { // PROJECT GRAPH - fn is_project_in_dependency_workspace(&self, project_source: &str) -> miette::Result { + fn find_dependency_workspace_root( + &self, + starting_dir: &str, + ) -> miette::Result { + let root = find_package_manager_workspaces_root( + self.workspace_root.join(starting_dir), + matches!(self.config.package_manager, NodePackageManager::Pnpm), + )? + .unwrap_or(self.packages_root.clone()); + + if let Ok(root) = root.strip_prefix(&self.workspace_root) { + return WorkspaceRelativePathBuf::from_path(root).into_diagnostic(); + } + + Ok(WorkspaceRelativePathBuf::default()) + } + + fn is_project_in_dependency_workspace( + &self, + deps_root: &WorkspaceRelativePath, + project_source: &str, + ) -> miette::Result { let mut in_workspace = false; // Single version policy / only a root package.json @@ -129,7 +153,10 @@ impl Platform for NodePlatform { return Ok(true); } - if let Some(globs) = get_package_manager_workspaces(self.packages_root.clone())? { + if let Some(globs) = get_package_manager_workspaces( + deps_root.to_logical_path(&self.workspace_root), + matches!(self.config.package_manager, NodePackageManager::Pnpm), + )? { in_workspace = GlobSet::new(&globs)?.matches(project_source); } diff --git a/legacy/python/platform/src/python_platform.rs b/legacy/python/platform/src/python_platform.rs index 9e28021c156..5a36ab036c1 100644 --- a/legacy/python/platform/src/python_platform.rs +++ b/legacy/python/platform/src/python_platform.rs @@ -1,7 +1,10 @@ use crate::{actions, toolchain_hash::PythonToolchainHash}; use moon_action::Operation; use moon_action_context::ActionContext; -use moon_common::{path::is_root_level_source, Id}; +use moon_common::{ + path::{is_root_level_source, WorkspaceRelativePath}, + Id, +}; use moon_config::{ HasherConfig, PlatformType, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, PythonConfig, UnresolvedVersionSpec, @@ -93,7 +96,11 @@ impl Platform for PythonPlatform { // PROJECT GRAPH - fn is_project_in_dependency_workspace(&self, project_source: &str) -> miette::Result { + fn is_project_in_dependency_workspace( + &self, + _deps_root: &WorkspaceRelativePath, + project_source: &str, + ) -> miette::Result { // Single version policy / only a root requirements.txt if self.config.root_requirements_only { return Ok(true); diff --git a/legacy/rust/platform/src/rust_platform.rs b/legacy/rust/platform/src/rust_platform.rs index 450beceaca6..09a57a82836 100644 --- a/legacy/rust/platform/src/rust_platform.rs +++ b/legacy/rust/platform/src/rust_platform.rs @@ -1,9 +1,14 @@ use crate::{ find_cargo_lock, get_cargo_home, target_hash::RustTargetHash, toolchain_hash::RustToolchainHash, }; +use miette::IntoDiagnostic; use moon_action::Operation; use moon_action_context::ActionContext; -use moon_common::{is_ci, path::exe_name, Id}; +use moon_common::{ + is_ci, + path::{exe_name, is_root_level_source, WorkspaceRelativePath, WorkspaceRelativePathBuf}, + Id, +}; use moon_config::{ BinEntry, HasherConfig, PlatformType, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, RustConfig, UnresolvedVersionSpec, @@ -117,18 +122,45 @@ impl Platform for RustPlatform { // PROJECT GRAPH - fn is_project_in_dependency_workspace(&self, project_source: &str) -> miette::Result { - let Some(lockfile_path) = find_cargo_lock( - &self.workspace_root.join(project_source), + fn find_dependency_workspace_root( + &self, + starting_dir: &str, + ) -> miette::Result { + let root = find_cargo_lock( + &self.workspace_root.join(starting_dir), &self.workspace_root, - ) else { - return Ok(false); - }; + ) + .map(|lockfile| lockfile.parent().unwrap().to_path_buf()) + .unwrap_or(self.workspace_root.clone()); + + if let Some(cargo_toml) = CargoTomlCache::read(root.clone())? { + if cargo_toml.workspace.is_some() { + if let Ok(root) = root.strip_prefix(&self.workspace_root) { + return WorkspaceRelativePathBuf::from_path(root).into_diagnostic(); + } + } + } - let Some(cargo_toml) = CargoTomlCache::read(lockfile_path.parent().unwrap())? else { + Ok(WorkspaceRelativePathBuf::default()) + } + + fn is_project_in_dependency_workspace( + &self, + deps_root: &WorkspaceRelativePath, + project_source: &str, + ) -> miette::Result { + let deps_root_path = deps_root.to_logical_path(&self.workspace_root); + + let Some(cargo_toml) = CargoTomlCache::read(&deps_root_path)? else { return Ok(false); }; + if is_root_level_source(project_source) && deps_root_path == self.workspace_root + || deps_root.as_str() == project_source + { + return Ok(true); + } + if let Some(workspace) = cargo_toml.workspace { return Ok( GlobSet::new_split(&workspace.members, &workspace.exclude)?.matches(project_source) diff --git a/packages/types/src/pipeline.ts b/packages/types/src/pipeline.ts index a728a3201ac..9bc9cca7ac9 100644 --- a/packages/types/src/pipeline.ts +++ b/packages/types/src/pipeline.ts @@ -147,6 +147,7 @@ export interface ActionNodeInstallWorkspaceDeps { action: 'install-workspace-deps'; params: { runtime: Runtime; + root: string; }; } From ee888a6be0c9d57d6819c4f3d6c2bbdbb9423a66 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Wed, 29 Jan 2025 19:13:39 -0800 Subject: [PATCH 11/15] new: Improve existing toolchains. (#1807) * Add implicit relations. * Move checkpoint prints. * Add bun.lock parsing. * Update logic. * Rework deno. * Polish. * Fixes. * Add debug. * Set env var. * Fix. --- .github/workflows/moon.yml | 2 - .github/workflows/rust.yml | 6 +- .prototools | 4 +- CHANGELOG.md | 10 ++ Cargo.lock | 120 +++++++++++++++++- Cargo.toml | 2 +- crates/cli/tests/run_bun_test.rs | 75 ++++++----- crates/cli/tests/run_deno_test.rs | 6 +- ..._test__bun__handles_unhandled_promise.snap | 5 +- .../run_bun_test__bun__runs_script_task.snap | 2 +- .../run_bun_test__bun__runs_self.snap | 2 +- crates/config/src/toolchain/deno_config.rs | 3 + crates/toolchain/src/detect/languages.rs | 2 +- legacy/bun/lang/Cargo.toml | 3 + legacy/bun/lang/src/bun_lock.rs | 50 ++++++++ legacy/bun/lang/src/bun_lockb.rs | 4 +- legacy/bun/lang/src/lib.rs | 18 +++ legacy/bun/platform/src/bun_platform.rs | 15 ++- legacy/bun/tool/src/bun_tool.rs | 42 ++++-- legacy/core/test-utils/src/configs.rs | 4 +- legacy/deno/lang/Cargo.toml | 1 + legacy/deno/lang/src/deno_json.rs | 26 +++- legacy/deno/lang/src/deno_lock.rs | 38 +++--- legacy/deno/lang/src/lib.rs | 22 ++++ legacy/deno/platform/Cargo.toml | 1 + legacy/deno/platform/src/deno_platform.rs | 97 ++++++++++++-- legacy/deno/tool/src/deno_tool.rs | 25 ++-- legacy/node/platform/src/node_platform.rs | 12 +- legacy/node/tool/src/bun_tool.rs | 14 +- .../platform/src/actions/install_deps.rs | 12 +- legacy/rust/platform/src/rust_platform.rs | 113 +++++++++++++---- packages/types/src/toolchain-config.ts | 4 + tests/fixtures/bun/version-override/moon.yml | 2 +- website/docs/proto/toml-plugin.mdx | 8 -- website/docs/setup-toolchain.mdx | 2 +- website/static/schemas/toolchain.json | 9 ++ 36 files changed, 598 insertions(+), 163 deletions(-) create mode 100644 legacy/bun/lang/src/bun_lock.rs delete mode 100644 website/docs/proto/toml-plugin.mdx diff --git a/.github/workflows/moon.yml b/.github/workflows/moon.yml index 2851a81003d..ce50475a004 100644 --- a/.github/workflows/moon.yml +++ b/.github/workflows/moon.yml @@ -39,8 +39,6 @@ jobs: env: DEPOT_TOKEN: ${{ secrets.DEPOT_TOKEN }} MOON_NODE_VERSION: ${{ matrix.node-version }} - MOONBASE_SECRET_KEY: ${{ secrets.MOONBASE_SECRET_KEY }} - MOONBASE_ACCESS_KEY: ${{ secrets.MOONBASE_ACCESS_KEY }} RUST_BACKTRACE: '1' - uses: moonrepo/run-report-action@v1 if: success() || failure() diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 9e44cca86d0..b2b49ca2460 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -79,7 +79,6 @@ jobs: # SCCACHE_NO_DAEMON: 1 SCCACHE_REGION: us-east-2 SCCACHE_S3_SERVER_SIDE_ENCRYPTION: true - AWS_LC_SYS_PREBUILT_NASM: 1 steps: - uses: actions/checkout@v4 - uses: moonrepo/setup-rust@v1 @@ -92,7 +91,10 @@ jobs: auto-install: true cache: ${{ runner.os == 'Linux' }} proto-version: '0.45.1' # Keep in sync - - uses: mozilla-actions/sccache-action@v0.0.5 + # Fixes issues where proto can't find a version because nothing is pinned globally + - run: cp .prototools ~/.proto/.prototools + if: ${{ runner.os == 'Linux' }} + - uses: mozilla-actions/sccache-action@v0.0.7 if: ${{ vars.ENABLE_SCCACHE == 'true' }} - uses: lukka/get-cmake@latest if: ${{ runner.os == 'Windows' }} diff --git a/.prototools b/.prototools index 5ec826a2d8f..5eca81bb9c3 100644 --- a/.prototools +++ b/.prototools @@ -1,7 +1,7 @@ # These are used by tests that require the tools # to exist in the environment! -# bun = "1.0.15" -deno = "1.40.0" +bun = "1.2.1" +deno = "2.1.7" node = "20.8.0" npm = "10.1.0" pkl = "0.27.2" diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b13413e713..146c0a4ccc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,8 +20,18 @@ - Added timeout and concurrency limit to clients. - Added a `MOON_DEBUG_REMOTE` environment variable, which can be used to debug internal errors for diagnosing connection/integration issues. +- Improved the Bun toolchain. + - Added support for the new v1.2 `bun.lock` file. We do our best to detect this, but we suggest + configuring `--save-text-lockfile`. +- Improved the Deno toolchain. + - Added support for Deno v2 and `deno install`. Will now run this command instead of `deno cache`. + - Added support for v3 and v4 lockfiles (we now use the `deno_lockfile` crate). + - Added basic support for workspaces. + - Added `deno.installArgs` setting. - Improved the Rust toolchain. - The root-level project is now properly taken into account when detecting the package workspaces. + - Project dependencies (`dependsOn`) are now automatically inferred from `Cargo.toml` + dependencies. #### 🐞 Fixes diff --git a/Cargo.lock b/Cargo.lock index f498595e910..6fda2f62594 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -834,6 +834,28 @@ dependencies = [ "winx", ] +[[package]] +name = "capacity_builder" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f2d24a6dcf0cd402a21b65d35340f3a49ff3475dc5fdac91d22d2733e6641c6" +dependencies = [ + "capacity_builder_macros", + "ecow", + "hipstr", + "itoa", +] + +[[package]] +name = "capacity_builder_macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b4a6cae9efc04cc6cbb8faf338d2c497c165c83e74509cf4dbedea948bbf6e5" +dependencies = [ + "quote", + "syn 2.0.96", +] + [[package]] name = "cargo-lock" version = "10.0.1" @@ -1025,9 +1047,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.43" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952013545c9c6dca60f491602655b795c6c062ab180c9cb0bccb83135461861" +checksum = "375f9d8255adeeedd51053574fd8d4ba875ea5fa558e86617b07f09f1680c8b6" dependencies = [ "clap", ] @@ -1453,6 +1475,56 @@ dependencies = [ "version_check 0.1.5", ] +[[package]] +name = "deno_error" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fae9fe305307b5ef3ee4e8244c79cffcca421ab0ce8634dea0c6b1342f220f" +dependencies = [ + "deno_error_macro", + "libc", +] + +[[package]] +name = "deno_error_macro" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abb2556e91848b66f562451fcbcdee2a3b7c88281828908dcf7cca355f5d997" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "deno_lockfile" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "632e835a53ed667d62fdd766c5780fe8361c831d3e3fbf1a760a0b7896657587" +dependencies = [ + "deno_semver", + "serde", + "serde_json", + "thiserror 2.0.11", +] + +[[package]] +name = "deno_semver" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4775271f9b5602482698f76d24ea9ed8ba27af7f587a7e9a876916300c542435" +dependencies = [ + "capacity_builder", + "deno_error", + "ecow", + "hipstr", + "monch", + "once_cell", + "serde", + "thiserror 2.0.11", + "url", +] + [[package]] name = "deranged" version = "0.3.11" @@ -1646,6 +1718,15 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acf65d056c7da9c971c2847ce250fd1f0f9659d5718845c3ec0ad95f5668352c" +[[package]] +name = "ecow" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42fc0a93992b20c58b99e59d61eaf1635a25bfbe49e4275c34ba0aee98119ba" +dependencies = [ + "serde", +] + [[package]] name = "either" version = "1.13.0" @@ -2282,6 +2363,17 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hipstr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97971ffc85d4c98de12e2608e992a43f5294ebb625fdb045b27c731b64c4c6d6" +dependencies = [ + "serde", + "serde_bytes", + "sptr", +] + [[package]] name = "home" version = "0.5.11" @@ -2938,9 +3030,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "ittapi" @@ -3377,6 +3469,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "monch" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b52c1b33ff98142aecea13138bd399b68aa7ab5d9546c300988c345004001eea" + [[package]] name = "moon_action" version = "0.0.1" @@ -3652,7 +3750,10 @@ dependencies = [ "cached", "miette 7.4.0", "moon_lang", + "nodejs_package_json", "rustc-hash 2.1.0", + "serde", + "starbase_utils", "tracing", "yarn-lock-parser", ] @@ -3894,6 +3995,7 @@ name = "moon_deno_lang" version = "0.0.1" dependencies = [ "cached", + "deno_lockfile", "miette 7.4.0", "moon_lang", "moon_logger", @@ -3928,6 +4030,7 @@ dependencies = [ "proto_core", "rustc-hash 2.1.0", "serde", + "starbase_utils", ] [[package]] @@ -6388,6 +6491,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.217" diff --git a/Cargo.toml b/Cargo.toml index 5df5f29320c..c143c627053 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ clap = { version = "4.5.27", default-features = false, features = [ "std", "error-context", ] } -clap_complete = "4.5.43" +clap_complete = "4.5.44" compact_str = { version = "0.8.1", default-features = false, features = [ "serde", ] } diff --git a/crates/cli/tests/run_bun_test.rs b/crates/cli/tests/run_bun_test.rs index 04e67f7a0df..75d944badc3 100644 --- a/crates/cli/tests/run_bun_test.rs +++ b/crates/cli/tests/run_bun_test.rs @@ -1,37 +1,37 @@ -// These are very flaky in CI, as they error with "Text file busy" nonstop -#[cfg(not(target_os = "linux"))] -mod bun { - use moon_config::PartialBunConfig; - use moon_test_utils::{ - assert_snapshot, create_sandbox, create_sandbox_with_config, get_bun_fixture_configs, - predicates::prelude::*, Sandbox, - }; - use std::fs; - - fn bun_sandbox() -> Sandbox { - bun_sandbox_with_config(|_| {}) - } +use moon_config::PartialBunConfig; +use moon_test_utils::{ + assert_snapshot, create_sandbox, create_sandbox_with_config, get_bun_fixture_configs, + predicates::prelude::*, Sandbox, +}; +use std::fs; + +fn bun_sandbox() -> Sandbox { + bun_sandbox_with_config(|_| {}) +} - fn bun_sandbox_with_config(callback: C) -> Sandbox - where - C: FnOnce(&mut PartialBunConfig), - { - let (workspace_config, mut toolchain_config, tasks_config) = get_bun_fixture_configs(); +fn bun_sandbox_with_config(callback: C) -> Sandbox +where + C: FnOnce(&mut PartialBunConfig), +{ + let (workspace_config, mut toolchain_config, tasks_config) = get_bun_fixture_configs(); - if let Some(bun_config) = &mut toolchain_config.bun { - callback(bun_config); - } + if let Some(bun_config) = &mut toolchain_config.bun { + callback(bun_config); + } - let sandbox = create_sandbox_with_config( - "bun", - Some(workspace_config), - Some(toolchain_config), - Some(tasks_config), - ); + let sandbox = create_sandbox_with_config( + "bun", + Some(workspace_config), + Some(toolchain_config), + Some(tasks_config), + ); - sandbox.enable_git(); - sandbox - } + sandbox.enable_git(); + sandbox +} + +mod bun { + use super::*; #[test] fn runs_self() { @@ -162,11 +162,10 @@ mod bun { cmd.arg("run").arg("bun:unhandledPromise"); }); - if cfg!(windows) { - assert.code(1); - } else { - assert_snapshot!(assert.output()); - } + let output = assert.output(); + + // Output contains os/arch stuff that we cant snapshot + assert!(predicate::str::contains("error: Oops").eval(&output)); } #[test] @@ -345,8 +344,6 @@ mod bun { } } - // Need multiple windows versions for this to work - #[cfg(not(windows))] mod workspace_overrides { use super::*; @@ -362,8 +359,8 @@ mod bun { let output = assert.output(); - assert!(predicate::str::contains("1.1.3").eval(&output)); - assert!(predicate::str::contains("0.8.0").eval(&output)); + assert!(predicate::str::contains("1.2.1").eval(&output)); + assert!(predicate::str::contains("1.1.0").eval(&output)); assert.success(); } diff --git a/crates/cli/tests/run_deno_test.rs b/crates/cli/tests/run_deno_test.rs index e633b7b9d85..6c0d90e192b 100644 --- a/crates/cli/tests/run_deno_test.rs +++ b/crates/cli/tests/run_deno_test.rs @@ -44,7 +44,7 @@ mod deno { let output = assert.output(); // Output contains arch info - assert!(predicate::str::contains("deno 1.40.0").eval(&output)); + assert!(predicate::str::contains("deno 2.1.7").eval(&output)); } #[test] @@ -230,7 +230,7 @@ mod deno { // Output includes the arch, so can't be snapshotted assert!(predicate::str::contains("deno platform").eval(&output)); - assert!(predicate::str::contains("deno 1.40.0").eval(&output)); + assert!(predicate::str::contains("deno 2.1.7").eval(&output)); } mod workspace_overrides { @@ -248,7 +248,7 @@ mod deno { let output = assert.output(); - assert!(predicate::str::contains("1.40.0").eval(&output)); + assert!(predicate::str::contains("2.1.7").eval(&output)); assert!(predicate::str::contains("1.30.0").eval(&output)); assert.success(); diff --git a/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap b/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap index 5e345ab6659..cbfc89fe2fa 100644 --- a/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap +++ b/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap @@ -1,5 +1,5 @@ --- -source: legacy/cli/tests/run_bun_test.rs +source: crates/cli/tests/run_bun_test.rs expression: assert.output() --- ▪▪▪▪ bun install @@ -8,6 +8,9 @@ stdout ▪▪▪▪ bun:unhandledPromise (100ms) stderr error: Oops +Oops + +Bun v1.2.1 (macOS arm64) Error: task_runner::run_failed × Task bun:unhandledPromise failed to run. diff --git a/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap b/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap index 6a2396be21a..84140322dcb 100644 --- a/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap +++ b/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap @@ -4,7 +4,7 @@ expression: assert.output() --- ▪▪▪▪ bun:viaScript bun platform -1.1.3 +1.2.1 ▪▪▪▪ bun:viaScript (100ms) Tasks: 1 completed diff --git a/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap b/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap index 0c0c6483b6e..daabdca75ba 100644 --- a/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap +++ b/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap @@ -4,7 +4,7 @@ expression: assert.output() --- ▪▪▪▪ bun install ▪▪▪▪ bun:version -1.1.3 +1.2.1 ▪▪▪▪ bun:version (100ms) Tasks: 1 completed diff --git a/crates/config/src/toolchain/deno_config.rs b/crates/config/src/toolchain/deno_config.rs index af5f47b38a1..1173207853f 100644 --- a/crates/config/src/toolchain/deno_config.rs +++ b/crates/config/src/toolchain/deno_config.rs @@ -15,6 +15,9 @@ pub struct DenoConfig { #[setting(default = "deps.ts")] pub deps_file: String, + /// List of arguments to append to `deno install` commands. + pub install_args: Vec, + /// Requires and forces the use of `deno.lock` files. pub lockfile: bool, diff --git a/crates/toolchain/src/detect/languages.rs b/crates/toolchain/src/detect/languages.rs index a31cab8df70..009b3aa039c 100644 --- a/crates/toolchain/src/detect/languages.rs +++ b/crates/toolchain/src/detect/languages.rs @@ -1,7 +1,7 @@ pub type StaticString = &'static str; pub type StaticStringList = &'static [StaticString]; -pub static BUN: StaticStringList = &["bunfig.toml", "bun.lockb", ".bunrc"]; +pub static BUN: StaticStringList = &["bunfig.toml", "bun.lock", "bun.lockb", ".bunrc"]; pub static DENO: StaticStringList = &["deno.json", "deno.jsonc", "deno.lock", ".dvmrc"]; diff --git a/legacy/bun/lang/Cargo.toml b/legacy/bun/lang/Cargo.toml index 10cc6e8cc3e..f2153b85f31 100644 --- a/legacy/bun/lang/Cargo.toml +++ b/legacy/bun/lang/Cargo.toml @@ -8,7 +8,10 @@ publish = false moon_lang = { path = "../../core/lang" } cached = { workspace = true } miette = { workspace = true } +nodejs_package_json = "0.3.1" rustc-hash = { workspace = true } +serde = { workspace = true } +starbase_utils = { workspace = true, features = ["json"] } tracing = { workspace = true } yarn-lock-parser = "0.10.0" diff --git a/legacy/bun/lang/src/bun_lock.rs b/legacy/bun/lang/src/bun_lock.rs new file mode 100644 index 00000000000..7c41d403db8 --- /dev/null +++ b/legacy/bun/lang/src/bun_lock.rs @@ -0,0 +1,50 @@ +use moon_lang::LockfileDependencyVersions; +use nodejs_package_json::{DependenciesMap, PackageJson}; +use rustc_hash::FxHashMap; +use serde::Deserialize; +use starbase_utils::json; +use std::sync::Arc; + +#[derive(Debug, Deserialize, Default)] +#[serde(default, rename_all = "camelCase")] +pub struct BunLockPackageDependencies { + pub dependencies: DependenciesMap, + pub dev_dependencies: DependenciesMap, + pub peer_dependencies: DependenciesMap, + pub optional_dependencies: DependenciesMap, +} + +#[derive(Debug, Deserialize, Default)] +#[serde(default)] +pub struct BunLockPackage( + String, // identifier + String, // ??? + BunLockPackageDependencies, // dependencies + String, // sha +); + +#[derive(Debug, Deserialize, Default)] +#[serde(default, rename_all = "camelCase")] +pub struct BunLock { + pub lockfile_version: u32, + pub packages: FxHashMap, + pub workspaces: Option>, +} + +pub fn load_text_lockfile_dependencies( + lockfile_text: Arc, +) -> miette::Result { + let mut deps: LockfileDependencyVersions = FxHashMap::default(); + let lockfile: BunLock = json::parse(lockfile_text.as_str())?; + + for (name, package) in lockfile.packages { + let version = package.0.replace("{name}@", ""); + let integrity = package.3; + + let dep = deps.entry(name).or_default(); + dep.push(version); + dep.push(integrity); + } + + Ok(deps) +} diff --git a/legacy/bun/lang/src/bun_lockb.rs b/legacy/bun/lang/src/bun_lockb.rs index 2ad36777b59..cd0ef38ee02 100644 --- a/legacy/bun/lang/src/bun_lockb.rs +++ b/legacy/bun/lang/src/bun_lockb.rs @@ -1,4 +1,3 @@ -use cached::proc_macro::cached; use moon_lang::LockfileDependencyVersions; use rustc_hash::FxHashMap; use std::path::PathBuf; @@ -6,8 +5,7 @@ use std::sync::Arc; use tracing::warn; use yarn_lock_parser::parse_str; -#[cached(result)] -pub fn load_lockfile_dependencies( +pub fn load_binary_lockfile_dependencies( lockfile_text: Arc, path: PathBuf, ) -> miette::Result { diff --git a/legacy/bun/lang/src/lib.rs b/legacy/bun/lang/src/lib.rs index 0dd9e04fcca..8ec3b54d120 100644 --- a/legacy/bun/lang/src/lib.rs +++ b/legacy/bun/lang/src/lib.rs @@ -1,4 +1,22 @@ +mod bun_lock; mod bun_lockb; +pub use bun_lock::*; pub use bun_lockb::*; pub use moon_lang::LockfileDependencyVersions; + +use cached::proc_macro::cached; +use std::path::PathBuf; +use std::sync::Arc; + +#[cached(result)] +pub fn load_lockfile_dependencies( + lockfile_text: Arc, + path: PathBuf, +) -> miette::Result { + if path.ends_with("bun.lock") { + load_text_lockfile_dependencies(lockfile_text) + } else { + load_binary_lockfile_dependencies(lockfile_text, path) + } +} diff --git a/legacy/bun/platform/src/bun_platform.rs b/legacy/bun/platform/src/bun_platform.rs index df2d0e60381..be8bd1c7f38 100644 --- a/legacy/bun/platform/src/bun_platform.rs +++ b/legacy/bun/platform/src/bun_platform.rs @@ -22,7 +22,9 @@ use moon_platform::{Platform, Runtime, RuntimeReq}; use moon_process::Command; use moon_project::Project; use moon_task::Task; -use moon_tool::{get_proto_version_env, prepend_path_env_var, Tool, ToolManager}; +use moon_tool::{ + get_proto_version_env, prepend_path_env_var, DependencyManager, Tool, ToolManager, +}; use moon_typescript_platform::TypeScriptTargetHash; use moon_utils::{async_trait, path}; use proto_core::ProtoEnvironment; @@ -287,7 +289,16 @@ impl Platform for BunPlatform { } fn get_dependency_configs(&self) -> miette::Result> { - Ok(Some(("bun.lockb".to_owned(), "package.json".to_owned()))) + let tool = self.toolchain.get()?; + + Ok(Some(( + if self.packages_root.join("bun.lock").exists() { + "bun.lock".into() + } else { + tool.get_lock_filename() + }, + tool.get_manifest_filename(), + ))) } async fn setup_toolchain(&mut self) -> miette::Result<()> { diff --git a/legacy/bun/tool/src/bun_tool.rs b/legacy/bun/tool/src/bun_tool.rs index 9bdfec743e9..4cef5f8d939 100644 --- a/legacy/bun/tool/src/bun_tool.rs +++ b/legacy/bun/tool/src/bun_tool.rs @@ -81,9 +81,12 @@ impl BunTool { let cache = match self.lockfile_cache.entry_async(key).await { Entry::Occupied(o) => o.get().clone(), Entry::Vacant(v) => { + let bun_lock = cwd.join("bun.lock"); let yarn_lock = cwd.join("yarn.lock"); - let content = if yarn_lock.exists() { + let content = if bun_lock.exists() { + Arc::new(fs::read_file(bun_lock)?) + } else if yarn_lock.exists() { Arc::new(fs::read_file(yarn_lock)?) } else { let mut cmd = self.create_command(&())?; @@ -195,6 +198,7 @@ impl DependencyManager<()> for BunTool { if let Some(version) = get_proto_version_env(&self.tool) { cmd.env("PROTO_BUN_VERSION", version); + cmd.env("PROTO_NODE_VERSION", "*"); } Ok(cmd) @@ -212,7 +216,18 @@ impl DependencyManager<()> for BunTool { } fn get_lock_filename(&self) -> String { - String::from("bun.lockb") + String::from( + if self + .config + .install_args + .iter() + .any(|arg| arg == "--save-text-lockfile") + { + "bun.lock" + } else { + "bun.lockb" + }, + ) } fn get_manifest_filename(&self) -> String { @@ -224,16 +239,21 @@ impl DependencyManager<()> for BunTool { &self, project_root: &Path, ) -> miette::Result { - let Some(lockfile_path) = - fs::find_upwards_until("bun.lockb", project_root, get_workspace_root()) - else { - return Ok(FxHashMap::default()); - }; + let mut lockfile_path = + fs::find_upwards_until("bun.lockb", project_root, get_workspace_root()); + + if lockfile_path.is_none() { + lockfile_path = fs::find_upwards_until("bun.lock", project_root, get_workspace_root()); + } + + if let Some(lockfile_path) = lockfile_path { + return load_lockfile_dependencies( + self.load_lockfile(lockfile_path.parent().unwrap()).await?, + lockfile_path, + ); + } - Ok(load_lockfile_dependencies( - self.load_lockfile(lockfile_path.parent().unwrap()).await?, - lockfile_path, - )?) + Ok(FxHashMap::default()) } #[instrument(skip_all)] diff --git a/legacy/core/test-utils/src/configs.rs b/legacy/core/test-utils/src/configs.rs index e06d71aa219..5336ea0bf74 100644 --- a/legacy/core/test-utils/src/configs.rs +++ b/legacy/core/test-utils/src/configs.rs @@ -348,7 +348,7 @@ pub fn get_bun_fixture_configs() -> ( toolchain_config.node = None; toolchain_config.bun = Some(PartialBunConfig { infer_tasks_from_scripts: Some(true), - version: Some(UnresolvedVersionSpec::parse("1.1.3").unwrap()), + version: Some(UnresolvedVersionSpec::parse("1.2.1").unwrap()), ..PartialBunConfig::default() }); @@ -395,7 +395,7 @@ pub fn get_deno_fixture_configs() -> ( let mut toolchain_config = get_default_toolchain(); toolchain_config.node = None; toolchain_config.deno = Some(PartialDenoConfig { - version: Some(UnresolvedVersionSpec::parse("1.40.0").unwrap()), + version: Some(UnresolvedVersionSpec::parse("2.1.7").unwrap()), ..PartialDenoConfig::default() }); diff --git a/legacy/deno/lang/Cargo.toml b/legacy/deno/lang/Cargo.toml index f3dc6981937..e2c786621e6 100644 --- a/legacy/deno/lang/Cargo.toml +++ b/legacy/deno/lang/Cargo.toml @@ -9,6 +9,7 @@ moon_lang = { path = "../../core/lang" } moon_logger = { path = "../../core/logger" } moon_typescript_lang = { path = "../../typescript/lang" } cached = { workspace = true } +deno_lockfile = "0.24.0" miette = { workspace = true } rustc-hash = { workspace = true } serde = { workspace = true } diff --git a/legacy/deno/lang/src/deno_json.rs b/legacy/deno/lang/src/deno_json.rs index 7bfb37f2a35..5a88d1cef76 100644 --- a/legacy/deno/lang/src/deno_json.rs +++ b/legacy/deno/lang/src/deno_json.rs @@ -11,8 +11,9 @@ use std::path::{Path, PathBuf}; config_cache!(DenoJson, "deno.json", read_json, write_preserved_json); // This isn't everything, just what we care about +// https://deno.land/x/deno/cli/schemas/config-file.v1.json #[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] -#[serde(rename_all = "camelCase")] +#[serde(default, rename_all = "camelCase")] pub struct DenoJson { #[serde(skip_serializing_if = "Option::is_none")] pub compiler_options: Option, @@ -30,7 +31,7 @@ pub struct DenoJson { pub scopes: Option>>, #[serde(skip_serializing_if = "Option::is_none")] - pub tasks: Option>, + pub workspace: Option, // Non-standard #[serde(skip)] @@ -40,11 +41,32 @@ pub struct DenoJson { pub path: PathBuf, } +#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(untagged)] +pub enum DenoJsonWorkspace { + Members(Vec), + Config { members: Vec }, +} + +impl DenoJsonWorkspace { + pub fn get_members(&self) -> &[String] { + match self { + Self::Members(members) => members, + Self::Config { members } => members, + } + } +} + #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] #[serde(untagged)] pub enum DenoJsonLock { Enabled(bool), Path(String), + Config { + path: String, + #[serde(default)] + frozen: bool, + }, } impl DenoJson { diff --git a/legacy/deno/lang/src/deno_lock.rs b/legacy/deno/lang/src/deno_lock.rs index 3650a65772f..e41bdfda7cc 100644 --- a/legacy/deno/lang/src/deno_lock.rs +++ b/legacy/deno/lang/src/deno_lock.rs @@ -1,28 +1,30 @@ use cached::proc_macro::cached; -use moon_lang::{config_cache, LockfileDependencyVersions}; +use deno_lockfile::{Lockfile, NewLockfileOptions}; +use miette::IntoDiagnostic; +use moon_lang::LockfileDependencyVersions; use rustc_hash::FxHashMap; -use serde::{Deserialize, Serialize}; -use starbase_utils::json::read_file as read_json; -use std::path::{Path, PathBuf}; - -config_cache!(DenoLock, "deno.lock", read_json); - -#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DenoLock { - remote: FxHashMap, - - #[serde(skip)] - pub path: PathBuf, -} +use starbase_utils::fs; +use std::path::PathBuf; #[cached(result)] pub fn load_lockfile_dependencies(path: PathBuf) -> miette::Result { let mut deps: LockfileDependencyVersions = FxHashMap::default(); - if let Some(lockfile) = DenoLock::read(path)? { - for (key, value) in lockfile.remote { - deps.insert(key, vec![value]); + if path.exists() { + let lockfile_content = fs::read_file(&path)?; + let lockfile = Lockfile::new(NewLockfileOptions { + content: &lockfile_content, + file_path: path.clone(), + overwrite: false, + }) + .into_diagnostic()?; + + for (key, value) in lockfile.content.packages.jsr { + deps.insert(format!("jsr:{key}"), vec![value.integrity]); + } + + for (key, value) in lockfile.content.packages.npm { + deps.insert(format!("npm:{key}"), vec![value.integrity]); } } diff --git a/legacy/deno/lang/src/lib.rs b/legacy/deno/lang/src/lib.rs index 6490544e6f1..81612eee5f8 100644 --- a/legacy/deno/lang/src/lib.rs +++ b/legacy/deno/lang/src/lib.rs @@ -4,3 +4,25 @@ mod deno_lock; pub use deno_json::*; pub use deno_lock::*; pub use moon_lang::LockfileDependencyVersions; + +use cached::proc_macro::cached; +use std::path::PathBuf; + +#[cached(result)] +pub fn find_package_manager_workspaces_root( + starting_dir: PathBuf, +) -> miette::Result> { + let mut current_dir = Some(starting_dir.as_path()); + + while let Some(dir) = current_dir { + if let Some(deno_json) = DenoJson::read(dir)? { + if deno_json.workspace.is_some() { + return Ok(Some(dir.to_path_buf())); + } + } + + current_dir = dir.parent(); + } + + Ok(None) +} diff --git a/legacy/deno/platform/Cargo.toml b/legacy/deno/platform/Cargo.toml index 3330c7eba4b..2c004298f3e 100644 --- a/legacy/deno/platform/Cargo.toml +++ b/legacy/deno/platform/Cargo.toml @@ -25,6 +25,7 @@ miette = { workspace = true } proto_core = { workspace = true } rustc-hash = { workspace = true } serde = { workspace = true } +starbase_utils = { workspace = true, features = ["glob"] } [lints] workspace = true diff --git a/legacy/deno/platform/src/deno_platform.rs b/legacy/deno/platform/src/deno_platform.rs index 2c98601de3d..244452141c5 100644 --- a/legacy/deno/platform/src/deno_platform.rs +++ b/legacy/deno/platform/src/deno_platform.rs @@ -4,13 +4,14 @@ use crate::target_hash::DenoTargetHash; use miette::IntoDiagnostic; use moon_action::Operation; use moon_action_context::ActionContext; +use moon_common::path::{is_root_level_source, WorkspaceRelativePath, WorkspaceRelativePathBuf}; use moon_common::{color, is_ci, is_test_env, Id}; use moon_config::{ BinEntry, DenoConfig, DependencyConfig, HasherConfig, HasherOptimization, PlatformType, ProjectConfig, TypeScriptConfig, }; use moon_console::{Checkpoint, Console}; -use moon_deno_lang::{load_lockfile_dependencies, DenoJson}; +use moon_deno_lang::{find_package_manager_workspaces_root, load_lockfile_dependencies, DenoJson}; use moon_deno_tool::{get_deno_env_paths, DenoTool}; use moon_hash::ContentHasher; use moon_logger::{debug, map_list}; @@ -25,6 +26,7 @@ use moon_typescript_platform::TypeScriptTargetHash; use moon_utils::async_trait; use proto_core::{ProtoEnvironment, UnresolvedVersionSpec}; use rustc_hash::FxHashMap; +use starbase_utils::glob::GlobSet; use std::sync::Arc; use std::{ collections::BTreeMap, @@ -105,6 +107,49 @@ impl Platform for DenoPlatform { // PROJECT GRAPH + fn find_dependency_workspace_root( + &self, + starting_dir: &str, + ) -> miette::Result { + let root = find_package_manager_workspaces_root(self.workspace_root.join(starting_dir))? + .unwrap_or(self.workspace_root.clone()); + + if let Ok(root) = root.strip_prefix(&self.workspace_root) { + return WorkspaceRelativePathBuf::from_path(root).into_diagnostic(); + } + + Ok(WorkspaceRelativePathBuf::default()) + } + + fn is_project_in_dependency_workspace( + &self, + deps_root: &WorkspaceRelativePath, + project_source: &str, + ) -> miette::Result { + let deps_root_path = deps_root.to_logical_path(&self.workspace_root); + + // Root package is always considered within the workspace + if is_root_level_source(project_source) && deps_root_path == self.workspace_root { + return Ok(true); + } + + let Some(deno_json) = DenoJson::read(&deps_root_path)? else { + return Ok(false); + }; + + if let Some(workspace) = deno_json.workspace { + let members = workspace + .get_members() + .iter() + .map(|mem| mem.trim_start_matches("./")) + .collect::>(); + + return Ok(GlobSet::new(members)?.matches(project_source)); + } + + Ok(false) + } + fn load_project_implicit_dependencies( &self, _project_id: &str, @@ -203,13 +248,10 @@ impl Platform for DenoPlatform { working_dir: &Path, ) -> miette::Result> { let deno = self.toolchain.get_for_version(&runtime.requirement)?; + let is_v2 = deno.is_v2(); let mut operations = vec![]; if !self.config.bins.is_empty() { - self.console - .out - .print_checkpoint(Checkpoint::Setup, "deno install")?; - debug!( target: LOG_TARGET, "Installing Deno binaries: {}", @@ -221,11 +263,16 @@ impl Platform for DenoPlatform { "install", "--allow-net", "--allow-read", - "--no-prompt", "--lock", "deno.lock", ]; + if is_v2 { + args.push("--global"); + } else { + args.push("--no-prompt"); + } + match bin { BinEntry::Name(name) => args.push(name), BinEntry::Config(cfg) => { @@ -249,6 +296,10 @@ impl Platform for DenoPlatform { operations.push( Operation::task_execution(format!("deno {}", args.join(" "))) .track_async(|| async { + self.console + .out + .print_checkpoint(Checkpoint::Setup, "deno install --global")?; + deno.create_command(&())? .args(args) .cwd(working_dir) @@ -264,15 +315,33 @@ impl Platform for DenoPlatform { if self.config.lockfile { debug!(target: LOG_TARGET, "Installing dependencies"); - self.console - .out - .print_checkpoint(Checkpoint::Setup, "deno cache")?; + if is_v2 { + operations.push( + Operation::task_execution("deno install") + .track_async(|| async { + self.console + .out + .print_checkpoint(Checkpoint::Setup, "deno install")?; - operations.push( - Operation::task_execution("deno cache --lock deno.lock --lock-write") - .track_async(|| deno.install_dependencies(&(), working_dir, !is_test_env())) - .await?, - ); + deno.install_dependencies(&(), working_dir, !is_test_env()) + .await + }) + .await?, + ); + } else { + operations.push( + Operation::task_execution("deno cache --lock-write") + .track_async(|| async { + self.console + .out + .print_checkpoint(Checkpoint::Setup, "deno cache")?; + + deno.install_dependencies(&(), working_dir, !is_test_env()) + .await + }) + .await?, + ); + } } Ok(operations) diff --git a/legacy/deno/tool/src/deno_tool.rs b/legacy/deno/tool/src/deno_tool.rs index 39fb6759740..9caa9f98aed 100644 --- a/legacy/deno/tool/src/deno_tool.rs +++ b/legacy/deno/tool/src/deno_tool.rs @@ -72,6 +72,14 @@ impl DenoTool { Ok(deno) } + + pub fn is_v2(&self) -> bool { + self.config.version.as_ref().is_some_and(|spec| match spec { + UnresolvedVersionSpec::Req(req) => req.comparators.iter().any(|c| c.major >= 2), + UnresolvedVersionSpec::Semantic(version) => version.major >= 2, + _ => false, + }) + } } #[async_trait] @@ -207,15 +215,14 @@ impl DependencyManager<()> for DenoTool { ) -> miette::Result<()> { let mut cmd = self.create_command(parent)?; - cmd.args([ - "cache", - "--lock", - "deno.lock", - "--lock-write", - &self.config.deps_file, - ]) - .cwd(working_dir) - .set_print_command(log); + if self.is_v2() { + cmd.args(["install", "--no-check"]); + cmd.args(&self.config.install_args); + } else { + cmd.args(["cache", "--lock-write", &self.config.deps_file]); + } + + cmd.cwd(working_dir).set_print_command(log); let mut cmd = cmd.create_async(); diff --git a/legacy/node/platform/src/node_platform.rs b/legacy/node/platform/src/node_platform.rs index 6bb20cb7957..1fe69d72967 100644 --- a/legacy/node/platform/src/node_platform.rs +++ b/legacy/node/platform/src/node_platform.rs @@ -142,6 +142,7 @@ impl Platform for NodePlatform { project_source: &str, ) -> miette::Result { let mut in_workspace = false; + let deps_root_path = deps_root.to_logical_path(&self.workspace_root); // Single version policy / only a root package.json if self.config.root_package_only { @@ -149,12 +150,12 @@ impl Platform for NodePlatform { } // Root package is always considered within the workspace - if is_root_level_source(project_source) && self.packages_root == self.workspace_root { + if is_root_level_source(project_source) && deps_root_path == self.workspace_root { return Ok(true); } if let Some(globs) = get_package_manager_workspaces( - deps_root.to_logical_path(&self.workspace_root), + deps_root_path, matches!(self.config.package_manager, NodePackageManager::Pnpm), )? { in_workspace = GlobSet::new(&globs)?.matches(project_source); @@ -180,6 +181,13 @@ impl Platform for NodePlatform { PackageJsonCache::read(project_source.to_path(&self.workspace_root))? { if let Some(package_name) = package_json.data.name { + debug!( + target: LOG_TARGET, + "Inheriting alias {} for project {}", + color::label(&package_name), + color::id(project_id) + ); + self.package_names .insert(package_name.clone(), project_id.to_owned()); diff --git a/legacy/node/tool/src/bun_tool.rs b/legacy/node/tool/src/bun_tool.rs index 6b6f8226045..2d1c8c79cf0 100644 --- a/legacy/node/tool/src/bun_tool.rs +++ b/legacy/node/tool/src/bun_tool.rs @@ -192,6 +192,7 @@ impl DependencyManager for BunTool { if let Some(version) = get_proto_version_env(&self.tool) { cmd.env("PROTO_BUN_VERSION", version); + cmd.env("PROTO_NODE_VERSION", "*"); } if let Some(version) = get_proto_version_env(&node.tool) { @@ -213,7 +214,18 @@ impl DependencyManager for BunTool { } fn get_lock_filename(&self) -> String { - String::from("bun.lockb") + String::from( + if self + .config + .install_args + .iter() + .any(|arg| arg == "--save-text-lockfile") + { + "bun.lock" + } else { + "bun.lockb" + }, + ) } fn get_manifest_filename(&self) -> String { diff --git a/legacy/python/platform/src/actions/install_deps.rs b/legacy/python/platform/src/actions/install_deps.rs index fd29aadceee..cfcb4ebd8cf 100644 --- a/legacy/python/platform/src/actions/install_deps.rs +++ b/legacy/python/platform/src/actions/install_deps.rs @@ -24,15 +24,17 @@ pub async fn install_deps( }; if !venv_root.exists() && requirements_path.is_some() { - console - .out - .print_checkpoint(Checkpoint::Setup, "python venv")?; - let args = vec!["-m", "venv", venv_root.to_str().unwrap_or_default()]; operations.push( Operation::task_execution(format!("python {}", args.join(" "))) - .track_async(|| python.exec_python(args, working_dir, workspace_root)) + .track_async(|| async { + console + .out + .print_checkpoint(Checkpoint::Setup, "python venv")?; + + python.exec_python(args, working_dir, workspace_root).await + }) .await?, ); } diff --git a/legacy/rust/platform/src/rust_platform.rs b/legacy/rust/platform/src/rust_platform.rs index 09a57a82836..c91c2635b80 100644 --- a/legacy/rust/platform/src/rust_platform.rs +++ b/legacy/rust/platform/src/rust_platform.rs @@ -10,8 +10,8 @@ use moon_common::{ Id, }; use moon_config::{ - BinEntry, HasherConfig, PlatformType, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, - RustConfig, UnresolvedVersionSpec, + BinEntry, DependencyConfig, DependencyScope, DependencySource, HasherConfig, PlatformType, + ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, RustConfig, UnresolvedVersionSpec, }; use moon_console::{Checkpoint, Console}; use moon_hash::ContentHasher; @@ -21,7 +21,7 @@ use moon_process::Command; use moon_project::Project; use moon_rust_lang::{ cargo_lock::load_lockfile_dependencies, - cargo_toml::CargoTomlCache, + cargo_toml::{CargoTomlCache, DepsSet}, toolchain_toml::{ToolchainToml, ToolchainTomlCache}, }; use moon_rust_tool::{get_rust_env_paths, RustTool}; @@ -46,6 +46,8 @@ pub struct RustPlatform { console: Arc, + package_names: FxHashMap, + proto_env: Arc, toolchain: ToolManager, @@ -63,6 +65,7 @@ impl RustPlatform { ) -> Self { RustPlatform { config: config.to_owned(), + package_names: FxHashMap::default(), proto_env, toolchain: ToolManager::new(Runtime::new(Id::raw("rust"), RuntimeReq::Global)), workspace_root: workspace_root.to_path_buf(), @@ -151,16 +154,16 @@ impl Platform for RustPlatform { ) -> miette::Result { let deps_root_path = deps_root.to_logical_path(&self.workspace_root); - let Some(cargo_toml) = CargoTomlCache::read(&deps_root_path)? else { - return Ok(false); - }; - if is_root_level_source(project_source) && deps_root_path == self.workspace_root || deps_root.as_str() == project_source { return Ok(true); } + let Some(cargo_toml) = CargoTomlCache::read(&deps_root_path)? else { + return Ok(false); + }; + if let Some(workspace) = cargo_toml.workspace { return Ok( GlobSet::new_split(&workspace.members, &workspace.exclude)?.matches(project_source) @@ -176,6 +179,12 @@ impl Platform for RustPlatform { projects_list: &ProjectsSourcesList, aliases_list: &mut ProjectsAliasesList, ) -> miette::Result<()> { + debug!( + target: LOG_TARGET, + "Loading names (aliases) from project {}'s", + color::file("Cargo.toml") + ); + // Extract the alias from the Cargo project relative to the lockfile for (id, source) in projects_list { let project_root = source.to_path(&self.workspace_root); @@ -190,6 +199,9 @@ impl Platform for RustPlatform { color::id(id) ); + self.package_names + .insert(package.name.clone(), id.to_owned()); + aliases_list.push((id.to_owned(), package.name)); } } @@ -199,6 +211,45 @@ impl Platform for RustPlatform { Ok(()) } + #[instrument(skip(self))] + fn load_project_implicit_dependencies( + &self, + project_id: &str, + project_source: &str, + ) -> miette::Result> { + let mut implicit_deps = vec![]; + + debug!( + target: LOG_TARGET, + "Scanning {} for implicit dependency relations", + color::id(project_id), + ); + + if let Some(cargo_toml) = CargoTomlCache::read(self.workspace_root.join(project_source))? { + let mut find_implicit_relations = |package_deps: &DepsSet, scope: &DependencyScope| { + for (dep_name, dep) in package_deps { + // Only inherit if the dependency is using the local `path = "..."` syntax + if dep.detail().is_some_and(|d| d.path.is_some()) { + if let Some(dep_project_id) = self.package_names.get(dep_name) { + implicit_deps.push(DependencyConfig { + id: dep_project_id.to_owned(), + scope: *scope, + source: DependencySource::Implicit, + via: Some(dep_name.clone()), + }); + } + } + } + }; + + find_implicit_relations(&cargo_toml.dependencies, &DependencyScope::Production); + find_implicit_relations(&cargo_toml.dev_dependencies, &DependencyScope::Development); + find_implicit_relations(&cargo_toml.build_dependencies, &DependencyScope::Build); + } + + Ok(implicit_deps) + } + // TOOLCHAIN fn is_toolchain_enabled(&self) -> miette::Result { @@ -291,10 +342,6 @@ impl Platform for RustPlatform { let mut operations = vec![]; if !self.config.components.is_empty() { - self.console - .out - .print_checkpoint(Checkpoint::Setup, "rustup component")?; - debug!( target: LOG_TARGET, "Installing rustup components: {}", @@ -306,16 +353,18 @@ impl Platform for RustPlatform { operations.push( Operation::task_execution(format!("rustup {}", args.join(" "))) - .track_async(|| tool.exec_rustup(args, working_dir)) + .track_async(|| async { + self.console + .out + .print_checkpoint(Checkpoint::Setup, "rustup component")?; + + tool.exec_rustup(args, working_dir).await + }) .await?, ); } if !self.config.targets.is_empty() { - self.console - .out - .print_checkpoint(Checkpoint::Setup, "rustup target")?; - debug!( target: LOG_TARGET, "Installing rustup targets: {}", @@ -327,28 +376,32 @@ impl Platform for RustPlatform { operations.push( Operation::task_execution(format!("rustup {}", args.join(" "))) - .track_async(|| tool.exec_rustup(args, working_dir)) + .track_async(|| async { + self.console + .out + .print_checkpoint(Checkpoint::Setup, "rustup target")?; + + tool.exec_rustup(args, working_dir).await + }) .await?, ); } if find_cargo_lock(working_dir, &self.workspace_root).is_none() { - self.console - .out - .print_checkpoint(Checkpoint::Setup, "cargo generate-lockfile")?; - operations.push( Operation::task_execution("cargo generate-lockfile") - .track_async(|| tool.exec_cargo(["generate-lockfile"], working_dir)) + .track_async(|| async { + self.console + .out + .print_checkpoint(Checkpoint::Setup, "cargo generate-lockfile")?; + + tool.exec_cargo(["generate-lockfile"], working_dir).await + }) .await?, ); } if !self.config.bins.is_empty() { - self.console - .out - .print_checkpoint(Checkpoint::Setup, "cargo binstall")?; - let globals_dir = self.get_globals_dir(Some(tool)); // Install cargo-binstall if it does not exist @@ -401,7 +454,13 @@ impl Platform for RustPlatform { operations.push( Operation::task_execution(format!("cargo {}", args.join(" "))) - .track_async(|| tool.exec_cargo(args, working_dir)) + .track_async(|| async { + self.console + .out + .print_checkpoint(Checkpoint::Setup, "cargo binstall")?; + + tool.exec_cargo(args, working_dir).await + }) .await?, ); } diff --git a/packages/types/src/toolchain-config.ts b/packages/types/src/toolchain-config.ts index 3ec84cfb937..0382fd43ae4 100644 --- a/packages/types/src/toolchain-config.ts +++ b/packages/types/src/toolchain-config.ts @@ -86,6 +86,8 @@ export interface DenoConfig { * @default 'deps.ts' */ depsFile?: string; + /** List of arguments to append to `deno install` commands. */ + installArgs: string[]; /** Requires and forces the use of `deno.lock` files. */ lockfile: boolean; /** Location of the WASM plugin to use for Deno support. */ @@ -485,6 +487,8 @@ export interface PartialDenoConfig { * @default 'deps.ts' */ depsFile?: string | null; + /** List of arguments to append to `deno install` commands. */ + installArgs?: string[] | null; /** Requires and forces the use of `deno.lock` files. */ lockfile?: boolean | null; /** Location of the WASM plugin to use for Deno support. */ diff --git a/tests/fixtures/bun/version-override/moon.yml b/tests/fixtures/bun/version-override/moon.yml index f9725d7f3bd..101cf4d7582 100644 --- a/tests/fixtures/bun/version-override/moon.yml +++ b/tests/fixtures/bun/version-override/moon.yml @@ -2,4 +2,4 @@ language: javascript toolchain: bun: - version: '0.8.0' + version: '1.1.0' diff --git a/website/docs/proto/toml-plugin.mdx b/website/docs/proto/toml-plugin.mdx deleted file mode 100644 index adf2d7952b8..00000000000 --- a/website/docs/proto/toml-plugin.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: TOML plugin -sidebar_label: TOML -toc_max_heading_level: 5 ---- - -The TOML plugin documentation has moved to: -[https://moonrepo.dev/docs/proto/non-wasm-plugin](/docs/proto/non-wasm-plugin) diff --git a/website/docs/setup-toolchain.mdx b/website/docs/setup-toolchain.mdx index 8faf9c7f72b..3925f8eca45 100644 --- a/website/docs/setup-toolchain.mdx +++ b/website/docs/setup-toolchain.mdx @@ -37,7 +37,7 @@ day-to-day. ## Enabling a platform By default all tasks run through the -[system platform](./how-it-works/languages#system-language-and-platform) and inherit _no_ special +[system platform](./how-it-works/languages#system-language-and-toolchain) and inherit _no_ special functionality. If you want to take advantage of this functionality, like dependency hashing, package shorthand execution, and lockfile management, you'll need to enable the platform in [`.moon/toolchain.yml`](./config/toolchain). Otherwise, you can skip to the diff --git a/website/static/schemas/toolchain.json b/website/static/schemas/toolchain.json index beba9ba5392..d521a525a90 100644 --- a/website/static/schemas/toolchain.json +++ b/website/static/schemas/toolchain.json @@ -293,6 +293,15 @@ "default": "deps.ts", "type": "string" }, + "installArgs": { + "title": "installArgs", + "description": "List of arguments to append to deno install commands.", + "type": "array", + "items": { + "type": "string" + }, + "markdownDescription": "List of arguments to append to `deno install` commands." + }, "lockfile": { "title": "lockfile", "description": "Requires and forces the use of deno.lock files.", From 4cea66d567463a63a24b0d2946d3cf2f504e9e9a Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Thu, 30 Jan 2025 17:45:53 -0800 Subject: [PATCH 12/15] internal: Rework process handling. (#1790) * Start on new impl. * Update impls. * Polish. * Fix output. * Add new capture stream. * Start on process registry. * Add shared child. * Polish. * Improve signals. * Rename methods. * Polish. * Add pipeline status. * Update changelog. * Polish. * Fix build. * Rework logging. * Dont use shutdown. * Use process wrap. * Try and test things. * Rebuild lockfile. * Remove process wrap. * Polish. * Polish. * Polish. * Fixes. * Try clone. --- .moon/workspace.yml | 1 + CHANGELOG.md | 3 + Cargo.lock | 904 ++++++++++-------- crates/action-pipeline/Cargo.toml | 1 + crates/action-pipeline/src/action_pipeline.rs | 112 +-- crates/action-pipeline/src/event_emitter.rs | 4 +- crates/action-pipeline/src/job.rs | 63 +- .../src/subscribers/cleanup_subscriber.rs | 9 +- .../src/subscribers/console_subscriber.rs | 15 +- .../src/subscribers/moonbase_subscriber.rs | 9 +- .../src/subscribers/remote_subscriber.rs | 9 +- .../src/subscribers/reports_subscriber.rs | 6 +- crates/action/src/action.rs | 11 + .../src/operations/run_plugin_operation.rs | 10 +- crates/app/Cargo.toml | 1 + crates/app/src/commands/node/run_script.rs | 2 +- crates/app/src/session.rs | 6 + crates/codegen/src/codegen.rs | 1 - .../console-reporter/src/default_reporter.rs | 21 +- crates/console/src/reporter.rs | 12 +- crates/process/Cargo.toml | 5 +- crates/process/src/async_command.rs | 257 ----- crates/process/src/command.rs | 144 ++- crates/process/src/command_inspector.rs | 273 ------ crates/process/src/command_line.rs | 123 +++ crates/process/src/exec_command.rs | 456 +++++++++ crates/process/src/lib.rs | 13 +- crates/process/src/output_stream.rs | 203 ++++ crates/process/src/process_registry.rs | 164 ++++ crates/process/src/shared_child.rs | 123 +++ crates/process/src/shell.rs | 16 +- crates/process/src/signal.rs | 134 +++ crates/task-runner/src/command_executor.rs | 31 +- crates/task-runner/src/task_runner.rs | 15 - .../task-runner/tests/command_builder_test.rs | 12 +- crates/vcs/src/process_cache.rs | 12 +- legacy/bun/tool/src/bun_tool.rs | 6 +- legacy/deno/platform/src/deno_platform.rs | 1 - legacy/deno/tool/src/deno_tool.rs | 2 - legacy/node/tool/src/bun_tool.rs | 6 +- legacy/node/tool/src/node_tool.rs | 6 +- legacy/node/tool/src/npm_tool.rs | 5 +- legacy/node/tool/src/pnpm_tool.rs | 5 +- legacy/node/tool/src/yarn_tool.rs | 6 +- legacy/python/tool/src/python_tool.rs | 2 +- legacy/rust/tool/src/rust_tool.rs | 2 - package.json | 1 + scenarios/signals/moon.yml | 22 + scenarios/signals/signals.mjs | 21 + tsconfig.json | 3 + 50 files changed, 2057 insertions(+), 1212 deletions(-) delete mode 100644 crates/process/src/async_command.rs delete mode 100644 crates/process/src/command_inspector.rs create mode 100644 crates/process/src/command_line.rs create mode 100644 crates/process/src/exec_command.rs create mode 100644 crates/process/src/output_stream.rs create mode 100644 crates/process/src/process_registry.rs create mode 100644 crates/process/src/shared_child.rs create mode 100644 crates/process/src/signal.rs create mode 100644 scenarios/signals/moon.yml create mode 100644 scenarios/signals/signals.mjs diff --git a/.moon/workspace.yml b/.moon/workspace.yml index 6651e99c5ee..c45111b72ae 100644 --- a/.moon/workspace.yml +++ b/.moon/workspace.yml @@ -10,6 +10,7 @@ projects: - './packages/*' - '!packages/cli' - '!packages/core-*' + # - 'scenarios/*' - 'website' generator: diff --git a/CHANGELOG.md b/CHANGELOG.md index 146c0a4ccc2..2b76c5397f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,9 @@ - The root-level project is now properly taken into account when detecting the package workspaces. - Project dependencies (`dependsOn`) are now automatically inferred from `Cargo.toml` dependencies. +- Reworked child process handling to better handle signals and shutdown accordingly. Additionally, + when the pipeline receives a signal, we now display the status that shutdown the pipeline in the + summary. #### 🐞 Fixes diff --git a/Cargo.lock b/Cargo.lock index 6fda2f62594..d15494d23bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -24,7 +24,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check 0.9.5", "zerocopy", @@ -41,9 +41,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "ambient-authority" @@ -68,9 +68,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -83,36 +83,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "once_cell", + "windows-sys 0.59.0", ] [[package]] @@ -133,9 +134,9 @@ checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -265,9 +266,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", "cfg-if", @@ -288,7 +289,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.1", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] @@ -315,7 +316,7 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.3.1", + "event-listener 5.4.0", "futures-lite", "rustix", "tracing", @@ -456,15 +457,15 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.5" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "itoa", @@ -475,28 +476,28 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.1", - "tower 0.4.13", + "sync_wrapper", + "tower 0.5.2", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper", "tower-layer", "tower-service", ] @@ -576,7 +577,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -627,9 +628,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block-buffer" @@ -655,26 +656,26 @@ dependencies = [ [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "serde", ] [[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 = "bytemuck" -version = "1.18.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -771,21 +772,21 @@ checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" [[package]] name = "cap-fs-ext" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16619ada836f12897a72011fe99b03f0025b87a8dbbea4f3c9f89b458a23bf3" +checksum = "7f78efdd7378980d79c0f36b519e51191742d2c9f91ffa5e228fba9f3806d2e1" dependencies = [ "cap-primitives", "cap-std", "io-lifetimes", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "cap-primitives" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fa6c3f9773feab88d844aa50035a33fb6e7e7426105d2f4bb7aadc42a5f89a" +checksum = "8fc15faeed2223d8b8e8cc1857f5861935a06d06713c4ac106b722ae9ce3c369" dependencies = [ "ambient-authority", "fs-set-times", @@ -794,15 +795,15 @@ dependencies = [ "ipnet", "maybe-owned", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", "winx", ] [[package]] name = "cap-rand" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53774d49369892b70184f8312e50c1b87edccb376691de4485b0ff554b27c36c" +checksum = "dea13372b49df066d1ae654e5c6e41799c1efd9f6b36794b921e877ea4037977" dependencies = [ "ambient-authority", "rand", @@ -810,9 +811,9 @@ dependencies = [ [[package]] name = "cap-std" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f71b70818556b4fe2a10c7c30baac3f5f45e973f49fc2673d7c75c39d0baf5b" +checksum = "c3dbd3e8e8d093d6ccb4b512264869e1281cdb032f7940bd50b2894f96f25609" dependencies = [ "cap-primitives", "io-extras", @@ -822,9 +823,9 @@ dependencies = [ [[package]] name = "cap-time-ext" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69dd48afa2363f746c93f961c211f6f099fb594a3446b8097bc5f79db51b6816" +checksum = "bd736b20fc033f564a1995fb82fc349146de43aabba19c7368b4cb17d8f9ea53" dependencies = [ "ambient-authority", "cap-primitives", @@ -858,9 +859,9 @@ dependencies = [ [[package]] name = "cargo-lock" -version = "10.0.1" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6469776d007022d505bbcc2be726f5f096174ae76d710ebc609eb3029a45b551" +checksum = "c06acb4f71407ba205a07cb453211e0e6a67b21904e47f6ba1f9589e38f2e454" dependencies = [ "semver", "serde", @@ -907,9 +908,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.23" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bbb537bb4a30b90362caddba8f360c0a56bc13d3a5570028e7197204cb54a17" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "jobserver", "libc", @@ -1090,9 +1091,9 @@ checksum = "aaa6b4b263a5d737e9bf6b7c09b72c41a5480aec4d7219af827f6564e950b6a5" [[package]] name = "cmake" -version = "0.1.52" +version = "0.1.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" +checksum = "e24a03c8b52922d68a1589ad61032f2c1aa5a8158d2aa0d93c6e9534944bbad6" dependencies = [ "cc", ] @@ -1105,9 +1106,9 @@ checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "common-path" @@ -1154,18 +1155,18 @@ dependencies = [ [[package]] name = "const_format" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", @@ -1200,6 +1201,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1217,9 +1228,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1341,9 +1352,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1360,9 +1371,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossterm" @@ -1386,10 +1397,10 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "crossterm_winapi", "futures-core", - "mio 1.0.2", + "mio 1.0.3", "parking_lot", "rustix", "signal-hook", @@ -1408,9 +1419,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -1536,9 +1547,9 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", @@ -1762,9 +1773,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1777,12 +1788,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1793,9 +1804,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[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", @@ -1804,11 +1815,11 @@ 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 5.3.1", + "event-listener 5.4.0", "pin-project-lite", ] @@ -1912,9 +1923,9 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fd-lock" @@ -1970,6 +1981,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1996,13 +2013,13 @@ dependencies = [ [[package]] name = "fs-set-times" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" +checksum = "5e2e6123af26f0f2c51cc66869137080199406754903cc926a7690401ce09cb4" dependencies = [ "io-lifetimes", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2071,9 +2088,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "fastrand", "futures-core", @@ -2147,7 +2164,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "debugid", "fxhash", "serde", @@ -2206,15 +2223,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", ] [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", "indexmap 2.7.1", @@ -2234,9 +2265,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "globset" @@ -2247,7 +2278,7 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -2257,7 +2288,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "ignore", "walkdir", ] @@ -2293,16 +2324,16 @@ checksum = "be136d9dacc2a13cc70bb6c8f902b414fb2641f8db1314637c6b7933411a8f82" [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", + "http 1.2.0", "indexmap 2.7.1", "slab", "tokio", @@ -2329,9 +2360,12 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", +] [[package]] name = "heck" @@ -2396,9 +2430,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -2423,7 +2457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -2434,7 +2468,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -2448,7 +2482,7 @@ dependencies = [ "async-trait", "bincode", "cacache", - "http 1.1.0", + "http 1.2.0", "http-cache-semantics", "httpdate", "serde", @@ -2463,7 +2497,7 @@ checksum = "735586904a5ce0c13877c57cb4eb8195eb7c11ec1ffd64d4db053fb8559ca62e" dependencies = [ "anyhow", "async-trait", - "http 1.1.0", + "http 1.2.0", "http-cache", "http-cache-semantics", "reqwest", @@ -2478,7 +2512,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92baf25cf0b8c9246baecf3a444546360a97b569168fdf92563ee6a47829920c" dependencies = [ - "http 1.1.0", + "http 1.2.0", "http-serde", "serde", "time", @@ -2490,15 +2524,15 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd" dependencies = [ - "http 1.1.0", + "http 1.2.0", "serde", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -2521,7 +2555,7 @@ dependencies = [ "crossbeam-utils", "form_urlencoded", "futures-util", - "hyper 0.14.30", + "hyper 0.14.32", "lazy_static", "levenshtein", "log", @@ -2557,9 +2591,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -2580,15 +2614,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", "h2", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "httparse", "httpdate", @@ -2601,16 +2635,16 @@ 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.1.0", - "hyper 1.4.1", + "http 1.2.0", + "hyper 1.6.0", "hyper-util", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2620,11 +2654,11 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.4.1", + "hyper 1.6.0", "hyper-util", "pin-project-lite", "tokio", @@ -2639,7 +2673,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper 1.6.0", "hyper-util", "native-tls", "tokio", @@ -2656,9 +2690,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.6.0", "pin-project-lite", "socket2", "tokio", @@ -2850,7 +2884,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "same-file", "walkdir", "winapi-util", @@ -2873,15 +2907,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", "number_prefix", @@ -2896,7 +2930,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "crossterm 0.25.0", "dyn-clone", "fuzzy-matcher", @@ -2909,31 +2943,32 @@ dependencies = [ [[package]] name = "insta" -version = "1.42.0" +version = "1.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513e4067e16e69ed1db5ab56048ed65db32d10ba5fc1217f5393f8f17d8b5a5" +checksum = "71c1b125e30d93896b365e156c33dadfffab45ee8400afcbba4752f59de08a86" dependencies = [ "console", "linked-hash-map", "once_cell", + "pin-project", "similar", ] [[package]] name = "io-extras" -version = "0.18.3" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d45fd7584f9b67ac37bc041212d06bfac0700b36456b05890d36a3b626260eb" +checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" dependencies = [ "io-lifetimes", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "io-lifetimes" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" +checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" [[package]] name = "iocraft" @@ -2942,7 +2977,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a34280c018dcd0a94d2c7a8b2999578d62ffee4decf52b01aeabd77a980932c" dependencies = [ "any_key", - "bitflags 2.6.0", + "bitflags 2.8.0", "crossterm 0.28.1", "futures", "generational-box", @@ -2966,9 +3001,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-docker" @@ -3065,10 +3100,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -3118,7 +3154,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.8", + "regex-automata 0.4.9", ] [[package]] @@ -3163,9 +3199,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmimalloc-sys" @@ -3183,7 +3219,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", "redox_syscall", ] @@ -3206,15 +3242,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[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 = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -3234,9 +3270,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" dependencies = [ "value-bag", ] @@ -3437,9 +3473,9 @@ checksum = "6367d84fb54d4242af283086402907277715b8fe46976963af5ebf173f8efba3" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -3452,20 +3488,19 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] [[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", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3544,6 +3579,7 @@ dependencies = [ "moon_common", "moon_console", "moon_notifier", + "moon_process", "moon_project", "moon_remote", "moon_task", @@ -3679,6 +3715,7 @@ dependencies = [ "moon_node_tool", "moon_platform", "moon_plugin", + "moon_process", "moon_project", "moon_project_graph", "moon_python_lang", @@ -4335,6 +4372,7 @@ name = "moon_process" version = "0.0.1" dependencies = [ "cached", + "libc", "miette 7.4.0", "moon_args", "moon_common", @@ -4517,7 +4555,7 @@ dependencies = [ "aws-lc-rs", "bazel-remote-apis", "chrono", - "http 1.1.0", + "http 1.2.0", "miette 7.4.0", "moon_action", "moon_common", @@ -5024,9 +5062,9 @@ checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ "libc", "log", @@ -5034,7 +5072,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -5060,7 +5098,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "cfg_aliases", "libc", @@ -5148,12 +5186,12 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.4" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "crc32fast", - "hashbrown 0.14.5", + "hashbrown 0.15.2", "indexmap 2.7.1", "memchr", ] @@ -5166,9 +5204,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "open" -version = "5.3.1" +version = "5.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c" +checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" dependencies = [ "is-wsl", "libc", @@ -5177,11 +5215,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "foreign-types", "libc", @@ -5203,24 +5241,24 @@ dependencies = [ [[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 = "openssl-src" -version = "300.3.2+3.3.2" +version = "300.4.1+3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -5429,30 +5467,30 @@ dependencies = [ [[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_shared 0.11.2", + "phf_shared 0.11.3", ] [[package]] name = "phf_codegen" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ "phf_generator", - "phf_shared 0.11.2", + "phf_shared 0.11.3", ] [[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 0.11.2", + "phf_shared 0.11.3", "rand", ] @@ -5462,16 +5500,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[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", + "siphasher 1.0.1", ] [[package]] @@ -5482,18 +5520,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", @@ -5502,9 +5540,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -5531,9 +5569,9 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -5555,15 +5593,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "postcard" -version = "1.0.10" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" +checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" dependencies = [ "cobs", "embedded-io 0.4.0", @@ -5608,15 +5646,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" [[package]] name = "predicates-tree" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" dependencies = [ "predicates-core", "termtree", @@ -5634,9 +5672,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", "syn 2.0.96", @@ -5818,9 +5856,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" +checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" dependencies = [ "cc", ] @@ -5838,9 +5876,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -5849,34 +5887,38 @@ dependencies = [ "rustc-hash 2.1.0", "rustls", "socket2", - "thiserror 1.0.69", + "thiserror 2.0.11", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom 0.2.15", "rand", "ring", "rustc-hash 2.1.0", "rustls", + "rustls-pki-types", "slab", - "thiserror 1.0.69", + "thiserror 2.0.11", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -5920,7 +5962,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -5945,11 +5987,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -5958,7 +6000,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -5969,20 +6011,21 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 2.0.11", ] [[package]] name = "reflink-copy" -version = "0.1.20" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17400ed684c3a0615932f00c271ae3eea13e47056a1455821995122348ab6438" +checksum = "fbd3533fd4222b8337470456ea84d80436b4c91c53db51c372461d5f7e6eb0b4" dependencies = [ "cfg-if", + "libc", "rustix", - "windows 0.58.0", + "windows 0.59.0", ] [[package]] @@ -6006,7 +6049,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -6032,9 +6075,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -6081,10 +6124,10 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.6.0", "hyper-rustls", "hyper-tls", "hyper-util", @@ -6099,13 +6142,13 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -6130,7 +6173,7 @@ checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" dependencies = [ "anyhow", "async-trait", - "http 1.1.0", + "http 1.2.0", "reqwest", "serde", "thiserror 1.0.69", @@ -6145,7 +6188,7 @@ checksum = "d1ccd3b55e711f91a9885a2fa6fbbb2e39db1776420b062efc058c6410f7e5e3" dependencies = [ "anyhow", "async-trait", - "http 1.1.0", + "http 1.2.0", "reqwest", "serde", "thiserror 1.0.69", @@ -6170,7 +6213,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -6201,9 +6244,9 @@ dependencies = [ [[package]] name = "rmpv" -version = "1.0.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0e0214a4a2b444ecce41a4025792fc31f77c7bb89c46d253953ea8c65701ec" +checksum = "58450723cd9ee93273ce44a20b6ec4efe17f8ed2e3631474387bfdecf18bb2a9" dependencies = [ "num-traits", "rmp", @@ -6251,24 +6294,24 @@ checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[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.8.0", "errno", "itoa", "libc", "linux-raw-sys", "once_cell", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "aws-lc-rs", "log", @@ -6290,20 +6333,19 @@ dependencies = [ "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", ] [[package]] @@ -6317,9 +6359,12 @@ 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", +] [[package]] name = "rustls-webpki" @@ -6335,15 +6380,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -6366,9 +6411,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -6446,9 +6491,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sdd" -version = "3.0.3" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a7b59a5d9b0099720b417b6325d91a52cbf5b3dcb5041d864be53eefa58abc" +checksum = "478f121bb72bbf63c52c93011ea1791dca40140dfe13f8336c4c5ac952c33aa9" [[package]] name = "security-framework" @@ -6456,8 +6501,21 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.8.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -6465,9 +6523,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -6697,7 +6755,7 @@ checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", "mio 0.8.11", - "mio 1.0.2", + "mio 1.0.3", "signal-hook", ] @@ -6727,9 +6785,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "similar" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "siphasher" @@ -6737,6 +6795,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -6788,9 +6852,9 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[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", @@ -7049,9 +7113,9 @@ dependencies = [ [[package]] name = "supports-hyperlinks" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0a1e5168041f5f3ff68ff7d95dcb9c8749df29f6e7e89ada40dd4c9de404ee" +checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" [[package]] name = "supports-unicode" @@ -7083,15 +7147,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -7126,8 +7184,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.8.0", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7143,17 +7201,17 @@ dependencies = [ [[package]] name = "system-interface" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b858526d22750088a9b3cf2e3c2aacebd5377f13adeec02860c30d09113010a6" +checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cap-fs-ext", "cap-std", "fd-lock", "io-lifetimes", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", "winx", ] @@ -7191,12 +7249,13 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -7246,9 +7305,9 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f599bd7ca042cfdf8f4512b277c02ba102247820f9d9d4a9f521f496751a6ef" +checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" dependencies = [ "rustix", "windows-sys 0.59.0", @@ -7256,9 +7315,9 @@ dependencies = [ [[package]] name = "termtree" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "textwrap" @@ -7385,9 +7444,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -7407,7 +7466,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio 1.0.3", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -7450,9 +7509,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -7519,16 +7578,16 @@ dependencies = [ "bytes", "flate2", "h2", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.6.0", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", "prost", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pemfile", "socket2", "tokio", @@ -7569,7 +7628,7 @@ dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -7744,12 +7803,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check 0.9.5", -] +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-id" @@ -7759,9 +7815,9 @@ checksum = "10103c57044730945224467c09f71a4db0071c123a0648cc3e818913bde6b561" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-linebreak" @@ -7852,20 +7908,20 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[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-bag" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "vcpkg" @@ -7993,6 +8049,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasi-common" version = "26.0.1" @@ -8000,7 +8065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "165a969c7b4ac223150e2819df36d58b8f24b06320dc314503f90300e5e18bc1" dependencies = [ "anyhow", - "bitflags 2.6.0", + "bitflags 2.8.0", "cap-fs-ext", "cap-rand", "cap-std", @@ -8021,24 +8086,24 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.96", @@ -8047,21 +8112,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8069,9 +8135,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -8082,9 +8148,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-encoder" @@ -8095,11 +8164,21 @@ dependencies = [ "leb128", ] +[[package]] +name = "wasm-encoder" +version = "0.224.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7249cf8cb0c6b9cb42bce90c0a5feb276fbf963fa385ff3d818ab3d90818ed6" +dependencies = [ + "leb128", + "wasmparser 0.224.0", +] + [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -8115,13 +8194,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b09e46c7fceceaa72b2dd1a8a137ea7fd8f93dfaa69806010a709918e496c5dc" dependencies = [ "ahash", - "bitflags 2.6.0", + "bitflags 2.8.0", "hashbrown 0.14.5", "indexmap 2.7.1", "semver", "serde", ] +[[package]] +name = "wasmparser" +version = "0.224.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65881a664fdd43646b647bb27bf186ab09c05bf56779d40aed4c6dce47d423f5" +dependencies = [ + "bitflags 2.8.0", + "indexmap 2.7.1", + "semver", +] + [[package]] name = "wasmprinter" version = "0.218.0" @@ -8130,7 +8220,7 @@ checksum = "0ace089155491837b75f474bf47c99073246d1b737393fe722d6dee311595ddc" dependencies = [ "anyhow", "termcolor", - "wasmparser", + "wasmparser 0.218.0", ] [[package]] @@ -8142,7 +8232,7 @@ dependencies = [ "addr2line", "anyhow", "async-trait", - "bitflags 2.6.0", + "bitflags 2.8.0", "bumpalo", "cc", "cfg-if", @@ -8172,8 +8262,8 @@ dependencies = [ "smallvec", "sptr", "target-lexicon", - "wasm-encoder", - "wasmparser", + "wasm-encoder 0.218.0", + "wasmparser 0.218.0", "wasmtime-asm-macros", "wasmtime-cache", "wasmtime-component-macro", @@ -8260,7 +8350,7 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 1.0.69", - "wasmparser", + "wasmparser 0.218.0", "wasmtime-environ", "wasmtime-versioned-export-macros", ] @@ -8286,8 +8376,8 @@ dependencies = [ "serde_derive", "smallvec", "target-lexicon", - "wasm-encoder", - "wasmparser", + "wasm-encoder 0.218.0", + "wasmparser 0.218.0", "wasmprinter", "wasmtime-component-util", ] @@ -8359,7 +8449,7 @@ dependencies = [ "gimli", "object", "target-lexicon", - "wasmparser", + "wasmparser 0.218.0", "wasmtime-cranelift", "wasmtime-environ", "winch-codegen", @@ -8388,24 +8478,24 @@ dependencies = [ [[package]] name = "wast" -version = "218.0.0" +version = "224.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a53cd1f0fa505df97557e36a58bddb8296e2fcdcd089529545ebfdb18a1b9d7" +checksum = "d722a51e62b669d17e5a9f6bc8ec210178b37d869114355aa46989686c5c6391" dependencies = [ "bumpalo", "leb128", "memchr", - "unicode-width 0.1.14", - "wasm-encoder", + "unicode-width 0.2.0", + "wasm-encoder 0.224.0", ] [[package]] name = "wat" -version = "1.218.0" +version = "1.224.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f87f8e14e776762e07927c27c2054d2cf678aab9aae2d431a79b3e31e4dd391" +checksum = "71dece6a7dd5bcbcf8d256606c7fb3faa36286d46bf3f98185407719a5ceede2" dependencies = [ - "wast 218.0.0", + "wast 224.0.0", ] [[package]] @@ -8425,9 +8515,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -8445,9 +8535,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -8472,7 +8562,7 @@ checksum = "b0f25588cf5ea16f56c1af13244486d50c5a2cf67cc0c4e990c665944d741546" dependencies = [ "anyhow", "async-trait", - "bitflags 2.6.0", + "bitflags 2.8.0", "thiserror 1.0.69", "tracing", "wasmtime", @@ -8550,7 +8640,7 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon", - "wasmparser", + "wasmparser 0.218.0", "wasmtime-cranelift", "wasmtime-environ", ] @@ -8565,16 +8655,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[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.59.0" @@ -8606,19 +8686,6 @@ 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.59.0" @@ -8643,17 +8710,6 @@ dependencies = [ "syn 2.0.96", ] -[[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 2.0.96", -] - [[package]] name = "windows-implement" version = "0.59.0" @@ -8676,17 +8732,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "windows-interface" version = "0.59.0" @@ -8969,21 +9014,30 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "ad699df48212c6cc6eb4435f35500ac6fd3b9913324f938aea302022ce19d310" dependencies = [ "memchr", ] [[package]] name = "winx" -version = "0.36.3" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" +checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" dependencies = [ - "bitflags 2.6.0", - "windows-sys 0.52.0", + "bitflags 2.8.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", ] [[package]] @@ -9001,7 +9055,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser", + "wasmparser 0.218.0", ] [[package]] @@ -9030,9 +9084,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xattr" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" dependencies = [ "libc", "linux-raw-sys", @@ -9041,9 +9095,9 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "xz2" @@ -9072,9 +9126,9 @@ dependencies = [ [[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", @@ -9084,9 +9138,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", @@ -9117,18 +9171,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", diff --git a/crates/action-pipeline/Cargo.toml b/crates/action-pipeline/Cargo.toml index afd6525b845..e08fd24ead3 100644 --- a/crates/action-pipeline/Cargo.toml +++ b/crates/action-pipeline/Cargo.toml @@ -16,6 +16,7 @@ moon_cache = { path = "../cache" } moon_common = { path = "../common" } moon_console = { path = "../console" } moon_notifier = { path = "../notifier" } +moon_process = { path = "../process" } moon_project = { path = "../project" } moon_remote = { path = "../remote" } moon_task = { path = "../task" } diff --git a/crates/action-pipeline/src/action_pipeline.rs b/crates/action-pipeline/src/action_pipeline.rs index a3922cbbceb..562c985c3cd 100644 --- a/crates/action-pipeline/src/action_pipeline.rs +++ b/crates/action-pipeline/src/action_pipeline.rs @@ -8,12 +8,14 @@ use crate::subscribers::moonbase_subscriber::MoonbaseSubscriber; use crate::subscribers::remote_subscriber::RemoteSubscriber; use crate::subscribers::reports_subscriber::ReportsSubscriber; use crate::subscribers::webhooks_subscriber::WebhooksSubscriber; -use moon_action::{Action, ActionNode}; +use miette::IntoDiagnostic; +use moon_action::{Action, ActionNode, ActionPipelineStatus}; use moon_action_context::{ActionContext, TargetState}; use moon_action_graph::ActionGraph; use moon_api::Moonbase; use moon_app_context::AppContext; use moon_common::{color, is_ci, is_test_env}; +use moon_process::{ProcessRegistry, SignalType}; use moon_toolchain_plugin::ToolchainRegistry; use moon_workspace_graph::WorkspaceGraph; use rustc_hash::{FxHashMap, FxHashSet}; @@ -22,7 +24,6 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use tokio::sync::{mpsc, RwLock, Semaphore}; use tokio::task::{JoinHandle, JoinSet}; -use tokio::time::sleep; use tokio_util::sync::CancellationToken; use tracing::{debug, instrument, trace, warn}; @@ -33,9 +34,9 @@ pub struct ActionPipeline { pub summarize: bool, // State - aborted: bool, actions: Vec, duration: Option, + status: ActionPipelineStatus, // Data app_context: Arc, @@ -54,15 +55,15 @@ impl ActionPipeline { debug!("Creating pipeline to run actions"); Self { - aborted: false, - actions: vec![], action_context: Arc::new(ActionContext::default()), + actions: vec![], app_context, bail: false, concurrency: num_cpus::get(), duration: None, emitter: Arc::new(EventEmitter::default()), report_name: "runReport.json".into(), + status: ActionPipelineStatus::Pending, summarize: false, toolchain_registry, workspace_graph, @@ -101,11 +102,11 @@ impl ActionPipeline { self.emitter .emit(Event::PipelineCompleted { actions: &actions, - aborted: self.aborted, context: &self.action_context, duration: self.duration, error: None, error_report: None, + status: &self.status, }) .await?; @@ -115,11 +116,11 @@ impl ActionPipeline { self.emitter .emit(Event::PipelineCompleted { actions: &actions, - aborted: self.aborted, context: &self.action_context, duration: self.duration, error: Some(error.to_string()), error_report: Some(&error), + status: &self.status, }) .await?; @@ -161,16 +162,18 @@ impl ActionPipeline { let signal_handle = self.monitor_signals(cancel_token.clone()); // Dispatch jobs from the graph to run actions - let queue_handle = self.dispatch_jobs(action_graph, job_context)?; + let queue_handle = self.dispatch_jobs(action_graph, job_context.clone())?; // Wait and receive all results coming through debug!("Waiting for jobs to return results"); + let process_registry = ProcessRegistry::instance(); let mut actions = vec![]; let mut error = None; while let Some(mut action) = receiver.recv().await { if self.bail && action.should_bail() || action.should_abort() { + process_registry.terminate_running(); abort_token.cancel(); error = Some(action.get_error()); } @@ -179,25 +182,46 @@ impl ActionPipeline { if abort_token.is_cancelled() { debug!("Aborting pipeline (because something failed)"); + self.status = ActionPipelineStatus::Aborted; break; } else if cancel_token.is_cancelled() { debug!("Cancelling pipeline (via signal)"); + self.status = ActionPipelineStatus::Interrupted; break; } else if actions.len() == total_actions { debug!("Finished pipeline, received all results"); + self.status = ActionPipelineStatus::Completed; break; } } drop(receiver); - // Wait for the queue to abort all running tasks - let _ = queue_handle.await; + // Capture and handle any signals + if cancel_token.is_cancelled() { + self.status = signal_handle.await.into_diagnostic()?; + } else { + signal_handle.abort(); + } + + let completed = matches!(self.status, ActionPipelineStatus::Completed); + + // Wait for running child processes to exit + process_registry + .wait_for_running_to_shutdown(!completed) + .await; + + if !completed { + // Abort any running actions in progress + let mut job_handles = queue_handle.await.into_diagnostic()?; + + if !job_handles.is_empty() { + debug!("Aborting running actions"); - // Force abort the signal handler - signal_handle.abort(); + job_handles.shutdown().await; + } + } - self.aborted = abort_token.is_cancelled(); self.actions = actions; self.duration = Some(start.elapsed()); @@ -213,7 +237,7 @@ impl ActionPipeline { &self, action_graph: ActionGraph, job_context: JobContext, - ) -> miette::Result> { + ) -> miette::Result>> { let node_indices = action_graph.sort_topological()?; let app_context = Arc::clone(&self.app_context); let action_context = Arc::clone(&self.action_context); @@ -233,11 +257,9 @@ impl ActionPipeline { // If the pipeline was aborted or cancelled (signal), // loop through and abort all currently running handles if job_context.is_aborted_or_cancelled() { - job_handles.shutdown().await; - // Return instead of break, so that we avoid // running persistent tasks below - return; + return job_handles; } // If none is returned, then we are waiting on other currently running @@ -290,18 +312,18 @@ impl ActionPipeline { if node.is_interactive() && exhaust_job_handles(&mut job_handles, &job_context).await { - return; + return job_handles; } } // Ensure all non-persistent actions have finished if exhaust_job_handles(&mut job_handles, &job_context).await { - return; + return job_handles; } // Then run all persistent actions in parallel if persistent_indices.is_empty() { - return; + return job_handles; } debug!( @@ -335,36 +357,27 @@ impl ActionPipeline { )); }); - // Since these tasks are persistent and never complete, - // we need to continually check if they've been aborted or - // cancelled, otherwise we will end up with zombie processes - loop { - sleep(Duration::from_millis(150)).await; - - // No tasks running, so don't hang forever - if job_context.result_sender.is_closed() { - break; - } - - if job_context.is_aborted_or_cancelled() { - debug!("Shutting down {} persistent jobs", job_handles.len()); - - job_handles.shutdown().await; - break; - } - } + job_handles })) } - fn monitor_signals(&self, cancel_token: CancellationToken) -> JoinHandle<()> { + fn monitor_signals(&self, cancel_token: CancellationToken) -> JoinHandle { tokio::spawn(async move { - debug!("Listening for ctrl+c signal"); - - if tokio::signal::ctrl_c().await.is_ok() { - debug!("Received ctrl+c signal, shutting down!"); + let mut receiver = ProcessRegistry::instance().receive_signal(); + if let Ok(signal) = receiver.recv().await { cancel_token.cancel(); + + debug!("Received signal, shutting down pipeline"); + + return match signal { + SignalType::Interrupt => ActionPipelineStatus::Interrupted, + SignalType::Terminate => ActionPipelineStatus::Terminated, + _ => ActionPipelineStatus::Aborted, + }; } + + ActionPipelineStatus::Interrupted }) } @@ -473,19 +486,10 @@ async fn dispatch_job_with_permit( #[instrument(skip_all)] async fn exhaust_job_handles(set: &mut JoinSet, job_context: &JobContext) -> bool { while set.join_next().await.is_some() { - // If the pipeline was aborted or cancelled (signal), - // loop through and abort all currently running handles - if job_context.is_aborted_or_cancelled() { - set.shutdown().await; - set.detach_all(); - - // Aborted - return true; - } + continue; } set.detach_all(); - // Not aborted - false + job_context.is_aborted_or_cancelled() } diff --git a/crates/action-pipeline/src/event_emitter.rs b/crates/action-pipeline/src/event_emitter.rs index f56b6bdc952..ba8247676a2 100644 --- a/crates/action-pipeline/src/event_emitter.rs +++ b/crates/action-pipeline/src/event_emitter.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use moon_action::{Action, ActionNode, RunTaskNode}; +use moon_action::{Action, ActionNode, ActionPipelineStatus, RunTaskNode}; use moon_action_context::ActionContext; use moon_project::Project; use moon_task::Target; @@ -46,12 +46,12 @@ pub enum Event<'data> { #[serde(rename_all = "camelCase")] PipelineCompleted { actions: &'data [Action], - aborted: bool, context: &'data ActionContext, duration: Option, error: Option, #[serde(skip)] error_report: Option<&'data miette::Report>, + status: &'data ActionPipelineStatus, }, // Syncing projects diff --git a/crates/action-pipeline/src/job.rs b/crates/action-pipeline/src/job.rs index 20536dd7e14..80f23a16efa 100644 --- a/crates/action-pipeline/src/job.rs +++ b/crates/action-pipeline/src/job.rs @@ -22,41 +22,38 @@ impl Job { let mut action = Action::new(self.node); action.node_index = self.node_index; - tokio::select! { - // Run conditions in order! - biased; - - // Abort if a sibling job has failed - _ = self.context.abort_token.cancelled() => { - trace!( - index = self.node_index, - "Job aborted", - ); - - action.finish(ActionStatus::Aborted); - } - - // Cancel if we receive a shutdown signal - _ = self.context.cancel_token.cancelled() => { - trace!( - index = self.node_index, - "Job cancelled (via signal)", - ); - - action.finish(ActionStatus::Skipped); - } - - // Or run the job to completion - _ = run_action( - &mut action, - self.action_context, - self.app_context, - self.context.workspace_graph.clone(), - self.context.toolchain_registry.clone(), - self.context.emitter.clone(), - ) => {}, + // Don't use `tokio::select!` here because if the abort or cancel tokens + // are triggered, then the async task running the task child process + // is cancelled, immediately terminating the process, and ignoring + // any signals we attempt to pass down! + + if run_action( + &mut action, + self.action_context, + self.app_context, + self.context.workspace_graph.clone(), + self.context.toolchain_registry.clone(), + self.context.emitter.clone(), + ) + .await + .is_err() + { + action.finish(ActionStatus::Failed); }; + // Abort if a sibling job has failed + if self.context.abort_token.is_cancelled() { + trace!(index = self.node_index, "Job aborted"); + + action.finish(ActionStatus::Aborted); + } + // Cancel if we receive a shutdown signal + else if self.context.cancel_token.is_cancelled() { + trace!(index = self.node_index, "Job cancelled (via signal)",); + + action.finish(ActionStatus::Skipped); + } + // Send the result back to the pipeline self.context.send_result(action).await; } diff --git a/crates/action-pipeline/src/subscribers/cleanup_subscriber.rs b/crates/action-pipeline/src/subscribers/cleanup_subscriber.rs index 0e4febd3aa8..789a2b6c589 100644 --- a/crates/action-pipeline/src/subscribers/cleanup_subscriber.rs +++ b/crates/action-pipeline/src/subscribers/cleanup_subscriber.rs @@ -1,5 +1,6 @@ use crate::event_emitter::{Event, Subscriber}; use async_trait::async_trait; +use moon_action::ActionPipelineStatus; use moon_cache::CacheEngine; use std::sync::Arc; use tracing::debug; @@ -21,7 +22,13 @@ impl CleanupSubscriber { #[async_trait] impl Subscriber for CleanupSubscriber { async fn on_emit<'data>(&mut self, event: &Event<'data>) -> miette::Result<()> { - if matches!(event, Event::PipelineCompleted { .. }) { + if matches!( + event, + Event::PipelineCompleted { + status: ActionPipelineStatus::Completed, + .. + } + ) { debug!("Cleaning stale cache"); self.cache_engine.clean_stale_cache(&self.lifetime, false)?; diff --git a/crates/action-pipeline/src/subscribers/console_subscriber.rs b/crates/action-pipeline/src/subscribers/console_subscriber.rs index 7696ff541ca..b7c68c5fa2f 100644 --- a/crates/action-pipeline/src/subscribers/console_subscriber.rs +++ b/crates/action-pipeline/src/subscribers/console_subscriber.rs @@ -24,25 +24,20 @@ impl Subscriber for ConsoleSubscriber { } Event::PipelineCompleted { actions, - aborted, duration, error_report, + status, .. } => { let item = PipelineReportItem { duration: *duration, summarize: self.summarize, + status: **status, }; - if *aborted { - self.console - .reporter - .on_pipeline_aborted(actions, &item, *error_report)?; - } else { - self.console - .reporter - .on_pipeline_completed(actions, &item, *error_report)?; - } + self.console + .reporter + .on_pipeline_completed(actions, &item, *error_report)?; } Event::ActionStarted { action, .. } => { self.console.reporter.on_action_started(action)?; diff --git a/crates/action-pipeline/src/subscribers/moonbase_subscriber.rs b/crates/action-pipeline/src/subscribers/moonbase_subscriber.rs index d79b9ebc40f..a37d1b6a201 100644 --- a/crates/action-pipeline/src/subscribers/moonbase_subscriber.rs +++ b/crates/action-pipeline/src/subscribers/moonbase_subscriber.rs @@ -1,5 +1,6 @@ use crate::event_emitter::{Event, Subscriber}; use async_trait::async_trait; +use moon_action::ActionPipelineStatus; use moon_api::Moonbase; use std::sync::Arc; use tracing::debug; @@ -17,7 +18,13 @@ impl MoonbaseSubscriber { #[async_trait] impl Subscriber for MoonbaseSubscriber { async fn on_emit<'data>(&mut self, event: &Event<'data>) -> miette::Result<()> { - if matches!(event, Event::PipelineCompleted { .. }) { + if matches!( + event, + Event::PipelineCompleted { + status: ActionPipelineStatus::Completed, + .. + } + ) { debug!("Waiting for in-flight moonbase requests to finish"); self.session.wait_for_requests().await; diff --git a/crates/action-pipeline/src/subscribers/remote_subscriber.rs b/crates/action-pipeline/src/subscribers/remote_subscriber.rs index 8104d5ce677..a482a93d06f 100644 --- a/crates/action-pipeline/src/subscribers/remote_subscriber.rs +++ b/crates/action-pipeline/src/subscribers/remote_subscriber.rs @@ -1,5 +1,6 @@ use crate::event_emitter::{Event, Subscriber}; use async_trait::async_trait; +use moon_action::ActionPipelineStatus; use moon_remote::RemoteService; use tracing::debug; @@ -9,7 +10,13 @@ pub struct RemoteSubscriber; #[async_trait] impl Subscriber for RemoteSubscriber { async fn on_emit<'data>(&mut self, event: &Event<'data>) -> miette::Result<()> { - if matches!(event, Event::PipelineCompleted { .. }) { + if matches!( + event, + Event::PipelineCompleted { + status: ActionPipelineStatus::Completed, + .. + } + ) { if let Some(session) = RemoteService::session() { debug!("Waiting for in-flight remote service requests to finish"); diff --git a/crates/action-pipeline/src/subscribers/reports_subscriber.rs b/crates/action-pipeline/src/subscribers/reports_subscriber.rs index 07d3ddc0998..b77e8f9c02e 100644 --- a/crates/action-pipeline/src/subscribers/reports_subscriber.rs +++ b/crates/action-pipeline/src/subscribers/reports_subscriber.rs @@ -1,7 +1,7 @@ use crate::event_emitter::{Event, Subscriber}; use crate::reports::estimate::Estimate; use async_trait::async_trait; -use moon_action::Action; +use moon_action::{Action, ActionPipelineStatus}; use moon_action_context::ActionContext; use moon_cache::CacheEngine; use serde::Serialize; @@ -22,6 +22,8 @@ pub struct RunReport<'data> { /// Estimates around how much time was saved using moon, /// compared to another product or baseline. pub comparison_estimate: Estimate, + + pub status: &'data ActionPipelineStatus, } pub struct ReportsSubscriber { @@ -50,6 +52,7 @@ impl Subscriber for ReportsSubscriber { if let Event::PipelineCompleted { actions, duration: Some(duration), + status, .. } = event { @@ -62,6 +65,7 @@ impl Subscriber for ReportsSubscriber { context: &self.action_context, duration, comparison_estimate: estimate, + status, }; self.cache_engine.write(&self.report_name, &report)?; diff --git a/crates/action/src/action.rs b/crates/action/src/action.rs index 147dacc74c1..dd8a481b368 100644 --- a/crates/action/src/action.rs +++ b/crates/action/src/action.rs @@ -6,6 +6,17 @@ use serde::{Deserialize, Serialize}; use std::sync::Arc; use std::time::{Duration, Instant}; +#[derive(Copy, Clone, Debug, Default, Deserialize, PartialEq, Serialize)] +#[serde(rename_all = "kebab-case")] +pub enum ActionPipelineStatus { + Aborted, + Completed, + Interrupted, + Terminated, + #[default] + Pending, +} + #[derive(Copy, Clone, Debug, Default, Deserialize, PartialEq, Serialize)] #[serde(rename_all = "kebab-case")] pub enum ActionStatus { diff --git a/crates/actions/src/operations/run_plugin_operation.rs b/crates/actions/src/operations/run_plugin_operation.rs index 5a8a6af9dac..3113049a70e 100644 --- a/crates/actions/src/operations/run_plugin_operation.rs +++ b/crates/actions/src/operations/run_plugin_operation.rs @@ -8,16 +8,14 @@ pub async fn run_plugin_operation(operation: PluginOperation) -> miette::Result< Operation::process_execution(&process.command) .track_async_with_check( || async { - let mut builder = Command::new(process.command); - builder.args(process.args); - builder.envs(process.env); + let mut command = Command::new(process.command); + command.args(process.args); + command.envs(process.env); if let Some(cwd) = process.working_dir.and_then(|cwd| cwd.real_path()) { - builder.cwd(cwd); + command.cwd(cwd); } - let mut command = builder.create_async(); - if process.stream { command.exec_stream_output().await } else { diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 9c5fc91a522..acd85979dbc 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -23,6 +23,7 @@ moon_docker = { path = "../docker" } moon_env = { path = "../env" } moon_extension_plugin = { path = "../extension-plugin" } moon_plugin = { path = "../plugin" } +moon_process = { path = "../process" } moon_project = { path = "../project" } moon_project_graph = { path = "../project-graph" } moon_query = { path = "../query" } diff --git a/crates/app/src/commands/node/run_script.rs b/crates/app/src/commands/node/run_script.rs index 527c56516fc..49028cf04b0 100644 --- a/crates/app/src/commands/node/run_script.rs +++ b/crates/app/src/commands/node/run_script.rs @@ -55,7 +55,7 @@ pub async fn run_script(session: CliSession, args: RunScriptArgs) -> AppResult { )); } - command.create_async().exec_stream_output().await?; + command.exec_stream_output().await?; Ok(None) } diff --git a/crates/app/src/session.rs b/crates/app/src/session.rs index e7faa5c8e36..a2f10e4bcf8 100644 --- a/crates/app/src/session.rs +++ b/crates/app/src/session.rs @@ -13,6 +13,7 @@ use moon_console_reporter::DefaultReporter; use moon_env::MoonEnvironment; use moon_extension_plugin::*; use moon_plugin::{PluginHostData, PluginId}; +use moon_process::ProcessRegistry; use moon_project_graph::ProjectGraph; use moon_task_graph::TaskGraph; use moon_toolchain_plugin::*; @@ -335,6 +336,11 @@ impl AppSession for CliSession { } async fn shutdown(&mut self) -> AppResult { + // Ensure all child processes have finished running + ProcessRegistry::instance() + .wait_for_running_to_shutdown(true) + .await; + self.console.close()?; Ok(None) diff --git a/crates/codegen/src/codegen.rs b/crates/codegen/src/codegen.rs index 74abe880e49..cc288daa8de 100644 --- a/crates/codegen/src/codegen.rs +++ b/crates/codegen/src/codegen.rs @@ -274,7 +274,6 @@ async fn clone_and_checkout_git_repository( .args(args) .cwd(cwd) .without_shell() - .create_async() .exec_capture_output() .await?; diff --git a/crates/console-reporter/src/default_reporter.rs b/crates/console-reporter/src/default_reporter.rs index e8d49e38f06..3781ba0fdb4 100644 --- a/crates/console-reporter/src/default_reporter.rs +++ b/crates/console-reporter/src/default_reporter.rs @@ -1,4 +1,6 @@ -use moon_action::{Action, ActionNode, ActionStatus, Operation, OperationList}; +use moon_action::{ + Action, ActionNode, ActionPipelineStatus, ActionStatus, Operation, OperationList, +}; use moon_common::color::paint; use moon_common::{color, is_test_env}; use moon_config::TaskOutputStyle; @@ -249,7 +251,16 @@ impl DefaultReporter { }; let mut elapsed_time = time::elapsed(item.duration.unwrap_or_default()); - if passed_count == cached_count && failed_count == 0 { + if matches!( + item.status, + ActionPipelineStatus::Interrupted | ActionPipelineStatus::Terminated + ) { + elapsed_time = format!( + "{} {}", + elapsed_time, + color::muted_light(format!("({:?})", item.status).to_lowercase()) + ); + } else if passed_count == cached_count && failed_count == 0 { elapsed_time = format!("{} {}", elapsed_time, label_to_the_moon()); } @@ -321,6 +332,12 @@ impl Reporter for DefaultReporter { return Ok(()); } + // A task failed, so instead of showing the stats, + // we'll render the error that was bubbled up + if matches!(item.status, ActionPipelineStatus::Aborted) { + return Ok(()); + } + // If no summary, only show stats. This is typically for local! if !item.summarize { self.out.write_newline()?; diff --git a/crates/console/src/reporter.rs b/crates/console/src/reporter.rs index 627a240cd63..af4d2d08b72 100644 --- a/crates/console/src/reporter.rs +++ b/crates/console/src/reporter.rs @@ -1,7 +1,7 @@ use crate::buffer::ConsoleBuffer; use crate::console::ConsoleTheme; use miette::Error as Report; -use moon_action::{Action, ActionNode, Operation, OperationList}; +use moon_action::{Action, ActionNode, ActionPipelineStatus, Operation, OperationList}; use moon_config::TaskOutputStyle; use moon_target::Target; use std::sync::Arc; @@ -11,6 +11,7 @@ use std::time::Duration; pub struct PipelineReportItem { pub duration: Option, pub summarize: bool, + pub status: ActionPipelineStatus, } #[derive(Clone, Debug, Default)] @@ -41,15 +42,6 @@ pub trait Reporter: Send + Sync { Ok(()) } - fn on_pipeline_aborted( - &self, - _actions: &[Action], - _item: &PipelineReportItem, - _error: Option<&Report>, - ) -> miette::Result<()> { - Ok(()) - } - fn on_action_started(&self, _action: &Action) -> miette::Result<()> { Ok(()) } diff --git a/crates/process/Cargo.toml b/crates/process/Cargo.toml index f3b7cc3f28b..8160e7c0985 100644 --- a/crates/process/Cargo.toml +++ b/crates/process/Cargo.toml @@ -20,7 +20,10 @@ starbase_shell = { workspace = true } system_env = { workspace = true } thiserror = { workspace = true } tracing = { workspace = true } -tokio = { workspace = true, features = ["io-util"] } +tokio = { workspace = true, features = ["io-util", "signal", "sync"] } + +[target.'cfg(unix)'.dependencies] +libc = "0.2.169" [lints] workspace = true diff --git a/crates/process/src/async_command.rs b/crates/process/src/async_command.rs deleted file mode 100644 index 8fb3c27f812..00000000000 --- a/crates/process/src/async_command.rs +++ /dev/null @@ -1,257 +0,0 @@ -use crate::command_inspector::CommandInspector; -use crate::output_to_error; -use crate::process_error::ProcessError; -use moon_console::Console; -use std::process::{Output, Stdio}; -use std::sync::{Arc, RwLock}; -use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; -use tokio::process::{Child, Command}; -use tokio::task; - -pub struct AsyncCommand<'cmd> { - pub console: Option>, - pub inner: Command, - pub inspector: CommandInspector<'cmd>, - - pub current_id: Option, -} - -impl AsyncCommand<'_> { - pub async fn exec_capture_output(&mut self) -> miette::Result { - self.inspector.log_command(); - - let command = &mut self.inner; - let output: Output; - - if self.inspector.should_pass_stdin() { - let mut child = command - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .map_err(|error| ProcessError::Capture { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - - self.write_input_to_child(&mut child).await?; - - self.current_id = child.id(); - - output = child - .wait_with_output() - .await - .map_err(|error| ProcessError::Capture { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - } else { - output = command - .output() - .await - .map_err(|error| ProcessError::Capture { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - } - - self.handle_nonzero_status(&output, true)?; - - Ok(output) - } - - pub async fn exec_stream_output(&mut self) -> miette::Result { - self.inspector.log_command(); - - let command = &mut self.inner; - let mut child: Child; - - if self.inspector.should_pass_stdin() { - child = - command - .stdin(Stdio::piped()) - .spawn() - .map_err(|error| ProcessError::Stream { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - - self.write_input_to_child(&mut child).await?; - } else { - child = command.spawn().map_err(|error| ProcessError::Stream { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - }; - - self.current_id = child.id(); - - let status = child.wait().await.map_err(|error| ProcessError::Stream { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - - let output = Output { - status, - stderr: vec![], - stdout: vec![], - }; - - self.handle_nonzero_status(&output, false)?; - - Ok(output) - } - - pub async fn exec_stream_and_capture_output(&mut self) -> miette::Result { - self.inspector.log_command(); - - let command = &mut self.inner; - - let mut child = command - .stdin(if self.inspector.should_pass_stdin() { - Stdio::piped() - } else { - Stdio::inherit() - }) - .stderr(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() - .map_err(|error| ProcessError::StreamCapture { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - - self.current_id = child.id(); - - if self.inspector.should_pass_stdin() { - self.write_input_to_child(&mut child).await?; - } - - // We need to log the child process output to the parent terminal - // AND capture stdout/stderr so that we can cache it for future runs. - // This doesn't seem to be supported natively by `Stdio`, so I have - // this *real ugly* implementation to solve it. There's gotta be a - // better way to do this? - // https://stackoverflow.com/a/49063262 - let stderr = BufReader::new(child.stderr.take().unwrap()); - let stdout = BufReader::new(child.stdout.take().unwrap()); - let mut handles = vec![]; - - let captured_stderr = Arc::new(RwLock::new(vec![])); - let captured_stdout = Arc::new(RwLock::new(vec![])); - let captured_stderr_clone = Arc::clone(&captured_stderr); - let captured_stdout_clone = Arc::clone(&captured_stdout); - - let prefix = Arc::new(self.inspector.get_prefix()); - let stderr_prefix = Arc::clone(&prefix); - let stdout_prefix = Arc::clone(&prefix); - - let console = self - .console - .as_ref() - .expect("A console is required when streaming output!"); - let stderr_stream = Arc::new(console.stderr().to_owned()); - let stdout_stream = Arc::new(console.stdout().to_owned()); - - handles.push(task::spawn(async move { - let mut lines = stderr.lines(); - let mut captured_lines = vec![]; - - while let Ok(Some(line)) = lines.next_line().await { - let _ = if let Some(prefix) = &*stderr_prefix { - stderr_stream.write_line_with_prefix(&line, prefix) - } else { - stderr_stream.write_line(&line) - }; - - captured_lines.push(line); - } - - captured_stderr_clone - .write() - .unwrap() - .extend(captured_lines); - })); - - handles.push(task::spawn(async move { - let mut lines = stdout.lines(); - let mut captured_lines = vec![]; - - while let Ok(Some(line)) = lines.next_line().await { - let _ = if let Some(prefix) = &*stdout_prefix { - stdout_stream.write_line_with_prefix(&line, prefix) - } else { - stdout_stream.write_line(&line) - }; - - captured_lines.push(line); - } - - captured_stdout_clone - .write() - .unwrap() - .extend(captured_lines); - })); - - for handle in handles { - let _ = handle.await; - } - - // Attempt to create the child output - let status = child - .wait() - .await - .map_err(|error| ProcessError::StreamCapture { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - - let output = Output { - status, - stdout: captured_stdout.read().unwrap().join("\n").into_bytes(), - stderr: captured_stderr.read().unwrap().join("\n").into_bytes(), - }; - - self.handle_nonzero_status(&output, true)?; - - Ok(output) - } - - fn get_bin_name(&self) -> String { - self.inner - .as_std() - .get_program() - .to_string_lossy() - .to_string() - } - - fn handle_nonzero_status(&mut self, output: &Output, with_message: bool) -> miette::Result<()> { - self.current_id = None; - - if self.inspector.should_error_nonzero() && !output.status.success() { - return Err(output_to_error(self.get_bin_name(), output, with_message).into()); - } - - Ok(()) - } - - async fn write_input_to_child(&self, child: &mut Child) -> miette::Result<()> { - let input = &self.inspector.get_command_line().input; - - let mut stdin = child.stdin.take().unwrap_or_else(|| { - panic!("Unable to write stdin: {}", input.to_string_lossy()); - }); - - stdin - .write_all(input.as_encoded_bytes()) - .await - .map_err(|error| ProcessError::WriteInput { - bin: self.get_bin_name(), - error: Box::new(error), - })?; - - drop(stdin); - - Ok(()) - } -} diff --git a/crates/process/src/command.rs b/crates/process/src/command.rs index 822bcdbe4c5..ddb300181f3 100644 --- a/crates/process/src/command.rs +++ b/crates/process/src/command.rs @@ -1,22 +1,24 @@ -use crate::{async_command::AsyncCommand, command_inspector::CommandInspector, shell::Shell}; -use moon_common::color; +// This implementation is loosely based on Cargo's: +// https://github.com/rust-lang/cargo/blob/master/crates/cargo-util/src/process_builder.rs + +use crate::shell::Shell; +use moon_common::{color, is_test_env}; use moon_console::Console; -use rustc_hash::FxHashMap; +use rustc_hash::{FxHashMap, FxHasher}; +use std::hash::Hasher; use std::{ ffi::{OsStr, OsString}, - path::{Path, PathBuf}, sync::Arc, }; -use tokio::process::Command as TokioCommand; pub struct Command { pub args: Vec, pub bin: OsString, - pub cwd: Option, + pub cwd: Option, - pub env: FxHashMap, + pub env: FxHashMap>, /// Convert non-zero exits to errors pub error_on_nonzero: bool, @@ -57,12 +59,12 @@ impl Command { } } - pub fn arg>(&mut self, arg: A) -> &mut Command { + pub fn arg>(&mut self, arg: A) -> &mut Self { self.args.push(arg.as_ref().to_os_string()); self } - pub fn arg_if_missing>(&mut self, arg: A) -> &mut Command { + pub fn arg_if_missing>(&mut self, arg: A) -> &mut Self { let arg = arg.as_ref(); let present = self.args.iter().any(|a| a == arg); @@ -73,7 +75,7 @@ impl Command { self } - pub fn args(&mut self, args: I) -> &mut Command + pub fn args(&mut self, args: I) -> &mut Self where I: IntoIterator, S: AsRef, @@ -85,43 +87,24 @@ impl Command { self } - pub fn cwd>(&mut self, dir: P) -> &mut Command { - self.cwd = Some(dir.as_ref().to_path_buf()); + pub fn cwd>(&mut self, dir: P) -> &mut Self { + self.cwd = Some(dir.as_ref().to_os_string()); self } - pub fn create_async(&self) -> AsyncCommand { - let inspector = self.inspect(); - let command_line = inspector.get_command_line(); - - let mut command = TokioCommand::new(&command_line.command[0]); - command.args(&command_line.command[1..]); - command.envs(&self.env); - command.kill_on_drop(true); - - if let Some(cwd) = &self.cwd { - command.current_dir(cwd); - } - - AsyncCommand { - console: self.console.clone(), - inner: command, - inspector, - current_id: None, - } - } - - pub fn env(&mut self, key: K, val: V) -> &mut Command + pub fn env(&mut self, key: K, val: V) -> &mut Self where K: AsRef, V: AsRef, { - self.env - .insert(key.as_ref().to_os_string(), val.as_ref().to_os_string()); + self.env.insert( + key.as_ref().to_os_string(), + Some(val.as_ref().to_os_string()), + ); self } - pub fn env_if_missing(&mut self, key: K, val: V) -> &mut Command + pub fn env_if_missing(&mut self, key: K, val: V) -> &mut Self where K: AsRef, V: AsRef, @@ -133,7 +116,15 @@ impl Command { self } - pub fn envs(&mut self, vars: I) -> &mut Command + pub fn env_remove(&mut self, key: K) -> &mut Self + where + K: AsRef, + { + self.env.insert(key.as_ref().to_os_string(), None); + self + } + + pub fn envs(&mut self, vars: I) -> &mut Self where I: IntoIterator, K: AsRef, @@ -146,11 +137,14 @@ impl Command { self } - pub fn inherit_colors(&mut self) -> &mut Command { + pub fn inherit_colors(&mut self) -> &mut Self { let level = color::supports_color().to_string(); - self.env("FORCE_COLOR", &level); - self.env("CLICOLOR_FORCE", &level); + if !is_test_env() { + self.env_remove("NO_COLOR"); + self.env("FORCE_COLOR", &level); + self.env("CLICOLOR_FORCE", &level); + } // Force a terminal width so that we have consistent sizing // in our cached output, and its the same across all machines @@ -161,7 +155,7 @@ impl Command { self } - pub fn input(&mut self, input: I) -> &mut Command + pub fn input(&mut self, input: I) -> &mut Self where I: IntoIterator, V: AsRef, @@ -173,36 +167,86 @@ impl Command { self } - pub fn inspect(&self) -> CommandInspector { - CommandInspector::new(self) + pub fn get_bin_name(&self) -> String { + self.bin.to_string_lossy().to_string() + } + + pub fn get_cache_key(&self) -> String { + let mut hasher = FxHasher::default(); + + let mut write = |value: &OsString| { + hasher.write(value.as_os_str().as_encoded_bytes()); + }; + + for (key, value) in &self.env { + if let Some(value) = value { + write(key); + write(value); + } + } + + write(&self.bin); + + for arg in &self.args { + write(arg); + } + + if let Some(cwd) = &self.cwd { + write(cwd); + } + + for arg in &self.input { + write(arg); + } + + format!("{}", hasher.finish()) + } + + pub fn get_prefix(&self) -> Option<&str> { + self.prefix.as_deref() } - pub fn set_print_command(&mut self, state: bool) -> &mut Command { + pub fn set_print_command(&mut self, state: bool) -> &mut Self { self.print_command = state; self } - pub fn set_error_on_nonzero(&mut self, state: bool) -> &mut Command { + pub fn set_error_on_nonzero(&mut self, state: bool) -> &mut Self { self.error_on_nonzero = state; self } - pub fn set_prefix(&mut self, prefix: &str) -> &mut Command { + pub fn set_prefix(&mut self, prefix: &str) -> &mut Self { self.prefix = Some(prefix.to_owned()); self } - pub fn with_console(&mut self, console: Arc) -> &mut Command { + pub fn should_error_nonzero(&self) -> bool { + self.error_on_nonzero + } + + pub fn should_pass_stdin(&self) -> bool { + !self.input.is_empty() || self.should_pass_args_stdin() + } + + pub fn should_pass_args_stdin(&self) -> bool { + self.shell + .as_ref() + .map(|shell| shell.command.pass_args_stdin) + .unwrap_or(false) + } + + pub fn with_console(&mut self, console: Arc) -> &mut Self { self.console = Some(console); self } - pub fn with_shell(&mut self, shell: Shell) -> &mut Command { + pub fn with_shell(&mut self, shell: Shell) -> &mut Self { self.shell = Some(shell); self } - pub fn without_shell(&mut self) -> &mut Command { + pub fn without_shell(&mut self) -> &mut Self { self.shell = None; self } diff --git a/crates/process/src/command_inspector.rs b/crates/process/src/command_inspector.rs deleted file mode 100644 index aac9147bb66..00000000000 --- a/crates/process/src/command_inspector.rs +++ /dev/null @@ -1,273 +0,0 @@ -use crate::command::Command; -use moon_args::join_args_os; -use moon_common::color; -use once_cell::sync::OnceCell; -use rustc_hash::FxHashMap; -use std::borrow::Cow; -use std::env; -use std::ffi::{OsStr, OsString}; -use std::fmt::{self, Display}; -use std::path::{Path, PathBuf, MAIN_SEPARATOR}; -use tracing::{debug, enabled}; - -type LineValue<'l> = Cow<'l, OsStr>; - -#[derive(Debug)] -pub struct CommandLine<'l> { - pub command: Vec>, - pub input: LineValue<'l>, - pub main_command: LineValue<'l>, -} - -impl CommandLine<'_> { - pub fn new(command: &Command) -> CommandLine { - let mut command_line: Vec = vec![]; - let mut input_line: Vec = vec![]; - let mut main_line: Vec = vec![]; - // let mut join_input = false; - - let push_to_line = |line: &mut Vec| { - line.push(Cow::Owned(command.bin.to_owned())); - - for arg in &command.args { - line.push(Cow::Owned(arg.to_owned())); - } - }; - - // Extract the main command, without shell, for other purposes! - push_to_line(&mut main_line); - - // If wrapped in a shell, the shell binary and arguments - // must be placed at the start of the line. - if let Some(shell) = &command.shell { - command_line.push(Cow::Borrowed(shell.bin.as_os_str())); - command_line.extend( - shell - .command - .shell_args - .iter() - .map(|arg| Cow::Borrowed(arg.as_os_str())), - ); - - // If the main command should be passed via stdin, - // then append the input line instead of the command line. - if shell.command.pass_args_stdin { - // join_input = true; - push_to_line(&mut input_line); - - // Otherwise append as a *single* argument. This typically - // appears after a "-" argument (should come from shell). - } else { - let mut sub_line: Vec = vec![]; - push_to_line(&mut sub_line); - - command_line.push(Cow::Owned(if command.escape_args { - join_args_os(sub_line) - } else { - sub_line.join(OsStr::new(" ")) - })); - } - - // Otherwise we have a normal command and arguments. - } else { - push_to_line(&mut command_line); - - // That also may have input. - if !command.input.is_empty() { - for input in &command.input { - input_line.push(Cow::Borrowed(input)); - } - } - } - - CommandLine { - command: command_line, - // input: if join_input { - // join_args(input_line) - // } else { - // input_line.join("") - // }, - input: Cow::Owned(input_line.join(OsStr::new(" "))), - main_command: Cow::Owned(join_args_os(main_line)), - } - } -} - -impl Display for CommandLine<'_> { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let command = join_args_os(&self.command); - let command = command.to_string_lossy(); - - write!(f, "{}", command)?; - - if !self.input.is_empty() { - let debug_input = env::var("MOON_DEBUG_PROCESS_INPUT").is_ok(); - let input = &self.input; - - if !command.ends_with('-') { - write!(f, " -")?; - } - - write!( - f, - " {}", - if input.len() > 200 && !debug_input { - "(truncated)".into() - } else { - input.to_string_lossy().trim().replace('\n', " ") - } - )?; - } - - Ok(()) - } -} - -pub struct CommandInspector<'cmd> { - command: &'cmd Command, - line_cache: OnceCell>, -} - -impl<'cmd> CommandInspector<'cmd> { - pub fn new(command: &'cmd Command) -> Self { - Self { - command, - line_cache: OnceCell::new(), - } - } - - pub fn get_cache_key(&self) -> String { - let line = self.get_command_line(); - - format!( - "{}::{}::{}", - line.command.join(OsStr::new(" ")).to_string_lossy(), - line.input.to_string_lossy(), - self.command - .cwd - .as_ref() - .and_then(|cwd| cwd.as_os_str().to_str()) - .unwrap_or_default() - ) - } - - pub fn get_command_line(&self) -> &CommandLine { - self.line_cache - .get_or_init(|| CommandLine::new(self.command)) - } - - pub fn get_prefix(&self) -> Option { - self.command.prefix.clone() - } - - pub fn get_workspace_root(&self) -> PathBuf { - let env_key = OsString::from("MOON_WORKSPACE_ROOT"); - - env::var_os(&env_key) - .or_else(|| self.command.env.get(&env_key).cloned()) - .map(PathBuf::from) - .unwrap_or_else(|| env::current_dir().unwrap_or(PathBuf::from("."))) - } - - pub fn should_error_nonzero(&self) -> bool { - self.command.error_on_nonzero - } - - pub fn should_pass_stdin(&self) -> bool { - !self.command.input.is_empty() || self.should_pass_args_stdin() - } - - pub fn should_pass_args_stdin(&self) -> bool { - self.command - .shell - .as_ref() - .map(|s| s.command.pass_args_stdin) - .unwrap_or(false) - } - - pub fn format_command( - &self, - line: &str, - workspace_root: &Path, - working_dir: Option<&Path>, - ) -> String { - let working_dir = working_dir.unwrap_or(workspace_root); - - let target_dir = if working_dir == workspace_root { - "workspace".into() - } else if let Ok(dir) = working_dir.strip_prefix(workspace_root) { - format!(".{}{}", MAIN_SEPARATOR, dir.to_string_lossy()) - } else { - debug!( - working_dir = ?working_dir, - workspace_root = ?workspace_root, - "Unable to determine the directory a task is running in...", - ); - - ".".into() - }; - - format!( - "{} {}", - color::muted_light(line.trim()), - color::muted(format!("(in {target_dir})")) - ) - } - - pub fn log_command(&self) { - let mut workspace_root = None; - - if self.command.print_command { - if let Some(cmd_line) = self.get_command_line().main_command.to_str() { - if let Some(console) = self.command.console.as_ref() { - if !console.out.is_quiet() { - workspace_root = Some(self.get_workspace_root()); - - let cmd_line = self.format_command( - cmd_line, - workspace_root.as_deref().unwrap(), - self.command.cwd.as_deref(), - ); - - let _ = console.out.write_line(cmd_line); - } - } - } - } - - // Avoid all this overhead if we're not logging - if !enabled!(tracing::Level::DEBUG) { - return; - } - - let debug_env = env::var("MOON_DEBUG_PROCESS_ENV").is_ok(); - - let env_vars_field = self - .command - .env - .iter() - .filter(|(key, _)| { - if debug_env { - true - } else { - key.to_str() - .map(|k| k.starts_with("MOON_")) - .unwrap_or_default() - } - }) - .collect::>(); - - if workspace_root.is_none() { - workspace_root = Some(self.get_workspace_root()); - } - - let working_dir_field = self.command.cwd.as_deref().or(workspace_root.as_deref()); - - debug!( - env_vars = ?env_vars_field, - working_dir = ?working_dir_field, - "Running command {}", - color::shell(self.get_command_line().to_string()) - ); - } -} diff --git a/crates/process/src/command_line.rs b/crates/process/src/command_line.rs new file mode 100644 index 00000000000..5cb8e4e17a4 --- /dev/null +++ b/crates/process/src/command_line.rs @@ -0,0 +1,123 @@ +use crate::command::Command; +use moon_args::join_args_os; +use moon_common::color; +use std::env; +use std::ffi::{OsStr, OsString}; +use std::fmt::{self, Display}; +use std::path::Path; + +#[derive(Debug)] +pub struct CommandLine { + pub command: Vec, + pub input: Vec, + pub shell: bool, +} + +impl CommandLine { + pub fn new(command: &Command) -> CommandLine { + let mut command_line: Vec = vec![]; + let mut input_line: Vec = vec![]; + let mut in_shell = false; + + // Extract the main command, without shell, for other purposes! + let mut main_line: Vec = vec![]; + main_line.push(command.bin.clone()); + + for arg in &command.args { + main_line.push(arg.to_owned()); + } + + // If wrapped in a shell, the shell binary and arguments + // must be placed at the start of the line. + if let Some(shell) = &command.shell { + in_shell = true; + command_line.push(shell.bin.as_os_str().to_owned()); + command_line.extend(shell.command.shell_args.clone()); + + // If the main command should be passed via stdin, + // then append the input line instead of the command line. + if shell.command.pass_args_stdin { + input_line.extend(main_line); + } + // Otherwise append as a *single* argument. This typically + // appears after a "-" argument (should come from shell). + else { + command_line.push(if command.escape_args { + join_args_os(main_line) + } else { + main_line.join(OsStr::new(" ")) + }); + } + + // Otherwise we have a normal command and arguments. + } else { + command_line.extend(main_line); + + // That also may have input. + if !command.input.is_empty() { + for input in &command.input { + input_line.push(input.to_owned()); + } + } + } + + CommandLine { + command: command_line, + input: input_line, + shell: in_shell, + } + } + + pub fn get_line(&self, with_shell: bool, with_input: bool) -> String { + let mut command = if !with_shell && self.shell { + self.command.last().cloned().unwrap_or_else(OsString::new) + } else { + join_args_os(&self.command) + }; + + if with_input && !self.input.is_empty() { + let debug_input = env::var("MOON_DEBUG_PROCESS_INPUT").is_ok(); + let input = join_args_os(&self.input); + + if command + .as_os_str() + .to_str() + .is_some_and(|cmd| cmd.ends_with('-')) + { + command.push(" "); + } else { + command.push(" - "); + } + + if input.len() > 200 && !debug_input { + command.push("(truncated)"); + } else { + command.push(&input); + } + } + + command.to_string_lossy().trim().replace('\n', " ") + } + + pub fn format(command: &str, workspace_root: &Path, working_dir: &Path) -> String { + let dir = if working_dir == workspace_root { + "workspace".into() + } else if let Ok(dir) = working_dir.strip_prefix(workspace_root) { + format!(".{}{}", std::path::MAIN_SEPARATOR, dir.to_string_lossy()) + } else { + ".".into() + }; + + format!( + "{} {}", + color::muted_light(command.trim()), + color::muted(format!("(in {dir})")) + ) + } +} + +impl Display for CommandLine { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.get_line(true, true)) + } +} diff --git a/crates/process/src/exec_command.rs b/crates/process/src/exec_command.rs new file mode 100644 index 00000000000..76612b24634 --- /dev/null +++ b/crates/process/src/exec_command.rs @@ -0,0 +1,456 @@ +use crate::command::Command; +use crate::command_line::CommandLine; +// use crate::output_stream::capture_stream; +use crate::output_to_error; +use crate::process_error::ProcessError; +use crate::process_registry::ProcessRegistry; +use crate::shared_child::SharedChild; +use moon_common::color; +use rustc_hash::FxHashMap; +use std::env; +use std::ffi::{OsStr, OsString}; +use std::path::PathBuf; +use std::process::{Output, Stdio}; +use std::sync::{Arc, RwLock}; +use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; +use tokio::process::{Child, Command as TokioCommand}; +use tokio::task; +use tracing::{debug, enabled}; + +impl Command { + pub async fn exec_capture_output(&mut self) -> miette::Result { + let registry = ProcessRegistry::instance(); + let (mut command, line) = self.create_async_command(); + + let child = if self.should_pass_stdin() { + command + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let mut child = command.spawn().map_err(|error| ProcessError::Capture { + bin: self.get_bin_name(), + error: Box::new(error), + })?; + + self.write_input_to_child(&mut child, &line).await?; + + child + } else { + command.stdout(Stdio::piped()).stderr(Stdio::piped()); + + command.spawn().map_err(|error| ProcessError::Capture { + bin: self.get_bin_name(), + error: Box::new(error), + })? + }; + + let shared_child = registry.add_running(child).await; + + self.log_command(&line, &shared_child); + + let result = shared_child + .wait_with_output() + .await + .map_err(|error| ProcessError::Capture { + bin: self.get_bin_name(), + error: Box::new(error), + }); + + registry.remove_running(shared_child).await; + + let output = result?; + + self.handle_nonzero_status(&output, true)?; + + Ok(output) + } + + pub async fn exec_stream_output(&mut self) -> miette::Result { + let registry = ProcessRegistry::instance(); + let (mut command, line) = self.create_async_command(); + + let child = if self.should_pass_stdin() { + command.stdin(Stdio::piped()); + + let mut child = command.spawn().map_err(|error| ProcessError::Stream { + bin: self.get_bin_name(), + error: Box::new(error), + })?; + + self.write_input_to_child(&mut child, &line).await?; + + child + } else { + command.spawn().map_err(|error| ProcessError::Stream { + bin: self.get_bin_name(), + error: Box::new(error), + })? + }; + + let shared_child = registry.add_running(child).await; + + self.log_command(&line, &shared_child); + + let result = shared_child + .wait() + .await + .map_err(|error| ProcessError::Stream { + bin: self.get_bin_name(), + error: Box::new(error), + }); + + registry.remove_running(shared_child).await; + + let status = result?; + let output = Output { + status, + stderr: vec![], + stdout: vec![], + }; + + self.handle_nonzero_status(&output, false)?; + + Ok(output) + } + + pub async fn exec_stream_and_capture_output(&mut self) -> miette::Result { + let registry = ProcessRegistry::instance(); + let (mut command, line) = self.create_async_command(); + + command + .stdin(if self.should_pass_stdin() { + Stdio::piped() + } else { + Stdio::inherit() + }) + .stderr(Stdio::piped()) + .stdout(Stdio::piped()); + + let mut child = command + .spawn() + .map_err(|error| ProcessError::StreamCapture { + bin: self.get_bin_name(), + error: Box::new(error), + })?; + + if self.should_pass_stdin() { + self.write_input_to_child(&mut child, &line).await?; + } + + let shared_child = registry.add_running(child).await; + + // We need to log the child process output to the parent terminal + // AND capture stdout/stderr so that we can cache it for future runs. + // This doesn't seem to be supported natively by `Stdio`, so I have + // this *real ugly* implementation to solve it. There's gotta be a + // better way to do this? + // https://stackoverflow.com/a/49063262 + let stderr = BufReader::new(shared_child.take_stderr().await.unwrap()); + let stdout = BufReader::new(shared_child.take_stdout().await.unwrap()); + let mut handles = vec![]; + + let captured_stderr = Arc::new(RwLock::new(vec![])); + let captured_stdout = Arc::new(RwLock::new(vec![])); + let captured_stderr_clone = Arc::clone(&captured_stderr); + let captured_stdout_clone = Arc::clone(&captured_stdout); + + let prefix = Arc::new(self.get_prefix().map(|prefix| prefix.to_owned())); + let stderr_prefix = Arc::clone(&prefix); + let stdout_prefix = Arc::clone(&prefix); + + let console = self + .console + .as_ref() + .expect("A console is required when streaming output!"); + let stderr_stream = Arc::new(console.stderr().to_owned()); + let stdout_stream = Arc::new(console.stdout().to_owned()); + + handles.push(task::spawn(async move { + let mut lines = stderr.lines(); + let mut captured_lines = vec![]; + + while let Ok(Some(line)) = lines.next_line().await { + let _ = if let Some(prefix) = &*stderr_prefix { + stderr_stream.write_line_with_prefix(&line, prefix) + } else { + stderr_stream.write_line(&line) + }; + + captured_lines.push(line); + } + + captured_stderr_clone + .write() + .unwrap() + .extend(captured_lines); + })); + + handles.push(task::spawn(async move { + let mut lines = stdout.lines(); + let mut captured_lines = vec![]; + + while let Ok(Some(line)) = lines.next_line().await { + let _ = if let Some(prefix) = &*stdout_prefix { + stdout_stream.write_line_with_prefix(&line, prefix) + } else { + stdout_stream.write_line(&line) + }; + + captured_lines.push(line); + } + + captured_stdout_clone + .write() + .unwrap() + .extend(captured_lines); + })); + + for handle in handles { + let _ = handle.await; + } + + self.log_command(&line, &shared_child); + + // Attempt to create the child output + let result = shared_child + .wait() + .await + .map_err(|error| ProcessError::StreamCapture { + bin: self.get_bin_name(), + error: Box::new(error), + }); + + registry.remove_running(shared_child).await; + + let status = result?; + let output = Output { + status, + stdout: captured_stdout.read().unwrap().join("\n").into_bytes(), + stderr: captured_stderr.read().unwrap().join("\n").into_bytes(), + }; + + self.handle_nonzero_status(&output, true)?; + + Ok(output) + } + + // pub async fn exec_stream_and_capture_output_new(&mut self) -> miette::Result { + // let registry = ProcessRegistry::instance(); + // let (mut command, line) = self.create_async_command(); + + // let mut child = command + // .stdin(if self.should_pass_stdin() { + // Stdio::piped() + // } else { + // Stdio::inherit() + // }) + // .stderr(Stdio::piped()) + // .stdout(Stdio::piped()) + // .spawn() + // .map_err(|error| ProcessError::StreamCapture { + // bin: self.get_bin_name(), + // error: Box::new(error), + // })?; + + // if self.should_pass_stdin() { + // self.write_input_to_child(&mut child, &line).await?; + // } + + // let shared_child = registry.add_running(child).await; + + // // Stream and attempt to capture the output + // let stderr = shared_child.take_stderr().await.unwrap(); + // let mut stderr_buffer = Vec::new(); + // let mut stderr_pos = 0; + + // let stdout = shared_child.take_stdout().await.unwrap(); + // let mut stdout_buffer = Vec::new(); + // let mut stdout_pos = 0; + + // let prefix = self.get_prefix(); + // let console = self + // .console + // .as_ref() + // .expect("A console is required when streaming output!"); + + // capture_stream(stdout, stderr, &mut |is_out, data, eof| { + // let (pos, buf) = if is_out { + // (&mut stdout_pos, &mut stdout_buffer) + // } else { + // (&mut stderr_pos, &mut stderr_buffer) + // }; + + // let idx = if eof { + // data.len() + // } else { + // match data[*pos..].iter().rposition(|b| *b == b'\n') { + // Some(i) => *pos + i + 1, + // None => { + // *pos = data.len(); + // return; + // } + // } + // }; + + // let new_lines = &data[..idx]; + + // for line in String::from_utf8_lossy(new_lines).lines() { + // let stream = if is_out { &console.out } else { &console.err }; + + // let _ = if let Some(p) = &prefix { + // stream.write_line_with_prefix(line.trim(), p) + // } else { + // stream.write_line(line.trim()) + // }; + // } + + // buf.extend(new_lines); + // data.drain(..idx); + // *pos = 0; + // }) + // .await + // .map_err(|error| ProcessError::StreamCapture { + // bin: self.get_bin_name(), + // error: Box::new(error), + // })?; + + // self.log_command(&line, &shared_child); + + // // Attempt to create the child output + // let result = shared_child + // .wait() + // .await + // .map_err(|error| ProcessError::StreamCapture { + // bin: self.get_bin_name(), + // error: Box::new(error), + // }); + + // registry.remove_running(shared_child).await; + + // let status = result?; + // let output = Output { + // status, + // stdout: stdout_buffer, + // stderr: stderr_buffer, + // }; + + // self.handle_nonzero_status(&output, true)?; + + // Ok(output) + // } + + fn create_async_command(&self) -> (TokioCommand, CommandLine) { + let command_line = self.create_command_line(); + + let mut command = TokioCommand::new(&command_line.command[0]); + command.args(&command_line.command[1..]); + + for (key, value) in &self.env { + if let Some(value) = value { + command.env(key, value); + } else { + command.env_remove(key); + } + } + + if let Some(cwd) = &self.cwd { + command.current_dir(cwd); + } + + (command, command_line) + } + + fn create_command_line(&self) -> CommandLine { + CommandLine::new(self) + } + + fn handle_nonzero_status(&mut self, output: &Output, with_message: bool) -> miette::Result<()> { + if self.should_error_nonzero() && !output.status.success() { + return Err(output_to_error(self.get_bin_name(), output, with_message).into()); + } + + Ok(()) + } + + fn log_command(&self, line: &CommandLine, child: &SharedChild) { + let workspace_env_key = OsString::from("MOON_WORKSPACE_ROOT"); + let workspace_root = if let Some(Some(value)) = self.env.get(&workspace_env_key) { + PathBuf::from(value) + } else { + env::var_os(&workspace_env_key).map_or_else( + || env::current_dir().unwrap_or(PathBuf::from(".")), + PathBuf::from, + ) + }; + let working_dir = PathBuf::from(self.cwd.as_deref().unwrap_or(workspace_root.as_os_str())); + + if let Some(console) = self.console.as_ref() { + if self.print_command && !console.out.is_quiet() { + let _ = console.out.write_line(CommandLine::format( + &line.get_line(false, false), + &workspace_root, + &working_dir, + )); + } + } + + // Avoid all this overhead if we're not logging + if !enabled!(tracing::Level::DEBUG) { + return; + } + + let debug_env = env::var("MOON_DEBUG_PROCESS_ENV").is_ok(); + let env_vars: FxHashMap<&OsString, &OsString> = self + .env + .iter() + .filter_map(|(key, value)| { + if value.is_none() { + None + } else if debug_env + || key + .to_str() + .map(|k| k.starts_with("MOON_")) + .unwrap_or_default() + { + Some((key, value.as_ref().unwrap())) + } else { + None + } + }) + .collect(); + + debug!( + pid = child.id(), + shell = self.shell.as_ref().map(|sh| &sh.bin_name), + env = ?env_vars, + cwd = ?working_dir, + "Running command {}", + color::shell(line.to_string()) + ); + } + + async fn write_input_to_child( + &self, + child: &mut Child, + line: &CommandLine, + ) -> miette::Result<()> { + let input = line.input.join(OsStr::new(" ")); + + let mut stdin = child.stdin.take().unwrap_or_else(|| { + panic!("Unable to write stdin: {}", input.to_string_lossy()); + }); + + stdin + .write_all(input.as_encoded_bytes()) + .await + .map_err(|error| ProcessError::WriteInput { + bin: self.get_bin_name(), + error: Box::new(error), + })?; + + drop(stdin); + + Ok(()) + } +} diff --git a/crates/process/src/lib.rs b/crates/process/src/lib.rs index 413365410ac..273c7434820 100644 --- a/crates/process/src/lib.rs +++ b/crates/process/src/lib.rs @@ -1,13 +1,20 @@ -mod async_command; mod command; -mod command_inspector; +mod command_line; +mod exec_command; mod output; +// mod output_stream; mod process_error; +mod process_registry; +mod shared_child; mod shell; +mod signal; -pub use async_command::*; pub use command::*; +pub use command_line::*; pub use moon_args as args; pub use output::*; pub use process_error::*; +pub use process_registry::*; +pub use shared_child::*; pub use shell::*; +pub use signal::*; diff --git a/crates/process/src/output_stream.rs b/crates/process/src/output_stream.rs new file mode 100644 index 00000000000..cfae2257695 --- /dev/null +++ b/crates/process/src/output_stream.rs @@ -0,0 +1,203 @@ +// This code is copied from Cargo, but rewritten to support tokio/async. +// Original copyright belongs to them! +// https://github.com/rust-lang/cargo/blob/master/crates/cargo-util/src/read2.rs + +pub use self::imp::capture_stream; + +#[cfg(unix)] +mod imp { + use libc::{c_int, fcntl, F_GETFL, F_SETFL, O_NONBLOCK}; + use std::io; + use std::mem; + use std::os::unix::prelude::*; + use tokio::io::{AsyncBufReadExt, BufReader}; + use tokio::process::{ChildStderr, ChildStdout}; + + fn set_nonblock(fd: c_int) -> io::Result<()> { + let flags = unsafe { fcntl(fd, F_GETFL) }; + + if flags == -1 || unsafe { fcntl(fd, F_SETFL, flags | O_NONBLOCK) } == -1 { + return Err(io::Error::last_os_error()); + } + + Ok(()) + } + + pub async fn capture_stream( + out_pipe: ChildStdout, + err_pipe: ChildStderr, + data: &mut (dyn FnMut(bool, &mut Vec, bool) + Send), + ) -> io::Result<()> { + let out_fd = out_pipe.as_raw_fd(); + let err_fd = err_pipe.as_raw_fd(); + + set_nonblock(out_fd)?; + set_nonblock(err_fd)?; + + let mut out_buf = BufReader::new(out_pipe); + let mut err_buf = BufReader::new(err_pipe); + let mut out_done = false; + let mut err_done = false; + let mut out = String::new(); + let mut err = String::new(); + + let mut fds: [libc::pollfd; 2] = unsafe { mem::zeroed() }; + fds[0].fd = out_fd; + fds[0].events = libc::POLLIN; + fds[1].fd = err_fd; + fds[1].events = libc::POLLIN; + let mut nfds = 2; + let mut errfd = 1; + + while nfds > 0 { + // Wait for either pipe to become readable using `poll` + let r = unsafe { libc::poll(fds.as_mut_ptr(), nfds, -1) }; + + if r == -1 { + let err = io::Error::last_os_error(); + + if err.kind() == io::ErrorKind::Interrupted { + continue; + } + + return Err(err); + } + + // Read as much as we can from each pipe, ignoring EWOULDBLOCK or + // EAGAIN. If we hit EOF, then this will happen because the underlying + // reader will return Ok(0), in which case we'll see `Ok` ourselves. In + // this case we flip the other fd back into blocking mode and read + // whatever's leftover on that file descriptor. + let handle = |res: io::Result| match res { + Ok(size) => Ok(size == 0), + Err(e) => { + if e.kind() == io::ErrorKind::WouldBlock { + Ok(false) + } else { + Err(e) + } + } + }; + + if !err_done && fds[errfd].revents != 0 && handle(err_buf.read_line(&mut err).await)? { + err_done = true; + nfds -= 1; + } + + data(false, &mut mem::take(&mut err).into_bytes(), err_done); + + if !out_done && fds[0].revents != 0 && handle(out_buf.read_line(&mut out).await)? { + out_done = true; + fds[0].fd = err_fd; + errfd = 0; + nfds -= 1; + } + + data(true, &mut mem::take(&mut out).into_bytes(), out_done); + } + Ok(()) + } +} + +#[cfg(windows)] +mod imp { + use std::io; + use std::os::windows::prelude::*; + use std::process::{ChildStderr, ChildStdout}; + use std::slice; + + use miow::iocp::{CompletionPort, CompletionStatus}; + use miow::pipe::NamedPipe; + use miow::Overlapped; + use windows_sys::Win32::Foundation::ERROR_BROKEN_PIPE; + + struct Pipe<'a> { + dst: &'a mut Vec, + overlapped: Overlapped, + pipe: NamedPipe, + done: bool, + } + + pub fn read2( + out_pipe: ChildStdout, + err_pipe: ChildStderr, + data: &mut dyn FnMut(bool, &mut Vec, bool), + ) -> io::Result<()> { + let mut out = Vec::new(); + let mut err = Vec::new(); + + let port = CompletionPort::new(1)?; + port.add_handle(0, &out_pipe)?; + port.add_handle(1, &err_pipe)?; + + unsafe { + let mut out_pipe = Pipe::new(out_pipe, &mut out); + let mut err_pipe = Pipe::new(err_pipe, &mut err); + + out_pipe.read()?; + err_pipe.read()?; + + let mut status = [CompletionStatus::zero(), CompletionStatus::zero()]; + + while !out_pipe.done || !err_pipe.done { + for status in port.get_many(&mut status, None)? { + if status.token() == 0 { + out_pipe.complete(status); + data(true, out_pipe.dst, out_pipe.done); + out_pipe.read()?; + } else { + err_pipe.complete(status); + data(false, err_pipe.dst, err_pipe.done); + err_pipe.read()?; + } + } + } + + Ok(()) + } + } + + impl<'a> Pipe<'a> { + unsafe fn new(p: P, dst: &'a mut Vec) -> Pipe<'a> { + Pipe { + dst, + pipe: NamedPipe::from_raw_handle(p.into_raw_handle()), + overlapped: Overlapped::zero(), + done: false, + } + } + + unsafe fn read(&mut self) -> io::Result<()> { + let dst = slice_to_end(self.dst); + match self.pipe.read_overlapped(dst, self.overlapped.raw()) { + Ok(_) => Ok(()), + Err(e) => { + if e.raw_os_error() == Some(ERROR_BROKEN_PIPE as i32) { + self.done = true; + Ok(()) + } else { + Err(e) + } + } + } + } + + unsafe fn complete(&mut self, status: &CompletionStatus) { + let prev = self.dst.len(); + self.dst.set_len(prev + status.bytes_transferred() as usize); + if status.bytes_transferred() == 0 { + self.done = true; + } + } + } + + unsafe fn slice_to_end(v: &mut Vec) -> &mut [u8] { + if v.capacity() == 0 { + v.reserve(16); + } + if v.capacity() == v.len() { + v.reserve(1); + } + slice::from_raw_parts_mut(v.as_mut_ptr().add(v.len()), v.capacity() - v.len()) + } +} diff --git a/crates/process/src/process_registry.rs b/crates/process/src/process_registry.rs new file mode 100644 index 00000000000..a6dfcf637f7 --- /dev/null +++ b/crates/process/src/process_registry.rs @@ -0,0 +1,164 @@ +use crate::shared_child::*; +use crate::signal::*; +use core::time::Duration; +use rustc_hash::FxHashMap; +use std::sync::{Arc, OnceLock}; +use tokio::process::Child; +use tokio::sync::broadcast::{self, error::RecvError, Receiver, Sender}; +use tokio::sync::RwLock; +use tokio::task::JoinHandle; +use tokio::time::sleep; +use tracing::{debug, trace, warn}; + +static INSTANCE: OnceLock> = OnceLock::new(); +const TERMINATE_WAIT_MS: u16 = 2000; // 2 seconds + +pub struct ProcessRegistry { + running: Arc>>, + signal_sender: Sender, + signal_wait_handle: JoinHandle<()>, + signal_shutdown_handle: JoinHandle<()>, +} + +impl Default for ProcessRegistry { + fn default() -> Self { + let processes = Arc::new(RwLock::new(FxHashMap::default())); + let processes_bg = Arc::clone(&processes); + + let (sender, receiver) = broadcast::channel::(10); + let sender_bg = sender.clone(); + + let signal_wait_handle = tokio::spawn(async move { + wait_for_signal(sender_bg).await; + }); + + let signal_shutdown_handle = tokio::spawn(async move { + shutdown_processes_with_signal(receiver, processes_bg).await; + }); + + Self { + running: processes, + signal_sender: sender, + signal_wait_handle, + signal_shutdown_handle, + } + } +} + +impl ProcessRegistry { + pub fn instance() -> Arc { + Arc::clone(INSTANCE.get_or_init(|| Arc::new(ProcessRegistry::default()))) + } + + pub async fn add_running(&self, child: Child) -> SharedChild { + let shared = SharedChild::new(child); + + self.running + .write() + .await + .insert(shared.id(), shared.clone()); + + shared + } + + pub async fn get_running_by_pid(&self, id: u32) -> Option { + self.running.read().await.get(&id).cloned() + } + + pub async fn remove_running(&self, child: SharedChild) { + self.remove_running_by_pid(child.id()).await + } + + pub async fn remove_running_by_pid(&self, id: u32) { + self.running.write().await.remove(&id); + } + + pub fn receive_signal(&self) -> Receiver { + self.signal_sender.subscribe() + } + + pub fn terminate_running(&self) { + let _ = self.signal_sender.send(SignalType::Terminate); + } + + pub async fn wait_for_running_to_shutdown(&self, terminate: bool) { + let mut count = 0; + let mut terminated = false; + + loop { + if terminate { + // After a few seconds of waiting, terminate all running, + // as some of them may have "press ctrl+c again" logic + if !terminated && count >= (TERMINATE_WAIT_MS / 2) { + self.terminate_running(); + terminated = true; + } + + // After many seconds of waiting, just exit immediately + if count >= TERMINATE_WAIT_MS { + break; + } + } + + // Wait for all running processes to have stopped + if self.running.read().await.is_empty() { + break; + } + + sleep(Duration::from_millis(50)).await; + count += 50; + } + } +} + +impl Drop for ProcessRegistry { + fn drop(&mut self) { + self.terminate_running(); + self.signal_wait_handle.abort(); + self.signal_shutdown_handle.abort(); + } +} + +async fn shutdown_processes_with_signal( + mut receiver: Receiver, + processes: Arc>>, +) { + loop { + match receiver.recv().await { + Ok(_) | Err(RecvError::Closed) => break, + _ => continue, + }; + } + + let mut children = processes.write().await; + + if children.is_empty() { + return; + } + + // Force kill after 3 seconds. This aligns with the + // `wait_for_running_to_shutdown` method above! + sleep(Duration::from_millis(TERMINATE_WAIT_MS as u64)).await; + + debug!( + pids = ?children.keys().collect::>(), + "Killing {} running child processes", + children.len() + ); + + let mut futures = vec![]; + + for (pid, child) in children.drain() { + futures.push(tokio::spawn(async move { + trace!(pid, "Killing child process"); + + if let Err(error) = child.kill_with_signal(SignalType::Kill).await { + warn!(pid, "Failed to kill child process: {error}"); + } + })); + } + + for future in futures { + let _ = future.await; + } +} diff --git a/crates/process/src/shared_child.rs b/crates/process/src/shared_child.rs new file mode 100644 index 00000000000..840fd30e239 --- /dev/null +++ b/crates/process/src/shared_child.rs @@ -0,0 +1,123 @@ +use crate::signal::*; +use std::io; +use std::process::{ExitStatus, Output}; +use std::sync::Arc; +use tokio::process::{Child, ChildStderr, ChildStdin, ChildStdout}; +use tokio::sync::Mutex; + +#[derive(Clone)] +pub struct SharedChild { + inner: Arc>, + pid: u32, + #[cfg(windows)] + handle: RawHandle, +} + +impl SharedChild { + #[cfg(unix)] + pub fn new(child: Child) -> Self { + Self { + pid: child.id().unwrap(), + inner: Arc::new(Mutex::new(child)), + } + } + + #[cfg(windows)] + pub fn new(child: Child) -> Self { + Self { + pid: child.id().unwrap(), + handle: RawHandle(child.raw_handle().unwrap()), + inner: Arc::new(Mutex::new(child)), + } + } + + pub fn id(&self) -> u32 { + self.pid + } + + pub async fn take_stdin(&self) -> Option { + self.inner.lock().await.stdin.take() + } + + pub async fn take_stdout(&self) -> Option { + self.inner.lock().await.stdout.take() + } + + pub async fn take_stderr(&self) -> Option { + self.inner.lock().await.stderr.take() + } + + pub async fn kill(&self) -> io::Result<()> { + let mut child = self.inner.lock().await; + + child.kill().await?; + + Ok(()) + } + + pub async fn kill_with_signal( + &self, + #[cfg(unix)] signal: SignalType, + #[cfg(windows)] _signal: SignalType, + ) -> io::Result<()> { + // https://github.com/rust-lang/rust/blob/master/library/std/src/sys/pal/unix/process/process_unix.rs#L940 + #[cfg(unix)] + { + kill(self.pid, signal)?; + } + + // https://github.com/rust-lang/rust/blob/master/library/std/src/sys/pal/windows/process.rs#L658 + #[cfg(windows)] + { + terminate(self.handle.clone())?; + } + + // Acquire the child _after_ the kill command, otherwise it waits for + // the command to finish running before killing, because the lock is + // currently owned by `wait` or `wait_with_output`! + self.wait().await?; + + Ok(()) + } + + pub(crate) async fn wait(&self) -> io::Result { + let mut child = self.inner.lock().await; + + child.wait().await + } + + // This method re-implements the tokio `wait_with_output` method + // but does not take ownership of self. This is required to be able + // to call `kill`, otherwise the child does not exist. + pub(crate) async fn wait_with_output(&self) -> io::Result { + use tokio::{io::AsyncReadExt, try_join}; + + async fn read_to_end(data: &mut Option) -> io::Result> { + let mut vec = Vec::new(); + + if let Some(data) = data.as_mut() { + data.read_to_end(&mut vec).await?; + } + + Ok(vec) + } + + let mut child = self.inner.lock().await; + let mut stdout_pipe = child.stdout.take(); + let mut stderr_pipe = child.stderr.take(); + + let stdout_fut = read_to_end(&mut stdout_pipe); + let stderr_fut = read_to_end(&mut stderr_pipe); + + let (status, stdout, stderr) = try_join!(child.wait(), stdout_fut, stderr_fut)?; + + drop(stdout_pipe); + drop(stderr_pipe); + + Ok(Output { + status, + stdout, + stderr, + }) + } +} diff --git a/crates/process/src/shell.rs b/crates/process/src/shell.rs index 26e81357725..6015d418843 100644 --- a/crates/process/src/shell.rs +++ b/crates/process/src/shell.rs @@ -21,18 +21,15 @@ fn get_default_shell() -> ShellType { #[inline] pub fn is_windows_script>(bin: T) -> bool { - let bin = bin.as_ref().to_string_lossy(); - - bin.ends_with(".cmd") - || bin.ends_with(".bat") - || bin.ends_with(".ps1") - || bin.ends_with(".CMD") - || bin.ends_with(".BAT") - || bin.ends_with(".PS1") + bin.as_ref() + .to_str() + .map(|bin| bin.to_lowercase()) + .is_some_and(|bin| bin.ends_with(".cmd") || bin.ends_with(".bat") || bin.ends_with(".ps1")) } pub struct Shell { pub bin: PathBuf, + pub bin_name: String, pub command: ShellCommand, } @@ -42,7 +39,8 @@ impl Shell { let command = type_of.build().get_exec_command(); Self { - bin: find_command_on_path(bin_name.clone()).unwrap_or_else(|| bin_name.into()), + bin: find_command_on_path(bin_name.clone()).unwrap_or_else(|| bin_name.clone().into()), + bin_name, command, } } diff --git a/crates/process/src/signal.rs b/crates/process/src/signal.rs new file mode 100644 index 00000000000..ca8b0767124 --- /dev/null +++ b/crates/process/src/signal.rs @@ -0,0 +1,134 @@ +// https://www.math.stonybrook.edu/~ccc/dfc/dfc/signals.html +// https://sunshowers.io/posts/beyond-ctrl-c-signals/ + +use std::io; +use tokio::sync::broadcast::Sender; +use tracing::debug; + +#[derive(Clone, Copy, Debug)] +pub enum SignalType { + Interrupt, + Kill, + Quit, + Terminate, +} + +#[cfg(unix)] +mod unix { + use super::*; + + pub async fn wait_for_signal(sender: Sender) { + use tokio::signal::unix::{signal, SignalKind}; + + debug!("Listening for SIGINT, SIGQUIT, and SIGTERM signals"); + + let mut signal_terminate = signal(SignalKind::terminate()).unwrap(); + let mut signal_interrupt = signal(SignalKind::interrupt()).unwrap(); + let mut signal_quit = signal(SignalKind::quit()).unwrap(); + + let _ = tokio::select! { + _ = signal_terminate.recv() => { + debug!("Received SIGTERM signal"); + sender.send(SignalType::Terminate) + }, + _ = signal_interrupt.recv() => { + debug!("Received SIGINT signal"); + sender.send(SignalType::Interrupt) + }, + _ = signal_quit.recv() => { + debug!("Received SIGQUIT signal"); + sender.send(SignalType::Quit) + }, + }; + } + + pub fn kill(pid: u32, signal: SignalType) -> io::Result<()> { + let result = unsafe { + libc::kill( + pid as i32, + match signal { + SignalType::Interrupt => 2, // SIGINT + SignalType::Quit => 3, // SIGQUIT + SignalType::Kill => 9, // SIGKILL + SignalType::Terminate => 15, // SIGTERM + }, + ) + }; + + if result != 0 { + let error = io::Error::last_os_error(); + + // "No such process" error, so it may have been killed already + // https://man7.org/linux/man-pages/man3/errno.3.html + if error.raw_os_error().is_some_and(|code| code == 3) { + return Ok(()); + } + + return Err(error); + } + + Ok(()) + } +} + +#[cfg(unix)] +pub use unix::*; + +#[cfg(windows)] +mod windows { + use super::*; + use std::os::raw::{c_int, c_uint, c_void}; + + pub async fn wait_for_signal(sender: Sender) { + use tokio::signal::windows; + + debug!("Listening for CTRL-C, BREAK, CLOSE, and SHUTDOWN signals"); + + let mut signal_c = windows::ctrl_c().unwrap(); + let mut signal_break = windows::ctrl_break().unwrap(); + let mut signal_close = windows::ctrl_close().unwrap(); + let mut signal_shutdown = windows::ctrl_shutdown().unwrap(); + + let _ = tokio::select! { + _ = signal_c.recv() => { + debug!("Received CTRL-C signal"); + sender.send(SignalType::Interrupt) + }, + _ = signal_break.recv() => { + debug!("Received CTRL-BREAK signal"); + sender.send(SignalType::Interrupt) + }, + _ = signal_close.recv() => { + debug!("Received CTRL-CLOSE signal"); + sender.send(SignalType::Quit) + }, + _ = signal_shutdown.recv() => { + debug!("Received CTRL-SHUTDOWN signal"); + sender.send(SignalType::Terminate) + }, + }; + } + + // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess + // https://docs.rs/windows-sys/latest/windows_sys/Win32/System/Threading/fn.TerminateProcess.html + extern "system" { + fn TerminateProcess(hProcess: *mut c_void, uExitCode: c_uint) -> c_int; + } + + #[derive(Clone)] + pub struct RawHandle(pub *mut c_void); + + unsafe impl Send for RawHandle {} + unsafe impl Sync for RawHandle {} + + pub fn terminate(handle: RawHandle) -> io::Result<()> { + if unsafe { TerminateProcess(handle.0, 1) } == 0 { + Err(io::Error::last_os_error()) + } else { + Ok(()) + } + } +} + +#[cfg(windows)] +pub use windows::*; diff --git a/crates/task-runner/src/command_executor.rs b/crates/task-runner/src/command_executor.rs index 4d11db1ede3..8e88eab2fb3 100644 --- a/crates/task-runner/src/command_executor.rs +++ b/crates/task-runner/src/command_executor.rs @@ -1,10 +1,10 @@ use moon_action::{ActionNode, ActionStatus, Operation, OperationList}; use moon_action_context::{ActionContext, TargetState}; use moon_app_context::AppContext; -use moon_common::{color, is_ci, is_test_env}; +use moon_common::{is_ci, is_test_env}; use moon_config::TaskOutputStyle; use moon_console::TaskReportItem; -use moon_process::{args::join_args, AsyncCommand, Command}; +use moon_process::{args::join_args, Command, CommandLine}; use moon_project::Project; use moon_task::Task; use std::process::Output; @@ -108,7 +108,7 @@ impl<'task> CommandExecutor<'task> { // Attempt to execute command async fn execute_command( - mut command: AsyncCommand<'_>, + command: &mut Command, stream: bool, interactive: bool, ) -> miette::Result { @@ -134,7 +134,7 @@ impl<'task> CommandExecutor<'task> { // Or run the job to completion result = execute_command( - self.command.create_async(), + &mut self.command, self.stream, self.interactive, ) => result.map(Some), @@ -340,22 +340,25 @@ impl<'task> CommandExecutor<'task> { } } + // We don't use `Command::print_command` because we need to explicitly + // control the workspace root and working directory! fn print_command_line(&self, command_line: &str) -> miette::Result<()> { if !self.app.workspace_config.runner.log_running_command { return Ok(()); } - let message = color::muted_light(self.command.inspect().format_command( + let workspace_root = &self.app.workspace_root; + let working_dir = if self.task.options.run_from_workspace_root { + &self.app.workspace_root + } else { + &self.project.root + }; + + self.app.console.out.write_line(CommandLine::format( command_line, - &self.app.workspace_root, - Some(if self.task.options.run_from_workspace_root { - &self.app.workspace_root - } else { - &self.project.root - }), - )); - - self.app.console.out.write_line(message)?; + workspace_root, + working_dir, + ))?; Ok(()) } diff --git a/crates/task-runner/src/task_runner.rs b/crates/task-runner/src/task_runner.rs index f20aff3de6f..b2fcc144ddb 100644 --- a/crates/task-runner/src/task_runner.rs +++ b/crates/task-runner/src/task_runner.rs @@ -404,11 +404,6 @@ impl<'task> TaskRunner<'task> { let mut operation = Operation::hash_generation(); // Hash common fields - trace!( - task_target = self.task.target.as_str(), - "Including common task related fields in the hash" - ); - let mut task_hasher = TaskHasher::new( self.project, self.task, @@ -446,12 +441,6 @@ impl<'task> TaskRunner<'task> { hasher.hash_content(task_hasher.hash())?; // Hash toolchain fields - trace!( - task_target = self.task.target.as_str(), - toolchains = ?self.task.toolchains.iter().map(|tc| tc.as_str()).collect::>(), - "Including toolchain specific fields in the hash" - ); - self.platform_manager .get_by_toolchains(&self.task.toolchains)? .hash_run_target( @@ -785,10 +774,6 @@ impl<'task> TaskRunner<'task> { if let Some(output) = operation.get_output_mut() { output.exit_code = Some(-1); - - if let Some(error) = report { - output.set_stderr(error.to_string()); - } } operation.finish(ActionStatus::Aborted); diff --git a/crates/task-runner/tests/command_builder_test.rs b/crates/task-runner/tests/command_builder_test.rs index b43c17877d2..b53a7e2f8ee 100644 --- a/crates/task-runner/tests/command_builder_test.rs +++ b/crates/task-runner/tests/command_builder_test.rs @@ -15,7 +15,7 @@ fn get_env<'a>(command: &'a Command, key: &str) -> Option<&'a str> { command .env .get(&OsString::from(key)) - .map(|v| v.to_str().unwrap()) + .map(|v| v.as_ref().unwrap().to_str().unwrap()) } fn get_args(command: &Command) -> Vec<&str> { @@ -34,7 +34,10 @@ mod command_builder { let container = TaskRunnerContainer::new("builder", "base").await; let command = container.create_command(ActionContext::default()).await; - assert_eq!(command.cwd, Some(container.sandbox.path().join("project"))); + assert_eq!( + command.cwd.as_deref(), + Some(container.sandbox.path().join("project").as_os_str()) + ); } #[tokio::test] @@ -46,7 +49,10 @@ mod command_builder { }) .await; - assert_eq!(command.cwd, Some(container.sandbox.path().to_path_buf())); + assert_eq!( + command.cwd.as_deref(), + Some(container.sandbox.path().as_os_str()) + ); } mod args { diff --git a/crates/vcs/src/process_cache.rs b/crates/vcs/src/process_cache.rs index d5459cce8f7..ddcfdf1a852 100644 --- a/crates/vcs/src/process_cache.rs +++ b/crates/vcs/src/process_cache.rs @@ -85,12 +85,11 @@ impl ProcessCache { pub async fn run_command_with_formatter( &self, - command: Command, + mut command: Command, trim: bool, format: impl FnOnce(String) -> String, ) -> miette::Result> { - let mut executor = command.create_async(); - let cache_key = executor.inspector.get_cache_key(); + let cache_key = command.get_cache_key(); // First check if the data has already been cached if let Some(cache) = self.cache.read_async(&cache_key, |_, v| v.clone()).await { @@ -101,7 +100,7 @@ impl ProcessCache { let cache = match self.cache.entry_async(cache_key).await { Entry::Occupied(o) => o.get().clone(), Entry::Vacant(v) => { - let output = executor.exec_capture_output().await?; + let output = command.exec_capture_output().await?; let value = output_to_string(&output.stdout); let cache = Arc::new(format(if trim { value.trim().to_owned() } else { value })); @@ -116,11 +115,10 @@ impl ProcessCache { pub async fn run_command_without_cache( &self, - command: Command, + mut command: Command, trim: bool, ) -> miette::Result> { - let mut executor = command.create_async(); - let output = executor.exec_capture_output().await?; + let output = command.exec_capture_output().await?; let value = output_to_string(&output.stdout); Ok(Arc::new(if trim { value.trim().to_owned() } else { value })) diff --git a/legacy/bun/tool/src/bun_tool.rs b/legacy/bun/tool/src/bun_tool.rs index 4cef5f8d939..7160fa6ffdd 100644 --- a/legacy/bun/tool/src/bun_tool.rs +++ b/legacy/bun/tool/src/bun_tool.rs @@ -93,7 +93,7 @@ impl BunTool { cmd.arg("bun.lockb"); cmd.cwd(cwd); - let output = cmd.create_async().exec_capture_output().await?; + let output = cmd.exec_capture_output().await?; Arc::new(output_to_string(&output.stdout)) }; @@ -270,8 +270,6 @@ impl DependencyManager<()> for BunTool { .cwd(working_dir) .set_print_command(log); - let mut cmd = cmd.create_async(); - if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { cmd.exec_capture_output().await?; } else { @@ -295,7 +293,7 @@ impl DependencyManager<()> for BunTool { cmd.arg("--production"); } - cmd.create_async().exec_stream_output().await?; + cmd.exec_stream_output().await?; Ok(()) } diff --git a/legacy/deno/platform/src/deno_platform.rs b/legacy/deno/platform/src/deno_platform.rs index 244452141c5..c2655c10822 100644 --- a/legacy/deno/platform/src/deno_platform.rs +++ b/legacy/deno/platform/src/deno_platform.rs @@ -303,7 +303,6 @@ impl Platform for DenoPlatform { deno.create_command(&())? .args(args) .cwd(working_dir) - .create_async() .exec_stream_output() .await }) diff --git a/legacy/deno/tool/src/deno_tool.rs b/legacy/deno/tool/src/deno_tool.rs index 9caa9f98aed..d39d282146a 100644 --- a/legacy/deno/tool/src/deno_tool.rs +++ b/legacy/deno/tool/src/deno_tool.rs @@ -224,8 +224,6 @@ impl DependencyManager<()> for DenoTool { cmd.cwd(working_dir).set_print_command(log); - let mut cmd = cmd.create_async(); - if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { cmd.exec_capture_output().await?; } else { diff --git a/legacy/node/tool/src/bun_tool.rs b/legacy/node/tool/src/bun_tool.rs index 2d1c8c79cf0..8454149964f 100644 --- a/legacy/node/tool/src/bun_tool.rs +++ b/legacy/node/tool/src/bun_tool.rs @@ -89,7 +89,7 @@ impl BunTool { cmd.arg("bun.lockb"); cmd.cwd(cwd); - let output = cmd.create_async().exec_capture_output().await?; + let output = cmd.exec_capture_output().await?; Arc::new(output_to_string(&output.stdout)) }; @@ -263,8 +263,6 @@ impl DependencyManager for BunTool { .cwd(working_dir) .set_print_command(log); - let mut cmd = cmd.create_async(); - if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { cmd.exec_capture_output().await?; } else { @@ -289,7 +287,7 @@ impl DependencyManager for BunTool { // cmd.arg("--production"); // } - cmd.create_async().exec_stream_output().await?; + cmd.exec_stream_output().await?; Ok(()) } diff --git a/legacy/node/tool/src/node_tool.rs b/legacy/node/tool/src/node_tool.rs index 17ce7329f28..215d4e99edd 100644 --- a/legacy/node/tool/src/node_tool.rs +++ b/legacy/node/tool/src/node_tool.rs @@ -154,11 +154,7 @@ impl NodeTool { } }; - cmd.args(args) - .cwd(working_dir) - .create_async() - .exec_stream_output() - .await?; + cmd.args(args).cwd(working_dir).exec_stream_output().await?; Ok(()) } diff --git a/legacy/node/tool/src/npm_tool.rs b/legacy/node/tool/src/npm_tool.rs index e9b4484f233..1e11aa08c63 100644 --- a/legacy/node/tool/src/npm_tool.rs +++ b/legacy/node/tool/src/npm_tool.rs @@ -154,7 +154,6 @@ impl DependencyManager for NpmTool { .args(["dedupe"]) .cwd(working_dir) .set_print_command(log) - .create_async() .exec_capture_output() .await?; @@ -209,8 +208,6 @@ impl DependencyManager for NpmTool { .cwd(working_dir) .set_print_command(log); - let mut cmd = cmd.create_async(); - if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { cmd.exec_capture_output().await?; } else { @@ -238,7 +235,7 @@ impl DependencyManager for NpmTool { cmd.args(["--workspace", package_name]); } - cmd.create_async().exec_stream_output().await?; + cmd.exec_stream_output().await?; Ok(()) } diff --git a/legacy/node/tool/src/pnpm_tool.rs b/legacy/node/tool/src/pnpm_tool.rs index 3ae225ce14b..02cb763f242 100644 --- a/legacy/node/tool/src/pnpm_tool.rs +++ b/legacy/node/tool/src/pnpm_tool.rs @@ -177,7 +177,6 @@ impl DependencyManager for PnpmTool { .arg("dedupe") .cwd(working_dir) .set_print_command(log) - .create_async() .exec_capture_output() .await?; @@ -227,8 +226,6 @@ impl DependencyManager for PnpmTool { .cwd(working_dir) .set_print_command(log); - let mut cmd = cmd.create_async(); - if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { cmd.exec_capture_output().await?; } else { @@ -263,7 +260,7 @@ impl DependencyManager for PnpmTool { cmd.arg(format!("{package}...")); } - cmd.create_async().exec_stream_output().await?; + cmd.exec_stream_output().await?; Ok(()) } diff --git a/legacy/node/tool/src/yarn_tool.rs b/legacy/node/tool/src/yarn_tool.rs index 4170bb6d5a8..a049c7a0914 100644 --- a/legacy/node/tool/src/yarn_tool.rs +++ b/legacy/node/tool/src/yarn_tool.rs @@ -70,7 +70,6 @@ impl YarnTool { for plugin in &self.config.plugins { self.create_command(node)? .args(["plugin", "import", plugin]) - .create_async() .exec_capture_output() .await?; } @@ -207,7 +206,6 @@ impl DependencyManager for YarnTool { .arg("dedupe") .cwd(working_dir) .set_print_command(log) - .create_async() .exec_capture_output() .await?; } else { @@ -261,8 +259,6 @@ impl DependencyManager for YarnTool { .cwd(working_dir) .set_print_command(log); - let mut cmd = cmd.create_async(); - if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { cmd.exec_capture_output().await?; } else { @@ -304,7 +300,7 @@ impl DependencyManager for YarnTool { cmd.arg("--production"); } - cmd.create_async().exec_stream_output().await?; + cmd.exec_stream_output().await?; Ok(()) } diff --git a/legacy/python/tool/src/python_tool.rs b/legacy/python/tool/src/python_tool.rs index 54bee3df22f..37bf2fe21a1 100644 --- a/legacy/python/tool/src/python_tool.rs +++ b/legacy/python/tool/src/python_tool.rs @@ -106,7 +106,7 @@ impl PythonTool { cmd.env("PROTO_PYTHON_VERSION", version); } - cmd.create_async().exec_stream_output().await?; + cmd.exec_stream_output().await?; Ok(()) } diff --git a/legacy/rust/tool/src/rust_tool.rs b/legacy/rust/tool/src/rust_tool.rs index 606eaab089d..cb6c86a7f5f 100644 --- a/legacy/rust/tool/src/rust_tool.rs +++ b/legacy/rust/tool/src/rust_tool.rs @@ -88,7 +88,6 @@ impl RustTool { ) .cwd(working_dir) .with_console(self.console.clone()) - .create_async() .exec_stream_output() .await?; @@ -109,7 +108,6 @@ impl RustTool { ) .cwd(working_dir) .with_console(self.console.clone()) - .create_async() .exec_stream_output() .await?; diff --git a/package.json b/package.json index 7e161b7d7a6..b4ecbc2f2e3 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ }, "workspaces": [ "packages/*", + "scenarios/*", "website" ], "engines": { diff --git a/scenarios/signals/moon.yml b/scenarios/signals/moon.yml new file mode 100644 index 00000000000..3418c660b88 --- /dev/null +++ b/scenarios/signals/moon.yml @@ -0,0 +1,22 @@ +language: 'javascript' + +tasks: + dev-1: + command: 'node signals.mjs' + preset: 'server' + dev-2: + command: 'node signals.mjs' + preset: 'server' + dev-3: + command: 'node signals.mjs' + preset: 'server' + dev: + deps: ['dev-1', 'dev-2', 'dev-3'] + +toolchain: + typescript: + disabled: true + +workspace: + inheritedTasks: + include: [] diff --git a/scenarios/signals/signals.mjs b/scenarios/signals/signals.mjs new file mode 100644 index 00000000000..53be1af4082 --- /dev/null +++ b/scenarios/signals/signals.mjs @@ -0,0 +1,21 @@ +let target = process.env.MOON_TARGET; + +console.log(`[${target}] Running`); + +for (let event of ['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGTERM', 'SIGBREAK']) { + process.on(event, (signal, code) => { + console.log(`[${target}] Received ${signal} (${code})!`); + + // Give moon some time to kill it + if (target !== 'signals:dev-2') { + setTimeout(() => { + process.exit(128 + code); + }, 2500); + } + }); +} + +// Cause the process to take a while! +await new Promise((resolve) => { + setTimeout(resolve, 30000); +}); diff --git a/tsconfig.json b/tsconfig.json index 8a469614b6b..528eab34904 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,9 @@ { "path": "packages/visualizer" }, + { + "path": "scenarios/signals" + }, { "path": "website" } From 618dc883c0084ee6ad5ad43fca322c0c71fe8823 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Fri, 31 Jan 2025 20:44:49 -0800 Subject: [PATCH 13/15] new: Add uv support for Python. (#1810) * Add config. * Add pip tool. * Start on uv tool. * More work. * Add tests. * Polish. * Add uv lock. * Rework hashing. --- .prototools | 2 + CHANGELOG.md | 5 + Cargo.lock | 125 ++++++---- crates/cli/tests/run_python_test.rs | 123 ++++++---- ...thon__pip__runs_install_deps_via_args.snap | 12 + ...on_test__python__runs_standard_script.snap | 11 + crates/config/src/toolchain/python_config.rs | 72 +++++- crates/config/src/toolchain_config.rs | 11 + crates/hash/src/deps_hash.rs | 6 +- legacy/core/test-utils/src/configs.rs | 1 + legacy/python/lang/Cargo.toml | 7 +- legacy/python/lang/src/lib.rs | 4 +- legacy/python/lang/src/pip.rs | 25 ++ legacy/python/lang/src/pip_requirements.rs | 33 --- legacy/python/lang/src/uv.rs | 53 ++++ .../platform/src/actions/install_deps.rs | 100 ++++---- legacy/python/platform/src/python_platform.rs | 121 ++++++--- legacy/python/tool/src/lib.rs | 4 + legacy/python/tool/src/pip_tool.rs | 180 ++++++++++++++ legacy/python/tool/src/python_tool.rs | 109 ++++++++- legacy/python/tool/src/uv_tool.rs | 230 ++++++++++++++++++ packages/types/src/toolchain-config.ts | 60 ++++- tests/fixtures/python-uv/base/.gitignore | 1 + tests/fixtures/python-uv/base/moon.yml | 12 + tests/fixtures/python-uv/base/pyproject.toml | 6 + website/static/schemas/toolchain.json | 99 ++++++-- 26 files changed, 1156 insertions(+), 256 deletions(-) create mode 100644 crates/cli/tests/snapshots/run_python_test__python__pip__runs_install_deps_via_args.snap create mode 100644 crates/cli/tests/snapshots/run_python_test__python__runs_standard_script.snap create mode 100644 legacy/python/lang/src/pip.rs delete mode 100644 legacy/python/lang/src/pip_requirements.rs create mode 100644 legacy/python/lang/src/uv.rs create mode 100644 legacy/python/tool/src/pip_tool.rs create mode 100644 legacy/python/tool/src/uv_tool.rs create mode 100644 tests/fixtures/python-uv/base/.gitignore create mode 100644 tests/fixtures/python-uv/base/moon.yml create mode 100644 tests/fixtures/python-uv/base/pyproject.toml diff --git a/.prototools b/.prototools index 5eca81bb9c3..f8dbadd86a3 100644 --- a/.prototools +++ b/.prototools @@ -5,6 +5,8 @@ deno = "2.1.7" node = "20.8.0" npm = "10.1.0" pkl = "0.27.2" +python = "3.11.10" +uv = "0.5.26" [plugins] pkl = "https://raw.githubusercontent.com/milesj/proto-plugins/refs/heads/master/pkl.toml" diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b76c5397f3..fee8561c0ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,11 @@ - Added support for v3 and v4 lockfiles (we now use the `deno_lockfile` crate). - Added basic support for workspaces. - Added `deno.installArgs` setting. +- Improved the Python toolchain. + - Added unstable uv support. Can be enabled with the new `python.packageManager` setting. + - Right now, has basic toolchain support, including dependency install and virtual environments. + - Renamed `python.rootRequirementsOnly` to `python.rootVenvOnly`. + - Will now inherit versions from the root `.prototools`. - Improved the Rust toolchain. - The root-level project is now properly taken into account when detecting the package workspaces. - Project dependencies (`dependsOn`) are now automatically inferred from `Cargo.toml` diff --git a/Cargo.lock b/Cargo.lock index d15494d23bf..d5081a37409 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -654,6 +654,12 @@ dependencies = [ "piper", ] +[[package]] +name = "boxcar" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2721c3c5a6f0e7f7e607125d963fedeb765f545f67adc9d71ed934693881eb42" + [[package]] name = "bstr" version = "1.11.3" @@ -984,19 +990,6 @@ dependencies = [ "phf_codegen", ] -[[package]] -name = "chumsky" -version = "1.0.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9c28d4e5dd9a9262a38b231153591da6ce1471b818233f4727985d3dd0ed93c" -dependencies = [ - "hashbrown 0.14.5", - "regex-automata 0.3.9", - "serde", - "stacker", - "unicode-ident", -] - [[package]] name = "chunked_transfer" version = "1.5.0" @@ -4476,9 +4469,14 @@ dependencies = [ "cached", "miette 7.4.0", "moon_lang", + "moon_logger", "moon_test_utils", - "pep-508", + "pep508_rs", + "pyproject-toml", "rustc-hash 2.1.0", + "serde", + "starbase_styles", + "starbase_utils", ] [[package]] @@ -5394,12 +5392,38 @@ dependencies = [ ] [[package]] -name = "pep-508" -version = "0.4.0" +name = "pep440_rs" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56536b95df75cc5801a27ae2b53381d5d295fb30837be65f72916ecef5d1e4f" +checksum = "31095ca1f396e3de32745f42b20deef7bc09077f918b085307e8eab6ddd8fb9c" dependencies = [ - "chumsky", + "once_cell", + "serde", + "unicode-width 0.2.0", + "unscanny", + "version-ranges", +] + +[[package]] +name = "pep508_rs" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faee7227064121fcadcd2ff788ea26f0d8f2bd23a0574da11eca23bc935bcc05" +dependencies = [ + "boxcar", + "indexmap 2.7.1", + "itertools 0.13.0", + "once_cell", + "pep440_rs", + "regex", + "rustc-hash 2.1.0", + "serde", + "smallvec", + "thiserror 1.0.69", + "unicode-width 0.2.0", + "url", + "urlencoding", + "version-ranges", ] [[package]] @@ -5874,6 +5898,20 @@ dependencies = [ "sptr", ] +[[package]] +name = "pyproject-toml" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643af57c3f36ba90a8b53e972727d8092f7408a9ebfbaf4c3d2c17b07c58d835" +dependencies = [ + "indexmap 2.7.1", + "pep440_rs", + "pep508_rs", + "serde", + "thiserror 1.0.69", + "toml", +] + [[package]] name = "quinn" version = "0.11.6" @@ -6062,17 +6100,6 @@ dependencies = [ "regex-syntax 0.6.29", ] -[[package]] -name = "regex-automata" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.7.5", -] - [[package]] name = "regex-automata" version = "0.4.9" @@ -6090,12 +6117,6 @@ version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -6895,19 +6916,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "stacker" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.59.0", -] - [[package]] name = "starbase" version = "0.9.9" @@ -7849,6 +7857,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unscanny" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9df2af067a7953e9c3831320f35c1cc0600c30d44d9f7a12b01db1cd88d6b47" + [[package]] name = "untrusted" version = "0.9.0" @@ -7884,6 +7898,12 @@ dependencies = [ "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -7929,6 +7949,15 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-ranges" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8d079415ceb2be83fc355adbadafe401307d5c309c7e6ade6638e6f9f42f42d" +dependencies = [ + "smallvec", +] + [[package]] name = "version_check" version = "0.1.5" diff --git a/crates/cli/tests/run_python_test.rs b/crates/cli/tests/run_python_test.rs index f3367cda688..0913a6f1a86 100644 --- a/crates/cli/tests/run_python_test.rs +++ b/crates/cli/tests/run_python_test.rs @@ -1,27 +1,21 @@ -use moon_config::{PartialPipConfig, PartialPythonConfig}; +use moon_config::{PartialPipConfig, PartialPythonConfig, PartialUvConfig, PythonPackageManager}; use moon_test_utils::{ - assert_snapshot, create_sandbox_with_config, get_python_fixture_configs, Sandbox, + assert_snapshot, create_sandbox_with_config, get_python_fixture_configs, + predicates::prelude::*, Sandbox, }; use proto_core::UnresolvedVersionSpec; fn python_sandbox(config: PartialPythonConfig) -> Sandbox { - python_sandbox_with_config(|_| {}, config) + python_sandbox_with_config("python", config) } -fn python_sandbox_with_config(callback: C, config: PartialPythonConfig) -> Sandbox -where - C: FnOnce(&mut PartialPythonConfig), -{ +fn python_sandbox_with_config(fixture: &str, config: PartialPythonConfig) -> Sandbox { let (workspace_config, mut toolchain_config, tasks_config) = get_python_fixture_configs(); toolchain_config.python = Some(config); - if let Some(python_config) = &mut toolchain_config.python { - callback(python_config); - } - let sandbox = create_sandbox_with_config( - "python", + fixture, Some(workspace_config), Some(toolchain_config), Some(tasks_config), @@ -31,39 +25,76 @@ where sandbox } -#[test] -fn runs_standard_script() { - let sandbox = python_sandbox(PartialPythonConfig { - version: Some(UnresolvedVersionSpec::parse("3.11.10").unwrap()), - ..PartialPythonConfig::default() - }); - let assert = sandbox.run_moon(|cmd| { - cmd.arg("run").arg("python:standard"); - }); - - assert_snapshot!(assert.output()); -} +mod python { + use super::*; + + #[test] + fn runs_standard_script() { + let sandbox = python_sandbox(PartialPythonConfig { + version: Some(UnresolvedVersionSpec::parse("3.11.10").unwrap()), + ..PartialPythonConfig::default() + }); + let assert = sandbox.run_moon(|cmd| { + cmd.arg("run").arg("python:standard"); + }); + + assert_snapshot!(assert.output()); + } + + mod pip { + use super::*; + + #[test] + fn runs_install_deps_via_args() { + let sandbox = python_sandbox(PartialPythonConfig { + version: Some(UnresolvedVersionSpec::parse("3.11.10").unwrap()), + pip: Some(PartialPipConfig { + install_args: Some(vec![ + "--quiet".to_string(), + "--disable-pip-version-check".to_string(), + "poetry==1.8.4".to_string(), + ]), + }), + ..PartialPythonConfig::default() + }); + + // Needed for venv + sandbox.create_file("base/requirements.txt", ""); -#[test] -fn runs_install_deps_via_args() { - let sandbox = python_sandbox(PartialPythonConfig { - version: Some(UnresolvedVersionSpec::parse("3.11.10").unwrap()), - pip: Some(PartialPipConfig { - install_args: Some(vec![ - "--quiet".to_string(), - "--disable-pip-version-check".to_string(), - "poetry==1.8.4".to_string(), - ]), - }), - ..PartialPythonConfig::default() - }); - - // Needed for venv - sandbox.create_file("base/requirements.txt", ""); - - let assert = sandbox.run_moon(|cmd| { - cmd.arg("run").arg("python:poetry"); - }); - - assert_snapshot!(assert.output()); + let assert = sandbox.run_moon(|cmd| { + cmd.arg("run").arg("python:poetry"); + }); + + assert_snapshot!(assert.output()); + } + } + + mod uv { + use super::*; + + #[test] + fn runs_install_deps_via_args() { + let sandbox = python_sandbox_with_config( + "python-uv", + PartialPythonConfig { + version: Some(UnresolvedVersionSpec::parse("3.11.10").unwrap()), + package_manager: Some(PythonPackageManager::Uv), + uv: Some(PartialUvConfig { + version: Some(UnresolvedVersionSpec::parse("0.5.26").unwrap()), + ..PartialUvConfig::default() + }), + ..PartialPythonConfig::default() + }, + ); + + let assert = sandbox.run_moon(|cmd| { + cmd.arg("run").arg("python:uv"); + }); + + let output = assert.output(); + + assert!(predicate::str::contains("uv 0.5.26").eval(&output)); + assert!(predicate::str::contains("Creating virtual environment").eval(&output)); + } + } } diff --git a/crates/cli/tests/snapshots/run_python_test__python__pip__runs_install_deps_via_args.snap b/crates/cli/tests/snapshots/run_python_test__python__pip__runs_install_deps_via_args.snap new file mode 100644 index 00000000000..19b2cf9e1d1 --- /dev/null +++ b/crates/cli/tests/snapshots/run_python_test__python__pip__runs_install_deps_via_args.snap @@ -0,0 +1,12 @@ +--- +source: crates/cli/tests/run_python_test.rs +expression: assert.output() +--- +▪▪▪▪ python -m venv +▪▪▪▪ pip install +▪▪▪▪ python:poetry +Poetry (version 1.8.4) +▪▪▪▪ python:poetry (100ms) + +Tasks: 1 completed + Time: 100ms diff --git a/crates/cli/tests/snapshots/run_python_test__python__runs_standard_script.snap b/crates/cli/tests/snapshots/run_python_test__python__runs_standard_script.snap new file mode 100644 index 00000000000..745a3427f2f --- /dev/null +++ b/crates/cli/tests/snapshots/run_python_test__python__runs_standard_script.snap @@ -0,0 +1,11 @@ +--- +source: crates/cli/tests/run_python_test.rs +expression: assert.output() +--- +▪▪▪▪ pip install +▪▪▪▪ python:standard +Python 3.11.10 +▪▪▪▪ python:standard (100ms) + +Tasks: 1 completed + Time: 100ms diff --git a/crates/config/src/toolchain/python_config.rs b/crates/config/src/toolchain/python_config.rs index 30b7c21b7af..ffb78985107 100644 --- a/crates/config/src/toolchain/python_config.rs +++ b/crates/config/src/toolchain/python_config.rs @@ -1,27 +1,61 @@ -// use super::bin_config::BinEntry; -use schematic::Config; +use schematic::{derive_enum, Config, ConfigEnum}; use serde::Serialize; use version_spec::UnresolvedVersionSpec; use warpgate_api::PluginLocator; +#[cfg(feature = "proto")] +use crate::inherit_tool; + +derive_enum!( + /// The available package managers for Python. + #[derive(ConfigEnum, Copy, Default)] + pub enum PythonPackageManager { + #[default] + Pip, + Uv, + } +); + #[derive(Clone, Config, Debug, PartialEq, Serialize)] pub struct PipConfig { /// List of arguments to append to `pip install` commands. - pub install_args: Option>, + pub install_args: Vec, +} + +#[derive(Clone, Config, Debug, PartialEq, Serialize)] +pub struct UvConfig { + /// Location of the WASM plugin to use for uv support. + pub plugin: Option, + + /// List of arguments to append to `uv sync` commands. + pub sync_args: Vec, + + /// The version of uv to download, install, and run `uv` tasks with. + #[setting(env = "MOON_UV_VERSION")] + pub version: Option, } #[derive(Clone, Config, Debug, PartialEq)] pub struct PythonConfig { - /// Location of the WASM plugin to use for Python support. - pub plugin: Option, + /// The package manager to use for installing dependencies and managing + /// the virtual environment. + pub package_manager: PythonPackageManager, /// Options for pip, when used as a package manager. #[setting(nested)] - pub pip: Option, + pub pip: PipConfig, - /// Assumes only the root `requirements.txt` is used for dependencies. + /// Location of the WASM plugin to use for Python support. + pub plugin: Option, + + /// Assumes a workspace root virtual environment is used for dependencies. /// Can be used to support the "one version policy" pattern. - pub root_requirements_only: bool, + #[setting(alias = "rootRequirementsOnly")] + pub root_venv_only: bool, + + /// Options for uv, when used as a package manager. + #[setting(nested)] + pub uv: Option, /// Defines the virtual environment name, which will be created in the workspace root. /// Project dependencies will be installed into this. @@ -32,3 +66,25 @@ pub struct PythonConfig { #[setting(env = "MOON_PYTHON_VERSION")] pub version: Option, } + +#[cfg(feature = "proto")] +impl PythonConfig { + inherit_tool!(UvConfig, uv, "uv", inherit_proto_uv); + + pub fn inherit_proto(&mut self, proto_config: &proto_core::ProtoConfig) -> miette::Result<()> { + match &self.package_manager { + PythonPackageManager::Pip => { + // Built-in + } + PythonPackageManager::Uv => { + if self.uv.is_none() { + self.uv = Some(UvConfig::default()); + } + + self.inherit_proto_uv(proto_config)?; + } + } + + Ok(()) + } +} diff --git a/crates/config/src/toolchain_config.rs b/crates/config/src/toolchain_config.rs index 37f176d9945..7846863bab4 100644 --- a/crates/config/src/toolchain_config.rs +++ b/crates/config/src/toolchain_config.rs @@ -185,6 +185,12 @@ impl ToolchainConfig { if let Some(version) = &python_config.version { inject("PROTO_PYTHON_VERSION", version); } + + if let Some(uv_config) = &python_config.uv { + if let Some(version) = &uv_config.version { + inject("PROTO_UV_VERSION", version); + } + } } // We don't include Rust since it's a special case! @@ -220,6 +226,7 @@ impl ToolchainConfig { is_using_tool_version!(self, node, pnpm); is_using_tool_version!(self, node, yarn); is_using_tool_version!(self, python); + is_using_tool_version!(self, python, uv); is_using_tool_version!(self, rust); // Special case @@ -266,6 +273,10 @@ impl ToolchainConfig { }; } + if let Some(python_config) = &mut self.python { + python_config.inherit_proto(proto_config)?; + } + Ok(()) } } diff --git a/crates/hash/src/deps_hash.rs b/crates/hash/src/deps_hash.rs index c604dcdded0..3fe03add708 100644 --- a/crates/hash/src/deps_hash.rs +++ b/crates/hash/src/deps_hash.rs @@ -6,9 +6,9 @@ pub type DepsAliasesMap = BTreeMap; hash_content!( pub struct DepsHash<'cfg> { - aliases: BTreeMap<&'cfg str, BTreeMap<&'cfg str, &'cfg str>>, - dependencies: BTreeMap<&'cfg str, &'cfg str>, - name: String, + pub aliases: BTreeMap<&'cfg str, BTreeMap<&'cfg str, &'cfg str>>, + pub dependencies: BTreeMap<&'cfg str, &'cfg str>, + pub name: String, } ); diff --git a/legacy/core/test-utils/src/configs.rs b/legacy/core/test-utils/src/configs.rs index 5336ea0bf74..659e72b2ea2 100644 --- a/legacy/core/test-utils/src/configs.rs +++ b/legacy/core/test-utils/src/configs.rs @@ -498,6 +498,7 @@ pub fn get_python_fixture_configs() -> ( }; let mut toolchain_config = get_default_toolchain(); + toolchain_config.node = None; toolchain_config.python = Some(PartialPythonConfig { version: Some(UnresolvedVersionSpec::parse("3.11.10").unwrap()), ..PartialPythonConfig::default() diff --git a/legacy/python/lang/Cargo.toml b/legacy/python/lang/Cargo.toml index 4ca4c5cd01b..1a9eef194f6 100644 --- a/legacy/python/lang/Cargo.toml +++ b/legacy/python/lang/Cargo.toml @@ -6,10 +6,15 @@ publish = false [dependencies] moon_lang = { path = "../../core/lang" } +moon_logger = { path = "../../core/logger" } cached = { workspace = true } miette = { workspace = true } -pep-508 = "0.4.0" +pep508_rs = "0.9.2" +pyproject-toml = "0.13.4" rustc-hash = { workspace = true } +serde = { workspace = true } +starbase_styles = { workspace = true } +starbase_utils = { workspace = true, features = ["toml"] } [dev-dependencies] moon_test_utils = { path = "../../core/test-utils" } diff --git a/legacy/python/lang/src/lib.rs b/legacy/python/lang/src/lib.rs index 90a0e45a446..84f432ef667 100644 --- a/legacy/python/lang/src/lib.rs +++ b/legacy/python/lang/src/lib.rs @@ -1,4 +1,4 @@ -pub mod pip_requirements; +pub mod pip; +pub mod uv; pub use moon_lang::LockfileDependencyVersions; -pub use pip_requirements::*; diff --git a/legacy/python/lang/src/pip.rs b/legacy/python/lang/src/pip.rs new file mode 100644 index 00000000000..c007112221b --- /dev/null +++ b/legacy/python/lang/src/pip.rs @@ -0,0 +1,25 @@ +use cached::proc_macro::cached; +use moon_lang::LockfileDependencyVersions; +use pep508_rs::{Requirement, VerbatimUrl}; +use rustc_hash::FxHashMap; +use starbase_utils::fs; +use std::io; +use std::io::BufRead; +use std::path::PathBuf; +use std::str::FromStr; + +#[cached(result)] +pub fn load_lockfile_dependencies(path: PathBuf) -> miette::Result { + let mut deps: LockfileDependencyVersions = FxHashMap::default(); + let file = fs::open_file(&path)?; + + for line in io::BufReader::new(file).lines().map_while(Result::ok) { + if let Ok(parsed) = Requirement::::from_str(&line) { + deps.entry(parsed.name.to_string()) + .or_default() + .push(line.clone()); + } + } + + Ok(deps) +} diff --git a/legacy/python/lang/src/pip_requirements.rs b/legacy/python/lang/src/pip_requirements.rs deleted file mode 100644 index c581227c6d2..00000000000 --- a/legacy/python/lang/src/pip_requirements.rs +++ /dev/null @@ -1,33 +0,0 @@ -use cached::proc_macro::cached; -use moon_lang::LockfileDependencyVersions; -use pep_508::parse; -use rustc_hash::FxHashMap; -use std::fs::File; -use std::io; -use std::io::BufRead; -use std::path::{Path, PathBuf}; - -fn read_lines

(filename: P) -> io::Result>> -where - P: AsRef, -{ - let file = File::open(filename)?; - Ok(io::BufReader::new(file).lines()) -} - -#[cached(result)] -pub fn load_lockfile_dependencies(path: PathBuf) -> miette::Result { - let mut deps: LockfileDependencyVersions = FxHashMap::default(); - - if let Ok(lines) = read_lines(&path) { - for line in lines.map_while(Result::ok) { - if let Ok(parsed) = parse(&line) { - deps.entry(parsed.name.to_string()) - .or_default() - .push(line.clone()); - } - } - } - - Ok(deps) -} diff --git a/legacy/python/lang/src/uv.rs b/legacy/python/lang/src/uv.rs new file mode 100644 index 00000000000..4efce22dbd7 --- /dev/null +++ b/legacy/python/lang/src/uv.rs @@ -0,0 +1,53 @@ +use cached::proc_macro::cached; +use moon_lang::{config_cache_container, LockfileDependencyVersions}; +use pyproject_toml::PyProjectToml; +use rustc_hash::FxHashMap; +use serde::{Deserialize, Serialize}; +use starbase_utils::{fs, toml}; +use std::path::{Path, PathBuf}; + +fn read_file(path: &Path) -> miette::Result { + Ok(toml::parse(fs::read_file(path)?)?) +} + +config_cache_container!( + PyProjectTomlCache, + PyProjectToml, + "package-lock.json", + read_file +); + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(default, rename_all = "kebab-case")] +pub struct UvLockPackageSdist { + pub url: String, + pub hash: String, +} + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(default, rename_all = "kebab-case")] +pub struct UvLockPackage { + pub name: String, + pub version: String, + pub sdist: UvLockPackageSdist, +} + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(default, rename_all = "kebab-case")] +pub struct UvLock { + pub packages: Vec, +} + +#[cached(result)] +pub fn load_lockfile_dependencies(path: PathBuf) -> miette::Result { + let mut deps: LockfileDependencyVersions = FxHashMap::default(); + let lockfile: UvLock = toml::read_file(&path)?; + + for package in lockfile.packages { + let dep = deps.entry(package.name).or_default(); + dep.push(package.version); + dep.push(package.sdist.hash); + } + + Ok(deps) +} diff --git a/legacy/python/platform/src/actions/install_deps.rs b/legacy/python/platform/src/actions/install_deps.rs index cfcb4ebd8cf..ee1533b3f01 100644 --- a/legacy/python/platform/src/actions/install_deps.rs +++ b/legacy/python/platform/src/actions/install_deps.rs @@ -1,7 +1,9 @@ use moon_action::Operation; +use moon_common::is_test_env; +use moon_config::PythonPackageManager; use moon_console::{Checkpoint, Console}; use moon_logger::error; -use moon_python_tool::{find_requirements_txt, PythonTool}; +use moon_python_tool::PythonTool; use std::path::Path; pub async fn install_deps( @@ -11,80 +13,76 @@ pub async fn install_deps( console: &Console, ) -> miette::Result> { let mut operations = vec![]; - let requirements_path = find_requirements_txt(working_dir, workspace_root); + let venv_parent = python.find_venv_root(working_dir, workspace_root); - let venv_root = if python.config.root_requirements_only { + let venv_root = if python.config.root_venv_only { workspace_root.join(&python.config.venv_name) } else { - requirements_path + venv_parent .as_ref() - .and_then(|rp| rp.parent()) + .and_then(|vp| vp.parent()) .unwrap_or(working_dir) .join(&python.config.venv_name) }; - if !venv_root.exists() && requirements_path.is_some() { - let args = vec!["-m", "venv", venv_root.to_str().unwrap_or_default()]; + if !venv_root.exists() && venv_parent.is_some() { + let command = match python.config.package_manager { + PythonPackageManager::Pip => "python -m venv", + PythonPackageManager::Uv => "uv venv", + }; operations.push( - Operation::task_execution(format!("python {}", args.join(" "))) + Operation::task_execution(command) .track_async(|| async { - console - .out - .print_checkpoint(Checkpoint::Setup, "python venv")?; + console.out.print_checkpoint(Checkpoint::Setup, command)?; - python.exec_python(args, working_dir, workspace_root).await + python + .exec_venv(&venv_root, working_dir, workspace_root) + .await }) .await?, ); } - if let Some(pip_config) = &python.config.pip { - let mut args = vec![]; + let package_manager = python.get_package_manager(); - // Add pip installArgs, if users have given - if let Some(install_args) = &pip_config.install_args { - args.extend(install_args.iter().map(|c| c.as_str())); - } - - // Add requirements.txt path, if found - if let Some(reqs_path) = requirements_path.as_ref().and_then(|req| req.to_str()) { - args.extend(["-r", reqs_path]); - } - - if !args.is_empty() { - args.splice(0..0, vec!["-m", "pip", "install"]); + // Install dependencies + { + let command = match python.config.package_manager { + PythonPackageManager::Pip => "pip install", + PythonPackageManager::Uv => "uv sync", + }; - for attempt in 1..=3 { - if attempt == 1 { - console - .out - .print_checkpoint(Checkpoint::Setup, "pip install")?; - } else { - console.out.print_checkpoint_with_comments( - Checkpoint::Setup, - "pip install", - [format!("attempt {attempt} of 3")], - )?; - } + for attempt in 1..=3 { + if attempt == 1 { + console.out.print_checkpoint(Checkpoint::Setup, command)?; + } else { + console.out.print_checkpoint_with_comments( + Checkpoint::Setup, + command, + [format!("attempt {attempt} of 3")], + )?; + } - let mut op = Operation::task_execution(format!("python {}", args.join(" "))); - let result = Operation::do_track_async(&mut op, || { - python.exec_python(&args, working_dir, workspace_root) - }) - .await; + let mut op = Operation::task_execution(command); + let result = Operation::do_track_async(&mut op, || { + package_manager.install_dependencies(python, working_dir, !is_test_env()) + }) + .await; - operations.push(op); + operations.push(op); - if let Err(error) = result { - if attempt == 3 { - return Err(error); - } else { - error!("Failed to install pip dependencies, retrying..."); - } + if let Err(error) = result { + if attempt == 3 { + return Err(error); } else { - break; + error!( + "Failed to install {} dependencies, retrying...", + python.config.package_manager + ); } + } else { + break; } } } diff --git a/legacy/python/platform/src/python_platform.rs b/legacy/python/platform/src/python_platform.rs index 5a36ab036c1..0b8bd5c042a 100644 --- a/legacy/python/platform/src/python_platform.rs +++ b/legacy/python/platform/src/python_platform.rs @@ -6,16 +6,16 @@ use moon_common::{ Id, }; use moon_config::{ - HasherConfig, PlatformType, ProjectConfig, ProjectsAliasesList, ProjectsSourcesList, - PythonConfig, UnresolvedVersionSpec, + HasherConfig, HasherOptimization, PlatformType, ProjectConfig, ProjectsAliasesList, + ProjectsSourcesList, PythonConfig, PythonPackageManager, UnresolvedVersionSpec, }; use moon_console::Console; -use moon_hash::ContentHasher; +use moon_hash::{ContentHasher, DepsHash}; use moon_platform::{Platform, Runtime, RuntimeReq}; use moon_process::Command; use moon_project::Project; -use moon_python_lang::pip_requirements::load_lockfile_dependencies; -use moon_python_tool::{find_requirements_txt, get_python_tool_paths, PythonTool}; +use moon_python_lang::{pip, uv}; +use moon_python_tool::{get_python_tool_paths, PythonTool}; use moon_task::Task; use moon_tool::{get_proto_version_env, prepend_path_env_var, Tool, ToolManager}; use moon_utils::async_trait; @@ -102,7 +102,7 @@ impl Platform for PythonPlatform { project_source: &str, ) -> miette::Result { // Single version policy / only a root requirements.txt - if self.config.root_requirements_only { + if self.config.root_venv_only { return Ok(true); } @@ -142,9 +142,12 @@ impl Platform for PythonPlatform { } fn get_dependency_configs(&self) -> miette::Result> { + let tool = self.toolchain.get()?; + let depman = tool.get_package_manager(); + Ok(Some(( - "requirements.txt".to_owned(), - "requirements.txt".to_owned(), + depman.get_lock_filename(), + depman.get_manifest_filename(), ))) } @@ -242,17 +245,38 @@ impl Platform for PythonPlatform { hasher: &mut ContentHasher, _hasher_config: &HasherConfig, ) -> miette::Result<()> { - let deps = BTreeMap::from_iter(load_lockfile_dependencies(manifest_path.to_path_buf())?); - - hasher.hash_content(PythonToolchainHash { - version: self - .config - .version - .as_ref() - .map(|v| v.to_string()) - .unwrap_or_default(), - dependencies: deps, - })?; + match self.config.package_manager { + PythonPackageManager::Pip => { + if let Ok(data) = pip::load_lockfile_dependencies(manifest_path.to_path_buf()) { + let mut hash = DepsHash::new("unknown".into()); + let mut project_deps = BTreeMap::default(); + + for (key, req) in data { + project_deps.insert(key, req.join("")); + } + + hash.add_deps(&project_deps); + hasher.hash_content(hash)?; + } + } + PythonPackageManager::Uv => { + if let Some(data) = uv::PyProjectTomlCache::read(manifest_path)? { + if let Some(project) = data.project { + let mut hash = DepsHash::new(project.name); + let mut project_deps = BTreeMap::default(); + + if let Some(deps) = project.dependencies { + for dep in deps { + project_deps.insert(dep.name.to_string(), dep.to_string()); + } + } + + hash.add_deps(&project_deps); + hasher.hash_content(hash)?; + } + } + } + }; Ok(()) } @@ -261,25 +285,62 @@ impl Platform for PythonPlatform { async fn hash_run_target( &self, project: &Project, - _runtime: &Runtime, + runtime: &Runtime, hasher: &mut ContentHasher, - _hasher_config: &HasherConfig, + hasher_config: &HasherConfig, ) -> miette::Result<()> { - let mut deps = BTreeMap::new(); - - if let Some(pip_requirements) = find_requirements_txt(&project.root, &self.workspace_root) { - deps = BTreeMap::from_iter(load_lockfile_dependencies(pip_requirements)?); - } - - hasher.hash_content(PythonToolchainHash { + let python_tool = self.toolchain.get_for_version(&runtime.requirement).ok(); + let mut content = PythonToolchainHash { version: self .config .version .as_ref() .map(|v| v.to_string()) .unwrap_or_default(), - dependencies: deps, - })?; + dependencies: BTreeMap::new(), + }; + + let resolved_dependencies = + if matches!(hasher_config.optimization, HasherOptimization::Accuracy) + && python_tool.is_some() + { + python_tool + .unwrap() + .get_package_manager() + .get_resolved_dependencies(&project.root) + .await? + } else { + FxHashMap::default() + }; + + match self.config.package_manager { + // Since the manifest and lockfile are the same (requirements.txt), + // just inherit the resolved dependencies as-is + PythonPackageManager::Pip => { + content.dependencies.extend(resolved_dependencies); + } + PythonPackageManager::Uv => { + if let Some(data) = uv::PyProjectTomlCache::read(&project.root)? { + if let Some(project) = data.project { + if let Some(deps) = project.dependencies { + for dep in deps { + let name = dep.name.to_string(); + + if let Some(resolved_versions) = resolved_dependencies.get(&name) { + let mut sorted_deps = resolved_versions.to_owned().clone(); + sorted_deps.sort(); + content.dependencies.insert(name, sorted_deps); + } else { + content.dependencies.insert(name, vec![dep.to_string()]); + } + } + } + } + } + } + }; + + hasher.hash_content(content)?; Ok(()) } diff --git a/legacy/python/tool/src/lib.rs b/legacy/python/tool/src/lib.rs index 84807fe6f11..5e1a45c3d8b 100644 --- a/legacy/python/tool/src/lib.rs +++ b/legacy/python/tool/src/lib.rs @@ -1,3 +1,7 @@ +mod pip_tool; mod python_tool; +mod uv_tool; +pub use pip_tool::*; pub use python_tool::*; +pub use uv_tool::*; diff --git a/legacy/python/tool/src/pip_tool.rs b/legacy/python/tool/src/pip_tool.rs new file mode 100644 index 00000000000..cd3ab490e7f --- /dev/null +++ b/legacy/python/tool/src/pip_tool.rs @@ -0,0 +1,180 @@ +use crate::python_tool::{get_python_tool_paths, PythonTool}; +use moon_config::PipConfig; +use moon_console::Console; +use moon_process::Command; +use moon_python_lang::{pip, LockfileDependencyVersions}; +use moon_tool::{ + async_trait, get_proto_env_vars, get_proto_version_env, prepend_path_env_var, + DependencyManager, Tool, +}; +use moon_utils::get_workspace_root; +use proto_core::{ProtoEnvironment, UnresolvedVersionSpec}; +use rustc_hash::FxHashMap; +use starbase_utils::fs; +use std::env; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use tracing::instrument; + +pub fn find_requirements_txt(starting_dir: &Path, workspace_root: &Path) -> Option { + fs::find_upwards_until("requirements.txt", starting_dir, workspace_root) +} + +pub struct PipTool { + pub config: PipConfig, + + console: Arc, + + global: bool, + + #[allow(dead_code)] + proto_env: Arc, +} + +impl PipTool { + pub async fn new( + proto_env: Arc, + console: Arc, + config: &PipConfig, + global: bool, + ) -> miette::Result { + Ok(PipTool { + global, + config: config.to_owned(), + proto_env, + console, + }) + } + + fn inject_command_paths(&self, cmd: &mut Command, python: &PythonTool, working_dir: &Path) { + if !self.global { + cmd.env( + "PATH", + prepend_path_env_var(get_python_tool_paths( + python, + working_dir, + &get_workspace_root(), + )), + ); + } + } +} + +#[async_trait] +impl Tool for PipTool { + fn as_any(&self) -> &(dyn std::any::Any + Send + Sync) { + self + } + + #[instrument(skip_all)] + async fn setup( + &mut self, + _last_versions: &mut FxHashMap, + ) -> miette::Result { + Ok(0) + } + + async fn teardown(&mut self) -> miette::Result<()> { + Ok(()) + } +} + +#[async_trait] +impl DependencyManager for PipTool { + fn create_command(&self, python: &PythonTool) -> miette::Result { + let mut cmd = Command::new("python"); + cmd.with_console(self.console.clone()); + cmd.envs(get_proto_env_vars()); + cmd.args(["-m", "pip"]); + + if let Some(version) = get_proto_version_env(&python.tool) { + cmd.env("PROTO_PYTHON_VERSION", version); + } + + Ok(cmd) + } + + #[instrument(skip_all)] + async fn dedupe_dependencies( + &self, + _python: &PythonTool, + _working_dir: &Path, + _log: bool, + ) -> miette::Result<()> { + Ok(()) + } + + fn get_lock_filename(&self) -> String { + String::from("requirements.txt") + } + + fn get_manifest_filename(&self) -> String { + String::from("requirements.txt") + } + + #[instrument(skip_all)] + async fn get_resolved_dependencies( + &self, + project_root: &Path, + ) -> miette::Result { + let Some(reqs_path) = find_requirements_txt(project_root, &get_workspace_root()) else { + return Ok(FxHashMap::default()); + }; + + Ok(pip::load_lockfile_dependencies(reqs_path)?) + } + + #[instrument(skip_all)] + async fn install_dependencies( + &self, + python: &PythonTool, + working_dir: &Path, + log: bool, + ) -> miette::Result<()> { + let mut args: Vec<&str> = vec![]; + let reqs_path = find_requirements_txt(working_dir, &get_workspace_root()); + + if let Some(reqs_path) = &reqs_path { + args.extend(["-r", reqs_path.to_str().unwrap_or_default()]); + } + + args.extend( + self.config + .install_args + .iter() + .map(|arg| arg.as_str()) + .collect::>(), + ); + + if args.is_empty() { + return Ok(()); + } + + let mut cmd = self.create_command(python)?; + + self.inject_command_paths(&mut cmd, python, working_dir); + + cmd.arg("install") + .args(args) + .cwd(working_dir) + .set_print_command(log); + + if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { + cmd.exec_capture_output().await?; + } else { + cmd.exec_stream_output().await?; + } + + Ok(()) + } + + #[instrument(skip_all)] + async fn install_focused_dependencies( + &self, + _python: &PythonTool, + _package_names: &[String], + _production_only: bool, + ) -> miette::Result<()> { + Ok(()) + } +} diff --git a/legacy/python/tool/src/python_tool.rs b/legacy/python/tool/src/python_tool.rs index 37bf2fe21a1..0711991ff8e 100644 --- a/legacy/python/tool/src/python_tool.rs +++ b/legacy/python/tool/src/python_tool.rs @@ -1,10 +1,12 @@ -use moon_config::PythonConfig; +use crate::pip_tool::PipTool; +use crate::uv_tool::UvTool; +use moon_config::{PythonConfig, PythonPackageManager}; use moon_console::{Checkpoint, Console}; use moon_logger::debug; use moon_process::Command; use moon_tool::{ async_trait, get_proto_env_vars, get_proto_paths, get_proto_version_env, load_tool_plugin, - prepend_path_env_var, use_global_tool_on_path, Tool, + prepend_path_env_var, use_global_tool_on_path, DependencyManager, Tool, ToolError, }; use moon_toolchain::RuntimeReq; use proto_core::flow::install::InstallOptions; @@ -16,10 +18,6 @@ use std::sync::Arc; use std::{ffi::OsStr, path::Path}; use tracing::instrument; -pub fn find_requirements_txt(starting_dir: &Path, workspace_root: &Path) -> Option { - fs::find_upwards_until("requirements.txt", starting_dir, workspace_root) -} - pub fn get_python_tool_paths( python_tool: &PythonTool, working_dir: &Path, @@ -48,6 +46,10 @@ pub struct PythonTool { console: Arc, proto_env: Arc, + + pip: Option, + + uv: Option, } impl PythonTool { @@ -66,8 +68,10 @@ impl PythonTool { config.plugin.as_ref().unwrap(), ) .await?, - proto_env, - console, + proto_env: Arc::clone(&proto_env), + console: Arc::clone(&console), + pip: None, + uv: None, }; if use_global_tool_on_path("python") || req.is_global() { @@ -77,6 +81,25 @@ impl PythonTool { python.config.version = req.to_spec(); }; + match config.package_manager { + PythonPackageManager::Pip => { + python.pip = Some( + PipTool::new( + Arc::clone(&proto_env), + Arc::clone(&console), + &config.pip, + python.global, + ) + .await?, + ); + } + PythonPackageManager::Uv => { + python.uv = Some( + UvTool::new(Arc::clone(&proto_env), Arc::clone(&console), &config.uv).await?, + ); + } + }; + Ok(python) } @@ -110,6 +133,68 @@ impl PythonTool { Ok(()) } + + #[instrument(skip_all)] + pub async fn exec_venv( + &self, + venv_root: &Path, + working_dir: &Path, + workspace_root: &Path, + ) -> miette::Result<()> { + match self.config.package_manager { + PythonPackageManager::Pip => { + self.exec_python( + ["-m", "venv", venv_root.to_str().unwrap_or_default()], + working_dir, + workspace_root, + ) + .await?; + } + PythonPackageManager::Uv => { + let uv = self.get_uv()?; + + uv.create_command_with_paths(self, working_dir)? + .args(["venv", venv_root.to_str().unwrap_or_default()]) + .cwd(working_dir) + .exec_stream_output() + .await?; + } + }; + + Ok(()) + } + + pub fn get_pip(&self) -> miette::Result<&PipTool> { + match &self.pip { + Some(pip) => Ok(pip), + None => Err(ToolError::UnknownTool("pip".into()).into()), + } + } + + pub fn get_uv(&self) -> miette::Result<&UvTool> { + match &self.uv { + Some(uv) => Ok(uv), + None => Err(ToolError::UnknownTool("uv".into()).into()), + } + } + + pub fn get_package_manager(&self) -> &(dyn DependencyManager + Send + Sync) { + if self.uv.is_some() { + return self.get_uv().unwrap(); + } + + if self.pip.is_some() { + return self.get_pip().unwrap(); + } + + panic!("No package manager, how's this possible?"); + } + + pub fn find_venv_root(&self, starting_dir: &Path, workspace_root: &Path) -> Option { + let depman = self.get_package_manager(); + + fs::find_upwards_root_until(depman.get_manifest_filename(), starting_dir, workspace_root) + } } #[async_trait] @@ -163,6 +248,14 @@ impl Tool for PythonTool { self.tool.locate_globals_dirs().await?; + if let Some(pip) = &mut self.pip { + installed += pip.setup(last_versions).await?; + } + + if let Some(uv) = &mut self.uv { + installed += uv.setup(last_versions).await?; + } + Ok(installed) } diff --git a/legacy/python/tool/src/uv_tool.rs b/legacy/python/tool/src/uv_tool.rs new file mode 100644 index 00000000000..fa4350dceb0 --- /dev/null +++ b/legacy/python/tool/src/uv_tool.rs @@ -0,0 +1,230 @@ +use crate::python_tool::{get_python_tool_paths, PythonTool}; +use moon_config::UvConfig; +use moon_console::{Checkpoint, Console}; +use moon_logger::debug; +use moon_process::Command; +use moon_python_lang::{uv, LockfileDependencyVersions}; +use moon_tool::{ + async_trait, get_proto_env_vars, get_proto_version_env, load_tool_plugin, prepend_path_env_var, + use_global_tool_on_path, DependencyManager, Tool, +}; +use moon_utils::get_workspace_root; +use proto_core::flow::install::InstallOptions; +use proto_core::{Id, ProtoEnvironment, Tool as ProtoTool, UnresolvedVersionSpec}; +use rustc_hash::FxHashMap; +use starbase_utils::fs; +use std::env; +use std::path::Path; +use std::sync::Arc; +use tracing::instrument; + +pub struct UvTool { + pub config: UvConfig, + + pub global: bool, + + pub tool: ProtoTool, + + console: Arc, + + #[allow(dead_code)] + proto_env: Arc, +} + +impl UvTool { + pub async fn new( + proto_env: Arc, + console: Arc, + config: &Option, + ) -> miette::Result { + let config = config.to_owned().unwrap_or_default(); + + Ok(UvTool { + global: use_global_tool_on_path("uv") || config.version.is_none(), + tool: load_tool_plugin(&Id::raw("uv"), &proto_env, config.plugin.as_ref().unwrap()) + .await?, + config, + proto_env, + console, + }) + } + + pub fn create_command_with_paths( + &self, + python: &PythonTool, + working_dir: &Path, + ) -> miette::Result { + let mut cmd = self.create_command(python)?; + self.inject_command_paths(&mut cmd, python, working_dir); + Ok(cmd) + } + + fn inject_command_paths(&self, cmd: &mut Command, python: &PythonTool, working_dir: &Path) { + if !self.global { + cmd.env( + "PATH", + prepend_path_env_var(get_python_tool_paths( + python, + working_dir, + &get_workspace_root(), + )), + ); + } + } +} + +#[async_trait] +impl Tool for UvTool { + fn as_any(&self) -> &(dyn std::any::Any + Send + Sync) { + self + } + + #[instrument(skip_all)] + async fn setup( + &mut self, + last_versions: &mut FxHashMap, + ) -> miette::Result { + let mut count = 0; + let version = self.config.version.as_ref(); + + let Some(version) = version else { + return Ok(count); + }; + + if self.global { + debug!("Using global binary in PATH"); + + return Ok(count); + } + + if self.tool.is_setup(version).await? { + self.tool.locate_globals_dirs().await?; + + debug!("uv has already been setup"); + + return Ok(count); + } + + // When offline and the tool doesn't exist, fallback to the global binary + if proto_core::is_offline() { + debug!( + "No internet connection and uv has not been setup, falling back to global binary in PATH" + ); + + self.global = true; + + return Ok(count); + } + + if let Some(last) = last_versions.get("uv") { + if last == version && self.tool.get_product_dir().exists() { + return Ok(count); + } + } + + self.console + .out + .print_checkpoint(Checkpoint::Setup, format!("installing uv {version}"))?; + + if self.tool.setup(version, InstallOptions::default()).await? { + last_versions.insert("uv".into(), version.to_owned()); + count += 1; + } + + self.tool.locate_globals_dirs().await?; + + Ok(count) + } + + async fn teardown(&mut self) -> miette::Result<()> { + self.tool.teardown().await?; + + Ok(()) + } +} + +#[async_trait] +impl DependencyManager for UvTool { + fn create_command(&self, python: &PythonTool) -> miette::Result { + let mut cmd = Command::new("uv"); + cmd.with_console(self.console.clone()); + cmd.envs(get_proto_env_vars()); + + if let Some(version) = get_proto_version_env(&self.tool) { + cmd.env("PROTO_UV_VERSION", version); + } + + if let Some(version) = get_proto_version_env(&python.tool) { + cmd.env("PROTO_PYTHON_VERSION", version); + } + + Ok(cmd) + } + + #[instrument(skip_all)] + async fn dedupe_dependencies( + &self, + _python: &PythonTool, + _working_dir: &Path, + _log: bool, + ) -> miette::Result<()> { + Ok(()) + } + + fn get_lock_filename(&self) -> String { + String::from("uv.lock") + } + + fn get_manifest_filename(&self) -> String { + String::from("pyproject.toml") + } + + #[instrument(skip_all)] + async fn get_resolved_dependencies( + &self, + project_root: &Path, + ) -> miette::Result { + let Some(lockfile_path) = + fs::find_upwards_until("uv.lock", project_root, get_workspace_root()) + else { + return Ok(FxHashMap::default()); + }; + + Ok(uv::load_lockfile_dependencies(lockfile_path)?) + } + + #[instrument(skip_all)] + async fn install_dependencies( + &self, + python: &PythonTool, + working_dir: &Path, + log: bool, + ) -> miette::Result<()> { + let mut cmd = self.create_command(python)?; + + self.inject_command_paths(&mut cmd, python, working_dir); + + cmd.args(["sync"]) + .args(&self.config.sync_args) + .cwd(working_dir) + .set_print_command(log); + + if env::var("MOON_TEST_HIDE_INSTALL_OUTPUT").is_ok() { + cmd.exec_capture_output().await?; + } else { + cmd.exec_stream_output().await?; + } + + Ok(()) + } + + #[instrument(skip_all)] + async fn install_focused_dependencies( + &self, + _python: &PythonTool, + _packages: &[String], + _production_only: bool, + ) -> miette::Result<()> { + Ok(()) + } +} diff --git a/packages/types/src/toolchain-config.ts b/packages/types/src/toolchain-config.ts index 0382fd43ae4..c73a210cd1c 100644 --- a/packages/types/src/toolchain-config.ts +++ b/packages/types/src/toolchain-config.ts @@ -263,21 +263,47 @@ export interface NodeConfig { yarn: YarnConfig | null; } +/** The available package managers for Python. */ +export type PythonPackageManager = 'pip' | 'uv'; + export interface PipConfig { /** List of arguments to append to `pip install` commands. */ - installArgs: string[] | null; + installArgs: string[]; +} + +export interface UvConfig { + /** Location of the WASM plugin to use for uv support. */ + plugin: PluginLocator | null; + /** List of arguments to append to `uv sync` commands. */ + syncArgs: string[]; + /** + * The version of uv to download, install, and run `uv` tasks with. + * + * @envvar MOON_UV_VERSION + */ + version: UnresolvedVersionSpec | null; } export interface PythonConfig { + /** + * The package manager to use for installing dependencies and managing + * the virtual environment. + * + * @default 'pip' + * @type {'pip' | 'uv'} + */ + packageManager: PythonPackageManager; /** Options for pip, when used as a package manager. */ - pip: PipConfig | null; + pip: PipConfig; /** Location of the WASM plugin to use for Python support. */ plugin: PluginLocator | null; /** - * Assumes only the root `requirements.txt` is used for dependencies. + * Assumes a workspace root virtual environment is used for dependencies. * Can be used to support the "one version policy" pattern. */ - rootRequirementsOnly: boolean; + rootVenvOnly: boolean; + /** Options for uv, when used as a package manager. */ + uv: UvConfig | null; /** * Defines the virtual environment name, which will be created in the workspace root. * Project dependencies will be installed into this. @@ -661,16 +687,38 @@ export interface PartialPipConfig { installArgs?: string[] | null; } +export interface PartialUvConfig { + /** Location of the WASM plugin to use for uv support. */ + plugin?: PluginLocator | null; + /** List of arguments to append to `uv sync` commands. */ + syncArgs?: string[] | null; + /** + * The version of uv to download, install, and run `uv` tasks with. + * + * @envvar MOON_UV_VERSION + */ + version?: UnresolvedVersionSpec | null; +} + export interface PartialPythonConfig { + /** + * The package manager to use for installing dependencies and managing + * the virtual environment. + * + * @default 'pip' + */ + packageManager?: PythonPackageManager | null; /** Options for pip, when used as a package manager. */ pip?: PartialPipConfig | null; /** Location of the WASM plugin to use for Python support. */ plugin?: PluginLocator | null; /** - * Assumes only the root `requirements.txt` is used for dependencies. + * Assumes a workspace root virtual environment is used for dependencies. * Can be used to support the "one version policy" pattern. */ - rootRequirementsOnly?: boolean | null; + rootVenvOnly?: boolean | null; + /** Options for uv, when used as a package manager. */ + uv?: PartialUvConfig | null; /** * Defines the virtual environment name, which will be created in the workspace root. * Project dependencies will be installed into this. diff --git a/tests/fixtures/python-uv/base/.gitignore b/tests/fixtures/python-uv/base/.gitignore new file mode 100644 index 00000000000..1d17dae13b5 --- /dev/null +++ b/tests/fixtures/python-uv/base/.gitignore @@ -0,0 +1 @@ +.venv diff --git a/tests/fixtures/python-uv/base/moon.yml b/tests/fixtures/python-uv/base/moon.yml new file mode 100644 index 00000000000..51c454f42b0 --- /dev/null +++ b/tests/fixtures/python-uv/base/moon.yml @@ -0,0 +1,12 @@ +language: python + +tasks: + standard: + command: python + args: + - --version + + uv: + command: uv + args: + - --version diff --git a/tests/fixtures/python-uv/base/pyproject.toml b/tests/fixtures/python-uv/base/pyproject.toml new file mode 100644 index 00000000000..123593e8349 --- /dev/null +++ b/tests/fixtures/python-uv/base/pyproject.toml @@ -0,0 +1,6 @@ +[project] +name = "python-uv" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +dependencies = [] diff --git a/website/static/schemas/toolchain.json b/website/static/schemas/toolchain.json index d521a525a90..9a627778a90 100644 --- a/website/static/schemas/toolchain.json +++ b/website/static/schemas/toolchain.json @@ -608,17 +608,10 @@ "installArgs": { "title": "installArgs", "description": "List of arguments to append to pip install commands.", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "null" - } - ], + "type": "array", + "items": { + "type": "string" + }, "markdownDescription": "List of arguments to append to `pip install` commands." } }, @@ -672,15 +665,22 @@ "PythonConfig": { "type": "object", "properties": { + "packageManager": { + "title": "packageManager", + "description": "The package manager to use for installing dependencies and managing the virtual environment.", + "default": "pip", + "allOf": [ + { + "$ref": "#/definitions/PythonPackageManager" + } + ] + }, "pip": { "title": "pip", "description": "Options for pip, when used as a package manager.", - "anyOf": [ + "allOf": [ { "$ref": "#/definitions/PipConfig" - }, - { - "type": "null" } ] }, @@ -696,11 +696,22 @@ } ] }, - "rootRequirementsOnly": { - "title": "rootRequirementsOnly", - "description": "Assumes only the root requirements.txt is used for dependencies. Can be used to support the \"one version policy\" pattern.", - "type": "boolean", - "markdownDescription": "Assumes only the root `requirements.txt` is used for dependencies. Can be used to support the \"one version policy\" pattern." + "rootVenvOnly": { + "title": "rootVenvOnly", + "description": "Assumes a workspace root virtual environment is used for dependencies. Can be used to support the \"one version policy\" pattern.", + "type": "boolean" + }, + "uv": { + "title": "uv", + "description": "Options for uv, when used as a package manager.", + "anyOf": [ + { + "$ref": "#/definitions/UvConfig" + }, + { + "type": "null" + } + ] }, "venvName": { "title": "venvName", @@ -724,6 +735,14 @@ }, "additionalProperties": false }, + "PythonPackageManager": { + "description": "The available package managers for Python.", + "type": "string", + "enum": [ + "pip", + "uv" + ] + }, "RustConfig": { "description": "Configures and enables the Rust platform. Docs: https://moonrepo.dev/docs/config/toolchain#rust", "type": "object", @@ -926,6 +945,46 @@ "type": "string", "markdownDescription": "Represents an unresolved version or alias that must be resolved to a fully-qualified version." }, + "UvConfig": { + "type": "object", + "properties": { + "plugin": { + "title": "plugin", + "description": "Location of the WASM plugin to use for uv support.", + "anyOf": [ + { + "$ref": "#/definitions/PluginLocator" + }, + { + "type": "null" + } + ] + }, + "syncArgs": { + "title": "syncArgs", + "description": "List of arguments to append to uv sync commands.", + "type": "array", + "items": { + "type": "string" + }, + "markdownDescription": "List of arguments to append to `uv sync` commands." + }, + "version": { + "title": "version", + "description": "The version of uv to download, install, and run uv tasks with.", + "anyOf": [ + { + "$ref": "#/definitions/UnresolvedVersionSpec" + }, + { + "type": "null" + } + ], + "markdownDescription": "The version of uv to download, install, and run `uv` tasks with." + } + }, + "additionalProperties": false + }, "YarnConfig": { "description": "Options for Yarn, when used as a package manager.", "type": "object", From 4323c341a9ada83404156e8c8fd7561112ea4669 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sat, 1 Feb 2025 12:23:48 -0800 Subject: [PATCH 14/15] fix: Don't infer inputs from CI/CD. (#1811) * Ignore CI vars. * Update rust. --- CHANGELOG.md | 19 +- Cargo.lock | 182 +++++++++--------- Cargo.toml | 8 +- crates/task-expander/Cargo.toml | 2 + crates/task-expander/src/token_expander.rs | 32 ++- .../tests/token_expander_test.rs | 19 ++ rust-toolchain.toml | 2 +- 7 files changed, 164 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fee8561c0ab..29698a88726 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,10 @@ #### 🚀 Updates -- Added unstable support for multiple package workspaces when installing dependencies. +- Added unstable support for multiple package workspaces when installing dependencies and resolving + lockfiles. + - For example, you can now have multiple `yarn.lock` files throughout the repository, allowing for + multiple Yarn/Node workspaces. - Updated Pkl (`.pkl`) based configuration to always be enabled, and is no longer hidden behind an experimental flag. - Added official documentation: https://moonrepo.dev/docs/guides/pkl-config @@ -29,9 +32,10 @@ - Added basic support for workspaces. - Added `deno.installArgs` setting. - Improved the Python toolchain. - - Added unstable uv support. Can be enabled with the new `python.packageManager` setting. + - Added unstable uv support. Can be enabled with the new `python.packageManager` and `python.uv` + settings. - Right now, has basic toolchain support, including dependency install and virtual environments. - - Renamed `python.rootRequirementsOnly` to `python.rootVenvOnly`. + - Renamed `python.rootRequirementsOnly` to `python.rootVenvOnly` (old name still works). - Will now inherit versions from the root `.prototools`. - Improved the Rust toolchain. - The root-level project is now properly taken into account when detecting the package workspaces. @@ -40,10 +44,17 @@ - Reworked child process handling to better handle signals and shutdown accordingly. Additionally, when the pipeline receives a signal, we now display the status that shutdown the pipeline in the summary. +- Reworked the new task `inferInputs` option to not infer environment variables from popular CI/CD + providers, as those values constantly change, causing tasks to always be affected. If you would + like to reference these values, add them as an explicit inputs. #### 🐞 Fixes -- Fixed lots of issues around remote caching. +- Fixed lots of issues around remote caching. Should be "stable" now. + +#### ⚙️ Internal + +- Updated Rust to v1.84.1. ## 1.31.3 diff --git a/Cargo.lock b/Cargo.lock index d5081a37409..a8a77de72d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -409,9 +409,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", @@ -925,9 +925,9 @@ dependencies = [ [[package]] name = "cd_env" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9c2cfcda51cac8c90cdcdc1b4f798919d1b4c5df4519439de53d28806f122e" +checksum = "7056fc524b158b94b531ed092ec94962da35889d8b571231057f17b12b9d48ed" dependencies = [ "serde", ] @@ -998,9 +998,9 @@ checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" [[package]] name = "ci_env" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e66a762324db3d46862b0751d1953dec257e201433ddaba83d16f4512831cbd" +checksum = "e80f7afabbbe272f95a9b0f107d9b5418a37956a5ee22cf7c95f94f8cfaf64ae" dependencies = [ "serde", ] @@ -3387,14 +3387,14 @@ dependencies = [ [[package]] name = "miette" -version = "7.4.0" +version = "7.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317f146e2eb7021892722af37cf1b971f0a70c8406f487e24952667616192c64" +checksum = "1a955165f87b37fd1862df2a59547ac542c77ef6d17c666f619d1ad22dd89484" dependencies = [ "backtrace", "backtrace-ext", "cfg-if", - "miette-derive 7.4.0", + "miette-derive 7.5.0", "owo-colors", "supports-color", "supports-hyperlinks", @@ -3418,9 +3418,9 @@ dependencies = [ [[package]] name = "miette-derive" -version = "7.4.0" +version = "7.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c9b935fbe1d6cbd1dac857b54a688145e2d93f48db36010514d0f612d0ad67" +checksum = "bf45bf44ab49be92fd1227a3be6fc6f617f1a337c06af54981048574d8783147" dependencies = [ "proc-macro2", "quote", @@ -3507,7 +3507,7 @@ checksum = "b52c1b33ff98142aecea13138bd399b68aa7ab5d9546c300988c345004001eea" name = "moon_action" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_target", "moon_time", @@ -3535,7 +3535,7 @@ name = "moon_action_graph" version = "0.0.1" dependencies = [ "graph-cycles", - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_affected", @@ -3561,7 +3561,7 @@ name = "moon_action_pipeline" version = "0.0.1" dependencies = [ "async-trait", - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_action_graph", @@ -3592,7 +3592,7 @@ dependencies = [ name = "moon_actions" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_app_context", @@ -3626,7 +3626,7 @@ name = "moon_affected" version = "0.0.1" dependencies = [ "clap", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_project", "moon_target", @@ -3646,7 +3646,7 @@ dependencies = [ "cd_env", "ci_env", "md5", - "miette 7.4.0", + "miette 7.5.0", "moon_cache", "moon_common", "moon_config", @@ -3680,7 +3680,7 @@ dependencies = [ "dialoguer", "diff", "indicatif", - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_action_graph", @@ -3768,7 +3768,7 @@ dependencies = [ name = "moon_args" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "shell-words", "thiserror 2.0.11", ] @@ -3778,7 +3778,7 @@ name = "moon_bun_lang" version = "0.0.1" dependencies = [ "cached", - "miette 7.4.0", + "miette 7.5.0", "moon_lang", "nodejs_package_json", "rustc-hash 2.1.0", @@ -3792,7 +3792,7 @@ dependencies = [ name = "moon_bun_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_bun_tool", @@ -3824,7 +3824,7 @@ dependencies = [ name = "moon_bun_tool" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_bun_lang", "moon_config", "moon_console", @@ -3844,7 +3844,7 @@ dependencies = [ name = "moon_cache" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_cache_item", "moon_common", "moon_hash", @@ -3860,7 +3860,7 @@ dependencies = [ name = "moon_cache_item" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "serde", "serial_test", "starbase_sandbox", @@ -3908,7 +3908,7 @@ dependencies = [ "clap", "content_inspector", "convert_case", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_console", @@ -3931,7 +3931,7 @@ dependencies = [ name = "moon_codeowners" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_config", "moon_hash", "serde", @@ -3946,7 +3946,7 @@ version = "0.0.11" dependencies = [ "compact_str", "dirs 6.0.0", - "miette 7.4.0", + "miette 7.5.0", "regex", "relative-path", "rustc-hash 2.1.0", @@ -3962,7 +3962,7 @@ version = "0.0.13" dependencies = [ "httpmock", "indexmap 2.7.1", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_target", @@ -3987,7 +3987,7 @@ dependencies = [ name = "moon_config_schema" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_config", "schematic", ] @@ -3997,7 +3997,7 @@ name = "moon_console" version = "0.0.1" dependencies = [ "inquire", - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_common", "moon_config", @@ -4011,7 +4011,7 @@ dependencies = [ name = "moon_console_reporter" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_common", "moon_config", @@ -4026,7 +4026,7 @@ version = "0.0.1" dependencies = [ "cached", "deno_lockfile", - "miette 7.4.0", + "miette 7.5.0", "moon_lang", "moon_logger", "moon_typescript_lang", @@ -4040,7 +4040,7 @@ dependencies = [ name = "moon_deno_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_common", @@ -4067,7 +4067,7 @@ dependencies = [ name = "moon_deno_tool" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_console", @@ -4086,7 +4086,7 @@ dependencies = [ name = "moon_docker" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_target", "starbase_sandbox", @@ -4098,7 +4098,7 @@ dependencies = [ name = "moon_env" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "starbase_utils", "tracing", @@ -4109,7 +4109,7 @@ name = "moon_extension_plugin" version = "0.0.1" dependencies = [ "async-trait", - "miette 7.4.0", + "miette 7.5.0", "moon_config", "moon_pdk_api", "moon_plugin", @@ -4122,7 +4122,7 @@ name = "moon_file_group" version = "0.0.3" dependencies = [ "common-path", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "once_cell", @@ -4136,7 +4136,7 @@ dependencies = [ name = "moon_graph_utils" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "petgraph", "rustc-hash 2.1.0", "serde", @@ -4147,7 +4147,7 @@ dependencies = [ name = "moon_hash" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "serde", "sha2", "starbase_utils", @@ -4158,7 +4158,7 @@ dependencies = [ name = "moon_javascript_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_args", "moon_common", "moon_config", @@ -4177,7 +4177,7 @@ dependencies = [ name = "moon_lang" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "rustc-hash 2.1.0", ] @@ -4194,7 +4194,7 @@ name = "moon_node_lang" version = "0.0.1" dependencies = [ "cached", - "miette 7.4.0", + "miette 7.5.0", "moon_bun_lang", "moon_lang", "moon_logger", @@ -4217,7 +4217,7 @@ dependencies = [ name = "moon_node_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_common", @@ -4249,7 +4249,7 @@ dependencies = [ name = "moon_node_tool" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_config", "moon_console", "moon_logger", @@ -4271,7 +4271,7 @@ name = "moon_notifier" version = "0.0.1" dependencies = [ "ci_env", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_time", "reqwest", @@ -4321,7 +4321,7 @@ name = "moon_platform" version = "0.0.1" dependencies = [ "async-trait", - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_common", @@ -4342,7 +4342,7 @@ dependencies = [ "async-trait", "convert_case", "extism", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_env", "moon_pdk_api", @@ -4366,7 +4366,7 @@ version = "0.0.1" dependencies = [ "cached", "libc", - "miette 7.4.0", + "miette 7.5.0", "moon_args", "moon_common", "moon_console", @@ -4383,7 +4383,7 @@ dependencies = [ name = "moon_project" version = "0.0.3" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_file_group", @@ -4396,7 +4396,7 @@ dependencies = [ name = "moon_project_builder" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_file_group", @@ -4414,7 +4414,7 @@ dependencies = [ name = "moon_project_constraints" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_project", @@ -4425,7 +4425,7 @@ dependencies = [ name = "moon_project_expander" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_project", @@ -4440,7 +4440,7 @@ dependencies = [ name = "moon_project_graph" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_cache", "moon_common", "moon_config", @@ -4467,7 +4467,7 @@ name = "moon_python_lang" version = "0.0.1" dependencies = [ "cached", - "miette 7.4.0", + "miette 7.5.0", "moon_lang", "moon_logger", "moon_test_utils", @@ -4483,7 +4483,7 @@ dependencies = [ name = "moon_python_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_common", @@ -4513,7 +4513,7 @@ dependencies = [ name = "moon_python_tool" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_console", @@ -4534,7 +4534,7 @@ dependencies = [ name = "moon_query" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "pest", @@ -4554,7 +4554,7 @@ dependencies = [ "bazel-remote-apis", "chrono", "http 1.2.0", - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_common", "moon_config", @@ -4583,7 +4583,7 @@ dependencies = [ "cached", "cargo-lock", "cargo_toml", - "miette 7.4.0", + "miette 7.5.0", "moon_lang", "moon_logger", "moon_test_utils", @@ -4597,7 +4597,7 @@ dependencies = [ name = "moon_rust_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_common", @@ -4627,7 +4627,7 @@ dependencies = [ name = "moon_rust_tool" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_console", @@ -4645,7 +4645,7 @@ dependencies = [ name = "moon_system_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action_context", "moon_config", "moon_console", @@ -4666,7 +4666,7 @@ name = "moon_target" version = "0.0.10" dependencies = [ "compact_str", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "once_cell", "regex", @@ -4680,7 +4680,7 @@ dependencies = [ name = "moon_task" version = "0.0.3" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_target", @@ -4695,7 +4695,7 @@ dependencies = [ name = "moon_task_args" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_args", "moon_config", ] @@ -4704,7 +4704,7 @@ dependencies = [ name = "moon_task_builder" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_target", @@ -4722,8 +4722,10 @@ dependencies = [ name = "moon_task_expander" version = "0.0.1" dependencies = [ + "cd_env", + "ci_env", "dotenvy", - "miette 7.4.0", + "miette 7.5.0", "moon_args", "moon_common", "moon_config", @@ -4745,7 +4747,7 @@ dependencies = [ name = "moon_task_graph" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_graph_utils", @@ -4763,7 +4765,7 @@ dependencies = [ name = "moon_task_hasher" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_hash", @@ -4783,7 +4785,7 @@ dependencies = [ name = "moon_task_runner" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_action", "moon_action_context", "moon_affected", @@ -4867,7 +4869,7 @@ name = "moon_tool" version = "0.0.1" dependencies = [ "async-trait", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_lang", "moon_process", @@ -4895,7 +4897,7 @@ name = "moon_toolchain_plugin" version = "0.0.1" dependencies = [ "async-trait", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_pdk_api", @@ -4911,7 +4913,7 @@ name = "moon_typescript_lang" version = "0.0.1" dependencies = [ "cached", - "miette 7.4.0", + "miette 7.5.0", "moon_lang", "moon_logger", "moon_test_utils", @@ -4926,7 +4928,7 @@ dependencies = [ name = "moon_typescript_platform" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_hash", @@ -4953,7 +4955,7 @@ dependencies = [ "dunce", "humantime", "md5", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "once_cell", "pathdiff", @@ -4971,7 +4973,7 @@ dependencies = [ "futures", "git-url-parse", "ignore", - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_process", "once_cell", @@ -4991,7 +4993,7 @@ dependencies = [ name = "moon_vcs_hooks" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_config", "moon_hash", @@ -5009,7 +5011,7 @@ dependencies = [ name = "moon_workspace" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_cache", "moon_common", "moon_config", @@ -5036,7 +5038,7 @@ dependencies = [ name = "moon_workspace_graph" version = "0.0.1" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "moon_common", "moon_graph_utils", "moon_project_graph", @@ -5807,7 +5809,7 @@ dependencies = [ "dotenvy", "indexmap 2.7.1", "iocraft", - "miette 7.4.0", + "miette 7.5.0", "minisign-verify", "once_cell", "proto_pdk_api", @@ -5841,7 +5843,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c369db05bac18030b65ad06d97ae415e5512a3b5279763ef35ff9d85bde5194" dependencies = [ - "miette 7.4.0", + "miette 7.5.0", "reqwest", "starbase_archive", "starbase_styles", @@ -6459,7 +6461,7 @@ dependencies = [ "garde", "indexmap 2.7.1", "markdown", - "miette 7.4.0", + "miette 7.5.0", "reqwest", "rpkl", "schemars", @@ -6924,7 +6926,7 @@ checksum = "985934bcffec6009ca2eb721b93fd7b87aee8605e9d134205d8d7e6ba141a158" dependencies = [ "async-trait", "chrono", - "miette 7.4.0", + "miette 7.5.0", "starbase_styles", "tokio", "tracing", @@ -6942,7 +6944,7 @@ dependencies = [ "binstall-tar", "bzip2", "flate2", - "miette 7.4.0", + "miette 7.5.0", "rustc-hash 2.1.0", "starbase_styles", "starbase_utils", @@ -6961,7 +6963,7 @@ checksum = "dfb2fd7146c0e55b53ab44aa4a178d4f27f2fd5ce33718054207cf8aaeacc020" dependencies = [ "crossterm 0.28.1", "iocraft", - "miette 7.4.0", + "miette 7.5.0", "parking_lot", "starbase_styles", "tokio", @@ -6975,7 +6977,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c91281d505ce323e248572ca04176cf43763cd7a98175de1157b8dd5f1a96709" dependencies = [ "async-trait", - "miette 7.4.0", + "miette 7.5.0", "starbase_macros", "tokio", ] @@ -7026,7 +7028,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65b486cfc419b43fee8b42a87f8d654c1c1d439df34cdf1bfa152cc6bdf8456d" dependencies = [ "dirs 6.0.0", - "miette 7.4.0", + "miette 7.5.0", "owo-colors", "relative-path", "supports-color", @@ -7043,7 +7045,7 @@ dependencies = [ "ec4rs", "fs4", "json-strip-comments", - "miette 7.4.0", + "miette 7.5.0", "regex", "reqwest", "serde", @@ -8023,7 +8025,7 @@ dependencies = [ "compact_str", "extism", "http-cache-reqwest", - "miette 7.4.0", + "miette 7.5.0", "once_cell", "regex", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index c143c627053..e0f289eb53d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,11 +18,11 @@ default-members = ["crates/cli"] [workspace.dependencies] async-recursion = "1.1.1" -async-trait = "0.1.85" +async-trait = "0.1.86" cached = "0.54.0" chrono = { version = "0.4.39", features = ["serde"] } -cd_env = "0.2.0" -ci_env = "0.3.0" +cd_env = "0.3.0" +ci_env = "0.4.0" clap = { version = "4.5.27", default-features = false, features = [ "std", "error-context", @@ -37,7 +37,7 @@ dirs = "6.0.0" futures = "0.3.31" indexmap = "2.7.1" md5 = "0.7.0" -miette = "7.4.0" +miette = "7.5.0" once_cell = "1.20.1" pathdiff = "0.2.3" petgraph = { version = "0.6.5", default-features = false, features = [ diff --git a/crates/task-expander/Cargo.toml b/crates/task-expander/Cargo.toml index 34727b68cf4..1d5d76412bb 100644 --- a/crates/task-expander/Cargo.toml +++ b/crates/task-expander/Cargo.toml @@ -17,6 +17,8 @@ moon_project = { path = "../project" } moon_task = { path = "../task" } moon_task_args = { path = "../task-args" } moon_time = { path = "../time" } +cd_env = { workspace = true } +ci_env = { workspace = true } dotenvy = "0.15.7" miette = { workspace = true } pathdiff = { workspace = true } diff --git a/crates/task-expander/src/token_expander.rs b/crates/task-expander/src/token_expander.rs index ff6250994ba..09fa76e2008 100644 --- a/crates/task-expander/src/token_expander.rs +++ b/crates/task-expander/src/token_expander.rs @@ -684,7 +684,37 @@ impl<'graph> TokenExpander<'graph> { &mut found, ); - if task.options.infer_inputs { + if task.options.infer_inputs && !found.is_empty() { + let mut blacklist = vec![ + "CI_", + "GIT_", + "BUILD_", + "PR_", + "PULL_", + "COMMIT_HASH", + "COMMIT_REF", + "COMMIT_SHA", + "HEAD", + "BASE", + "BRANCH", + ]; + let ci = ci_env::get_environment(); + let cd = cd_env::get_environment(); + + if let Some(ci_prefix) = ci.as_ref().and_then(|ci| ci.env_prefix.as_ref()) { + blacklist.push(ci_prefix); + } + + if let Some(cd_prefix) = cd.as_ref().and_then(|cd| cd.env_prefix.as_ref()) { + blacklist.push(cd_prefix); + } + + found.retain(|key| { + blacklist + .iter() + .all(|prefix| key != prefix && !key.starts_with(prefix)) + }); + task.input_env.extend(found); } diff --git a/crates/task-expander/tests/token_expander_test.rs b/crates/task-expander/tests/token_expander_test.rs index 5576108b40a..fab52950c20 100644 --- a/crates/task-expander/tests/token_expander_test.rs +++ b/crates/task-expander/tests/token_expander_test.rs @@ -597,6 +597,25 @@ mod token_expander { assert_eq!(expander.expand_command(&mut task).unwrap(), "$FOO"); assert!(task.input_env.is_empty()); } + + #[test] + fn doesnt_inherit_inputs_from_env_var_that_is_blacklisted() { + let sandbox = create_empty_sandbox(); + let project = create_project(sandbox.path()); + let mut task = create_task(); + + task.command = "$CI_HEAD/$COMMIT_SHA".into(); + task.options.infer_inputs = true; + + let context = create_context(sandbox.path()); + let mut expander = TokenExpander::new(&project, &context); + + assert_eq!( + expander.expand_command(&mut task).unwrap(), + "$CI_HEAD/$COMMIT_SHA" + ); + assert!(task.input_env.is_empty()); + } } mod args { diff --git a/rust-toolchain.toml b/rust-toolchain.toml index d2bcae8ceb6..62242a2da3b 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] profile = "default" -channel = "1.84.0" +channel = "1.84.1" From b14fa7f2a40de5c2afbdc59e94205cbec4e2cbd0 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Sun, 2 Feb 2025 15:18:42 -0800 Subject: [PATCH 15/15] docs: Add v1.32 blog post. (#1812) * Start on blog post. * Add image. --- .prototools | 4 +- CHANGELOG.md | 7 +- crates/cli/tests/run_bun_test.rs | 2 +- crates/cli/tests/run_deno_test.rs | 6 +- ..._test__bun__handles_unhandled_promise.snap | 2 +- .../run_bun_test__bun__runs_script_task.snap | 2 +- .../run_bun_test__bun__runs_self.snap | 2 +- crates/remote/src/lib.rs | 2 + legacy/core/test-utils/src/configs.rs | 4 +- website/blog/2025-02-03_moon-v1.32.mdx | 188 ++++++++++++++++++ website/blog/img/moon/v1.32.png | Bin 0 -> 1026514 bytes website/docs/commands/overview.mdx | 2 + website/docs/config/toolchain.mdx | 76 ++++++- .../docs/guides/javascript/deno-handbook.mdx | 1 - website/docs/guides/pkl-config.mdx | 10 +- 15 files changed, 280 insertions(+), 28 deletions(-) create mode 100644 website/blog/2025-02-03_moon-v1.32.mdx create mode 100644 website/blog/img/moon/v1.32.png diff --git a/.prototools b/.prototools index f8dbadd86a3..4aea8c629d9 100644 --- a/.prototools +++ b/.prototools @@ -1,7 +1,7 @@ # These are used by tests that require the tools # to exist in the environment! -bun = "1.2.1" -deno = "2.1.7" +bun = "1.2.2" +deno = "2.1.9" node = "20.8.0" npm = "10.1.0" pkl = "0.27.2" diff --git a/CHANGELOG.md b/CHANGELOG.md index 29698a88726..24ac87ad3bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ - Added timeout and concurrency limit to clients. - Added a `MOON_DEBUG_REMOTE` environment variable, which can be used to debug internal errors for diagnosing connection/integration issues. + - Improved handling of TLS/mTLS connections. - Improved the Bun toolchain. - Added support for the new v1.2 `bun.lock` file. We do our best to detect this, but we suggest configuring `--save-text-lockfile`. @@ -34,11 +35,13 @@ - Improved the Python toolchain. - Added unstable uv support. Can be enabled with the new `python.packageManager` and `python.uv` settings. - - Right now, has basic toolchain support, including dependency install and virtual environments. + - Right now, has basic toolchain support, including dependency installs and virtual + environments. - Renamed `python.rootRequirementsOnly` to `python.rootVenvOnly` (old name still works). - Will now inherit versions from the root `.prototools`. - Improved the Rust toolchain. - - The root-level project is now properly taken into account when detecting the package workspaces. + - The root-level project is now properly taken into account when detecting if a project is within + the Cargo workspace. - Project dependencies (`dependsOn`) are now automatically inferred from `Cargo.toml` dependencies. - Reworked child process handling to better handle signals and shutdown accordingly. Additionally, diff --git a/crates/cli/tests/run_bun_test.rs b/crates/cli/tests/run_bun_test.rs index 75d944badc3..1b17b938ac8 100644 --- a/crates/cli/tests/run_bun_test.rs +++ b/crates/cli/tests/run_bun_test.rs @@ -359,7 +359,7 @@ mod bun { let output = assert.output(); - assert!(predicate::str::contains("1.2.1").eval(&output)); + assert!(predicate::str::contains("1.2.2").eval(&output)); assert!(predicate::str::contains("1.1.0").eval(&output)); assert.success(); diff --git a/crates/cli/tests/run_deno_test.rs b/crates/cli/tests/run_deno_test.rs index 6c0d90e192b..96f3df8791a 100644 --- a/crates/cli/tests/run_deno_test.rs +++ b/crates/cli/tests/run_deno_test.rs @@ -44,7 +44,7 @@ mod deno { let output = assert.output(); // Output contains arch info - assert!(predicate::str::contains("deno 2.1.7").eval(&output)); + assert!(predicate::str::contains("deno 2.1.9").eval(&output)); } #[test] @@ -230,7 +230,7 @@ mod deno { // Output includes the arch, so can't be snapshotted assert!(predicate::str::contains("deno platform").eval(&output)); - assert!(predicate::str::contains("deno 2.1.7").eval(&output)); + assert!(predicate::str::contains("deno 2.1.9").eval(&output)); } mod workspace_overrides { @@ -248,7 +248,7 @@ mod deno { let output = assert.output(); - assert!(predicate::str::contains("2.1.7").eval(&output)); + assert!(predicate::str::contains("2.1.9").eval(&output)); assert!(predicate::str::contains("1.30.0").eval(&output)); assert.success(); diff --git a/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap b/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap index cbfc89fe2fa..281325e4dd1 100644 --- a/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap +++ b/crates/cli/tests/snapshots/run_bun_test__bun__handles_unhandled_promise.snap @@ -10,7 +10,7 @@ stderr error: Oops Oops -Bun v1.2.1 (macOS arm64) +Bun v1.2.2 (macOS arm64) Error: task_runner::run_failed × Task bun:unhandledPromise failed to run. diff --git a/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap b/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap index 84140322dcb..0862ee37940 100644 --- a/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap +++ b/crates/cli/tests/snapshots/run_bun_test__bun__runs_script_task.snap @@ -4,7 +4,7 @@ expression: assert.output() --- ▪▪▪▪ bun:viaScript bun platform -1.2.1 +1.2.2 ▪▪▪▪ bun:viaScript (100ms) Tasks: 1 completed diff --git a/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap b/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap index daabdca75ba..eb97ddb2be0 100644 --- a/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap +++ b/crates/cli/tests/snapshots/run_bun_test__bun__runs_self.snap @@ -4,7 +4,7 @@ expression: assert.output() --- ▪▪▪▪ bun install ▪▪▪▪ bun:version -1.2.1 +1.2.2 ▪▪▪▪ bun:version (100ms) Tasks: 1 completed diff --git a/crates/remote/src/lib.rs b/crates/remote/src/lib.rs index 883164d3208..03be2e8a95f 100644 --- a/crates/remote/src/lib.rs +++ b/crates/remote/src/lib.rs @@ -19,3 +19,5 @@ pub use remote_service::*; // TODO: // - Other digest functions besides sha256 // - Directory blob types +// - retries +// - metrics diff --git a/legacy/core/test-utils/src/configs.rs b/legacy/core/test-utils/src/configs.rs index 659e72b2ea2..74c2db223b4 100644 --- a/legacy/core/test-utils/src/configs.rs +++ b/legacy/core/test-utils/src/configs.rs @@ -348,7 +348,7 @@ pub fn get_bun_fixture_configs() -> ( toolchain_config.node = None; toolchain_config.bun = Some(PartialBunConfig { infer_tasks_from_scripts: Some(true), - version: Some(UnresolvedVersionSpec::parse("1.2.1").unwrap()), + version: Some(UnresolvedVersionSpec::parse("1.2.2").unwrap()), ..PartialBunConfig::default() }); @@ -395,7 +395,7 @@ pub fn get_deno_fixture_configs() -> ( let mut toolchain_config = get_default_toolchain(); toolchain_config.node = None; toolchain_config.deno = Some(PartialDenoConfig { - version: Some(UnresolvedVersionSpec::parse("2.1.7").unwrap()), + version: Some(UnresolvedVersionSpec::parse("2.1.9").unwrap()), ..PartialDenoConfig::default() }); diff --git a/website/blog/2025-02-03_moon-v1.32.mdx b/website/blog/2025-02-03_moon-v1.32.mdx new file mode 100644 index 00000000000..136bf14483f --- /dev/null +++ b/website/blog/2025-02-03_moon-v1.32.mdx @@ -0,0 +1,188 @@ +--- +slug: moon-v1.32 +title: moon v1.32 - Remote cache and built-in toolchain improvements +authors: [milesj] +tags: [platform, toolchain, remote, cache, pkl, config] +image: ./img/moon/v1.32.png +--- + +In this release we focused primarily on remote caching and toolchain improvements. + + + +## Improved remote caching stability + +The main focus of this release was the stability of our remote caching implementation, by fixing all +bugs and edge cases, and adding support for missing or new features. + +### New settings + +To support new features (below), we are introducing 2 new settings, +[`unstable_remote.api`](/docs/config/workspace#api) and +[`unstable_remote.auth`](/docs/config/workspace#auth). The `api` setting defines what API format the +remote server supports and expects client requests to be sent in, either `grpc` (default) or `http`. + +```yaml title=".moon/workspace.yml" +unstable_remote: + api: 'grpc' +``` + +While the `auth` setting does 2 things; allows HTTP headers to be configured that will be injected +into all gRPC/HTTP requests, and a token (via environment variable) to be used for bearer +authorization (instead of TLS/mTLS). + +```yaml title=".moon/workspace.yml" +unstable_remote: + auth: + headers: + 'X-Custom-Header': 'value' +``` + +### HTTP API support + +If you don't want or can't use gRPC, we now support the +[HTTP caching protocol](https://bazel.build/remote/caching#http-caching). This is a very simple API +that uploads action results to `/ac/` endpoints, and output blobs to `/cas/` endpoints (content +addressable storage). The HTTP API is _very_ simple and does not support any of the features +provided by gRPC, like batch uploading/downloading, streaming, or missing blob detection. + +To use this protocol, set the new `api` setting to `http`, and configure an HTTP host. + +```yaml title=".moon/workspace.yml" +unstable_remote: + api: 'http' + host: 'https://cache.yourhost.com' +``` + +### ByteStream support + +We now support the ByteStream API for gRPC servers, which will automatically download and upload +blobs larger than 4mb by streaming chunks of data. Previously, if we encountered a blob larger than +4mb, we would abort uploading to the cache for that action, so subseqeuent runs would always be a +cache miss. + +### Depot cloud hosting + +Our good friends at Depot ([depot.dev](https://depot.dev/)) recently announced +[Depot Cache](https://depot.dev/blog/introducing-depot-cache), a cloud-based caching solution that's +compatible with the Bazel remote execution/caching API. We were very excited to read this +announcement, and wanted to get it working in moon immediately. It took a bit of work, and uncovered +a lot of bugs on our end, but we eventually got it working! + +To make use of Depot Cache, create an account on their end, and then configure moon with the +following. + +```yaml +unstable_remote: + host: 'grpcs://cache.depot.dev' + auth: + token: 'DEPOT_TOKEN' + # If you have multiple org's + headers: + 'X-Depot-Org': '' +``` + +You'll need to set the `DEPOT_TOKEN` environment variable on every machine that will use remote +caching. +[Learn more about this flow in our documentation](/docs/guides/remote-cache#cloud-hosted-depot). + +:::info + +moon itself now uses Depot Cache for its remote caching, and it has been working quite well! You can +see it in action within each pull request. + +::: + +### Miscellaneous + +- You can now use `http(s)` protocols for gRPC servers, instead of just `grpc(s)`. +- Added timeouts and concurrency limits to our internal clients. In the future, we will also support + retrying. +- Added a `MOON_DEBUG_REMOTE` environment variable, which can be used to debug internal errors for + diagnosing connection/integration issues. +- Improved handling of TLS/mTLS connections. + +## Improved built-in toolchains + +It's been quite some time since we've made any changes to our existing built-in toolchains, and +since there's been many updates in the ecosystem (like Deno v2), we felt it was time to do a pass on +them and introduce some improvements. + +### Bun + +- Added support for the new text-based `bun.lock` file in + [Bun v1.2](https://bun.sh/blog/bun-v1.2#introducing-bun-lock). + - We do our best to detect between the text and binary formats, but we suggest configuring + `--save-text-lockfile` in [`bun.installArgs`](/docs/config/toolchain#installargs) to be + explicit. + +### Deno + +- Added support for [Deno v2](https://deno.com/blog/v2.0). + - Now supports all lockfile versions (1-4), thanks to the official `deno_lockfile` crate. + - Now uses `deno install` in v2+ instead of `deno cache` that was used in v1. + - Added a new [`deno.installArgs`](/docs/config/toolchain#installargs-1) setting. +- Added support for workspaces that were introduced in [Deno v1.45](https://deno.com/blog/v1.45). + - When a project is within a workspace, it will now install dependencies once in the workspace, + instead of in each project. + +### Python + +- Added unstable [uv support](https://docs.astral.sh/uv/). Can be enabled with the new + [`python.packageManager`](/docs/config/toolchain#packagemanager-1) and + [`python.uv`](/docs/config/toolchain#uv) settings. + - Right now, has basic toolchain support, including dependency installs and virtual environments. + - Uses `uv venv` instead of `python venv` and `uv sync` instead of `pip install`. + - Relies on `pyproject.toml` and `uv.lock` instead of `requirements.txt`. +- Renamed the `python.rootRequirementsOnly` setting to + [`python.rootVenvOnly`](/docs/config/toolchain#rootvenvonly). Open for discussion on the name of + this setting. +- Will now inherit versions from the root `.prototools`. + +```yaml title=".moon/toolchain.yml" +python: + version: '3.12.0' + packageManager: 'uv' + uv: + version: '0.5.26' +``` + +### Rust + +- The root-level project is now properly taken into account when detecting if a project is within + the Cargo workspace. +- Project dependencies (`dependsOn`) are now automatically inferred from `Cargo.toml` dependencies + (only `path` allowed). + +## Pkl configuration now available + +In [moon v1.29](./moon-v1.29) we introduced support for Pkl-based (`.pkl`) configuration as an +alternative to YAML (`.yml`), but it was hidden behind an experimental flag. Going forward, you can +now use Pkl without having to enable the experimental flag, and can remove any references to +`--experimentPklConfig` or `MOON_EXPERIMENT_PKL_CONFIG`. + +Additionally, we now have [official documentation on what Pkl is](/docs/guides/pkl-config), how to +use it, and some examples of what it looks like. Check it out! + +:::info + +Based on feedback from the community, and our current thoughts on the configuration problem, at this +point in time, we plan to support multiple configuration formats instead of choosing one, and will +most likely include support for JSON/JSONC in v2. We're also open to other formats that may work +well in moon, and are compatible with our current codebase. + +::: + +## Other changes + +View the [official release](https://github.com/moonrepo/moon/releases/tag/v1.32.0) for a full list +of changes. + +- Added unstable support for multiple package workspaces when installing dependencies and resolving + lockfiles. +- Reworked child process handling to better handle signals and shutdown accordingly. Additionally, + when the pipeline receives a signal, we now display the status that shutdown the pipeline in the + summary. +- Reworked the new task `inferInputs` option to not infer environment variables from popular CI/CD + providers, as those values constantly change, causing tasks to always be affected. If you would + like to reference these values, add them as an explicit inputs. diff --git a/website/blog/img/moon/v1.32.png b/website/blog/img/moon/v1.32.png new file mode 100644 index 0000000000000000000000000000000000000000..0512cf4ce9e9c5c4609fd8a65beccb17d5b2c3eb GIT binary patch literal 1026514 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ęUOF?zLyAgtJ9o2TJfjR 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

X~3)CW+98TU2b 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%0AcV z1c@#&Pu?l*_x5a4gS;qXf^oa@OvSzE_vQ7h|9#H6{3>Is0ShnUYYb-JG=XQI+z@H@ zh!0hz0J?FhWb6K#!7Bo;>{Kjm)+*V-T3?lmH^5TwY1|q(^MA9w@q4OipgE@4vh+>H zcC8yWj0+pKz5``87SXU2ltQgilQF4Ik16PR?T8r8Z12?U#g3Ola&htMl|zC3DQ%e=Bl_ zj-|Vtgla7xz3WOw=_+?Z8IXMt2^!R2#${|7>4E$`*AbFw> zfvfn}JRg48^Ym;?&$Dhk@0ifFUA%Cp(&wmSGtYz3V)5&x!opRJPbCh??;YO)BSKW! zx#2vD7GHfm5_3D#pW}A>3Hfg?_!^on zA_koSH|8*%D{K=^%zCX9P@h3^#-gU2P!&ft-3oS9M##WA%U2@C^=ix+*PX88866R( z_=&ZKaet_OSO)PkFCOx~7q2b~DV_>|$mghE0YdR6^Y|R!A~u13Bqs`FSu4=}6=LF- zIl(Td6HJL{%u%zUD4&D_es>FN%Z@R%H#t0kE2fP_IO|?Wu#Ow~;hdZVP|1Q15OORN z6%~*pc0?KDI4J04-Q!JzY)c77^C_R_tUU>`v{FiRRhvJOVX05Wzinl-?vN?N z`ConCz15-*$nU}A)Arn0gZlRErayk}q66S+t5|xHzsM6p!t-`{2LZ_ra`Ea~ctS})1WT+I^6>su4rK4VMz1yq(~CYW{rH#szHh`u+g~na-(9VS{A3V(^7`?^WRG4c zRd1RP>h)Uo>^!R+`~>VdAm%MfE&m(J_ryJX^SQ>r3G)&5ZTwKe->g%M=S4r_DB=ee z8|)314xaB2Uc8)DVy^pq)w1k!%9b3IP=aE&>^U$NbH?FL?*o$^ZGJb3f3`W%p#LU5 zub2eK4)cYK<$>Nte#QBKr?9|QeGq~V1w-Ek+ssn5Xc}-<867GAb9N{!rru7G>ZI>A zhmowd%ZFsBu(i=`Bf5M@W`WIX_-@lBY{I-oSP_I4zJb__c#Rqxm%u@c?wVx1b%hV6 z3*Q-cUkiT_Zy?-ZuhfSF_?`)d#3Aoa*C!u)FM)O59Ez1b#?~fc;VQ2&%JyFKY08izvhS$&mwYgntQ@x)XCn>Bg;@UAOU&=_J@ZQW9a#4KYy zG1s4>v2*oUUV?M1w5;1c#n>WRhZ|>4llw0CGkhZ6TfNF=rMDA zxoCxX%NxM!@$BVs*pI5AtbE5aFD&gWA2DOP6H|Pr+{7uo(%4a%5alWuP1J_=kAhY7 z3KN^uVP0LgE5fVrS?2BR(HkGb>dh%9LEz%00*T|lbCB`h^jh#rHaEtKShKhq!=PfW zxo^h%1Zem~b$1p3%6pPuJQZ(U9^+|WZJZ0je|Zn40MBHW>*g?t<8BW z5+_{RF#v#oJaIK0%r>0s7~!3AD%S;kFYXu0l_Q5=dG$-ZwMQg<0px=_%R@MZtqQkb~dDGv;sY)lECYqikF*cjCAMJQ%zX8n+ zZ}#Xd92(tbXBbl7LlMWj`dAR2waQcOenAs(eL<2Z;e z#sEvAjYOa=ecdb*?(pYDu!;_D%ydI&?vRNpu4B3ZFMocd1yah-cD z1T%bkf!E__4OF|YP2&i@#0c6{;;FrXb7N5sH^92$10vEv2!keW#0CXTUkL8DfIN4( z_*(G#a9jw`Bxd)(_OvUAAGA0xA1ICTbzVGk(%jjNai}B+DHsE+{Rhb>faaFM8Cr-r zra+sR0@znAv9s{Z$Y3T(p1mKWi_z@jvPl$z4?NVry8na?tQo85MEtY~g?24yeAEd# zb8Tb}-~)7V6L+GRGM8exlf-@$U?-XebB@QS>c- zi2tA8huG~o>@N^Xy?s8V7V(gH=&bYZ(n|)pXLOHW+k0z&!GI_9i8kYGZH&A0oj*Rg z*tD{9_;kjlT}_>BsT!cPQ4I+OA;I3Fpd2zA4bUFNOwZKXpb!kN*&igbY5xY;*kAVQUR0p*(>Z}G}Gkix&{m|Z&_ zD=Ku{a%K#3VAwzX!n78R`gF7=vk?wNN{H(~*9BcM8{Rk`cJVgRMGMd7bx7oe%x#T? z;>USY<*yI1w(y*cu@V`t?Bi$udKz3@DRGbD-;>M5w?Q{93S+Iud@|N-v;NJn-Dn&j zy=>#3>Tz%8UsLko4}@Dw{7mjhueIT7;M&5;uPqBzAFj{5@4~-$;=|2yOx8unDgN5< zP5qJP>^xXcE=8wfM#N^QU>kE*_Fya?a7+w_OGsQ&-0?k5&P?&bCw>AV=Q~xphmDO6&72b>l^UD&F6W%37wE%{prTuriOgH z*Zb-#;(wTFzyYbFN*DSUeW{lONRxRYFBFbB;fk))tDVNkgJ9y(`Mvw(AEq58wo1sv zUt`DXoYWCkh5fGnC;T>p9+XvYwV@54E*Y+yb5O3{TqE^*Jw&Y9QbSD+{hfS{dEwfC zFg|c3-+J5dUrx*q7qFHs?FJF_D&ez090Y!r*$Jgxa`#vd~dcaDG7t!vmFJGQmm5D0e z`^M+3%_H{O7+xj?q)=f!I&^Mya?Bskov*T`E(99JZFvy=R9sc?be_D))@;)1<&A?v zoG5rq-?fc8H-6D|l4($4(+7cAARMpvdodUCKIq;+g_zE9_BEc777nvafGzhidz3;nXQssx^DBMBHrQOu`^^I`Ya;3P5{X-vBZXMdg81)^xoKu z_@Rybg10EHnj@~aw+6oPTQQ{*eY#Z(Rtk8l5h7{}o z9m<#vOgVeCFPPkQ+Ifp%4Od+68}+*&p_i!`;HM+cBA)wDj7i)h7a1|X^2bYzI>3zL zfftarwF|eh?N$!zXVky3U1)T_Z;ZPZ1zC(V4mzG%ZGu&uv-2G*oaB3<*Tk5XQxci# znxD_rK^Rejloz=OrG5^v`{I!Jx5Tp~-E`m#>(1`22tp%k5#pZnIE}hB-`X{f|K!|y z{Fg*_Ne8l!u7lLYjb9B4{-L1Ky4k?Kp8wZ%T*SZYxW~MA)vaPs%`N%gAho!_lcVL} z6~SS5ul(QhF8jt+{GaLyxx=s4#>1Vk%plm^br!VsE~MYyXME;TAm`tE#{~iz<%X4z z^ocT~c#dl|*cjjfYa^ehjsaZM17}_Z)&BKw*L&YA^>)4ZGsWO8aEs&kmtEhPM{zFt z92uZox%`TR%qQz$7-=q4@4S(0g1c9F^o(zWvm!Rdn7$M1&C{36`b4$lSOa-?i+hsq z%HM4Eh71d9JNZDvCZGM3VdO{aOFTG!HSGmi2IAr~w$nTyp*kxf>yv1&cdGx#06@&IO zfNHkJof-OrPJ%fIoNSUepQrH2dzmUDuM;MHy7*suGBN9#U+a&)F`W3wd37ne>aOY; zvE-SVgFl;n*FSk!l2;?YNYCZ-jGQH%@J9TnJxR8}1kn6f2dX)^U9+6l=|4!#E3Zb< zm5SA7UgN7C6-5B4`{q!o$MDI?Gc;8%KVvkqP5=Jrr^bRer;apfBmPOqi>5fNpy_mN z{C26ki~tnNI9)lWeNUci?L7|HtnAdsvsq-H$(R>GrSV?(9x$5L(rfLosiU<17v$6Y zpE(MW|K;9fqp+aGSn*w8Cho~5l{)LZcD&x0Db|;`gAi5}s`}BZX!Uy3 ztLZIwDU}%`QP*h(;2ap7@8uxXm-?PZ+()Oo84TkA%*;vVYXvKh!MaGgh9kj=%>8xX z_29{%cC%A1c?IcZvS-q;lErb@00cNa;Deby_mbNPAVmS86~K|NXFy~yk^E2B1wLji z5-E>)9IpJ7-D{A5XXcaJgIStvAhEX;X{hr}EQ6iRoBcMSG8uu^aK`VY2=&GyBP_Kk z5(EI&95|gC5`zxLp;_}XiQ$Y59Pz!>Mg`B2kT`HiJ47fqB1}b!#^GmE(SWS8)6uzH$t^N;vAF3~&y z;EdrI$%fH<;JfF~6EkL6_&)n_a3A!Jv7=|ljD0ilZ|i|$(S=(0wjXM-Bk>dtcm#*E zEx)h3i)xQJi5))N1v}&S6y!k<8Y>o{V!>isxE<#B+J;=>To};}51{PM3$M2CU$0O4 zaM@%#fER6OL6UST6AojaI|;LgiJqG*T3q*d1da_ytOq2ljiCA8@8eNMtAUpK3S?t( zAal=<|8HR?gUxe6K=Pj03J zV2&Y1h;n#|f7km?_~(OPW!;eaBwIz>J~3)}EX$j0A2PJDfHD7n>bPH^^Wz%ZwI5pl zlRrf5Vl5gnxz(h$p7cfP$cdHIPwIq_{#`H`P3--A*vZg*hictEiTCubiZS;4a%D#w zChz9_;zXWmM@-fNgK=si`b8IT&95LG=8)l-R=j#!)ZGKMDU52vODjod%c8E#y_%fI zdxLb9gCm;6f%;~*7+*8C-4G(y`-igqjH%oRJ7P_h#W*3%0Ilw~4s+DNvjZcaHnr5l z)4SYVKY>TJs9r7O{-B_nL+W9|$D+!zC-HF5s=^=|kBk@R{wRpZ*D}?F)#--_CD^~HrV>0(9eKslAy&KSJa*&K(3g$SSrCp1^D=7$0W+O@ zNc>w7aMq_Vp1O(w^8pnAWBkKg{I~Tks^1v1!F<#B{K=N{uvT{^nBhncs7UCv^Z^%_ zZsV}oPVE{GfJqFY+3AK7=f$-ttJr?u8z;uoF~yl~Sy_$|c$)LE)JQqD6HgWcOz}-^ zBRO}*tBORy7veWp9|HH|UpJ>L5q?4D85?)wcP-~<`w$?p4ghCQ9O z%jrk*$?ID$86|;lmoT_+*3NN~&j|@0iB;lDPMub#g6l zf`CJ4paX2t>-S5-JD@uaXUF?F4D*R1r>9N&0@Y%^lDXLtgK>#+?B;DX67`#j{re&0 z(}%h)K>o8CL4c!6K@eKtaCEs&iOKsDNOk>KSm}h}BVB?xu*Ku4M;ESi+|?(PO2p&D z`4y;QIruJKIe|U6xKBT<#8+O^hD_N_<)nD4oY9^HZG~?xK1u8q-`--f%v=*BZ&^N2 z;3#&P79jbcmR6=H;a+<9oA+rd*NsztGG@eDx@H_yds28Trlhf(<$7*Jm!LegHjLs4 zAyam2QJ;So;$S;9nWLPQWkxIe0`n7_lA!`?49O(4`$_7Y}vUObE;jzn%QcZyoO7?6}Iv)x%%s zF#wD(c*zeQRDBm$2F4|{JTgy>o1IDmu zw;4TDY~`o>ZBw_EkkEMUO-e@2DVCUjG+YmKrd0i}m@JyOF+^hO7Pux;7Z2$VI3P#W9SsmV-Y@ z3Bq=Rewx;Ayo{qD&ai9h2l=KuPFw;+u8M>5dEa21uW;yMu$L2l&cQKb1`0ih#~RQ7 zm2LH*qG`QRSiIF{!j41cg?1xIU}N;js0-Wx$3x*bvAEB@xi{DU>;qcY#3DX=zDizj z*1MlPsslaFgNoVGQSahp1d-J}V?TB2p1<3-*d@iB5T*Q6o4`$(f3@yB_nG5gkBWaD zwjPr1KICJO#ql5d8%832nztSY`ytP-?%EmoT|Suh;QH+BS@NypVXCF$x0b>;{j(jc z4&F#HtK4o@a|hJ$FZ_GvA=Q7o+B&irqIv5?pce0V?# z1y%r^MsS7Gc>%fTT3o{q(2Ie$#x#KX>kz~e%!^tj3If(sj?f$vK><<*sh|(A!zi?j%1}dRxKRSqQ?!KVd?v8kHQQ$Ce781yaCq!~$ckb~ zKh4{Q`S30sG?HD~VvoiCoo-kYrBG#rkFgHT4qMB{ke5%u2ET|w$tQSNmb?;*E*3&g z)sGmHrtynS*ZB*QePlt$_=B*EtDO7%v{QW*OxQ`-b4OpeWThC#S-cb@a&P@TsDVzr4Ubkh#omv2IRQE~EhbXp;Eji2`c zysMF%lWed+E{9I5y-zx5zR0{aqxQ*Eihba4y}EbREPLrop2*-D~HysYhlYq&z*8_6EN*_{mZ|3 z#`=hemw5?_YIhkAANIO*wK^t2J9A_}q!LjKy_^WL2 zJETrL;%~^+w(aL2?96$~*{{UewtOf(4jYZ3(o*Ui@*p_Pv$&C%`R6LRL(gk40_<;Ji z3*=Mqd9w@jT4J4*%s|)0O)P@xPBCF^jEL1OU_fj7S(w_75koyy|06SUj~b5PCv>{IxV%?`hr}<5X@ahe+Kx`!qSD3pq8@pg^<26IN8k z|B~hr1v3v7`9JCgKYfKaGplygdva{MU;pJpd*+l6!cP>3af$|x4vp%1Um|l14ci19 zOBzZD9clD&C)$8)9BG|mXNntDM7;8R3ft~ePNCXvz2)2${-)#RG{=aB*s!81$-3NFPI$iZv*XL1*qQakPOcKSyTGx9#msK!APdU8g(zxx5H=)~1>ej}MIPosS z5L+2AErXazvO|-DC*B2NeKO9m?Lv#srBD`84Gd!$Cp??r;h-KDR&i=;Ko5U-D>R($ zoNfA@I`0d6F`h#o7)UH3dr8r;V<|((k(1eoOWt_u6Z9AtgPPE|%f(pqCsazIU8?W~ z)(A;5kXZ1Tay$D)n7wpthb-%VZ$4Bsw(>^_YT*j12dn!|3Sl`}U3~OK zKXF%M9o@t$fWCQLyaLC@FcqZ}y-6>DMjZcr^J4Pp>6%U?4ZPf=n;kgLKj(5vdtk5+F?~bhX7fbidRJ_MrWg#tyk{%G( zrUHQP-yAjJBz#G~Up(e@)YE&laBJ0{H)F5QTZ5i=A9 zAo+6)zMSnNKShJGbqBMY5R)0ZCr00hFnv<9YNEc_n0?JEHUNkdrLWd?i*s)@S*OrX zB6^D>CtW8NsFK);lV(cY6p?wx*ls3i(x{y~#`rVlDaK+amTUbetT*zV%6l3k5^^eC zUdaXQ;KuzN+L=hjoDr+#AE5fM0Dv*(4Wys-|F+Lr<5MjniQGhPN@RI|cZ2rAk#o+v zFd~3(Yp9EpZ-npr(ZBSuBZqY6L;g8*<~Ym$=kY^Q&jf zy*#peZ7w?3&RY$NPZ-kwy{-~=DDRy&@fH9$7Q@YJu3bLlr?^D?)QjRMwRRV}ojI9P z@d#$*k087&-Gg|}tH#jKWL6Zh`lKPZ+V=8pyyB9ed70577dbB)s**F{{h(8j^Mml`~}l}d&2Rg zu_Ed~?c+)cL%2Y5SfFUrOOHTupY38s_qKK@_opA;v=j{7| zph;T#lWTCCh~x5uoL)qni-E>Mv=2P9foxui_&5Fvtmg1EfFDh~(7@0oq3eyHL}DT# z-TOrU!$O3J9JHbgqRqvAjCn*Vqe$aDXy5u+(|X=(j0=$5(2=ac?9uxPsQiu&Mo`Kd zsh^40A!2f(MY@%!Wrpf~0!8ri0#eTjJkxRJoyF{Slrc}0ACtgc_`NnstS@LxU>WZ< z@)(?a)8)J2dK`phMw)!WPEly$mJ69Xo0;JReD>AT5%M~Nc0cpu4hXeOY|Rs^0^x8M zS9;_kyotk4^5~+a_74JPM6B~_rb&~1a`%y^go{lj#Nkj%Kt6e62MDRIVth`A3@6Yh z81>T%majp+dgdQ1GezX*7JiW3tS6?fqS7B0|4X1 z+$q;B61*_~1UU-&2BpS7y)j4%%h?EL`uCfW0k`oijM0&{;!4G9{+JSJ%#-ZCmsl6i(|n-Rc=-Nmfm1{lf};mEwcaixGDZ+0WjmA=nz<$8BSk-sw&&@gDN#XjGm^S z5>4~}(w);HM8!D!1m_1nI%3FVcF6w~yOr-VevKAs20Vn&+j%Q+Ad5vvE?jMpH8`hI zQ@~00cv#dS8vo2nGM=*b21vp5mileK*6Yh)i)l*;kv!NsxoA9}>=&!$q0+3UAlS=! zS4s|Yqwt&XDXsq@c~#^KTLr#H+gAUFuV-C+#2>kLyFMS@UPA|UwcCaLQF|NN$#Ld? zUgV%Swl=V_ETW;^r27S93XWF}%_;m-^#}~v-0sE?sw=xL0_fRKW|cFB_;9zf=-sDB z&j%3JwQ>XI&=4CF;dj<>i+w6MfHl0?bB>DtGCI%SN-wh?0mLKwmZ+mP?Qi%7`;>p`gHesGy#UVb>)r_*^@)ozZlG-N89C64g$i#Y58n4Sn+)4$C*C#-X7IptQ>mEl z(~#hWsbP#y9J;7nAimgZ{&aK(qaYp>#*~By6&|*>wr4~xP zU>o&J{-yfea;Cqk?_$hJ1LrsRBEHn}11~f=%Ps__p|>xQO@tSm870pt08eSG^;Tah ztiza@lV$@{Z@RZZKkTgqLmYdGWtE0o{7?9Mdz74tKU&;YjMA&|MA;53nKUc-PTK1j z3vOfTiGBnwUGN#R$D_v6 ztawKo=kFi?91q3smA3={0}tvpg|1108n4I!-k&<|B8Q>annYx|BDy#18cft7J=-~H(6&G^g^WXSZ)W| zxyApTy~n#Oi0LAA(Z=DJD~2iuc3s6tJg+)@M`{iBm*UbJ-Xz}7n#i+@pT~|t-lPd+ z={^h@b;2I?!}0^hCao8v8E)uv-V{q2&%;pu*8L1ZY-0+?0&o1{^wSK4a_(;L?&oH} z-TXh>^ECkt&I@zx=ffC!G#?cQ4i4snTQYsF_1QPXXSv2`0N`z|9Dab#+FQzDr~3xud0{PUKdTVyVp0(hjeXZjpEb%WBXu_-}mt!{1(U625&GvV#>$(zw;l1 z#yk#u08v!@$WbKzmG6@>OAX@hlNHC% zIPbDe`5y-k+AWn&$#e>N{ffe?2O%kQ+TV2Qsm*9JIF5IMq`cQZ`;P*vldEVvdbVJt02CUKU(aDY&GW94PEI;ugGQ}S-1w2Kv z+5yb-ZpZu|Xr#cs#NhpSWkZ52+6?R&|J%MwAfJZydY@8H$(2Nzj!6FE;T}%~c2-Ty zl|9mo&Bh$Lel7|bcS9R5^=%}%aIV9OoK`G$!rtt%DHi=b} zq>UkI8*n79m{8juG@gjDBW;uq%9BMD0sw47 z`Gvp(flMTXcXR~b>**C*q@`q)Pf|er+~_3rX!?GKWkE~Gyn8>0FIk9kmodb0RFLu* zRg_V3OucHc9fe&lZdjm~jtvcy{7gTgFW@G{odDq8#|$}Uu;}>GCu#FUGSIMX{DeJO zHdE$!fxAaP05r5AUr_(BA)jyyUT_ontwxSC;ly82Bb+u9pDbDJh>R$j3ojH;$~Ov+ zPn;mhGG9UDk(IRPd7x2L{OZMJjOgeNCvHUR)Z>jo5vCEUVl$%XER<-AeFo} zOd#BL6wWb4!EO{@KU;z8`^4e`i?DB2_Senv_3HSn#cGt!Uw+kW?84WO|GkkDzrFs- z*JQJU^55)hmgY)jiVl{8m=QljJQqLneT}<&LRfKEdt$~VaiG-3ezl4-NQ)Xg?UR2` z8HsVG$A8H`#Qz>Vd|#K%q4}(tE_5CFs@{`Bo1t$oVZeYK2i5`vNB&P=u|YQKv-o+W zZumRz&tuD-c|9ossGQ}Fmj99Q=G1Y{|6ywr0EmSM=bZ1+ywThJ1M#0!m`Yyg(pgP# zyY8000NMCT>7%YIzet3n7-Dk4$5dy8Y*UzI9&W{f)JLZL5-f%qwlPL0fqW-kI4`r= z;~x;7dh^fQ{D{_ZrWC+(fa8m<_4sd%QZ+{OxBQ8}@>@!*m)*y@TbR_j#>z+eu`zyF zEePfm_Q(ww;$QjU_;B{|C`f_Bw4#SLw&fTugOv6t_KI7<)w+sS`<#4CDb#3Gh5+V0 z#?$mqb!g!A%U&+J$$FFxNw1vamF}@FecqVOZ|QT)JfUnSw9gs{q8g0mpyW` zd;eGQ=wiX5Z<06FtqfJW0H?J>-G%v554h5(`X3^<9Feb_FZt2lj$kL>w6@s=!Xxb> z_ZSB@v;nA1fWmIJ&ur((uT7kceDsL3LH1^UUP~~#V+h-CAB1C=rBr@ue$4AR@mn%; z{!da{&X6G^GMVl9-xY347l|oB+X{P)v=Zt{{CP8t;3kMKG4+a za%#1Y*01?{dZTOHwHw}Blj`V)o4zCqDA@g7TYp2hU$@iqZVziBeyYzq+psJc_@Vb` z_eH0l%fnd_V&_R*bI=(j9%d=P#d)V$cc+!h&pGVPJ7gf* z&3m3WCeQ1J+HDKR3&H5Ob9@nccdgy_X+g<|x0NhS*hya9n@VfM7-s@4@qi(;%*K{D z;-?YdrwAny2Y+>tjh*E>`G_GL7@Xs2_ z75*EG2D-8tg79b58=`rj`L>PAm?vhaUcK7-Ra4kMlvq4YaYg8 zd$i+DYb*EmF2RF~?k78`9+3-LRYb3vVAT@-1%dfi3{J$E!&Hv(qP5!3$GCg^<% zDexDtPQBZcz;BQ=?cMyaYWtwsFbvQdEouedxZ!u83LSS->iKVCm-8LK@4JH?POL}P zE5)~9_)Sc*UZ`0+LL*LdsOVR14t>PG`zw_SFM^utK5=XZThE`P^NiOBtANrAAUaX} z9dt0nzoY5M+qf-P@f=9l9DF_75d5s`<(vFoi2=94GaRC0Hn^i|NrXRc`$>$kKjKYL z$AG4CO|d@8?J{pKm8uU-d5im{ER7EPGX}mQ9+|J+^iKR*0I&9Xo#$~YPdz;rN^wBV zgj+t0FOj$zzgst1GIGq3?<0w1yG62e$W0QvD4yvh;q#tfqcsA@F&Ele^oB7)m;6BL zrNgTZB_QjigSX8c+2Nhb&-kS=>cd&u`7g@8T^KRQ-a>d$Wo%eh~>y7b$8-uv230|dqpQ`gIrPYv706Y!=OzX_XukJH>k;hy22S|D1@7vNCU+q24(PF&kK-EAeWyU{Z|*d{wc^t_`_;QFlLC4lU@UH@Q1DLormfk0 z&iwd9kFULZ#mV;}!!#}idV{{V_c#}W8oxR-P5NGCscTXujg1!_rq5s zee3JH;wReOwKyX0CN7Vs)bje~S6rZYXIP6i4%M&50C0zBeq1|kT2FR(sV)1LKZMJb zzf?o-@t?6Wa27tjeR;nTk25l#dzZ*?7QJ;i`$nVb-Y~~q@Iv|2KZ$?3#n+bW2MTR| z5`;qDwz$smZ#b~RC~)ktpRC;f9jbu|V;a$}Hlo}UPY?C5Ur=RLeB>g^)+^<`*Yy~HWwc2yjsLW_GmmkN*4_~eEHo}oF2@l=hIsR!fUkv+zN_I?m)ND2BN&Ka@`6TV;H!zE9ljGWWJD%9a;pK9iHnH;r>VrH)_+GHm+@u|i7juA^dHflkA20} zTa1KW6ASj7X1NeQdgCbA^YjrOo$K#NknCrmw!%agzB_`)SZavi5j(*fMP8D%TF@#V z!o6=Y{zigMzh(w4h6RJz`M?X2$q{xxi!dGH+C=cog#x$zoPneV_0T8zX*?V*8}Yy8 z=J~x06a@j*~KSTo?L2aBYJ;$0*(xxCzG~Xj9aZl}=MZ&$$?H_j(+#4$c}m)+i#^ za7-!Rz76Yik!6!G65}X~j#F%=k$feezF8}cv;CGDjN-vEN}{HYIw9VVgQN73v9p^W z_8|N}WPs}b3Sn3xW2mhaX%h>sB0Df5|5D|5+@8& zbi$fCjA9=<|I@%AOBn`tC&wN@$4)>DH{YjzC_~B=)Ax@9J>|VOPQ9H+GcV8a!9hd| z?fQ6)ocTzCKJ<6J$C2w(yPN)IH|;%S1wI#o=}B z(LgTx_`V;>%LettxZY!w3Yh4@OSq8{*iu$Z$ru8r&4!_OhnmN1azQIO0^4qU&&I1Y zZoZ~n9J;7Ue?&;R_nPcFbmFrw1io(5QnDqoyFDlK&~^Vff?wD+!9)iEfM47(qp$+Y~2dx^(5i-kSQP|15fq>~;8<&x(U-H-_%#@LU> zLd!stG>C2QJiFph@nppwYC_7xI`K?QW)ZgWg5Az}fIUfCZ59E~>%^^lt1&FP&&o*N zO?-tn>39Oym0NVVSh3VqzDoETxx;#z2T;D3Eo}7HDr)W*YQ_E@8&OQFV#?)eO>8R< z)Lr$%6opNg<2#L?BasUT_lD7Fb>Ywj>&in76!L=AaNyknSvK1Fr}Ehv*Sn+hIFWlv z%+v=dX|X&%t)BcoPx{CEj0ML3;NdpnWuPSWObW^4#q#xI$#qR}HsqK#RGfk}^FQ5( z-(Z%Xi`NXS?CbHK$5U453G(m^SzKX{u4TCH&<@q7oHaGy#osZS_>n>IhW!a8x3^%b z`1g{1%KvhZZxcCDhu}iI>O&6;){Mq)qkM+@1&tV6aGJ11^@hTXfCA&#r?zpG>jA_@ zQYkr2ko_WOLHw@#jHv;m!I%*=9U0Rgj7>~i{?O4W zbv?{g`lvy(=C_FdCTAIS z_bq#PT%&|g`OKT{%YR$+A3n{C^_l-&{jg)wBZVPi&`(poey*$uShCmqM`{e zd((q9pjxbRJoCnua%U%wY(JbLzmFa~XE%{0@I5el`vGG#+glk(N}4|+{!PchzlNP5B0buF1@@-)6X&V>C6%gG8$)l)An&)9NA8~)B7<(dpm1w+qrZZ z#+Bjy=KNEKwLX4xz4vjv)xF4XH?(j1j%_Ae--X>t<90;zB<=20$n!@#{ay|GF91pw z*W%vLWg_)@y$UU-*9K?;UF$k%*x_;x4VLh&YKq z_V@H3)^tw1C)P}`9EEPm*Ztu(+K-_#R;7m7-MOHCx1ib=z>cRknm$Z?-=w&(21xEu zYzv}8fyLOsuOrXxl_?av6-ZU2I=Ns(g9}@^SrYc96@sZ?H^TX(Y{wauOOWh#O=3A+`Yww6KO~0f7|EzV+rMcqMO&>WAgyY|3(-IyouP7IW6)y(I?{H zS>LX5y<~a1TuT?B)ETkS@v$%rs+1il=1r61*uKS1C;6X42`3)%(g)X;krfun&^yJy zVP=PEdD-guEID;UfOV)uIQ&D_XjY#}ti^p}8qEjAPJG0IQtG;Txdbxa=9~5VXOmL+ zVGHJn?zN-L-xf}M@iMEvDG$vjL<^*w#JTcU0$K9YO?9`;(Khz6uc0qM9q}JHW)(}s zn*+xpPfHc6o!~^sU_H|M(3s*n#7<2N^+)&`&*9Rx5jPb2GFtj{Iep~+#7y!TC6!gv8V_?zY_uj@}gM(sz{s2m?PVELFnT)=tftE}`h+Wqe2HYegXQKPvy-##iUT=m7`g z-_qFpv)w&Y8>OM@pX&DD7gBe^>p^42OyVY$VWfnV)j{!pbSZss{AYWfe{8FyPc5x; zeddHU?$+#IJZ3sLHH*6i{&$BpH|p^}9f23D2p577{O7plW_LL7>Q8>4wO81^JYA=h z_cifdomQU++}P&2L0EHp%e)mb7I9Kx=!5Wp=V!?@>mcoIubg;>|A559eXV`+YVm+^ z1Eg4=?@j0Lj)(|~Dxdm0z4{Fu=FR7E#(sC>eCFYU+&%I?i=L(AXv zxf{bj(VpAP_KBxG!Nq|S&a{bf78SkH^@8v!#1x?Vh6qNEK7Hg9uYfN4NOlPJDuN{# zU3CCTNL4@n!&4qZLr!rXd%;ctODJb9M-sY zo~L`+5mqso44>qWfZH^22|7J2c?{_T=wgxFI-3%ebooNXR>qN?9vt@%9`u65ViXa6W@wH7J>IdQVb#`R_78gMj22Pu zib30B7{$cWd1$7vq)RP$3sB*-qOv9g6;BaDPO`<~PlbB}dmszBG_|WfdVIw|x)^B% z2~FiH7yE=2!xufHR>VJlwZV%2bEteWg$l}&x7u)!+2FvrNyE+>;E2AsQIiMGx%?_Y zVido6_fQg{j<&Vn($T|2Ckn{?3W|S3u6TM4)YeVSH}=xk%Q3FKe)9vT-=9$nObx8_ z2T1;h;P?J}*a4Y+Jb9pj^FQcXygI$7XiK}(`v`v{o@>Gs=cFJKw59RHrD{9GKVe|p zQBAAw1|CIhu9u2gjelgk6{QycXsU|5VkYm^j|tda^OBs^u!+>7|GK1dqOiDc#10Uj z=Vc#c?&F1R(F@Z=`znlRWbst_wj1FptJNKv`$+CsjHF0y`s&uMgXI^7lS()$M28Wt znWT|;}X{|gS9#Sw`1QeRtFUfE!Zz??B|tV@}F~U#diH)V+}f{9)U~l6j4s? zdr=uZckpQbhd5-Y&G!2OE=%WNo*zvQKNIFPT7tm`X=GUCC8?+;?Ui~Zw@SDz(` zAFab*TKFI181sPDfNS>h3(I6})RP}9%FPzT!B32_>J}^dH%IZXP9AsR{`Won??iG! z;x^8I>fxVxZMxo}!amV|>i4PRaLYIM-(9oM9AoM?-|wIlVCOyBQ9wE^&N8ifI*0%O zE=7u+-9O{#@a_jHS-Y(KQBz7%$i<1GE1&k*B>I!OS?FvM3^p_^lw`=>^{ybu1WfN2 ztBle$Xcbh|iJxxcv7;@JhLDSy1O5qi)`%W&Aud-lIbq%GcgG8kP&{(X@b*q`F8*olUnmI@ZAe;i(A zZL<)k?VMv~7iByDfhVnEtX6yI^)O!nbQ% zLu<74rjz#7CTq-njpP4VtOflJL=ZU`LjJHjv&i^ta>Gi;BzJ9CK@TGgvNp7ruVr6W z1LuGCIcxrR6RYL0AiwMz5OvOfyl%h&kg|KrgYHB8*K01Sq82)WEi=-SMjO5V5ux;{l2tzMsckoadF`zh&)+FCLn6X}L0W+ym0>yT_# zYTFBReK8kfeqp|NGdNfapG^H(fnwHnyVG_4BwkTgvTR97T6Qn$eRX-!Wr*jzJl6pveoIIPt z-;xw-u*T5&i*0*yOO1DCiQm-5|5AF?u}(tA0-w$m&}2BzOU%-6yyxwT`~1(oY?v16 zb8(wYzwXtABmSN2VFQaC_mro4{%2XuG`E(oK^S)O^Ak2BuehLIx=#3oio(!Ml3UhT z=cdJQ+}=9vv1BU;%y?#e8)B4mzWC~nP0jx^E6*u!zZ8qg|6CsoI8t@VVpwAzYJZg8 zD*m77o7_78@9|xD@sM{C)%jjrk}xwL7=kXgOAPN8mSe4d9PO!Nku_qm;vZxmo)1W_ zIm1AhFO0InDdstHCkT%@wn!NV<~SsO2KU*T9HHvM&}HPlEz9IDhe-Vajq>xzb&NS- zgXEnkaZST2RHP?SseYf1!bp0bm=HRy#(_b+P#xHj&7{`x!l1@O#Ij(0#DN4OJv@f0 z7n~gJVf53`L)@-p># z36{dN{sPU1jKd34@uz@9WcG!6I-d5K-QRHcDLK}_hQ6??(q!Qu0BR(=GKmC}T{ZL_ z+Yai{v@cSOTvK7j{1uErUb!EGH1FD4C%*545_YaJFi;!FM|nS>-)-qVaElB)eft2Kt0`b`}5VKH!2V zXUm>oc|keaMa=SMoG>2a9Pv-F!g$z<6r$Fg9cNMaz8X6C=Y{@S%c9t#ST>0XDncNT zm+_2J0rj0m7b|6+jUiPB+2q}WUi2202&L@SXZC)xCH75P& zj3Y)50a3h_5H|3kPoPH(EZ7*H#;tr+*ca`Y*J#3%noc@TCH|2KfMaRV=YUZ>so%xv zIJCRijePr%Pb_-HzbyW9{8Mg=+9+7#^K(RwzRI;Dh#}-g`7dZAy3zI_fF?g@`0&Pa z)ifrrzG?Ahb07cUr`>zHY9Ku*a02y-K<0~IGhZi8of>;k5tjJYbW?G}3u*iI&i|<@ z!tSUGYJ;cc!4j;5^v)lsE@o}?n98sttX5jqFZpSmDVKt9{u~st*tBAcFcgrQ$&4@t zf&1Lf&heQK%9pu7H;%i zJ!3jd0|q*%ZO7zIB+}T83`&NWXk)n|M2r6-Ku>C8#x@qqLtfHBf6zb+UAp5wx=MBH z0cOYj*YBroN8mggu`IYqGKU;b^1%ble08e)U-kTT41fmZn{WRA#urkqsAJ#)tG@3*Jlpl~)2Ma&wdatj?)? zka~n|c$^0|jPXxCE*hE?&9WMF{*Oa-?)dzpVOL>8e8NiOKfS~|=lXhgbUVgF1U**D zX78y^rOr)Dq2tf`q-or?#Q2C$eF!Y{6mb<+99%#9^dm8VuAEVdmfP)^$K6yJu-%Hw|$%cSkn;gZ+ zh&JwW-|2delzJ&%N9_|0v;>ulX+TY?W5Sd)Op70jvCf5?;P>gJ3(p%a{>I6Q3wL*& zpha4!1>9{Fb_rRuX({eV=zim?F+RYX9@?K$)pVa7V&6-DaFrqW^k%m^f9)Gi8ZhOl z&gWhq$BYHAssrjH+n@x=6Xn$`_(v6PK-s?)VPQ}HZ(4LG*2NaQP&aL8`VA3Yba?Pg zyN7qkf|64f>UdJx5+2Pe&|&j7fqehCBnmLYC%JPJe+FTok%hbcAIjUTK06eo}r(xW{0Z zUBi*@<3C?3G-PrPJEIU0o5uK$vNJh|s>H>?a@@s6;diTA`_ptTzoFqt%Z5HF1L1M` zu&LiYY}4{_K`i|?d`Z~c0&JmrDo2{ZM762v<#ZAcIWW+0-o@|J&JKxZBODF?WVx>M z_<`%D^6{`9|7Mi8U3A5Zo$LR|aZK;Db#Idd+nvPtd`}u<{kHhGYyCD;BU%5g>eYGQ#4W*!grdCkM( z{lY7kIyDA;G}$^IO*Coe?Tq_C>VL+c!VIA|!~n-J$Jz4p;v-DSC8-Hs>pdCUiC^lt z@O_VOm4CX8mWk=%2=*gre8&B>oAKNjN8QW$NOei|r#M=8s!3bsC1lO+-qsjGp{AQ0 z{D7DEpcn1JVpskT`pJeI{BR487q5}3eDEE%F^-ss@NNvbNjsPBzWWts#myW`V!rv9 zD(E^Tqy*=1#l_B1w zPoDO*FB>3Vj{npna}2|(*OQ{LKv)Zn054h!q4;Zn9K|(n9300KT``ueMK3Nwyj4dD z8b=}n=dFCTUKB~8?gE^I(FcGAplEI>1=KK902~Q5_#pn`LQ53AcnI+CNmFxAOMGqN zf(yHBf7nAeBx1Y*(|S|>u@vK=q{*3Y>pFbwVFi9s$gvzz1jQJ&;Z{tfk69IgIoY`W z-N~!|!y#w*Iwt`x4v`e3TOKi4NG~ugMnnAMIj`9^m9x7fPmsiA%15&oM@H)JChNvz zzT%UEW@+I;vGA~S66h5F21vZ~Q-V{e#P+RgPHtFFU!*;$KsEA6NxJcB$|q0E0h|-{ zExt)+uj@VuKtk|FM71BL#8x~pzbEnW=I;B<`#dpCP%;`I_^>ucTbz(LqPxEM>CLAo z{#$~OMJlL!KX=PV$0Z|-v5KiEl+y15-dbL|Zap3qPwb1a;pd}4jqF4^h3cZIweH3D z;TUp(qsM>nr|&D~49(;mJ29EGHCBwVyKepv0%uIh_ynC1SBXEa3#j>?<06JDmQ@$e z>XY$cy7BAWkLW{Uc>VWeK0>~<(j5QM&P;P7=leCZ5m=z~#@DDXZyKhJQ}3n|oFQ(j zj)JDdHXzqrMTc?-Xd!*m8k$w^GLn~@Sr-(Ob0&5YWSkS(O~3q&^S{y)m-Qb16|+8M zCC>khrK^eyC1BEx>NSkHptu!;&#d3Yna$L@WeD8?!^7bnZuZ*V{Dn6`8jxm<{+9M2{d{W zUt-TkT#(_mxnmQEYem`k0Oi=p4xM>vfU!amD`}zpK4bY^lQ> z8;L{jIG)eSsqxzZCNZzS z7K}bUinXy(^MM!)gzKyA^OT~-dai4a#Jy@)HtVtMsaKY@yXO%8trjkNjHiXUe$e+4 zQ)z_xq26%tZf%Vv6E4xQ`l=(D=k0$(*UtTtm)+4byrs5^c^BI7CIa=%0nNOFdt}?w zN;Q74XW=7GxunqXpd=3iY(lwc9=-F?2wb|@x7wbh|HbA}{|0zc%wCf*_$>erGst{rUB3rwH zYvxIt2%|uV5fzcF-T-3fcfWdrGHaQko`9mDa{^QZs8{BfePeGRcND&qmv;M9S0)Cg-)sI32sCEA&PCL8jgP|VeBXG; zW{EP@j(OnN3x2c1_U#uA8L}8n>9+f@-0l!bWAe*(PONsY2W}aPXDQes{xcC(XLc91 zeJ;cULm}n|zREl_V#Ln)mm>ngxL8)VuT8edPuw}$kS=p_gu=@0t2`M@#=E-=O07*v zlw2*}O@%m=)w=IwBPYG2z4yYo0^9zoJ&Jd}-5mjhabiD1Uo_+x>zi)npHJ`tP0tDa zT1ActZg^eJ&b*1N4{Z2tj7R);tnp98zvdMF2zggw<nT%Ue836G}5nVc=1=%f?{#Kbzs34#W3aMp#*78;NXR%9FP2}tZN$!g9DBkt5@RH z`?xe82p?WV9XM$M?>1=pU-KTJ4b2AtDXKE` z%O{hLnP5l>2X!!`O9qjvYbMC}?rfO`g<=9>x!C@uz?a zcU_ztRG-Fs97mrsa9^oapdMtT%f2z+b4hyU=OoUvT|G z52q2YiK%45v25w%SA=aF`H*WI80{?V(}nVH(q#G#*G&CE5hpyb2L$`k$Ku1RakX=e zQLSlwkMaS9l(Qgd$DZHFDZ)_?09Zuzrx;x9Bk|kfHHQlvu!_0xkf=Y?Zy4uZ8#4}# zA5zsGV9{WGA@!CxBApKwQw_>D3FMLAc--K6`@xeuf1fuG(fq|cog8Eg_W3OP6UR`; z3ZZlBdmF1L|A&7QqVA?@;Asu0A4Yog;a>75Kwo-Rxo!-%M;BMLvlsIjSX2^ui~ld5 z0QqwKXB`{qBG~Hb&wZO0T1wySG^U+Be2F9io$fK(Y^&?gqrS;LUDdu2jAgBG}Qj*v1k zRR%pOvPh@>Jfu?y-ox_wFwxJ&Pg^jl#n+}Cix#f^qwpgEt|H6+R-{D`0ms{>0{{^_!uJWVeF6T|-7!KOe zkoeEVwv7X$%QSF)P5$6ns7sy%60_nX%B=g2SA9~&wNW2lT&H2`oW_d9iN*ZQ#A)ZR)%IC-Zjwm|AxZ(<1cgsawTF#;79b2)>Jk z^rPVRrW9}bs2is7&s->=EHsI?8UJ>UZIJvQaSo32)U9c*YHa9+Xz*c$EkRgt!t0Vd zVa4t*F+skay`AC>CsP;#p;k7!f!e*ygc-$h46D5u2pO^fn|E z7!-$DkD4jhMoN*(4ZE5O(QV_!W3@NsW%K6ABIiX{99OctHS=Ia6N)==(&uDewKQ@~QChtXX|?8}s|R zL|^< zxb6oF+P4`cIuER~H}v(GceO~&E2~CVeBa(7NMJUgg3sst&>F{3aHnyi4~q8q4?pO0 zARP5YJvfv2LQWR?8p2=X%9=R*FzM8N)&9n_i=9W={c!?-vYqdPmK7e+ShAS~(A*t0 zE_jpnKLxiG?u z6p;u9AiU)lZGmIG5WkC|03fa-Qq29HmEcF=LA++hGW`12U*WqC+gRf84-OMT+xqKJ&%J(Iw}vfA=+h^?@bVN7?@Tr=RiThkR=o z-2^!nD~K9P+okUZFI*L~mXlb1ALOr*pY)`06zBCM10+F40dmFK%P*fFe)+#X{PLHl z@&Ya04_-Ub&pN88$!=XPI-GMKCzR8DDt10_|BAV9fAx6zPp{YPMnRDNP5KVo zcAcY@plqv%GvSq9JCBHQX}l~5>0a;p)mKZlufKWVryrj$pA6Z~V~($iGnEX&8a*vu zGn2$V*~sGJwPTAAh2UGq&BrC%@4oqv@$rF?zu?dR@lLkSJJf2rG`jfRXLrGw?pllE zt7uYcGPxW2fBnr@AF_S@`hL`(e|q9ifBcZ`8DGyuJ{1%>{uv6r-t)oe&rh+M1WaSC z`9VMWf;0~NG<@^z1Hb<8$7>_urynl4e!~0XP2j>N)g9*t6{? zp0&Vrz5MQr}$6R-CVB*lqaFO3g7?w+mCqr z?bk0lSI++aKW=KtNw*@C6~FP$p}7_3;?6P57Tt)f;3hW&s`jF5!RI$0^~iU>{pvOT zPd_f4jC)K>?1xjIJxtE~@AH3ZeiPE{_=$s^jQV`{+f{E}Z@&Li)RJ}&0C(@{TKBce zx66@w*UbO8!Jow7O%F6L=+|i6?|$=Pw~t!+8ut5-y#2%XPilE50BCW6^DX7(1RFH_ zmz*ALJ0N)rrW&?#T!ZRf|6eqIecA21uU@s}_kVt_I(e$alSXI7D!7=5Jw(g_nQd_S8=%(PqS?~|D2)CTkc@}Pe6OxK;%l+wj^U_T z`_Vn;g(crTUSGNO=a1a>bHJp#%<+qTllv=vpFPebl zbJ^`$zgzRtpI@&@j~(Lm-cA58)aNFY4sg|y&;00u3rAf3zdHuarr$6=C|VZr^9s>^W9Mp9IqJ86SoPK~AM0CJ?!J7J z>3X9b7oBCHxP0AC3?p%>H7FSizAKXuW5|5lN@w-3$W`Azvh6k3zU+3jylVeH{rfKv z9ZLM$aPPe##ZN>Tqoh)Yq~C$thiwV(y<#BfU2R12Q|NZ|l&F?-o2Y&a5U%eJluEmCL zfA#f?!3%Ky(T|Yrk}G7p05lfV|B;X1{O())_T%qbgt%;X$@bHS&HmN}u)p@; zzq|=ji3jL~()Ieg-~Z}0Ie2_zzpp-IyB3_U$$_^jdKFahL{`DLEJA)h_aukWwFVb? z8bD=D2g*y~n+uhs^8CG<=Ab>GG$Nstn%&}{u&TiuW60ifHhy3%uT(a#sz_(w$uE!i;NdJjnI!@OwMW>OD*th7flgg%voz>{U z4Fbbko_NXjVW-O{zuI=YY_{e%m23paTzM)oX(%;_Z^}!jaqr z2jjD)Ot1LA`>}xGP&=33yr#e(|78Auxwo~Je&hqw1}S^!{Sxul9}AY({N{RpEj(Y? z^3yAChaYQPtoS*@EYXYxj<`eECI}?G7pk>dyqegcpU~{3i=2m`7-8SN{PLR9T)6p~ zyM1^0rRFwP4-JpP=Jie&9MuVr_?L6_HEdsddiY)WA4fvQKh;Q_7yjvge*3Y(|9IuL zz{wwD4#0`JLJI-_gMML6GMb+udD(Y!zGbDKl${roS?;bE_GhFnRxSCc`OU9le#3e! zo`Jzvz`mjF0`->8eao%YCi}oUUrC`^25Y`S^8evqzIoMMYaM8<1+5MK!#s7(Wf+Pl z&7Ec{p%|2WG~=4*Xdx-(?95{=Pr%DRgSShb-+##V_>kv{wKXrbSG;jM*2z?F(2e6g zyL84J2L(uR&1bzABAFDlTle!TzW(q(zFGDE$F*xg{krq>uC=Dk4$Blbl!o3-f>XPv5+J@#T}>EE#|N{#hHM?G-S^6cvB-$i5lT zL_WxIOEO#jhl)wYjYm_Ig)A-3ZPg;b|L0}9<14T(!0bnSV&WhDxEA&LG0FRncuaD9 z_kYlC{A3D)y#T;&B8!&0SsX7JD5%!P)mH}?*T*kCQMC#Nd&}#QJYPNeV`7y)yvdlL z%NI7UyF#tlXSCmKuEhmodS;`aCKJhDzgWd2LwXgWt%q0Al>1wk@wfD_2pyYQrlPLm z0a*BRBXPIOjPon4TPtLr4%=mSl9T)LmybSfCmB};BqQcj>h6-2ec`zv_p^ zI(kz4L*qZ=j5=Nu^W$*88O@}Sh@CyA`85ci!&X^4w!=Z!5B{(JoANAp2`Z;T<`+h!^6@(jm?dY8QxEnUF$L*Czfbvxo% zmgL}6B#41`bhzGj`pa?XUJMl28ov6Ju^K<*zm?mr%gZ-ki?rF%n;5EVSrje|>7Ai6ILWO)@U?Ds&n79~yfpy+KsLd|~_gcQSWd#I89&m^ppfi#S808C^5O zIrS~X&G|ndINYH&c*)d6ay^?4Jbc_VKCk$?HW(>9UpfrztoS^Sw%of%xmjP}_%}*< z(bLbyulY!xZ|`%m8BFS%>>9G|jmGlkwR!cLyEz#s-PJTNgJOyPVs6%Xj@V-?t%c2s zYgyby>7r^aK4@Ssmahfa2bt*kn!By1)B~TEJyb+;PsIAo`m0YYn>a5%kvCWa!$s-3 zWJta}>YdtQ_!YUl$siSZS4vQS~9tzoF-iq`B4+G#g{QtkpzMW(l;rQh#tIDA!7QrdBpD1bqIgD$Vi^DS+K;h7uG+P?8gR( z4v+;eqw3Si3uvS&;|3mKYg+9AMO|W+l9bmTQGELgUoEJN-mX{&5K4(tPC`T9MNo2YIc$ zg$pjjnM?<6^Nc_4$X#SHrG>3iOvNN>y?2xvtrB-H?p-;#-saO)R1rjxl^ZZQSq)qu zI(MSd@$~ZXjx#wKAOI+N{eB$le$`y$4sWvI;oX=U^1=vPS&N;8kAc0l`J}!@28SqZ#f_{-YQ>^A;WDC05C z^VryZp95yhV%{aDHbJd5r?X}=Xuf^D94U?Hc;Up$){lGs^3`r?&I}BQ+IX^7`QJ|* zzj3iC|AX>BPu2zhpz-WDU~^&2FHDQZP5T>o;+B&RFJj$~P8uE%p|3-@oufQP!M+T}zKmg%9&Yma!gX&W;qZf;8xEK!G2YG;sF z8~yOKNzL(}XjG1QK=}AE2iI$Y&o2|9Mh<2FT1Qh=sK1X$tx6LGHj)@-Gn^GU-(*%IbkvKOdKh|R_^8J42`hGq_ zPgY|Tj3U-6;voj?nkm$NmjCo=6htiDApm~@qHvl-Y0ddl?Wa)Fk9YHX$$#mC-f}`T zX19u9g!o!L91?WA<$uOx*AV77B}m8+;4wpHsu%bn21nH%ck#czvTsK=eeEm9zmfB1 zP7Vfk{?Yk=^G7)^KZ%>ZuV;ObW91`dh)1AeV`K813&wapU#i(2m;OOPc+4w#o?-H$ zQpnrQJ5nF9VUSqD0q%u8F}ButYcn<7$|$_y0Y9C*%6Q_s_ZZk9d6FVp>% z2peBVCbJIiR)vnXUEe**6YuN$5!dfXSR0oL%_#cY^=LOGzKEq)o6Ir_syV6baZ7Pu z33>H_MZmiRfBgOMrK zNNz!=mQc$lQ;z*RAfZD??daCKfqxn!ii8?5G^^|{kldhayG>OWHKJFdld(;oI_o<7 z;rn0Y{VyMj57+mJ=VTw0Y}q&I9v_(}hkJdZ6BH(%qky-;Kb5Qt#iaSc>yILvy%zO; z{Kx_6w@%(S#L_abUU3qTpM+U_muV=UwHhI+v!H(tKrT{$xgzi1zs=#EgB#bu@o4f+JXM`DHuzhLP-}c{?fk6@xsaL z>rX(1P8MRv@dO3G(2l-~SDr{L1t&*>8RY{RT^XNLjG@UYN?l|9^uzi-+;Xaw+nz0M z<@tKk#mFAvEaAd|K6E_wHphR6TOE*gx{H6Kf3M?;vn#fk%=$=wU$C0&Rg=AFQ46e5 zte5X|+w?E$DdQNOSJ0=-%yH^Y##()^uPEyeVO-ynp1&u=lNQ$@d6TkYxMJ$WPr}%Z zgPcFI-A(>q{Wc|kVhWL(P%MmmK6UZp`n`pEst~HP2%yZfPWa~SE0H{LBJ3x{j7O6Ci3_ zglsz27M9lW!w>X5#=HAflPK3lwa&Zv*C$S&?!;-)c!FKL`)#805r%PJ7EN|wN8aG$ z`#;lf>+C#n)nGiIHi{=zT~6^gj?iWVG-h}MbB-j;@fk7s)LO3=PU0(-Lg@0hAO7@9 zp2rctmt;fFAPKRA_Cv<^}l2v!?sZox*m#p`Q)JI0hac4 z&317fwU!eAjM&y+n{6|%Iq3oAYuTA%`o|x%Mt;6(t*6k;*PUZ5`K}zit}t&nb8iHM z7fY3gQU11bn;DM@3!6Hx_BfLcFGy!zXWpH^uE?^+s@QdzAAxct`}=F2 z_QNj~hqium;m04ThLF6N0!!=)Z72OU`^6l-Z)gK*2mV^NkkLLF2+L}Llh2>^D>$#? zn%nSK^NU|>|KI5{0mJCu>eqxt&EIkfe9HecXkyGzlX;^J8t-a;eQjQR<#`-Ge(&I) zI1De0cwKR!@n>`|>qI94#>Bkt^;{M{7CC_GRl#0w>n|EY_-%sYi`MluUTY5O=Wl>K_YY`4Hh5k?I^7GIf7Bxiu-A`P{=8(n z7A^lf9IxMv*ozI9Y=8WaZ7qKN*B-o(zb~Ng;zfb^3P7U;w0&?qU$R^Uiuo$2FPpvI zqk@=sR^Kfi{{>PEG)xO}Yt6Gz;NS*LmKKkocf$tY{*e#jyK3ZiN$**}4QB-4%-}Lp64^p&=PBxaV z0?b|$@k`EY^O)^o0|1X%6ZBi@>$_nyVrGb&^Pjm=xgVv5?{DPe1uM(FIiU6d@Xui3t`{?`DcxP7%h;u z_)otDO;l(+BYRPJH0ek&?R_yJy`r!T`oYTUWykglv#y-|BqH^ zdfDyz`n#V$YLh?z@t4;}tim-BsO>!-w{Iq4e zYX3j|`_KA&LQejabk@kS=)dW;lqx*&>uTQYM|gN3&ckl-+R(RD_IAwcL51h8udX@4 zWw*EUn|I;RLeSsbU+-ffZP}pm9u9{WJ%rr^Qn}xj?Pt$=YuT-8OCG-;KIZW9Hb!iH zEykI>E_3gpl&tC*uREFJftT+so2^B@%O4N9$Un+|s(vrGr+SL;aAdHGj>a{*LswkQ z0I>Y=i18)i%WivP=$h;N>5uWC2FJhS)AfHX0A4NE*YondsQ(R$p|xqL^=CWTDh{|5 z|Brgqbv#~A_~~N-{n~7N?oadtW=!!P`7ajys~u%V!hf_y`Q!u88rj<`2_`V6KZhfG} zUb)~uuKCT5&&na2TIhWM0VChBQ7{mm`EIARN!Fx!uk+3R1L&eX>!<2|_tooK#Qf7A ze?GKWnmj~O`34^9I@#7w8^-NWohXaqQ8BdZm^iSt;2c9NvpCFR8hEx7w{b5EvB~5S=>a)Y>7X5JvQN|#e`f>AzRiQ zX4^<|B*$j3WUm}>+1!5rum9G4?#uDz_=^vlGBW`SFaB{cBgI4nH#&&oKxTWJ-u5tO z?JE8GsS!?^zL{je6F}Yk_k}v9-Uoltl_GJ7Z>>#s0nq_<80$EL0P(tMG{}BW`psmT zHUTkl%B~%m8*Yd;Nn0)A37hL{Xr62XcPW+^m3k^H>0Y0*@whwWIny}}p#H?FXliKf zY)&@7FyXM|2c(+-Hckv2n!THADF-lOc;`h)^q^XzCT8zk@ ztJ``)TCcg^bA%gv#rsc5(XVr{!`y|$JV`qbzq#JVm|EGnNcp0;7qYzp0Q37w$~Cq~-MlaF5YD4pPt5P*lWl$84f$Y{ZE- z@lV%zg9}i?9IudA-Cp<^@hXccphb9;Pw}vyJQ!n%k98V3n;dTNxr(piWAgVq9ja{o z;`{j51&I6O^Yi~4dQ}(rm|L^hPn{+6v&`ZTp!ly%vys=ZO*>!jKg;4MjHi6t;y))3 z!B?+;hGUF>=R0R!@a}W%dc1#8aq4Xx3+v{x#f-PnpV^wQi`hNv!q4-yDY?l6ald~^ z{*O^0@`3nzk>xyEfx6q*MAq-Hiq4fcj*;>X$^ZDYk4^D&_359Gx{EV_y>sJS`d-Co z7q0ByV*=T?FIx1z(Y}(-=E1AhvTU@Egw8pSaT}Je>VL{}+@%|3kU`Qb)W2r$p7b)h z>lq8Iqvjtq%9-DD_I4ERxKsnJzFNBqiI5dmUscE~VZ# zq=sI(`oW({=q!=HC4F0)ELM8)W;m(;(FwB;BX#4Hi^{)U^vN{R58>Ub_SoL^51G$( zzsZBJEUYHBY<@nVCT_GTbht%goL~!ZZ{0bU-R1@k$+$$hiyvs~n@AIpd3~bj7F$DL z5YL<=@_gSo=8+JWz8BE(27}IccN=lnqfdwK1q5>-U0(735I}d2n{L%vg+OBrf>g z=Fx;_5U85~oeliP6CiOvcQFNMjQ+ZA^-Z$;s=6H_%xl2)7n5l85|i!cJbK-?eJ_BA zlRGD>w3c;{y1;4gHt!-l2IOaNUbO5H)+e6phzUnBhXVWDan8cSBw_Ot8@w6RCnc;# zW4Tf<`@cunP3cFw2Z?qhv{J$5*|(n57BDUbJ^5o_P4Mr;VZ|1FM|y$?p@Nb{h`s z2z#R^9%8Tx+X34`Mvkq(w&GYnt`70j5?$NKNP!#NG78vUHA(Pj9EAJu=J0t`pakwj zOx6OsF-aM=(vpz}SjNQ|pJc1_pG}xQ<(8Poqi&lqu2`cFv(r^f`A;{oYS8T_I&<|! zr?Djd_f7t7xBeab!S}j$`fJ&}K3dI(T(f4?ZSTr?cn>k!6`_Z}J^$m4&jsH+Nw)p& zawy6@P8eeR!@t=v<2Kq=%oRRFyhnWJd-MfB%fCssL0E*BvfVfiMrTYrlb-Xop~KSZ z6ME=~QMrk!MvLdM7z7RE)Whye7!&93RKY%5SOSfILOI@)I(+MHfOb^=YrF>+8v{}$ zKA7RaOU+ZZ?UWXZgh#pE8hwj;}GKPuo&{h1?%wO20bwgme&fn*Q zWnuYEXldK%k(ld!Bd)bOu4ERbkTZ#Qj_2?ZAMoti-Y*@q|F83hA!C#yAoCt!c-V5% z&BMqpt}_5jg8TXoBxhTh%DFFUShF8x&b)Yhh@9a^EQ|M?2)3u=E+aYlngbGIg15bM zsK& zTkq{&$`(1vS^gMS<5J3?LWOV_Fz?-?R;z7JV}v z#cfd6OyKwY-7OUOQJfY086|bWm~(I^kOYTdjW57J!Oul1Ldu+M#vrZ)Rl13tdS#3# zhJetC7t`{C^H#h)Of?jIJt+a{<^jZ3HCfqDGYP+|47n2RX-ms?Yn)oDuEej$vZo6e za{t#|N_fGE4YMpG|7-b`^KiZ%?9dpziR8j-wbe;n=Y?-t6-+>`FX~eb%!X%-=D>?g z4Ql20K_Fa13i{x}&X~zUj4DQV=|%2knSh-G#-fcr^;Q)|e`=@nq&6|GBhqJeO5@3k zM$V@XYp-%N8^*#1$APr9DsrP>S@&EyuF#|+>OqohsS-at$H#ziXM8;QvQG3H%S_)v zHlm_33aczW9EU7rZ}Kq%O%hDxaT>2e+*5a%HvHr_l${&!6q|i>GWbY-0OjwXU1J-F zogV*aaWDN%`6s=Y2xT~+!XPm&5bBD_>Guz0{Bzt#$C@Nh+!})c(cLlH@j+%ukcEN+ zH$zsz-&*jHT!fx822S7R|9K)k=Ks8h;jCL;h#>=;Xuhs)+tehhO&}BjM%fOj$T>N* z3gIH_ZoJNZ`b4XE+Y$dR6C;y6680v+2yUw1v-| zr}MtVj2~xS9AOM?)Yx|THZR1f{vrOM{ZgM!IwU1V-N}C89=1PidgLAF4P6|EJTQYM z>*noPsNPaAeo4+~{(hu!fO0#dRJ|51=^e6ei~ppI+LY<>ul!Ygi8JKeK+eLri%?Yu zTDD!yTUze?{o!}ltZ|i(fU-go{W~Y8qmkbk~Kv7BA>Nn-+!I$un`0I$r0RU_D3$+`L ze2_pe!_{w5`mDwG{@_Z~rg4tUt?Bbtk_oWyHqN z!4n#kd{kCL?7F6`SrBRb_wo8uU&^-*%96yL$jgK?c0h^0E{mMremG)+B8yUB zKTu7Xaq+D_RSS$nABxk@8$Qkjywa-^P2X>f6XeamJg2=Ihu*Z4^KxmaR^nq*LZvL=h;c75@JH}SV_ z%0#lyrYzzg`@D2nwz0HHBpjtl!tTByc*Q>`&IAz4#>UHeqz6z8LfPkY-YC-M{gYp3 zMod>Dzc2i+c1*Y9DKLz^L5e5ADW@ZIeJ!4u@|%NE{C7R?b6ym7ihtD~;i)CkpdY&E zpc4!|bMkM)5lb{WFPpb5#~S!BDviat7NCV+2W>Xv!oRCgvCoYSgYcX!sTSq8QjZcWHysC4IOd z_J%c#)+#b}?v0{nkGkGOtWA@Of37unQ>AiK3&-#+;H<$|-z9{cFS?$71j@@1|1$A! zy!S=<$%oE^y+`|>@vmczw8^m;{{t^MFHG`xXHKkOfXiG-ZFZb;{7d?`BB6iX5jN*m z>~a1+Y6{c_M8!YhF!;RYC^gSjzkgT%LwJGIpv6Ol{}CI6bsZiw{)gZMG`76xdh2n~ zcvvlL1?+Hb#}Bq8PViW!^rIo4Ge1FpovRbMbl^6ny`%nrlwKQhBo1>_HVuq2-5)Ww zL+6f`v?6X8hlu;k&tjg;wV*`N{L1T-?dofli=UK3%VvfN00fcK-{J{-!h=BrzGItj zPbK{65KaH4cxF&m`TewpA@}xphMEPsaxJ`B*8zI0v4wc8!0Fne&3cmg4>+Eb=ZLq$ zmHovB?e{iI-k0Br;z-0Kl`>=)`Ku zVrRILkAldpuMi`@CzaHExbbd`--W5n!%M|thoaKj!hb@coY}^QVr#w_F3bX>nkRN0E2j1$-EIqS$2+;mLlU zx-O0LQwRfV$5;TQcs#{o#G>7EFi7JJxso+>V z@w`^M*g24&5}U2{bRt1bxa2bhSn+`K<

wDpkLHG=C`2G0g?esS^15RSO4@KF!XhD?|Jl-^E!oN;z<_uyA_5A^}< zQ?@w@3~}`8^W@+cWq@$7`tc_;7?&~_$?>B=J(wikbJ#;KO-qK+vTF#%Rc{@QFeGei zTuj~IDKBa!ZSD|^p~09dgXKd#{&64wTmJ>=CC95Dc+pqw-Z$lZD>?idq)(+e#Qzqm z$A87LGrO;|!=oF(mj3yv#=>PA{4V1^gUcmXNZOl#A-Z_`*s`DZIhI$wf5v}h|I&Hs z;`H54C3Rl{0^?ZeIhE7)``YXZn>!iNYjBEtgXX@BJwLI~1Roh!<_-Jzi!<$>^*W&> z_twXWzK2ZEoImp5$VtZ@GB=?nTx8$ZxT{ZWRXi8o0%!cQEV|gG4`gHxwbLQXY&Pb9 zK6J6optoH|-))>mN#8Q{UzUjm15YS5uQ+h<#`lpr6!*6}F-bgxEbj6(WzH)A(Y@!e zeIvII{j>+4SNIpMHe!RPZXR8qv^_0(9>*PTlr#TZ`ZN2h5b}Yjsl3*1^8%?W8~Z+# zy(7jcw++{B4Is# zCWueHdux~Bl)x=6P4vRU_u?n`L4cBH{W&;q^6PczXL&Pf_U|Ot11E7mKV3o$AM>al z|8cDZ+_qUG#;5%wS4ID4)?dVU;8mHEZg%OB_RiT80r#>UC>=M<71C_u(l@yp30n#; zPCR2ka4@Y@dX?#h=y1T51FuZ#HOm;Vjq4o$G`E7{VCmP(4>OUqI1EF0*Mx~~OWM#) z!;EH&{s12Q^kDbN;#k+PL>@KA3Vh6D)p1cP?^(Z2qto#M{9t-cR3tt-tgl6_z>M_9gGk zL%U?{;oVl0Yqy}aux^bdA5VE9{?qmF)pq~IRU<$1;xYJRthg51JyZwMaVP?9u7gY) zdCe;^6kEWl{(y|9=U}1BnA3_5@{?sm$R+4h71uvcxGz?%R0hFH@$ zc{IUjyz#+>tNo+p3NtwmA58S@`QPeo^y9I!Xtt{~2dV(;+6L`^Tv)-?6z@uVt8Uz=%na|sG0u> zCOr#kB<|;;h%;6YR^r@%M&u3GV%Oz|-YfPh{y}kBv6rd9YvH9f=Fj*q2dcg)D(f}J zVVvwbRGtBdzloocT=z%df9MXV`0tbc?pq~K06E*g@}RO5c6CQjP2xA9V@aAb86_I>jZ+O zb@#~snRgq0Nr73XY>V}>eaouW53`56M18CjS?}d2)|HckwwNjCt+=+*Gn!4U)m^fH zK+J{C7$2ArV-~lctQd2oo)=O-*4xt<6sqC}2L)Js(tK~<(#P8~)3=ljrimQ@^;v_gWiSpIP>@3}xwlU9< zJLx^R1}I7N_i+(obyPM-c` zD%hqEwP6;!%oj8y*u}!WTkee8Zi{GRhC%WzGwEq;}PU4eF84N zoxE5v`+S~Q$@MAo$)YWda$A-g#V^^S*Yn2F>!Mg-z#UK%0GZ=u^c_?A$pO&AT-mwm z-N->%-&?F}tgmQ~cze-{^HlGLuRLkss1*`jNe*U{FmRGp;vUt<4=@GI2M+ZdV^?WX z4Afkic=P%sZm+M3_+IIHG$EpqH@&xztOu;9=hGno7cx8htgBMO(TKM*|JU0u8z5hf zzvGXwDW$KR|m;rw(-srl@9C&aCPvNB(SQ61l)a%i-O`? zc>@A6{Jjt{)MF>_#s(+L1UILg*@~Bmw;0N$N=6oERb(0QT?Nc_tfz&PuI=QzlCy)! z)KtsT&Ma3Bw0Vw#$tIL{!DIq$OaGHaN*3GGQO0p2rvYUvYwcx{BZWviCQ}o@dtDO# z7oYVfiHhi2W=&EI)#m5MqGJwK zsvbclCXCB2#~cr6F^iMGz!F|8&BChtR2CHJOvSs-ph_yQje{&2GX_1o1Rw51I5ncN zmx$rBysgGP^&i(fHhPh<=_nt~hH(szZQNZ zCyg6zK|EyP_#lj>iAq1bJL;D4361|6qrfLcC5X1obC^})zh=0~0OLyVPuT0d57;MI zFi-Y6#>VmF!j;)TG2ZoL@2Ys4G)JM8Qwy)W;0=EFDQ4!yRQ4P+UA?~Z9DpvUd(v7sH9II%O%7}TAHl}6p6L0ebi8>m!c1#+ zb*(AAL+@&q2&72^}!hBy|wyE_hb;Adymi6SbxK?*&<*42mx{(@Itz5l5QUO!Kdgu z$?>TpH`oyD*CIUEZccHYHkoR2!eIsgO8?M}npy;VW?=z+C3g|gys)(vI#=V!|Md`X zvs2UkDNj&a%CRj(_jblS=1XFd=o?$iV@xM%`>q!U!qCBU_;&fS%)8AcmoK{#t6P9G zH<2i2#1Fk>Zru9pacy<2{7XiW@r*8|{~vlvt2DU=g93url@Ba&qQr8s4cjc_^7<#;`n-g&WXV+Qs6Y(u?WY2-STb$v%#+Wza6 zThZb&eCoh)Ynr)YJ$_eFV1gP_47LFvWth)nz0~zAstJp;v*EZC_I zw@E*2j9D4i2?xa8DF3rAxHgzl4JCV&PgsP1=3aJ0uK>b1PcV_~I{&f(^5yuek0}7< zUXK+iCXnZkDDom9?(>Fqh_}4K&~aiq+Hw+&eLiDQOjmJ~c`bpYT{jXY-q4}|%Ni_H z0>#O%pL`|*bl*9dq4Xt~U}TH1ky&Gi4g#xuzv<^kt_PkCk4#uRu?)10e~oj&Mf&L? z$Ku~n6B0h>#9jruKDF%WM@IV7r!l(^R`Qq*-@qDpT~ugOg8t)v!4gCp`d;4zWovx* z_`+XsP%K8m+JzgtTKdg({pk{4I!W4X9KzG1#lN~&1xgiimB^&1r##CE+KG0^BEF6m zicZA~-Swl&u;ZG&QLxy7{fuqz>bHp>bU$M)fP@1WkRs&Rm^Iu^q-t}pdX* z%=>l>Wt)u?>Av3d>zNkhdZmrnB;HooowBIEiT@g}5R6Xd{VGdf+QJ zZ#}}_CH_h$75}{Xnm!Vec*K85Y^h`Z*!;LqErV^odmCreWt+RmOb26#pf^=Kem1QZPm?tT1nU zKWh8>it(Z!SGf8&9FWB129(hIQUAkfQ~Z{}=(oPdWU158!$};B^%l1sG&OAb-^q-- z&2!sL;?fwa8UvF5EysKq#>GwcH)gfZ|2b#%@DKFtaS$@1T}$noQQjmGU~LZAkIJ>d zclei6(&tV18#j=WhO#>pNSI z&#fRcq)wQ<@E33VIjX(4AI}WmSlES{i|wB4U$(fbUiuLjq!jA zc;37nk55?fzS`iPKgu`lMDOQ$@YVFjarq?7PyPwveCwYef`3v(*8iNiP{`T&-*zmk zqiem)n@$+ptT9@Yo9Dd3n&k^q*e{Zh#%IPcju=@E9{_2cp=$H2{OWAb$*`BuM_{zB7}L9cbaD54GCR<$b7;jUydn7PP)`x`9#XPI{N*o~3#==d-QeSPKd}=;<9gm}^KM$kvV?yIx zOlARG@vi_t__h^b>}-be)ffY=iynrut$`*R_4IO1p7$VvVNj$B9AE*PI$Ph4r<@1s zqq4yJg0=4HxS} z2@c!tWadnt0!9~}*8m&?Z>F}zj+wBvhnK&M55lFS;JWyg7z)N!9I+Pl2CY}XT5VDJ zU+-0%kga6ExF$#|`VuU)lC|ps>0UZsj@jaEUjlD@aZdK_6BXw%o~!O8PFW`v|H%*4 z6W(ftnvj$3gjW}TDUCsV@BLx&Z&s96+DF6BY2l?pgD^1}6*1~s%aQ81ILsypK7@yv z4x$Shp~FYkBQKsKh7pT8#R~u1!oT?rJ-DZ4iqNryh&R4{APvG@I=2F?^YAiD@m{ee*BXYE zZfbRRJ#ES-&OGhoVbiPuMBhM$ z$niP|@FMEE(DD6}+1q_f|7ZH0N$>ZB9j`dVIVNvDF)KWbgZx}4R**%!pebH{#^Dkv zd=>|O8#)^{%)@5d*Ac%};yrdGzr>%H{}?|Mw(ZgUJbYNNBptFUVI+MkC9=OVhBbNo z;F);hF`Mp>dZy8sbfpaenvD>)?dUONts-+$0mR}o^0fMs9b?7J*9F}S9GF~#c3O5g z48>$JRrE|=85=qtI(=mjjVlz-+9RZzb&0_coX7h$ex(|M@_j{H8=%EloY!2~%HO;y z025t7>latOhJR=d!R?WoS;SBHm13lcRP5UvqN*j+Jg2IY_=l05*?pVa7}JU7@nh$Q z;Tf^YKV(DLOWwq&8-A1L0UVD=_Z9~vYs~lZ>%Y8ickfYPoWn`m;ZTrM^yMmm$<<;c zdK!7db0(D`@_7t{B$l?u)Vf%LKQFdr;k}8~1YJqwH3pj9g6VKE(u<@qF%VyMNk6$T zEfB@xD=U^aK1AlT_jomE$R>moDrf89Z#{iwXVHmzYMPbG-jZ0o-;^#D;BOshxEH$M z#pJ{1frBrnBEjt5W6Qn@*ujtY>%?QY8}rDEI^H`FVJ^5nC!VD6`b3ZAqmEj*>U53^ z<0SeG1IY!G_v6}ZyZ3xg*O|XXWsZOHWM-;aq_~gM*vvrkTNA?7k0%i^Y1WAal9!23 z-M~`p0|@hMmOt9)4IJUmSStB~c{>L{Jk4?&|4xgj9S?&QSH>j%KVgE9ug710ckuJX zRbJ?dv?a1{rph-^*pQAo1h#U8hR7Xini1^=5Ko#V&uLq`8!I~u4S9qC_sVCh(_Q|L ze=~wRZrtjN$1{oj`*vXp%erQ|Ui_sXg7J58mBfPWVQ}#&cO9F=WqWi?-bis0&;H@0 z*k2K3W1cv|g!BItN8EdG9H}t|+0kTwSUtpnhOs%GyYMxzBzd~OPREd9vgVlUsv5n! zNIgZ@aH8=`CaG9H;uqvl?Vi;#3_qzkOBlK2t|pnZ$h!Gdym9+^42h@ao{Po+(p#U0 z-R{|4x3@!{n~XSPjFgs(G+mh)gZ3BK|7c_|_!{Sqv(`HO?7;D1yql)frcguXa1-Ox z(HxuSXuYPB8ie}yn&Dloo825o?K3mg#W{5rXP!wK2UhUhW!SP9Gpxu*++_U*Kx=oR z`g&my<@c@6kcSd;y4{`V!Gu2yJc}^KFYlZJcsK9SIZ6RQ#-eDe==I|4oa>z9fXBe; z@5kDO;|+f9X7(ojsm;2Fw}(n}lOIrlk=%PcG}YptY{l>IWJ)_z1F0n3@Cn#|Bb6sT zA0wqAK(O;sbK;z*CibGeKQxB>sKncQWBzCC>O9DqZrE{oko8aAGrGr`_}oK1zT+zh zU&elIuqlp?{-m7G;Zy5;9v>}-y;|@0gRcdNNkJ!}W1J9I?-T;?5bU*j-f)=Wk%Ywv zMw45PM>Tknd!T%W9G-`a_(02xDLcKtb1Vy<%+0 zw0%5mG4a!4`O7Cjz8rtmv36NsXD?TaM4!N5ID$|Dm;d6nJN+%%9I?D_@5IM$Ir4bE z?@x@bYeq?a$x}=RzX}9U0CvamWH?QJ3_>*JDA_@JEMB5p+zSopg62Jj8u7(;Qk@i? z{5mqYj@?HYCUPa)J)(2b8G5Qh(~?5bip1SEt+s3A;wN>h#7(}|nQdPQb=f5J z;dk+${b&+*Lzq=q=Mn2Ahqb6P`tPL6JoOyrkSc8VC+V$@y*7Mt1{TR_>{!+zOj*?+WCh(6f6!oFG3Tl{lC zf#P3TLoK%0QBYecNBYFM$uDKEzsIA_bK;mzy!#m~ln^Ar+i-c0aF^jP^ci3=gp+an zqm9SxCyz#q(CtWwP@_`czxZ@<`F%1 zyba_sytdUGRFaddV7s`)xrOYD;p*is)p}vwHfYzY>3H>~q#Wy)h+$X8ooH(}&9TQq zvQ>Ot=MOYHH`J63SclXSk!(-QK-ro2j<3I>q!}^K*pY)H? z14th^&*|7H;EAe}Vm#+KC3)PNrfPmB)Mfsjgzc7?T>_-puIrViZf! z;Uzdn7RnE|9NC_HrEA`TxZ%J_R*Z!|rmRMBdw=l!7EQePosi56o2|f>vYw}HaMb^0 zD@^eZmA%_Z@*8^mqn$JnsQwT9axIW|yRxx0Na-bTg`#C%&60-#!|9)1<7SO*WhYR4 zvAjH=4juNnl*Sz^0G~J%FrHK=X=jp&`AQ)v*2yTzFDbF+Z;n#le{}HeN$y-U?1{}Y zF>&F?>}ML$?7JIR^hUp4-0OJUwL>!`0aY1W&~1dTcZ%uX^A`)USKs{jHPMNpB+SS7 zU7RS0^zq;3z~r9WJJGW$8gf)|u;^6v5dX!QeDr>a8XOm>vpsDP1n$s$c4 zpnh(+IR^Wk6Y^@{lyiIAyl%>?f&G|2g38`RG%(Z`XK+UP>sLI`4UYeZRY9B!Uqk#m zq*w}@T_5d@B5Z)^W)Dj`>f2C>bofzTlZGy12R6qm7mm@-ge}Dp+#!lPf_C*(PMn zg5RtAx@LPkmaFscpERF+!mO2BO&1EFi)X#>(cj}sFSoy=#s9{WkegnLSCmV#kJaQ6 zrLYssS`K!CBPV@C?hi~{%qgzZru%?h#hNw!+IYI+pFgb^W1r!bY)ibD@ZWl5o291O z>_L;a-{WBxZiK#{gKW_{VqAS)Vk=G?&}Cfb8-AJ{a%TN+NU#bYPJ&Q_a2Ll>E7gXO z$#wNRpyv-}R&o=MoqPdR|C_|WZp^7h*~Lj>`Pao!YNKyvVm^+IpI%#qj)qv;7gBBy zLVP{Oph-laF(*3K3Y(94%(gb4dzVXi-g27dR|<=q){s5pzj|AWTEf-_t2pD9(_5Z9 z$7;Rkn);Qt+d8tccZ?(BIjTmXP^^u^XcU4Cb9D^oUOM1BuvH zk&uI@SY9qG^MA&5(xq!W@faMZ{z;vj*DU=-<7L`JQ`BSL3Qt{tq~hP|hkIsRr!nWT zJ?H;Cm#R|&MT(d5)37glXZdt~YUgDL_DS*)y2fK$3{Nyu;i5Y31DXQ23v z3l&Gaxx>B`zMu2aHdw~L$!O_cUp7F#9DmhuB)?sJ<;3qM?h`l4hZ{XBMB?if#hMnX zLi-+TB;iFelPV*q?Ryc#$quMs2qK9Fg=7XXEpJOgTDuFATLt=uU^zbw*{ewSSwJVWNi(NV7m zxzz@JqoI4{xTrL#Y6k}Un)-`rqV%3Hlo&txp&o9Tta?dQ5z&`BSe|Ify~0<{kNf&S zLl%-NbiiIA1u4%EZiptXpzM^3-k_p{dblWXOYX!JxLEUykCLrFeGBkpw2X1=* zTD1J{flC6)IR1k7I7gEwhq4~=D%Z3q4B*IDlr>NjU%raw|BLnmb{FuCg3C3>yRS|{ zsdbB#@m0<(`p`-LzyM9+NB|8>;*DwXW;icmYW|<%V*msZf@tq^9XZ;pf7r@-(q_c+ zglVmsRh!_+&qqe?YM9Cm7pVs@1gmSJ&=WRf5~YonZX3qaE%@ZdT>lfyOC+g=ZR&GfcXWdw+x@SvC_{p_wxxQ=s--a`#kgjq@PQ3J!aGYk6P8J7FuPBMS?B)R&kz>dI_FadA7b-db zce!uU|Gqwq?d69&mu34JTKuciq}=k5AY(t6{lLs^6y|I<2!np zE_3Yr;&X&=lY9}gj8RBh+R(TB8(AT18&>y4M_|l5Z5!_PWdr2P@fRHt2sJ5h!0@^_ z_jS;cmZQ~Pl)NTdnH;SWHV)=+cg#wYAvFI-vwYh5acY zC!Od~e=aGCVY?+}hvXifLx7qoNC%1=w_pH_bXtA|X7nST-lab6rPnAys6O_xf6&C=|~LNqg@UE6o)W(@}Y-20fn$ z-ENNDi0M9cseiEb6MK{PSt0iroQ0S2$!C^1UM zLr^dg0fhl9^B!Y|!t*&0{NRzZd+6pi{>d~w+!FI_^8JbzS+Ea2>)=BgMu!fCZtKfJ|NXG&C*uAWZ(ruUDi_V zvtM!i4x!JYLF0?Dj44;APP3K&RZk&JfvC6RwH6zSbl*s1K9fIsFY}}{Naeona}K@U z!e4T`86(^FH^=@&+S0)F@1rZh8}H6KD0ah#aomeKVpl2#sw<92$$q-fMzZ46XZqR^ zAf8_lg^iQ!ibcaHuUK;iJLF4;VSV@Uy|qpGdQy2+!}Z~ct^%t|*mkOZ_i81#oJ z`@i}U0zjjc$LBdiJakfV+i}+hpEorB-&FhjKj(pi+?fIs#|ktF>2U-K^x+jLqtkB+ z&k`d81H3kD!hvfJy9gS|zGQHm^VKF3C%W)m56#4N%{>6&GLet?=W8JYIjPvqB}CN@ z!m{%xt(~y_v{K0cssV#c*(JtLwR-qp)H;-FjD3wqbM$qD=@{40f_wG_X;J}SbEaUH zup7u@d)yA_CrVExKnKIVV@~M%OTEVD8uPD7QRNet?UaZ4vC(c8GEiyDI)=z3p5-3 z2`ysX*dM}P8=tsdGl{2dDQgc0!zuomKZwp*@A2|w1LVu`7ahEqEW74AA$8}h#7W@H zxF|lG**J@c!kA-`lyQT#FH~1o&l$9JV zfzE$txm#c#@^qyLh`ZX37)DGy0)RF`5h*H)tmznM`z4zTxBc9Q^PGTnV%&G*H_fT? zedbT{wPjbOH%)rkk8gS2yyYeh^yApL={IefvFU@Cr+b1u7eYDju~RR{U|^sR)GuE_ z^W91=nlOXxsXs1mXz+|Z%NPp&wdg=4OCptCUBcq5m}aqgVwHt6#rqsXcc9{Q-}8O= zMa56YwdH(kk;0>+81u@h8tkb6N}luvP7 zi4Rlp5MwY@77s4(ophzhP#U?82icnSYE6bS{`Wn$tD~=1WsY%&)$gQyEVH zg4x~v8CVqVLe9C>j421`Fzon)EW3AkCm3FG<5w8*>#%)wT^EU(!X*XgQTNl{i_=a=%47dtlwmTzHX9OxY}lO_16t<}EkC8brP75>Z6 z1IG}JH?ZY4<{KNZpf)(u2jYJmo-s9|dUU*6^Uf9KBP)Mlo{2X(Y`ceEgX zyq6vIZC(N7kHjkU(qv?Z))jby1u;Jw^Hv2DTC zX%zPP|BydG>oe(wwZt6x4Yhu;NSEB8I%FMi(X+{Q{D~>$1 z#wHCqkNC=s=jMA6 zfU2i6dLZcUeN`NxrGKlh(ONOF*Tx!OQ5RZIJ{^Ka*raCGY*5y7=w!HzAv&lOu=1<- zxFP%_{A6@JJAqyuWg|$1$c>JU|7sxl_(}fHnMe_8s{j-Z%RsZ4v@3e`7y$~#clan7$8o%-W9`d=(o*v7RTxKMP*O6SF1%48z+BoFMr+dQ*Ts(0bxQ+C^3?b+ zU>rMZf1v)O$Z=*~&DS|zTquN1{2DQPIW$Xrk1-+fNK#zf*#*hB0P^jaOCPC1=-^Iq zzx&U7kaE}7gf_j%O)CzKPnRyFE4$aFr55lqaSQwlTpE6id=tr!?GK?+MDCkY|1Jep zz26ouHD#Z+Y@RNHiitohSX*=`C6eL*BB>UyoUbyp!tZpR;){8M(Xz*ulkLHCeIZah z*(b%m%bM(sMNZcaS98mF1~i_AkWBee_#22rvOwznfhG#-^IA+euL*hS(NL(lJs5}W zukR2x>Z@*`^nB1q-&tp4$#p(#N80T`8|QA{6&jxV+Agk$zNruDi)vKt2-=r-BYve& z<;i@;Q(YEuY-C@=T;?p%%yvzP{8;~JZm}CD=<9S?v4=u?K-@H@Y+Rb#fHHHzK6D`!CTo|7) z-N%FRA9|*2I#&CE4$BymQVJS|taA~KrO;^GeNfU!NCT}^Kqn*^`?+tdJ0v*RA2tW8 zv=Y2p`Jvjayw!y@QzEpy1wky%I-qkmir`Ub-wyxWv`y7AfL#Mw6x+{=MZV zV_n!kO~>+8T{NvRonIBXxc$-WE;6l|5|1k6Y?9{;0L9^<{EVBh%^u%nwEpD0<0@7q zO>*vE?|n<)MsX55T7O22)VL$hjs2i<0Kk8wSjGq)x+aW;J$f%WZ{g5P;+Hw=j1%QZ z<~cr|G-&nS!8fyrD6x;B$TUd)rIaeM+_z#a9Rul`J94NjdX@Z-n!A>+-uSZLNIi`> zbDpz8)kJv5#J(*i8~!6U0nRC?!Lz^-`%FJomrZTLf4Pgd-)?~XwtdxR%n0D89pW%0 z|B3Gaow#<8qLN7!i%eurt-e}o)$3)u-D*L(Kv&1I>oQfqnT*PMML|OeUUGda4AM1T zg82!7{a8y{$z9BFXwHc=Tq=hLc_JA7SktX^nYZK08?l;&acw*MccE>ToH~K|k&6&Y zb7oXnVNx8mqAVPDP4yvyw@LLKQ<24yRvPFEgEZqirTHtBn@#RO3irp=)0ZvY`)V zpn5sS@8Hsmszo3yBRzS6e;)gs!~mF|GE@0a@xS)rJpNeNEu*}xGSHBbl4wu;XruM} z!Qe&YM#DMYOTx8vc8iI24YRXP6*i9@u;r?yP0BjkP)_x_Q7#o`Kr02h z(he2dAbt^@t#sE|+4a|f^JbeKzuhiw0a2PT?Cg*|2v?)*^Xel6ajeQ>1_|dUyz*6Y zSR40vPx#jnCp($}>=~#3;>luLB6tiS*FapJi<(P0GoEBeUO@6ampCT!j3%i|Zkkjz zOy>UxD?W#Y|765+_Bnwi!@Og43^M2w>ian}_G)n(kIhy7uS;F~y9iQQNcFJk;%gW< ze!TSaPG_w%KCcgusE?6(@AS8=9*n$BCfAtm@E5h|g&nj7<(MPlJ;emKwV8~C0IG)E z^@=uK2jMgePoHw-1|#Q4^8d9;>}zHKyxPNFF*P11F+`uUHnW8vZm!Y>lsHoL6@S zT)Esj{yn*==3p_8FSOS(J-^2uH;-obvg(4wa;-roJ26cQ&_g#%!cLyZ3M}}e z;k_PaBR)lH9HR4BqQR&SFC0Ps*2PR^2C8jG1G6UKxoPTD0be$m`e8GG1%xWju^My# z5D|5Iy(%wO?4Ls#4}(_yFS>Jl1ctie28qQf9=LW_{9DNesJ0__=pb(Hiavk40rK1S zm78sabJ9~GJi&nm`pg?nfx7myfQ$BCedfQmKdH#AydBBuSS!f57+E6M*a+kL0PeG?oNxtTl|z3<##8s)yuQOJ@qVip~@Vr2}>&giMu1# zxp2MeFN!$53l8Hf;RNE@+kN0L z*3|f2hK(hMWcP;ha|{S!k-d@PB_CLqR60t(72;ah z>9Fle`5L>xv?PW7T3O&(4v59i^Crl}G&&uhZwBFdfn`8*;-JOVeo2$*2)?2cb|Z{k zN~VfUA3_HuP?@-JvV6Q}8>|NE5!1J-=@(Yq%f>AT@e2G+(TmIcZ(DwIvc2~je+D$^ zNKjknRZu=!7Z?6P{Dhpy%U^(wa)jJKMU7L~QuJzzGtc`(8E;Z60h3~p?Guc|_`y|twKlP~7JCr_XacatAM9D3X zlsB(x%zhc;PZnB36UG(!ROCDM`rlYkV3#z`4_EHO7^4QAnyv;3xEdqwBjS={ns45e zzU#PJrFdX?5ohUKsba!GNZ5())e?;Bm)ZzfR@s{I2`*yVbg>MBd0osT4C`eL7= zhN1pke3lqVCt6`J2FbDIq;OZrD!Q@?e!hbE(6>Z>2&;ws;#Bf#2DFpjyFb9(!T9%z z%Z`<}wrZt4{`tno136B*hkoHGFQ*#;RAVn4BQ^+Whe$wbobpQfC~AbbAyOP_X=9FK zs4V`h8m)|m6545by*GV0kPUgB!jg}ZBYjt4;}m)LWl0GhF<|5|bR~GKKzL1z`rM$8$dbQWv_f~n$Y_gr0T}`Hud8kLVqpXbj$eg;T-CwUYRh+ z+Op@ld*7ZQuRePv5JjloBq0BLOQ2KVMhBd|p!lsmcX2RC-1Q{8Pm0v<){Zg$_c3uT zV$C!W(_~F_^g?)GIg@Ugu|~>Llo2m9lS3Nfrk0n*jUU!=#(ApC6A5|(%+dUKDtt4( znPM3i@}vX#`qp^qco81;!oTQzC;U^9YhZ37e{kIOv$hxI+>&`n;7Ga~pv9az2A7MH zHxP%|2H9~^I>{3X9Ex(1*YV#6^WxI8<#C6EF)3H=R|dY$OSI5t)|ugNEgEs5oZ|m- znAbn-pNv()WxiT~vR+M^+{y}Dzo~`dxNJ*frQLK4PHNW@EhML6728*yr(^C{nPQzj z14na8)GGil6nfSQ$U;7k6Ynwpg9D;X=o4>Qo4{e7^U6h|_1C7vEyu_yGh_q=ArAR&Z*4f~;vZ z1!3liQ?{pWbl%#{cVqsx$E2}thWMqu+G)4UT6=9?@l$Pi!8!h|b0nwWFSW;%U#mkK zIXYr3c%x(*xV+l%M8_BtNRH!A_O#8jlNG;o+$!&7^R50T{hJNP7Efg75eXPMkll7Y zU0O0{ooCzVo?{vPX19htOn8i(J0UgchJ<&P<{KA~8b(qU#dOa9@y5b@gll~Li$_a$rOiBnblxSZQ)uaF zzz}Dpcg#s6=a~>vTvL1$hk}dw2JDG7!q3uKZ|b=ApKZ`A+W%@UY#CyaTN(d7=SZmg zgsOepYgCi`ADrVTx36Y#TKMbOZfT6EADGKrb4_-z2uP>@bOUnQ7M?n8l0Ti|2Et4| zqVpwhLN(4fuL}eyk`!MKh#)@P@`I-pLg;<7i%ba9t0krc-e;i zbhxsE6IVffn%qIUc=?QP`X1Of*xc{34V`8wqHFAHZeYvcs*9jC{kpKimFoY5c*Qt% zOk^_Tf0$q`IkkN<+u4z*A=_d!{%*Qv7U_&BG38p@I5QnR3XftK0tI60g^l zkB#OQPUo?6N8fC+-+#LS^4s?M#!t9KQq4u0oJ>%A_!#&HJmNJ=Y||Nv3f8AjW~~#eL+o;J=U{{A#gZq2EZLUiGrHK)Hcy@NZZP=yD{Gw+Nq_{? z#Ljd!SmywTKzP3w(HSMFtqZzLNeEO(p3az(0`DaeQg2~bq~w@YD*eG(XVym`|FE^0fk+~m3bWRBErdSN?GL94r2?C^~> z#!P;8B3o~qK8<&#!Qjgu5 zkGx6b>l>dL>reekI9D7c9(c@w$Iq$f&?-HpkK6%WfGYgQI9H)kxau6+-QmmO!_^qyRW|D=}1E_+AA)W zXw%%1YYR{v_pR{i5@IbnY#$k2u&GxJaa9*v_Q4BS(MJtMHj*3?_!k~d{Hs2PJ+}e> z;XCG*@`fSCsM=e%M*6RX5zlLq4Q29Iv7=ApSx`IWiMjz)lkRnLz_Z|ycOs6=NVkr| z(s#@M^mKTVx#Ae@Z zu5)0>?DkW<_pz_sa|#+US@c$iLisS7;#?fI_$Ii6b!P4=l{!!GHA0AqS8mp8$|j-83Qb3u&)BOuDXXHS1yh5jQCR|3M#IJ-8B|W{!7fTeBEbN5!%!C!iKh zpDp5b>T-@4f|BM2yqf=C+st-Z=Yp{jp9D9e6d@CxUJL$|7pphK`oOK_N3+(~64BW> z@)${^E&@Mx=9u7JkSbOWKZ$?bleT=lSNtyl{Iyq+^J|xIzxs$e$w7X;kv;T@@)f_H zU(HoMmYa4~IgG@zk%;)Lkh84oqG{zAo+m86?_wl72SHE zQiwanW{gAeYvqx{WpQgVeDAEbgK*gUx8%m2qeGz+|6b}DDo>^#OPpNoA=@`IWAVJN zy?B$E{s{jOVEWD1$5&-}%~Q|AyVEx|3TWRLfp*gVGk#zx=c2sF{?!p zu`o$4K=}eygvD6#ldv0mX0>`Xfksk6D3s$H_TLFV zaY61SWYI2BN3ko!`;gS+l=vFoV`EwDCk~2m$C~ zNc|i5H|=^R9O9DVQN@3702&{qP994-=Rc3HqcX*P#B^Mp6LZpFj#&hCy!>GfV^q#W(wigSgQ)wDexCA2U0Z84bk}H<^x`=&_tB6Q>FhIj%*ydob z8n|pp8OHLQm4s6wUnm6R#YbQ zmj2Gu|Hr>~%I%fUOTm7wWJEolF0FBK9uw-HIH=O8tKS-zf;ghe@*0eX4!6qVoXTt1 zJoAAQ|D2etdYm6JdvLa^|2OKUX8mtF2Z3X|a+i0#x$ESu0-|$YtyZ#z^Ro}5!4c5!HZA{4Asolf zj<7BEU*JFTiQVSPN<^oGR~~U7ltwBgl()>B~B^M zgou%AjahhD^`RD3yl)fO&Q|+ z3<21RmT7TL;JldprotmgAmbHS&slIe zq7)j$ZLw?nB2RVZ!>~P|Z`ND#Do;FR@fL&6QV;AMZQcl5 z1GAy8Ro!9j3cHqMO$UnB6ckU>y3&L4g)!b4>@FRNDijy2L&bOXl?@Fr&|=>@p-)it z3(xJ~@5`HxYzXQTCoXk`QQY7%Pi6k+fC7k{P7D;~m||qW!$&01ya zL_MTUY8i1XD(zz%I&SHvoimC(J`Wi7Pd2a}dw+saZ_2NInb1RPz=)rc2RwUV%eFmB zNsRW$(|V;U-|L2GA!9~%8(rrZ@Xz*BEL8b#WI&8*aeQ1{xn*JB>dDoJZOY>H*MVc$ zYTnc*4ca*`{K0_~AHL`&oa1+gH3qoerZzDSF6S#27E6;qd;M%+9@h{|sH1CQ;G3v| zLEmGaxtdc+=IW+fJ)m>izz;k|Tir@)UW^Ov+`Gl>uW0W*#6&X3i`3oeW7Ebd%F0;q z@oAfJCiQ>lpc5UM+acp~OPc})%fRQGRm+;XP>rd}mYrEHEZ*37lnTCFIPUd*aGeAP z=`8Yyg!>%S%Ws{l8UIKXjC_aU4TxCMKlVa4#SG=c5>4DdWFyz}6Z}I0a^}DEbzw%D z8yeT@v4?Iq8b6w=yTwftQxf1%koZ$Yiw{a>V&x9#?O5W4)*j`iq7=b@&$W$MI{t}c zHXr-IzS7NlF#B&eKz`f4W{aTBz%?lX81UNyjA5%(l3a}vY%avK;?*okXp4O6 z$S;oNB*n28hd>t3=hN5_PLi4gNOHRS`YF&OYdL=k;9TT3#r4!!`Cv+%AVQCc zP(FLO-g9x!y4uKy7>~t-uv^Q%%Huq#>QU(24qHOcadlpZkO%-T8cl^&B;&Y}lVOdU zC62gZLC_q`12aSM|*< zEI#pVYX36ePBEOxc8%|`f1@gqb>km7&tk@_zzWPI?gI!;JXx??@=H#(E5XHKarBZy zq2rdXreIRiTKt#Pn6Inr)-i4V|3@q?d`rexM^}e znME_1UiglkaIyP1ytsyKXDqBX6UWvu6VVkCMVh)ewtU5b%R16KXVv4MWphHA+;k_q zBA%E463^zfa7uY@%Ksq(PhwY3t(b`8Tth%rHieH!$OVCjp2$;94^eQSul>lu30JCZ zxJ7I82m3)b)3~miER2bM-D;!Vw-&7vLK`2iI3oO8;h(#9WBiBQv*ArH!l;b& zY!m+LT)#kWl86NukM#v%$EHD^sa)=*OZeD@sB>Id|KN50Y8YNVj$FIG2%Hb6T%9yl zQjD8sm-Yu9GsXt_9IL1p%bNgXdHF%PgV{d$Ap4MxkUq^=vdn{fbW9@%!A&j%gzwie z4#VVMZ|azK6E@#nz?~Qj`8OKh5GAkIGzL&S=bQvS;~$#U+|lY$;^;^7_Q@9;KK+66 zbQ^l?B;8`$~blX77M5x>J95I8u3DSug{J0PJKF?H%il8D>fFdZIVs0V zE}-mTNL*(9=etNFeZ!c%8JF!`+W6`?<9fq?s<8*>76?_-q~5E0yWMh(s%^R=b&NKt zb^z*lxqDC%jMZG=sd*9we}Gb)v~FtM>H3U42m32^B5bFq&YLs`t(;clb^cDMHP)fr zeMML$`lZIQ;)%d!+GKn5RKw($l552k{W`i{=X9WN^04$JE3Z?Z*{)jiAdcy=7n&H^ zN+{vHW;FB}8yPI+bLKMFUQ+o7{_j=eIr%GN`_?|y=JC3)O+IthXDR84{|Y_MX_EUG z!VdAL5B_qRQ%3MPV}Ln=<}LZ&n|z1FT#W~-;?fU4>TnK2&n3(QCi+)Qwb*o5SU1}* z%BSCMfc&;yZ#E{$b7qJwVH$Zp)lU^tj9(Px zY!g3i(*1{4`S20m#w4<}AfIJ2z8+^VQKl(WP>q@Za`VM2LarBtgQjD$H7$1N^|~;t z34SB%v{7#;)}jQ!H+n)wCOXDp^YlKM*ThcY-*YBOIk#KJ3l(jck}Gn-B8r?C4l~j< zJ2lOqwA~y2L%2q`+E5W&g>dL}7O36|Ka5uA6FQ`Osk)MELE+*6s4WS@A0yb2=x#x`ZPGI{Bv$pvP@Yyxy|E7;YkB3T~#c3JN|65w3&Te2-KT8b*xu^JQb8<^f3q${eZrTe@0$1~=e`0e zZy2s~o!>d%#{1AY^CAgs8_cl@(@VvyqekXoOv=RV69o%?2gtcBJQ|4957!**XAo^CNt z5xmwp-7}~J0}-P4JL=}k+#_d!NN=?y9QA+0Vilu>c~g|SG8cNRS>tyyxG>b5p16(N z69GWh7*9YVUwK~(faLsfbLI&0p_3;PM^pU|i91I6qb)Dyi>u0ybnp?cCEKofz?w`p z>A?T`lRjHahFkMN56&BsMAVH&q|9?At^sQGrwCd7r5FsqF%%U4-tbTIL$lPAR^QsU zYn&WoN#ryl|uVFH)+9kXgQT>QIs~?aR{|+j28Q>ugW_4s4uRYBN`boi!HR z-g-^f{lS><3a8(0fc&%EvEn>yf$^vaIv$EiQ=d*^+ZWNiJcS6}fyY*4ja8dM=unS&RQvaa0Z zLTy3aiB6yN&7Y47ve($zGy68mcKSnDKAIc3mXc6!dLEBh(83}~yHDh#E6ai*(8JQRV;oR%??;0<%YB-h6ZbUOQRmW8xGMu@pSsU-_6l3ByK@rk}h zJH_ECugT^1jgZ$APkdL$&-U@joGhH2IVmq;rE+{~Appo?+q>RQ$JhJ7zth-DPkaN( z!6SGTrA8+U*@a~0{uLgTr@*-3c<_-!bMfQxwID490VR;Yoi`;ta$HUHu-;2806fkA zs{7~_X;t(>{n7jFN{)ZRC|`>-zXpJ5i3OhcSl&-R8TrN`i%T?7ap{Zn%iUUvQOmn+ zlp81y++DBRHYo_m9@53wai)}1{X=6VcQnc?pVv9b|4rE~|AS&zD4_T}zN6bjPK&P= z8(aR*ZW(zz`Hq^wDYj20NZwElqN7lt4qxRd>-yJpJ#9_w^vUdO=eW7XQ>H|UN&}A< zGDbUIK=^*XF6RzB)28{FldQsLJePNG%Cp&Xe-UPi{{&y8Xe30VvxkM z#wPfNW5EIR{2e(>`Xl^D>hi1y>t+h$$yqHqNceZQCK}XS#VBV6hPs#gC~bU0LHE`5 zzjF?&apD?18fN`y#lfKoXfODy$2{XI$8OMz*I>@~q3Eu=ytXZQYWaFw6Di9`z6q~f z)j5d}?|S*R`-thA?E|{i#b@Iv!-PLG+&Q9caRrp4oVYlD*xJB1r@8QT@vY}gqqqqc z3UDpODJu0Pxrr&duHTU9+@CSVfTS?vxfaJ??gn@Zp4i?3-6?Y%vgh zfqZ2#*DQ=O&m=xwUxj+Ycqrc>`;GkBzQux_<`jEPsCD}c(0m=F$o$Zh-u@%^Q<77X`NH#;fqR;a7~DC#^&#ydae_X%Rrv zfNzUn6W8=JywH(F$Z^!6h4TW|JvH;xDT&U`#<$eSWa594CVgI#nHaq9^{*6E`UJIa zwzNMhdX&u#TAY|jO|Ek68xd9!x~V82$=Zo1!A)K7a(7;q!URSsl*r83M~y`z@sYEb zK#%<&-vj^rjpO@w=K~CctdU@`((nrVtF&vDehQ&n~;HHEc+=z^>jk{or@Z0 zJ*$%@{XE9gB@^~d0wB+l8PmZf3NY7jusL`?ppjI znUZi*snSzobG5HUNdB1X+HRE2ohDQ)Gu8HtfwQ@1M$bj6RKO*UQcoj4cHnpAnX6GB z{~v}xVu8m>Cl?^@7(NBDIfvv^@lv5KNnz<|qK~f_P_EWIP`)bV&uB0mZ}d-PfYS|F z9P7Ywm_N`86(q-?_~%JM9s_qa`OGfg_12s}Fl3O3v$9_$w!3$q#4qA#6K&Z`={iJIVT*LOccwNjJ(?W z=AGmBAMP(X?vD3wVw_FrgT2sWBGlPOc;BXlYPng1Hc27{cyi__9w@sNfLTY1sFwdT z4qW5L?kX-;`y|SwrZ`-B|WHknR?JV7x zZTObwI7Mj?uh=HX8=UFuDu6{B<)7V^b zd+8oSNH_ZCLFRb ziZKJ#3e?Uk7dx6aMA&M(@MCmLa_%x9#s;7<8idw@U2$m4{dl&@4*~8AFFx`$+acrN zjF=i5_CH!55m!tZ);r-owBtO}p&TzJ;BCS0ff?5rk(in7F5@^FJ?#yKKH9#0nVkRd z{tJHp{xiOL`vq?@SNa&=p{~X`*M9tob7Z5pPhe>eVl5Vy+E&t%Ie?oXO8TNIlkfaDY8S^?UpedVjQ_$3-&o`FsA3~-U_t8|Kyn~+Ou4dr zEACx>tnnlC2YAvvlfdpdS!fU3NvIIY)+gh-m)s%sf7ssRPHNc}OVWGj&VibcI1S*- z?8pE9KL#58CUlBWe=fG$EB|O-Ca2ge!`&p{i)5+ zc1Ej?a_)&AnMl-D9`Ccad>SSLajQ>@PJr+S$o3}5y?al4>_+-VWFJB({E&AoS zIq|ag2OgX_K8LUyN$<&0Dw)fQ-P8-*ws?tSR~Y}=oTNqEkb^R2=K-?SS8zEn!@uwI zlg@z&P~Hw+Wlq;~sxhP=eR8;r1&vGP_)AdP!or;j)M;pOl1-AIhVhDaZ|V&KV+|D3R` z_jmWEDRwRtUsz5=%SY<0OZ;Eue^d3tVo3Ad*G_$YWk{($*kg%x$izVXS<5S$v_Sc$ zjo7l`m@gRDauet&zlgnfQm0&OV-8{t+ZyO*z1h});$dKzL+AVrjWGd;s1|p9l*;EE zW6$cqh`X4(oiYD1ce{Uid{qm_Pv?}^YV2n`Rx!+Vd$T2vVK}Zw%O5BVbL^2go+BCM zQkj#S0%`2Blk6k3%O6!W#_^@f0&&jZF5Gi!$MF|T^&0-OP0LBuy#B>sff;rt$Dn)n z>&_fkId}871l-D1KC4j=0AQz^bv*oyuGhfhv0pOTKT`~LTLJL{<^My}?_O?t{O@xTeLU2TR|?mqFD1gGe!^Z3nF=mIo`HZHa#k1`#0x=$4%$P16A>Rq_FunCXx z);?IzaXWl>*R_(qcCzIpCc(9PU-qVoS7T1cLypYBThq6X*&O!jQQU0jcgKkiTs)~-XGUYd=gic^nSyA8s1$(Tk|kokJ;PQ8p9=&!E;{C z$2HDtts~mnzP8FX;8OpFJc(uE3G7ZUpLfzn>U5P4Scq*RdThrDPc^*dgPbcs*9wwf zIsdQ$ZF_YN)~@}#_yow27~a0Uf1D7U`sHmVp7>Z-$aT`aUh^KV5m227 zaP1tS`1ak);@<7-(7*&>=ch)TNK6uwJ{4xrq%qpVHU$CE6(J*%p^4=y@c`I9j!YFy zcJs1-jGLM2oqlRQtD~T}*vXU$KS(TNAPQdAiINJxKWx7@Ql!&V0G&Jk{LTHPfNq81 z%Reuaf`9(@{wS_XcZ|fDdSo1*yBSM}IISc&Zccygc=%v&?kUykX^!beSCPiWfjrMGA0$dkMk*Qawc_>W_6jvNr0#Q9#qiC;~U zeLf{{cX=v1LwA5TVuFznoWA$bUpxMl11w{o&kDB^{49mJfv^o zFo|(rqFmb2C-r{89V*W#9;$ZXzK_^@=EKD>GVlHVkbAdOhe~eMuLj;gry@RGeQZ$7`0AW!G#efBQuZ@c zN^0}4-bprHauRa6We`~URe)8iA3-M7c^{qr}UU)D|T zqu*`pTXQov4*$Nkxj#D_x5_MeF6ybC8Jr6k!($!c%^Q`K<3+xY_uh+Mv^mM80da*% z9&DbX9Mf`1^tkl4hS$l52Q40W+hQY!-CJ#KqDiqPamJm-m~Uo<+Z4cSDEfl}4w}gC zx-;0U*0qX*U$$l2LyXBVZ6c)9miW^}UeNkk05R&PoL9!!w0@%V%#*|B*}v0tq9XLj zXWzce)jqs^kM}Qs-@QNPa33gkNRBC66&HYx)_%>ASX&@q&o*TrAo{U7di;A6KC{+0 zOQ^4Pdd%G(^;Vo(7D(+9xvKJGeA2|kHj};`kqXQCJ+5lK$SSTvvBw3zVpT8X+#c~l zw4Z;6ZExSU+>v@UrNSV=abcgFPGcP&5#^+5$mB7VTGiAeC!LU{3zuix@V)1_O%Fw( z8{A9^v#)Tm*C774{{+afF!cNX^i3N3=bt{}&;R-f|H#|%iI3xE$IbTpOGnuK@s~ed zPC))%wtA8U6w&qm+aKQHyYJsW4uARL_?Q3n3+`WBNiNVEGNE@;K~1vYGcL-DXtt-@ zI2o^~*X~ZKL3el1MBGUSE3n0oeDmE~eE-Ayl>e`P`W3(a`HRZu*}i(N9ow_@d1M-Y z8zu0uP6?Y%#n6yc77Lf(9pm=yaq9lEP<&wRm!ChK-nihKBrLnqk)IsH6Mf5a8~ic^ zOmoC(2NV6bZ}GA~^d*N?3$1fpk2U%K`KLFylPrm!ORG)flon<0D|NYC0jSlblgx+jo>g7XoyiI3Se%CwWe-+1pD{RK?LHW)54==d;CWq#6bT#|= z^Dp@I)311@pWx|hfS4u`{!_9(g~WDFPgQLx4QOL%j|tuH|M|mXVei=f{I4JJ^G{z= z1?Ic2;Sk>dP5ZbOB5J3bt~jJ!E4;HbvGbB2fBzou-k-L8`gq5mUby6(aPmV35geM& zd)~5nhL)+QdO!b_F``ZLKSf>m`$_%}TaQKNA71eG_T9PC@ar#M9{J7bS9ZJiI{ri6 z*$34LsLZu4D?NY>m>X?f11QT z|Knc@Uml-JQz(eU7st50;Ouw*^!{bx`NZnaKYe}~x6jyU&G-Btid5;d=jmyiZDx|N zuR_}H9p%n9FN>8w{_fo)HjnMkFSh;i)90a2%&sN^&>95Pqi4A{V(aPn&YSYqc_hhT zy?yuL+Uhj<+wb3;_14RF%-R0%zdmk@ z22bOibFg#HxKvSP?vBa*o;T!5kG}Z^m&*9?&6}5c^4&Qvz562`KmKx0f5$jXm|*Ty z9^n!8K{o&sR=}~TV>wE)T@1(hw=ZM%?e}lbIn7Hk`R6~q*!J;DH9QHRX#lCwd^bw9 zmOOQ~_Lj%EhpPt^ZJ2EEg5z=SySI1z=WoBvv38j9a`3S3fBx~k=x(G_#-8sy!A5Gn z1^H>e!9IAJ>1P;-o)dE$8qCh>hj~~ zkNEZFFSt$~JiP#g_%N}Cu?8IIjpAZzjXl4txVRIZxfVTcR{ik%cliL+FOQn!3$C`W zX!DGvXZ6{}iBe+X zBVM9k{EfFC|LKDy(PL5l-TOEAN8aAPc{|?xIJP4o9(P;+j<>#OyUHM(kz;uO&3S|1 zan$jc0R8y;51E{7AnpiY-p{9~LQwW-qD!Cn6@c*MTBa{wPf3CRo5-Nz%146Xlsr)|gfEJ)kurP}Hwp1KK8vw7z+BOu2KUNmi$06S>4JMON2_cCFP z(0nWy{rLW6{QhzpNG-eyr0CW*ivdokG`e#9Dizj6ai>1|GJN~4et%^ubdK#B4Q$ckRP^Sxq z!bm2nR&8^SBv|>b>pCw4R)NOF)3Lq3y{GHFWFI!asodsXyjn5TCe0nQ4kiuVjPRd6 zRPL9e{XAH&Or7!X){j4K5FFh2`0n4A^WXjO{!w)Dy~~>)$3@3NUrdBl z^*#Rw|LnB{F5%(0x*?#)?i~M^IPyI1P4@X!YUlpr=EvL0tKa?bV%xhLVTFh(0*I4c zBY^aCsNnO>kBH%VxX1JO;E?8pUXvm7KjZ)V7h4`r>#ermegF26XAO7~PZ4{kA@xMK ziv|onTlityH2+f$h*)+VG5$2yIoY3s`t6%HkGWgA+(nE01i!OS$gWO@x?jA_IohKK z1Ig3;9p_}OW7V(G>m`rAY{z2ddGq6xbL6>WQAP7;8x1o#?lfm}1ZS24l&T~rPQR5V zCfULq$9M_~*-n&Vbo`u$e*fdUwDs}+hj-_10Vd!A|LD>;?sOV^ZQ1uU+B*l&qA{lSk1cSJ5e<^bRS_;%&s-LK5O8z*Onn=!J`$horeSp1Qq-ep8bMx9lh z$GLCb?q3I%$I-Pfx(gmEjL(}>Fx3>qMJaRj1 zJ%I8Sy)bsV2AJ~?4!^UIMv`dj39Q^h3#zA1^c@G-OJi!hfBP^fBSBa zy-<^4h1cYK=_Hk>jicN!b$)9?*_BsQBhT2+=yk}=kH=ApE57-0Y~Or;E~@u>&sI+G z9K06avbW=c;B#>uzduJMJ{_1bo9Cd|w;qkB!biRJ=3TATz5C{vyS-5rr`#XX{8T*0 zY+YBr;ba8GSF>G=U6k(5>p}|yIhXQnJuR?x9RKFKbDYjkPrl&q+k-c61)UA#F6x#d z+=AC|)V8qsZ+ZjdAehHjDCOpP{2zI{y7}?7=l_;l1muF{zBpz6_(~TB#t}>J-`%iP z0R8Ml#-Vz|pwMDo|T!6o8wr> zhy`qJA|I1R44)T9R=mCC8^X)>7_(eN-J;G?Q&H0-UCg@3`ni`&pnE zh3R^I^X`q} z{D)31?Fj_yb)Vt_(sOe`K85ol`?x94NBl8CpkAE(!m$suI80wqf4=Y6Cn=Cvj~XM2 z;bbu1MX68g09Ojfp#xh^q+yFEpW)v(><#!|MLeiJIUkfNOqeyLGl!7<_&>pYv;m|DB~FO zfAB&yGUDtJCJ-dzszs`eh_2rL{KQSt73cT$gQiF9@y(Ce-n_FFe=asxu|~%RJfxO} zT9AOoNIhsVzotwYeDPhp=Qs%y*pBZ;-zXr)>fjTeyR}*hzGJRY@wlbeJ*t^qv8ti09jlgnlc!WHzBzWM zx%F9Jl3XaqC;ns6z>Izvxb%;35$#QLW^%kMao`0)94 zSY*)g+-D!+*puT0X!Na(Jaj>BMS0W@IR_|tIZo_{=qZj_jpd{MaPH9`i?ZieeVLH& zd9C7hiPd>fbeI&*@w09=KVshm|C@iRuvFO`3AyVzuXuM86$Cd`j{|4P?CBGtCGcqH z!wbNcho<-YsFKKLhqv4uL28s|`I0#Lc5yvO_qVx-c^(LV-0vO#rMM49_4!fEPn`6u zV~)6q3+wR;@FILHREC7}!}w~UzZ{IbU8qC*ofFC9vOB|F1kZtT3txqDpx{{0(@dE&KY<2ZjdZfvBWYYjzb#3YBt zBgcJ?V-jXH3Ex`r!SU(FV{Vo{Mi0$cgCnh+<+a!_WL_=H+Jjr&rpI+BYHrcr+UM)h z2qhzl@{n%!c);*Be9hc}K_9R)&GiAk#lGutwM{B%UFOYCX!CzhPU=+SOJQqY>wB&Z z)dPW?16&ka7_b;+!oRnUtSMm7@(e&fctHJ?Ee(}2vo;(?ev&M=? zg((K40!Y8mHzv4!y@V41A{lYQcR6{{&H3cXsk^s{t4S=~H(&1p({0vkj(V3je){IB z*D0zZFUgwEugqXwGZQl&AD2GkvygCn4HjUekEgEXYLz@~9WOjOTYM5GBK9cfrUo*= zEA~ucwvu9eq?n%${JgOC2!}iBD_}E0LlU@CHNoYbqv6J@|GV$wG;Y4m`{n6V-u^Hf zzPucC4WtJK^Ja=Gwo9Mo3fnbnEx?6ZE|So>d`C@rk;oA^qAS~2rH2+2?-%(ieIbix z#6zqLEzI!iCX5D=7d3M_M{=Yvhf+AkSnhqDJ7@jjL`VL}Z(8616BR7Whj^jiHKB#1 z)tb1y-k)a2l+l2_J7%Wgpb^oZ-G2Ub-`d|72BXmB2L}*+CvHvbx4~3nBhc}0o1BLZ zk*iz4^FjqjHlsFtevVst?6~$=RA7<0R)olNSDyv|4Wp?7+{7twQqznb8jJo^e&24K z@L#qse!)z_TQy;fSas6CF?@D`_?q!w;`|8{MEvu|c_rqLUp^J{@zBQHw5*PYSz4bspH$r= za34cHTR058T5!7h!20;I!eQ9DE^m(Cn^8;Vm*B}DN2i=M;IQ^hx++Up|KPpy+`e$W z+iI<+ATWuom;XNBtKA*mqO$g5>YX{(#YLK1jO)TSSY9%7o(pVkDu?qE;;d8=v^#&Y z42l1Uv-_Q{TQ2<~>sy|k){W!=f9Y$sm33Ni>e?Ucm7>U>QNzLOQ@UpB=6>Q#5-XyU zbDl;Euvqn$F{eGeu=FUuRSbI$BHw_Qb)Tr47iSygV}9V#p|(pvIsKtMC>cc@*?D|5 zEKaxNg`Ypu93Bcgi0^yuEIU$h*jNKHMhcM7vA5c}^ZKcAJz&Y1NcE~>Ve!?(6BmX4 z=&5jJ6>ybLDe!LSnT`KBJ@>dzwt6}K{o?d68@kVU5V2!+Z3otrpHKOc-!lI*zBpLw zLEY*fczsQGI_C8$Vyl~zQIpsF-xF_)Rjzd&*9C7_$vl3$K3(f|^E2~XbV7sS`{0t& zC;mgeoL?@QVjIxoj;g~-C$vsWk;fWWT)W_S|FWdIJ}k=hiQu>wYj!*rtb_qI`4v;Osb(mLKp!(V^-j9>ozISYg%>HYMl zUlVAV*Caz2Nrx_2J(}#ab|z!nbPV!TD!(A9OzPQj$_gDG5cMLwpZ@ewlGzcX_d6Tp z+-;OAqbaor$oq9glAe{q9?oO;v{%psFK#k~N_{dIW`F*2;w@@JTef{!H?(4LD0)f) z1?WeKy(Q_9`Ki8HX-$fR3KSW2Z((4~o|V**qF%=85f=pA(Glp-+^vdOM9fw;8i z^G-1*xx{RrDEhGARrNxJQ(FXzw;zA`f?t0A@`zDC#o?z1Z+d3GS|-(KoX2)>DaajN!doH~J|7v?GK!i8BYHQC4O z5r1brb^7JwuV3)%&tIfn#e#1W@S0VYu0R!o8x}<=K34x`w(~wpSKGO`U#-rM7XSR` zFY8Ieb2}#EKflCj;DQ(FV^S&;>rzPLD(y$Lk3Z~-O^m(BC$?FD{7Rj8zbpeIH;x~9 z`%X^?9{UFdMRlfF_olyLzrn)^TKV~WaS2|_oLrYNKBZ`vo=NVCz2jchr~A-0e7}_V z^~*Ws42UWIZR;q{H~h~UHT*NrGyVaZZ=6b8;-3nQ>#hyo8irZXh+=Y~&aUi}4n<}6D`Ez|*EHYJ^v*aAV5c27Z zejQ@q|J1!4d08(vAB3p-GyzF5jfz_Z-=0eRJlG?KL+IlR-^XHl$o%OKpGj*|4ZPuh zFY0r+U1aDuhAqJX-t>zSm8s+8tunB3PQ^>$@Q{1_w$AxL%_;1$cJjwhG7hJI= z($zSO7ALHl&P;t0e80{mpK%AFe>)~l;)bX^k~iY{6{l_So3_XMV=?yl?Jgre-SV6% z{sq|B`HOcLt5dzb*Q#Pp$+p%L;qnmh`O6o<8OQ(UFQ2LQPf=^E3cpUi?4Mc|*@M2Z z*ng*=_&naKr?`RZz6?7sSU_V@FjK1+YcIDY)K?j8qU3U?8|H!U#FJ?Bl*Vf<&H zdPUK0$=PLmQ4Ed2dj0vQd))-V@sQB{k?$gQl`HsDo2Kz(?X@50j+a8t7+H4h?O9Z< zUj(1Cqxh!!V?FDSU)GJP6O+gOV-A4uAKB(Sb{-{zdZkMlcDW2YaxIMm$^yA0R=abqf+?+xNk$M=bU{`BRsNaURx-7gok_H9|? z=XZd*tByf5=f_8Pd#>z+>14ajII3sY#C&|T?D%?~kDpG`iDaE5H?d_1X*$=Wi@I-3 zImw=5S3cp%tlCIVOJ5}ZxbDCGaK|@qaj`l6@XPJ-BeCo4W*SCYS?BZL9?!UNRn-Sq zMY)zB;RDm|>z{S%9=T(VfQuD?zwNUe)_U9IhW8Z+XcY%uWwIEkaWt%P)q z&%S?b#}603eX;G=m&Kv{M3TraXJ_#W_TpyAwtsc5UK_`meH91ggaWlNTm9JMqtnMn zbB`NY4z!8eYUjS;|7xpPu{PFa8M}@7ro;O@W?AG~CrsO8>X7!shwt&m-f-C9^UEyZ zr;mSr{6J^w*Q2fldT{7yBd~EanKfC9uL_FG&5|&0izAOXI16aB$<3f|A5`{b2cz_= z3;Kn%bH8G8oi!I-dxQ!dG+qfi-hX)eu;uaeeLfMm=l%G)lPa>W?O+A|QvCNeJ4Sc> zU&%SXzTnXLd^*;*aQ4eMc*c3Vrp((lV%}`2yvKg&;g}1It(R}!I{xc-pD(nv$4!#| z_s?%1Pt*F0i1O)0>_T$$4xEVl>MQt{||;}l14*8Jv}^dI%)EO_cLA+G+lc+vb{i!&GF{1s+y zxsU1r$6fscyH;*FM;1qrJI+XRrI@{hI(@K%u{P zFSz?=3yq&Y{qnLH`#Ej->+Ao1mCg-b+rEZJ6_;nL%7(Hp7{%1*Z>=3)sd4cCr_a7|p=y2}(@ zLwwZPmznz5{@eGT9$)pymzIx!KYo0JKmMw}2`lyQS0WJmFo>?ag%3*nka&Ebx6Rvm z?eVo&N4fmvV|>*W>F%dzw*2qU_0{p!{J{CJ*L5t6N9610{~lrfxc2xOp5v>-KR)Je zD?n~4Mr&M}McOTMz3@Pm2{flN)BKA@`4OLaa@mp`1`OneVSy;Ua{SK1A@tzMs3rH> z2F-WP=K#jJKAVE5hFyWccCzxA{9)i@hJ8Y&_;}dGn*y|I+8h z+&I?-HcVKaSM=|U$8C1Du*tk_%UaTp^<)P});UDX8~dx)|F3VF>$pl<`sdIOIP|b? z&%GPqt^}p8>L<4{|lapYbjpTC!Xzfjq$v&>vPm2kFUMT zaijc0ebotoYZ`5GF@CND`gd^yd+$89d=7Ik<5nYXGD zc3>qS=x~xb_2E77F4U)7RGXS0c*;{Fpd_%4g|zzuA19Su+#rN!PGs9^ zk&l`7C(+vpN~D*x+(|%jzR^7E2fY$XPCYZ*(3)%pH1XrgN4pi7{OH1-)1BjE#nSNu zf&b;ZFL@KBh}<7HKK}6Qt%y+^fL2WKVpkOctlRGYejE=dU3Ij=y`0{zP+{rLb#1F#l_M<7$N4v z+jlQFLEb*(etD_He*OHh=_i+A1Rm==U_h^+veKaOMHg&X!Q{jFd|(D`0j3r-qCGO# zl#EI1c%R_V+!}U;j|?rxg>QZBSrg7r3+~3TyYre9ll{f`GXEG zyy#7f)X>`XgdxN8MXE_DnZJXuA%$2fmiv!~@m}Ty|M}aOn;>sWXxQ>EFE>8^^zjYF z4{=)>vLkS+St7Q@$Lca^%iPx34mS98a?v$5t|DngY{w?FZo+`eUVCaYj(VhU<=rdY z$-fUF-QV4NOW*i`Mmb@SA}=v}o^$#7tQo)9-b=?teOuSMcGNG_l4T$3RNrx7HOC}x zjX5YNbS;4JFSP@SK|3t^XpUjtIbQCK&ySn@$8R|vZ;nrX95?p+@bomIH# zjfl0WK6Bd9d{Ed1`GMExzLtyk^XK@+*RyFYI2g*ZE-?(qyo!QD)+`Oz0_IS}lykxJ z@1;sj15v%j6wbf5kNqIUeTewb@zrZ5M9pAR*4?nio5L zL>FIm1LU=U`)&Kj-X6ixSZZ6q;GkL;WgIyz9axrA#&7!q@v|tyxNbJ}L{|XB zd7WdcdBs766)#$G0b1AZMRLVXX>u`f=AeFMn^>~WAdmLEGs@zSAKGm<2<(-KKc1OF zju+1KC;O_Da`Lv66B@|7MvFS303QRmn9k$D&CJ=pVz%=+*tUgR=jyKD&G*6CmAH9BMn*nyygnxDAb*KX1yt zR}UMcUrqfWwS6=F)a8|YK|H~S(^i6T&jC6o@x{A)n`xdBGNTUz9h37maviDuIP~q? z`%7-SKjv;9myi3kb#cZnlwVZclH0wc?xdWm(g(Fa7y?i`Ln6kZb9)!JsULoQ{nbj_trh{9dIjHmAG>MhvbH zh%j3L43FN=)Bn&h62kzo`pqtFPlB zz`EAk`?gWsw)8G-@&?HDF#q-2e}v4x_4bco(-k3HZWQdc$dw5wjz>V|9p9tf%Gr|e ztO##cV0Bg*0%Ld*BgE4iH-l2BB-kKGC7F!=RahvPi+Io$z*1f(TPYf^$VlzoCpxvS z3BHKxvWQ9}+WRF_z}_<)WhbMj>3S{pH4)Ba?89;Nt}~fY%Wde-3(f)rqi$Sy$XNLE z1xxNiyVg?6n^NPX!S>^IfuYZy^v*Zk5HaH+8OXe4A3g>YF4Gbo@{YfXz&bc!PpToc zA^a^1YI{fvU!=^|1b(sjw>X8nFJ2)W;%k;RNyhru2b=?Ka`i;+Yd1Ye!EDz#G-Cj- z^GEV6@xsI#sX6&>7?$eC^kzp$G3Jm)9WHh?Q+xbwIiVHsS3a{jq?UDfb|Zm{JW+Zg zD^4OS=*n(x)O2F5r6!ky=`Ejxzzx@su{gIIDtEAG$FnHaCs!3Goi}-5;nIJA%+bfE z%E9)YZ#aK8k2W2(TiFSUaJ26Orr>NU_x+G#1O6ZFyf3a;_SwT#e#pLKp~ZamL2>^z zPt>Z~`!)NGq!yEd$d>-;t9XD7WuiZ}^_n;ik{43Y_@`jj@_+XMk;pavvGGzKr?{If z_tdo}W>*N>H^G0)XWUzNRM?Jw?N-B0rz&=)8VCTU#Y?%t&g~qqS54j*kU1ud<>MM} z(SIG^$3ltq^{vO^IF1smCZ{4!M91Fwz}JGcR{x7^>^!Eii3@*F=R;DE*k-U1*=YRL z`HlZ^e&Tk&DOe3`<8E4n@`{J@$*Fti&3^No7qcd!3UlUdAeQDN69TF+ltnkMg&EDF z6I1S6$Iy92>1O0t9-_Rq)Fm#&ki2pLF%y94wX{Fo^vSLS8a$>*{Wo_!0^x?o_Y*RY z_}qVSIO~7B(qbRMb4)|5Gxpf%^MO3rIi-c$jDN#E|Br`9daUa>8wu~@d$!}_gaIQb zs8P`9>~(X$L7@KA+i}ReGI5Y{)QaTS6GUC}%5m-F$UII8n#`3V(oz#MC>bIDnN z=1&TKGaX;enL8)%!(P&!$A#vm z+i{FEFYf{HfL*TtEl#aLv=+LJ1lO*6%l{2mLi^TM#faB>H;e_cX!AqAUS$k`%9ASx zN#dY=o8}IBgQ*X|Kg1_M{{QZO2%Ep_?cd~|tS&%gb%N{s7^60L1QQ1zD4qg;beXkW zvfWJB5Z?)ysZvxOU(pE#3O--&bJ9SG7`rN%7jHo1S;eMIs6?T@HBe?>7z?M(Mobq1 zqm!BnCVRedNbh^Ao-n#;U1w<3*lNg~lx|X}_Z&s>(-XHtB502R^l;X9uio&Y z_?nV8C-}*pr#CtzhRej`6Kj5F(0=`mj?n}k;YXWFmzo(3{(K-B^TLTrLN6m2&m#}o zK1O5-CX3zo-#zHJA&vWK=fB2_Q_sAp1mD)KpGZBIDMUgjlP%qkVd;tBt}aN2KzjABS$_g3pG`JwJ87GaVfW01| zbFXcC*VBRrokQjSxKOc#s*`$WtARYZ7N=~V{N|2^U6TiFgiboK{Ab%GMz&z#2+$f_ z8ei0ebI+=H#Si6`!M0uxbHk_w^G!7(+08F4q#YwQN?Tqe-G*Zo5p{D(7bR`*>t7PR z8x3O~N898*VF1RF;{yK|n>C)19CDoxuLMuD(D5(r##r6KA@8IQySQxN{)?wecg_fr zC3||(cl3>GKH5MH*0I$+qB~@4Dq4LIbhhg^Rx^r*fGaz6q4Mht5$n>c*>ydc=Efj4*LC$>VKC6~Get^q%(9s(FYS`tLP3}@w*2Q9 zYBUzIu9Wq|H!`on(f~- zJ}VOP2L?S7K%BtpK#P~h!lJFVS#$vcWr4-jc>x0y~Q%6fOb6C7~z6%}t zzQWJsZ(L9(;ISqGu^g*b0OkZBV#-$Rk|I2$(EY-{YhlIX-!9IZ%Z-=#DM5$Ez3*ab zBP0*|b)H3K3uST~5}lANmoKH-NpE@y(Teu^lQ zk7xXQ<$4hQ6K7oyPCD^v8B+%0dV-Y>z1RNTBQ7xba1R7Vi8L`fXY>gk58a&fW`FxU z;LN?I9OY?`;$Lih!gnb@_1^z0{CBUo_)o;fxOtBsjU*%dZ#Uh%$wW}f1^%t!Kir%( zmyUbJLSW7c$H^BH{!9Dpb4veFlX&FN{3HH1^6Tm}^FMb^V-&Vf)Fh7%!%xOy9P>EN zc_46?lgD9vHe0>iyt$6^VHiQVfk(!uRn^bXT5;EaIUC$eE5B7Q)zO-KQdr#z{E)lo>c+Iq9ew)85KTp>a1OzSpLrbs8!Uzj_9YV!_Y=3bD;;{?GW2ODh*eER+3gi7PTK>*F|&ePcryc*`>O zR$gwq|LsPcb-SG--bllV5K2~6l*yst7ij#-nC8B1tAy20DPY#!zgQ^i430@hiHHD; zyyg`r>-x|rY|gnjJ8yL&acx}F7`Pr2ACdp6CLmiIj@af-PBDLpeQ*=bN zjL~|4gM+V&37p+Scf@O(fvk9`ni3VOBvBt$Vc*J?Xr|_|;9|{EB(BA?%$C}`+{bD+OhA})@Y6RwVWt{dhp6pYs7wt9!hO?Ea%nb_r+ z1}^==T@k=FzprZ^ZZ{bwCQU^ z$cwb7cyccyxmnOzBV{szNq&2(khpQvI}f5r1_0k-kG`z++&5lZIK^KTJa_^vr>#eHPZ+f5=j12MI#xmiS!kr5$)Zx(Y*KuCU7YH~xLI>h zE=)QTX!9xJT4@4aN=jXmLS4@CgqjO}7iG(yY$q7$*R=Q4mN#2i$pDw`DuzPu8VPJR zTyEC-gEw7#*V!}8XtCl)^yRY?B>D;a=EFk zynQ zV5>uz(|>@DuV$&Hhp|7bz!ZLP4EfTCS6K-4N#Q6t6vd-8snHv9`O1YfnjRiJw14$g zO)w`P0NL#@^9%~jTE+?g==oo{xn8{GjJ0p&yNoR;##raP0m#SlpRRiQ&-JTaY`}l# zzw$W)woPn94&k3CG>osbne0FD&jt;FDZ zg&(VU^roU+%lGz2Aw?tT)SpQM?vJ2O`M)}HnrFD{h(G?N92&>BdIHLU(mutx}b?stt{G7U!ICt8#7UZo*imtA&41Z5gj_s+f})A!q;3SE@TDyN=t?%wn4(&HZXw{thr`xbaY>1CuR z&%2z7c-3dFjwbGP(YxSkdCcK0wu$eEhpZb1>^TG-&W2w9pRe8yR3v#Dlhjz@x^0~k zwT3T0R-T}EU1yUrBHkQ@O*9|Sb-B*vbptSBFE!%&d7abxiB!#ey_zpKC--xF^FXm5 zn5xW&V}P3DC)QVI<%d`g4xQIS>gy}Mxc1E(&nO)?UXOSaw^uwy?2k7=L$7w7O5$Nw#xU%bZtUt+gk?7wym_cNuazoviQ>aHwM6Y9FcIB5rzjj&_bir)0s zBF2{SsDA4cnMP@u-)d4@FlP$X>rbM-XVy?+q{YbORLW)y@M!0H>@=xAg;xIaX0j|4 zbTVkKYy;FWl;Dj+La$6vC3VLVq&SEPqt{N_(icsS z?M@RjE`;S~7Ay-ZSw!M3p_OEm_%FAWjuyJbL@DZ{pyXL>ID9c`p= zi-IAFD5qnKM~t}9nDEy%OfyD$y{bPEVrPn)jA(PdkyLT7V>xYi?_F2laxCLYb=dGP z`^bsYm6^eG$(y zCMmygRMjb+WOM8mYU*f>c*GYfK2j^!cvk9U11r{@Cab0~9r=OaqJoxRw|u;OFqC$5 z?L{7Q+VS#8Er_31N)2a#HNabA`j7+cu^K+=_)o91ebc__vCK8b4?j3C6xE#b<%WOL zS@7*5LKr$MD$Z3uCr_I$cBc=ruTo;fc5?lWqKwU@*NJ~ZznSC+?-C}GO~1NuTf`bd zE@N*gBC)8&-_uRP1+#LM$I0h%gE9sNm7y7nW$w{pGxme>I z-$Qo=i5(ZrKM^}4*LVeyOasSFm8d$#DvqNjF!qvlTB;q&r~AoLn&IE;6!+>QLjuLK z9BxUiae{L7mQG&|+}GF8mRya3to<{N881fd>mN7LIedN#pVk-&C1w3V>n1%eXxn1S zNF}Ix-R0bF&k=rpb$`C`!yrd%^5BwZ)vWDz@ ztsw!Wv|PY_jH>(|MCb(>gZeZztuyrepKc=*241kn+DucL4Sk|N_-KS(2Z*<`&H_{y z5bUwrHpN7K6N7V}uDaYtV3AO0ikh~?pl}NK&PCzd+{jUO(eIA0N*tC0Q0sqH%M|Fe zJ~39fdRRdme&w5j1tEi3t5p|L{Xv)`50z`7=BBJ_$)PiDjOrDxQ zl24WZw&POvrgVEReHc_oJBEpQ%5H01!Eq^95LZdtCZD+_{PLPrm&bjlGPS4h3JhFB z7u3Ye#rDb(zQtG>`HWwVShAt$T^e3ugPk;ww2mX=dg5eW#NIk1o9D4fdF}csF3&JK zPml?Pc~gEj#xGjDG@lsp8AKI+s(+GK5nlP9uUC%D)|3l)Ahuk(IuqMizs1G7zdAl` z-)BS6ul>vM&&zx^h!@{SZAbCyKBH~7neYz6KR6cl>-%_xRymOj4wEKM#~A&ZYcBOR z#SP>BIyzc(GCs)2DgSRe4bGb4ZZm<*?-(BO`xk7TKd<7g^J?Hwa@%&5?r+=z>^y-z ze{fp>QWre@yyBf>R&s2PKO`K!w*H@d?Cb~<56nZT9xb1TDg%^aHXbeodcC^>9+$RX1^1vgv#5yRT7d@XqGY|O|LY-xK5wm9f35yU zb&Sq6cK*JuSDXk1`!Ht@9L0|WJd4=~fOSyukKF+buzoH(CIj1=MPV9a>5+cT#%S2+ zzO7@gZrnFC{!SfykCUv$)>xzA7hlu+Kv;%iM7IqmAz9~tgJhcHRgCR7EV0_;H3K#W z(*?7IiOxCI$ez`Y7mm^ztBzs>x3Z`#921#s<1~;P*YDF!jedb|8dQ5wET9?$cS1WI=Z`EpxNJPZ@F>VJQV zYSLO|_R%Ubvvo*{E$#5J-56LQ7j#3%N?yjQ6;VZk;xXKHpCY(OnV%-?<7$Q-(EOhD z4PDn*usoI-I-0S#-QipirrawvFwqQOy&HGh?Nw-I#}KB1D+K(sLz54%>Kgho4k*I^Xesnqru5s90XJ6_>6F-g->O zIgVdck!-13^(X5L+}%kwcox#BFBeX1gErP{StmYd%F9AVVH@$sRFm(TbQ3MJ-k{_J(B(&+wc47 zt9WNr9|tJHK+IY?pH(##N^?3~a@zx}$uwuIVm!)uP|P4Bg|Q4p6(k_1HPb-Pfli3uXNp z=G@=~!)~VyIi@h#94i=E!W={Wyz@^@*bA>tbph9i+*j-R)%u_7vgE^y`ak{S-GBQH zBEH#_a-B6>))B{)FHH80`pI#iz~Kc}E73B3-n!qORONWh*YdIDYj8w8&22UW^Xg;D z{~$fK%e;Kf%@i^{25CN*M7M#Qt~ET{?)2MkPQ_})fN%WyaGz;;ASUvdLNyxqEk@aD z@YWbr9?!1O=jFP<1o^$Xs{iX>klt*Xhhb3sn_RnmYWo78L-h>&Uxh@>6=O|-wUiss zkyra#1t9u8ZdiacH4wL&J8q`>kRc2*pn|7i*M7cw9Wyf_IMNV(q-D}X?dpk5KBG_R2q8D7%LRGtHbN#nl#BoY@yL>JIHAYo*Ve_8>ntV59T#~)SuwhGZ;7h@=;L>llaJA6n9T72_0`3xbwk4HB@434_$=l{`ADfKpQ3!X z-OM|-J1D7kJC-;436b6)CW?N#9mezE*>XiAU zh|-mesIgavYkaELYB~%C9nGRy&YcmcH#+JZx62!O_bR0?@t^#ne36AC=^-~sxKC3| zuLc>snzs(!Zq)t4tC?Vx_n4PTWts$Sxr1ews9p_q0Jx~Md?b&g}MdR_lf zEL!|dh`_EE)Z_*pF7UtM#|Kuj)Rh;ML3kVSyLN6<{x@|})Cfr%(6PuA#+_uWo$}P* zoqwtC!2{ap{HH!eYOSHAOSoR`vg)C!X&x};FE0{V$9Td#<$o3#H-W^bp@%gaR>6`B z(?-2=y|D0hUw&}7U@2>mCDXyUP7&DWKRwC}oc}xWIESFh9Vym&obvzPQpX6=Pf~U4H;+e7xaNhwY#U%j=Ztt`EvR9N zktN6?ZFqA%W2g9P$0xE~*3Tun&hk70ka2mmzZvyxkcG+y;|+AIapT#W4n`d){n12qK4`pje4D2(w;&fuTt6I2V&-+b_$Pj+>frnKbsyniVJU zljcK#NelQFf7!Bx;rL=b!|It zlFH9c!{rsHgf)`rtN)B6)(ONxJcO?Pi1P|>rwKM=oUb~MiK&EVkZywiY^pIGzKMm0 zW6MRzKHkZF-jbkaK^HNQ`eb1RDFOp$A-EU9F%t8Hpe=SRtZL-PCeJ2uXXH`-Q9GSdTd5gs&IBH;I*|BlGma|4rl}y>a*OB+_;TUiY!qC`PYO;9vP4 zu6a~jA$kq`=YjT`9K7`GoWeYFT}sRggcTXQP{kA0hJU$|V-A!@X8cR9G^XiG*S1lX zaX;w3^1>De)LH8p<*vBi5EW=#7BZ5fY|0_n{04~*GJtSaev|AC#W$hYl)KQ|aITE; z^3sGC=FfH&^Fm)#L+K66ed`PJ^QNr2OrgHwp@JzBd9|~~7oa>W`sbefF}GRc>$|sy zcpQow(?!?1xxIMOmQAaVtt?p~kvH28?gA}dpgJyYg47%-hu=?_&Rn)0YA{f|IX5Wp z*nmUy>`z$sg@5vi_$T<%iNj3WX$+7~#4phulHZmdDZ_;S#1RExWPoAEP~jiyL;fTD z$9`g?UA7;cH^vSvt&qq4{GoO1GK^w&U4%&0#C|R3j$?B%V!F zKDntEMI6^&_{f@Ty)xEF=~Js!aKfM|)t%zYNeyRJQTSiF zdFL)KzY$MFELWZ6sD}`QkT(v3diAm0@Ja(Ur3am!mvOo{kBirdho*MkWcK$M+FrFm z>wkK0c@3jaT;ih3u&<^Jh+|SAbG^QVG+w*KM%~6r2GehZaOWX{z#~ z-@1<9zbwYzI7;a02T3_i=G6cIa^0Ssp_3na&qV^i3XyHmge-mn{M#61pcyF7R`Thq zQqi0U!g%&a!hLr<`&MOdBH6K(C(yHj@&a*8(kK zjS^oAuf8~;O*k1h@&st|SHoiD*UJfm5B)nA-=?;W*Bt|Ij{+5*mZq#TMpn|>OtcDt zjGu**$aU1+`Gdjj=@20CzjD(Sb9p=pJogSD;wP_I1ep>2EdHTfOinjcu}^X1KrLRk zv7o=|FBpT`@ww(lnOHgFAM;k~ojZ#Zj092$1Tw;Y36Tw$(gHC`?xf;dZ`#X&d zqtloeyOb`rlrZi`3&P?7bsX(Eu?gWh^aDhc*dpT%Z^P{}pA?lD9Nv#vE2b*=`8^kG zIw{8*=8^|ZW!w0y!(>|(olY&&9M>Bq%UWu~SDALg8}Vkw4j{Pgi_7lKui>7B)k-^O zyxg-cIM4G<=}R6qldl&FOn_|4$>EKI@|FCLVUr{colp(>q2d4b3jTY3%9ngINwJsx4q@JBGNqe(C(qmq{~PC{duqvQi^`|1ZP8L< z&CiD|I5uL;?vNVT7#gRblW!@w?e7kbBj~3mNrlEAMkawc)NJT5Z|CUGOw@7a+TdRsPSN4Ev&|X-W$l{ zA)9C|4~|)vJz=-vkY%2}f@+zz7++W|Shx}XGj}OxbzMSduK%ka6WNcK+ja<112$HG zPnNes!ObU5JnKM^>}Yq$tA~Nrvpx31gkW3Fhf&uU(CQ#l2~+?$?y5gGlR(?Q-YfTn zGYB(Fp{mo$a%;sr(|yf}tDlTJ%8MFjjNh|?yl2%z3#+xPq`n-d=%*fl%Y3`Y;(j&n zB+X@6+1ox}Gy%%n`RVwvb^9FJ$JDN$@BO!YCOR}mL`kSkt4+9AfIcp4jnh_Yx=;K~=#S6E~yDM(V}U4DF1cc=Y=Ioy$!pzq>U&QR)$T zF51Rqn4S*i?0FTmXl%rjN!COb2UzdAOh|5wwgB{|M9KC@EM8Z75HxkVke&r*u!qri zRg!)!hpzr8ZEOu~yTC8r^Ubfc%i3`!EGNqwfaNI;0R6@WPj*YTL!YoM9fQO*sl^Db zPYofWD11)I(*c<@unQW|$OJR`HNJsUPvO9w3O3KU&Yryd2-M<9EQXyicP|$j`EDJp zM6hpFzGvK{m08~Sq}!!^3d=!31*S3W74Cy}wq zPnbcB9OAV@J7Sk)p*89Iy_jIZinad9x=imf9@)AtCUbvALAwIUmIC=CiPP7N5LT&H z8g=c9UwWK5Mog1kGX+(SmDf1$*mUs;Q*S;M(nulbk|&Sxm%dsOPiP)8&c5nLUJWrZ zsEMU(fm^1unC3rkSeO^|A3Yc-AM4Y3w+?o{erqi$Xda=w!^WUKD(uYHDcxjpdK|eE z*7Rl;hY{a&m1WYDy^jmq#ZPH_r)Aw%jCcHJP|&2KauW5`^&pz#8-mkf{-(DKNas2y z^}Mi&$X(d*pDN#d?k`)?5vzw0ieu;otl-~eQU~w&SMi+}DnEJ3E>e%15G%rHJab9W zz2$$6t<(|XR-KT^8J6ILLsOeTxzx!-qtHp2b%O>q8$5L<)2Z7UaWDB!GxN$_rMKJ= zXj_jfIzxv|4w+2sL8;HQy{WV-uL>|yk`?y?8|P^*tv)ygL*DTn>9+Rok(g}wB&SdM zA!$4q$0Ja@GKyStML@PY!vsscF*CLf6x&L}-|}LORq>vq7EXD=PXec6Ds)}%ZMET? zPgGEx#K%$gscS-Ov^g8H9xlsW{mIyscI7Un=pN?mH-KKV?l9sBwk1uv%`2v52oTsQMr{m<&KFS$0_>Bls4QT)KH z(NPU#r3OQOU69jYhebKaE@H0g?Me_>zOt?Eu9QzBMLZldvY;W{y#ueYjYwBxyzQut&w%HcV0k!@X z-ZBt{ll}V^H-5%RtSWURUSPWMjD2o37oKvez%K?|;BcCtG!-sIc~ zdf$^C>&Jt-O|JK9SMkruQ^>4eM=?ZtKh8)+5WX>JJ!v}0C4w`v5$C#SdcLoC;gJrN zO!hNInV1>q0DM~za$5YUh7qSf7ZwVxObI-RY@Pa6CXT8}XnRXnHmMk0*M{ zH=NvTOmgWV2eME?i~lUF#0(7dlarI)mr2L5P{oU;Ezm`|-j_GOV)?0jE?dE`+A)ZI zzlIAap78e@hy$Ej$4$>>+ZhK-x{=9NoYEz-A0q&rWi3N_Qd!t4-V0H|Gv^-xIc>My zr@ot%r(A>72m$c^!Ha)A=P7r%JPj+iSG7D<_J+{G4n+OV6Me)f1aELhdmyaan5759|mnVXXh}&T+zn zt>e=1)mw1CQ@dQmqLaMXtX#%7QC)Z|-NeVFzAAmS4HEZUlSilfqT1?>ou-9-jW553 z5{ZA+i{EA3g;f-HVb^|DH5)gpYmLo7RO^hzvW>EUa@2qz>k6zv?Z^2^ZEIoWQ~>ZP z_Ng!bpCRfk-YXvb!WYL6!7D@}hHKCwc6yZtNce4kCno)|fFDm-6yB6y9>2lCanSWO z?3-h(|4m}cq`l11jdb@+pA~LtBY)C=P+~Qfn@%kcO2GTBTVgiTCD&^%tP@w5bsfSW zdfUw*c8RKB7^O-|A_cV@lLCvOH%>~sK=lCZ@IEFgi@cudG zgv02qoL;&+>oEy5^!z{7f;ooiq9xxH>+;%kPJLIPMtt0Tx_Nn?b5~n=P3_KZZT*pm zrE-mLFbj{ZV1Ef=KVMK#@zan$)$&<_@mU8hO2(4n$Q-xJ-T83z9oh=)LmoZs(?y$f zvD!DTwe#CSJo@1nVwq&uX|pZNTZ<8=`u|S+v@9{S`Tuc@K3R6*$9~+40JebVn{qs- zi+pm*GX<^@n+xoecVdTQF2vlnhQLN<6})?3@wjb)tu}6BJB>NF^^3lg;^s|=7}uM> z@_Jrxn}57X;beeU^n0fN?8hBgQ(x9(Fa_oH!K_s9=9Btd>>FKA1GOg<&p?cv;CbF3 zfC^bMej(rLjLpo9y5V6m2~0m2Q!EnjqmR9wa&|@>CG|MRPh_Nx9qi!^$1p)X|8fkx z`OtU$ob+VfDnXcJj;g))rvif@eFWtdD%g{%i%udcR`}y|^_QL@LbN?$GH|F}B@`kv zkC;+qOp5`Vri(~zLj-Z#K;#*tk$X13<%vG0OH!9f3!RU#G!hl|+~e2wa9)2FO5PGc zQ)MZ^hi@%IJ?y{LLg3@?e#%aqae-?hT@p&zXyh#CnGOuEE&dy7{ERwe?B;?xEGOf@ zJnk5L&F4Ju=&{&q=*cLPG5uK)Vu@P|9t211H^G4Gn{)cQE`(yRlvBPqvEeiz9H+U_ zIP38y%bN<8Ls;)O{ObZVOJreIs^CJ6c5KPsvaHMN5|6Piam6LavaZXpBfO}~>4_rx z{B>P>2z4sz2$v|4%7%EgJ_y#l`!w$Q#BcXraus!Q>zr$`XlZLMWS;F&6{bov2V?kV?timA*9OP2b_V&)iZxH zOGKP|0iP5_^Hfuaul4TuthU>a8nrwKgS0|1NgqY-xuo7Ln zVRP&wUV1*RyVoE{o!SWq)psN?%9h}V)ADkg=Rg*=3Z#iMtLb)SGDpl+hvv$u^@jz+ zD6_KNp^JI`CPwgsJk(MumRoF7@Z4R#ERMzUFWX!XW8`r^y=OxVC6|Q#cftkdAdlg* zogfi#ybY?hYZqsbSqr*Bb~A$UAH|T|#H6`Z+GdmBQl<7ImjOg0>Fzt9i1uzZ7dCPo zc5LNUSyO@P2fL^hi|^A!I>+|(yiuoJY6`By&iPAN`Jn0|RBdIQD=2>Z#^d5WhHPsSSc>yG2F{vVQ`TzNpQr#ZV(In#_twC8^tM8&4)e0{bP72$_Zf zxz8$-fibb-MGA7jq;oW30`3zc27BBDIE$H!*zC#6fJm^%#@|7ni3&xwr=QkesX@B1 z&R0lW0pVSjDqxIk@;t_t$Cald$Ju*NSV`CsyC(fb5iQA>I#7ZH`qMl6rl{pbC1JMS z)sx`t3oLNR#Nqk1oZr0o+|KkAiyKj}+-|0E$%0njp^8&M=w1c%*`MWm-T+BJw!hAa zhau;;G^PT7kGQLDQzO@Wfo2OvZjqEGo=NguEm|aIB`iQ;;k|5 z+LA{x8;cLMfT%jM?|{7@W*;tOE&7s)iCxAV^IiBD4hdMAhoG>_wjtv(;tcSyV2u5c zedj{2=@mFY zwE)ms`Dk0A(t}@u6DS^8K#qNakry-|Y2ns5IpQ)ntaC%>>esg&4Bmm0Dw*)d#zkZY zlX4Cheac2r zQF+&@ZmwEjf3n^O1%0zKINA0CM`P7V}B-Kc4#Bm39u5J4mkn ze7{BHoW$7&7zz@zn)x}hH0d*GXI22r0?TW|*)n{<5RyYLb%CWGo7K#s$9 zAMs5N<9=eWQlIry^~!DK2(-fvYtUn*P1EF~&a#|0{xNa#3>{ zfO$i>e%R-v!m68rq|sHrdKXo#t322=tc^r`EFbAjhROknOSJj_lF2pmX;Rg@!h+#1 zQ$=h2?^Zc@DOl@&UJiZyQE;Q`$HeN=A=mJj2Dq4_c~aC}8^^|FLDk9Sd;PC2c8Y{` zp$PXP7@C{sCH$U_HMSl&=4_bv+}UqTU%ZG8_(pu4BdAMir)6;0*DvhxO(-3b6oCT z35EOO0q>Wer_ZmUi~b%zl1BxV=-C7$oar?%C7k9^oh}h=A{#uRXL(y|4VLGNU3!HS zfUD0(oZTx+<_#euzH15SwBIO(fXz-vVsd&icXdz4rv374xq@NeCz;3J{jUDop2VVHrN~}oj+5Rr zN{%-1f#?i0SQ@<;L}tmRn|)pl8UN1mtHbK&B7bGawtAvTCI*}0CVJE%k-zj3-xrL` z&c$ewxhd!u?dVx)A# zxB$c$KDN8N)GgBu`l*aN7FeYu^T@$12h{p`{Hm81Xk{(8)*Bwm*_@E@hOpgk$3d{HpeMye#pIN{a;*C9Uy;-B(CcmBV)~V4H;|AC6TWasTt=B z7tk6w^pXWv3OUB*=@TF0n04S+*<|o5*9PBbW!U2m*>vv@Wgm}O&L0-OqWh4OqiqBJ z0l^>;W25UTJ?1zLT$Rf;haIb}=dfX2z>DV9QR$s}Fq~a8QN}nA9Qi5u=ZqcCDGeH~ zSbxqhx*t6nwBV@z+^68st*;vn#0k*YR&q-fiOu9J@iGyj$Yh66{h9T1 z;1}~0!v~%*=={W8{2*iKNz%(Uj*z-R-mxNE!$;WHF@vRo{qW!ahqI@5Xka|fW5u^c zv|Rm&!#j{)QU1d_gK=x`*eGy^Zh_$&Qi`2oPwbGrupT5a`gQ@y2t zv_aG&UTcva;5Q1~>%@)A<9*`-Stq5F2P`@K(ZVQ!Jt2{@FTg7P<{~YTT!-cye9&C?k zvA?kJlm@zU=1RD*y8a;;166!)6@}_c_~uC3QqjNZz^u|ye52g3@`9($~Z1L52RJ_c`eAP-k0P3O04o? zs7@NxGLF$|Yc%%5)6&FGNZ&wmNxEb>S7I!S!FXSqu`Siz6mlHT%Fire-bOTRpyT#X z{%b{ zhlU%+mLsn_u`$1IW6{n}n>U~D_zzxisp~X8uy>L;*YRT$aCweBCWhxlj^}nwx+KAd zsFwdj{@3_RNA-NKxlYgZO=CjqE;$Z=;zPr;dHAe%Q_rUSt8<4QvxU`Y-7KWR-F;%h zA(p-F8~Y;13hUEh%$HB%L2s~g3~RTeo?XYCWHZO+lO~kgqy}39u;G8x7Z_mH${me8 zS#x?a;hDzv*|x=>l}}RML}Xi^z+V4XYYK?de_W3*|ML3PRX*p9@=11Ll(Rt*auwbDnfT<4a70ZIoP~JIt>ub~V1Q@Xzt%&`cd-%BHI0Y_zBRekylW zF6ng>!(3eSWSjVKe3*n}`-r2Mub%sI-A?x{tl8+g#wt?r5U z#l%i!J(Q}y3MszQwmyvhJpZhnb2`^8G3lK@asztL)}i%hBqjO-Fo43K0O{K7eVep4 z(ZV-RK$Zq|ux@Kio)niO@K1Kq;%8`^T}E5?BtPM74S{uu zi~l&vF)ZSoEeQ4QO=Pt>zP3+#&i>jK*v?!VQ1pzG z>b)j>M%-CcSKNyTyhOKpE%9*f@f^y ziVSiJz%9TsxLPgD=R@_Cht@9Vwu(^@Fv_^hfgtWO-+VwrwvM^z6!xn>PraRr{TP-z z`DYqjBe@ZGhVorz9jknvy;_U8)knYi(Lzx=PJRj-(6AQRZ2fhPkvJoJ&LJJ@|MXe) z5nL7&Rh_wV516|M|KzuIne1n+VAyJxmLEB0QpR&#A=@i0$>~m8aLPUj= ztLwt7>#8%a1EhjnjaOLb={BwdtS%#pxgWh@Q91=r82keN=k-0=)p)NlpJ^kmRvxf#j%QfXR!jWo zE47r-2U4JQNyoURy^;dD+I7Y zf;2&zR|!>6x`I+IfJ)ITD1r)j6;UZl5wHRRSEL3N0R==_f|U|%bgz{JkoxX-_Uz8g zZ+7>b^CSfP^v}SX=Xp-qot>SwGh0$yJkL_cq^c4!+LvG)oj5CMxGZ$>4)?p*xAuFi zM`w;i`HSCF!LvgXogHUvB=cm8Pl!2f@jPp4v_THytcay=esTfT$^*7(SmGm5C3VQ2J*r$Q?h{pG0J zber~2Sr0s5f*yeLsPdW1BVNZRjO>nDe$K3@KT~OW(6Fvv!Df-ljY-ny29i6Z!i*(< zgDe_B);d}K^_DHu=(J3!=6yy6T`T{V5JVM)3CyN;xCS}T7@H3`q5Nl+P>uxJ{4U-h zDkVwj>y6&)u89o)o3bjEYFF3gUwtdYQFXkwE!XKK&1(8j-b41I5dma9q8D`sBIP#7IV!4I-TV=}_l@ zoy7VP5a)1f9Pt4Ze0JSAJ9`uB?-hTl*=P$|j{U?}!moCf2O-_4G;F|VtP`cLgy*$C z#Frs#E2>wQ^$Jz+@4gNyx}bylk3^P&nH>PpD(`Y#9_&K*H7&piEnHqbKG+6uovE1l zka6o6W>`M2%0CIu_5un4pq61O^tNn}(-j%Pjlldhd2{$J?<)<29nvcIWmO=xl`3zEiVH1=|soG6(Xk*P)KwC!$I> zW+-)abL@}Qrz7xZ-H!R9VMf9#-6T%gWfSVA=B0R9vQx=u}nrC zY)$&sj6E`%=MsnaP*yE(m3=2R2V|!UD_{NI6$gT{QsYgWi7M&_^sxAA?StuQdB4N| zCs*bD4pGUpReHOSe@@CPuXwL_*=`GkGx^7gt9sn%QA-a$mj+SvjB=>_#wUo%ajTUV zs`X+I8um#Kda5e7S&7Ba2kZvZTK!*s$=CgV(iI$~pJ>}IS`JkkRXT~XzUw27C!;3_ z^t&$z4APUysOzCP(Yl&7z}i&*Dn^PRrB^{MVUsZtML$%MSKFI=Srb(&BX;+Jfo zOBJ-U>P*=+(ip@Yp@-iWxXdd<<&obPdb80YRH#6QTqEVUwZ;4Dy*>)(f}hj|QB^xJ z)^&+M++zcXTc>4afjg^dUA*R7OPB{)7L5 za?m0F=u~&Nt{gBiiG9{;l@n|K37ZM^k8c014w3;%s$O{|OMcOaGB5zBgQZfzhN`~E z$nrlT22|KMtxf7SNI1Qg0}3bznKQS$0>+NI?0?SxbK6GkGqnHC&^;gc78q6RnhehH z8rLK5Se=8P3B5v;EY--C+u;XUc_PA6ZE}P8*cI|ydpmEt<;4);$-_0g09Av>(la;f1!$$ z_MxiH(e_v zD}$Ai&+7G+@*F(xviqe;@TAQz)r-$cFW*NTwKcs`Mo2fG)ukfq$l{M!c=ElPhD@2* zQf?=r(w62k4)xF`ul3@4{HRfIPK{do)44(-+GTgtt^TTQ$P81BdC3G-RUs-0-r$*+ z<`_4`*SUg=xZRGRI2344pe#$Cwms$RlHm!63yvn^9>n_1nn!<7+K^LEtAk^*HV440? zJOjkTvugdFo<@F1^w9d_U_Y1Lwv7(>5&A`>pON|-}j0h7y6Tz!h(zi*q7t@x*qXpJ&<;+jf+FWLmIMT~Lvd%$}nB zQ`P?S4Ylb+Hu_|dKpWm1X))36a6s$k8c`2LYqcJH9yG6Xq9u=2XcfosfoX~ zBjKC*U>RvOBCa^n6Z;e-MsL{=-9@XhU7b!pEl}f{E{=e3zkZYkn z|KE2Bxlk8m8?K_+acDH0ty^nW+>K=9EWzgtIMagET!$pJ^2{YVk|2cYL8{AtP1hnq zVr#q|2XNcdbynXPJ2L8=GMotfPM7sJv{CerBinvpeDOcigGwU@I3^wCsnqj84+r$) zE|sUbi=FbV)Z*+jgx4siuoKao0yiYPqF*Eppbv83_3!^8}zf@CNpI05`Vsiev7lOIKV6NkC*y# zy`tkRC;W2Pd+W_aTN7Sbr4aL)unG$$P{q zd(tb9iM&y@zzp4*{6ilw@f~7R=Zd@{?04~@ZEf(&8J*(cde$vf`HyIN)mhm+mZjX3 zn7)9*#e|7%NPd7AFpzUsX_qgNF#PW*tC$SmVD|~X3LU&?5aR=&?sInKF>0m4{rLM$`(WFCO;qJ}Fr+Oh*^W@VXr$5-C(qcKq(pKcoEnNq5#BpVdfthv~P}R?}6|QK7%UW*K8)*oL>g86N%1$*pMyb(;K0YZd(;FU@fW@`M zAGEJ?@*ZVvFz*-mI--1#EoEoCRqIxx47-r+lEsoQ@?x2LZQnAkToTUKvrRGMAyjfz z-t6F4VKY0EbEsLlc9j%_4*YW@$Il(OLT+ z^hgMXja7XglKw?s2*)g@@i}wcO& z=aJH86xCVTDE)sj`b~6?SA3Xm21jy5ALaa8_8cj*Wf-epO3+Up?ve3b9omIdui7R8 z-5P({l~14ms8kb(W}zMn9ZOoiv!B`)-_d?5h$Lgj8lyU;vq`XZK<-m;S$^D0Ir$eU z+c`^ICn`np&GDxa-HbbGSd#bkz?I=4Xp6NwmJd}g0Ro0!0nfY{PVHvip9Ue6AM8(; z=|QN-&<<~j&~Q7kUp;hz2yUrj%{^;{Df2JUSF%W`{v50L4LG*e_BzUaS)WzSq*{8? zM4Gzl@_K%o(L;_dy!4mYBI9Eq6n2L?^bF;EQeG3w1_jib<_esNqz5t{WBoZ^`2Y5K zx!NKB!Uu?q>*A9R@K)VPn~VO}dtA2YFo$>029oeK!EdZH*O64UP*y`24)5sPJ~_62 zh<#bT?ouBV?K5wbcT24CdQYF2axyhbmjAdtL*;OLu`Ri75WM7BuM`0NX2?cl2|`p7 zKZl|rl-Y)CRT*A4DwP}Lj2+2+d*jyk@SG7JC5}Pc!-KUZ=RIEql)3!n3NR1lW26O3 z$`66hKD*wnVbk>-KJR<(cfHGa(1_1=z3&H}&!6j~n-%f+8Nb(qTzzyM>YqLu=`Ca~ z9K0h#6u~=3Dg;oRJm%sZQDV+jnK$Qz;x{@$UT3EBQg;u}#94{17z7(~C4^aNU3kjD z^i<)_d;d&#HGjXj{SWl>TkoX1@B1_PoM*rhsaxM5d{L=3#<4hqLY1iZgf`!F z6!&rb?#X6@Pn<})P*13}QZJ|m(yfiCA=4cPnK z?)Y&k6N2(G7%;xij$1td6n@54A+A+Hu{9;7#aEs zet^G02n-R{C4K5LE^s79J$DSzInT8p>Jb@a@nF+IKn-worhg;7&8#2Fbpwe*k`Iy* zF*V$V66ulffG^C0IP`$4&Mt5TzKkI(G1JvXC5$u!?* z&wiNp{Lm@T9Q%+<3I(hc@fKE?q>E@|I0Dqf39Aw|0Wpd+@kzcttLOYNG9D#ma+MA` z_0A?i+JAl4QY2|!M=Dt4KW~OdJ*J45M0L@(fMlo z{T}+{7rv|YD27IU`|Ur`TQ^;u-n!Wul^P;tKJ>}68oT^g;lo!>UWPvUfvpH_T-6Lw z$qO|-hWGO8{QR5;|3UBm@K@Wk;oEw|q*SWQ@BQTp=#>`G4+?z!)8 zboc##qg!U()0BT-^ZT#yhR8%N|Bld4;b%myO#Fys#Qa=E7R7~rnJeAKDg)pztasfen;P(esk0Rze}_r z=r3)ZD|{?%y$LoJ{=e!`vFAw3Buw!g-Tw!}O}Vv21MZln9&sd~QK|=R0V#hvXo_ie zVrbUnf9iT0g-}5+b)k;kh;ayDf6u67L zd!q`C5yPKwjc<6efVg3hTpbjUY@;_-I`c6F2Dp&(>h_=1x8QE&?ShkzL*G<5->IB9 z;C0I6Uq8L*a7iBVf#@LX4xU$gqW-_I9b6}}$ueyxbda+Qu0sH5l`;X@4kp2$X(z98 zHRQqnFZC&r$}{7cPvFRd>IQ}8?{%v!M~8i6Q|f{XFa3q^3LhEClXr|*_dsF0s0>tF z8^iP`BC_)0eMZXkh(2XylHeL9Je`qqSK55Qw=G|~8u(5OH0ot6h)lhjfN{ciqU*?; z-zfj4B_87)p!)#{B(Wm$JM_Jgf6}&5Cja7p*(MtK2fDb7v7Gtz zAkWF3fUIg8mEI08RR1BXAYWZU8GRj+LC25$pca=T#DmJ?K#NaW(kqVS^<_+k#P?%c z+ap^&1mlq)P*#XpSshD8zggZQ)8(iG+a`Im586)aXIL7F{f8UQl~l#&N?!tKY8a(? z5BxrlPpfe>MHt*b=9ylIi}E2!`?c-y>VlSP6)KwAD_B(7AA5zLb5ubo`<|CiRL7?# zZnby&z-MLUzq{%m<$He3_gw3uMXj9C!Bq?%6j0>)!GcUY~u_ok8mn&tmW(bWORi0Ca zK!;95*)Ydv3d#2=sFM0P6Ut{=uJ*La?K>N^qDp_{;~*l+oWx`uJsKs;Lu8Dj@~Iv0 z_|o2`;ytv<<2@qqBjUqtvSVCt$iNg7rv_TAoW%eTslzSpA@nt*Ug;CB2;o4*kE146 z>G7USKZ~tkv?*fD( zu$EH~a_|o=Kht~oup=1Dc&pbyHdSXj6XZZ6YaA9WUfLnm7JXH=S2U`xKWoeJGA4{| z;DCCflE~fY;4<@Mf?~P7C|=6@T=inOvFxN5(Ara0tk!$?eSg6ht(6q|X8rERt7Ul@ zA%dt0E{0#YZCtl1wIn-=2NCci=uaO>PxbDVxo1f)y4-A#wwq;4T5jbwJ#X7YR7?&) zo)?wt3~s2$(RuU|4Dx^%X;K9A$y!rZ7%||F4OKlNKT{j5&4}b!rs0`TPahyDLjqvv z`S}fP0;Z{a&6Xa|qh}IAd$D6DEV)R7$IEGc!*w%$L+4#`6Pwzlh9n_o-$gB~ zZSm%A`vmG%bfkzf`Bt9+ZGnDz(yI`#ff{*YL9T`}vCP__`doZ-(;=?xBO>s*i1JAa zh6+x7Qxcu#OgZ{#^%K|YQ#P5CZ_6z8TsrcQx6&G`y_80U@Xj)uu10TZ{z8ABaOxFJ zGGr!EK}EHX2AS-c9E?9wvjto(+3{4mV*?FVt@6w5PxP0iI;Zvp1Bc9O&fDVHHhQ9p z|IaqEi}zJ-@s^{yJTrcbzt&5I@9d#Kt9_ivjx(3M)=5Avhe-`hjNlN2pK+u(=)F`H zvLo~b`cs&I0JjmlEtRMJ>QlkUXC5jJX5}>HyXgPRPT0%+nrq zJ%Miu?ew;fSdAFJh@j6&i6eNT{F}l_7^-N8w}q-N!^p<_4$3fO$VEF{l*Cdh#wxV< zp5AA@42ce)8}qbBB4j$6n?d~B*L4ga*(5$Rh%Ds@1FLMy_ev?PJ{hyJLe)3GZl%tx znY6Y%D#&H@lhh0HuVW-v^amzhxUFb+qmw8Ks{N zFFkxGX*1HX)Bb0EgCb!sjC-8S1U{G%Izj=Y-2W%Sre->qY~NZg!SR23&tyzIiT$r2 zgZjtdW@rhW*d#9Ucmw0Wq=`D86C7F+x5wf0*lG`P1~D#b44lv8%88OUa_kUiPo^#W z43NfNce#B~UgxJ+OBvsx)XwA_$dIG#(~EO}mRxnUIkxKQg&KZ!_UhqAiIT3v2z1lt3QAc0BeYka%+x6U2p@*Y+18mPw+g$cp zyGK!QLCD3C6drM;qD_QBrMyTMDx>@ps?HdFr~jc+1jSNowP~wI*5`ZrU6hbhz2ZF; zPNog0%xk~&LrAK8=@Wa=&o2Hv?YPCd=AKoMBzBYlcdNu~t7Ue0a(c#K&@azH6RiPI zB`a4P2AR~jjf02m$a0sboFg-%k@zbwSNc$Fus1wpgO(at*TK9?^Z;Ii!4<#b0S5wO z;~jp;n6$COcXQ@qn|_JJMJJxk(kXp$J#U#~Ec73tBj~AO%;3|p-r(YG@Ivt@>q#w;hn!I?!xC!wJ6+4Z8Qx_c z$Now9lZXB`^tSaF$HCicasg=$^*aT-r0Iv_=T3e^?n6?Kg=H}VHKnKfb} zcpdP^CP3RVJr%1d%QYIv)CbP$02=lgOe!ewS1EgnfpHqAO#VeJsOCez(G&KIjt@{q zt=@6a1SjPfywJRGVXVWzwsU>EY_|@5=k)i@Rq`W;m_XT@jyQN5T6!s5Iij>oHQL{3 zkDZm3$P21?UDDmCwq+)K%LiEx`OFru0m|&|c%~D1Mkv3-J{|`AJy~`#l2!Hp9T@?2 z-Tfwy0J?$)JYc%kS$xc@8UnfU(rn`X&lHOGNvd4rl9a|iT{M9nMjGnVdrCf$XBcZq?^XQ z;4H;D4YG<*6q-lNtloj~rcreSx`9Z1J>|3LNovsF8=f~+gWsnFBeJvYJQ?waev;p$ z_kEIY55FpE#z2OR&`l9pC`RDNe;to%tyKp@?SK+d#KPJWCz zY$1s+YwN{#%l2|VqAroiiRl5C$-nf6@U)l8Jm_PCG=Fuf!?=E~Gd9N=ePiMwOg-;G zddSGGhdTJawh<}gfMx`KgQbya2Gie-L6f|FIMXxyp4fl#h9{kHBIBWS5uPTKHUOM# zNu&ln<1?S(i+@>6f-En@iE=tVVm@-FTqk)0!M*lQUt4_7 zdlh4bg9jK?NJtV4IVvpC_nF=o$6WO-R1b=m&>-a8tS!S~t_-d?fP*R`Gs-5pLnRtx z`H1srgyolhVVej!;qX0a;*yKUDgiSUR8T-*3{;r21XTrZY(Il(KNxdXgsNo4GRtpN zs2<9TI>sucoGZOx%0V_%qWaKS#kpcMVik^f=86o;Jb{{o#24cweC?7!O@*6*HPq?5 zCC54v5UlrHq|@gpYaf-f7rAX+Y$v{kQ!0+3x08&Sv>ECbGN5y9B&A0D0d#OKC&jGI8%HV=E0bP*zW+-&sFf`SXH-ifK9fiA9lH+E4BH zL<~TnG(ggZGQCQrZef{rnWHRsMKnFUKvXr&toN$A!KW^F)%$&*PI@(LW$eFliC0z| zwH{J^Iv20~+kk%t8@z~$M4l9L2}ttJ6ie%Vsn7^&7>K$trfcJq$7fR=o92r^5!YkOy#P8yk0Cx z0%ocmt93Z*07wvlKRwi;0TR`-j8v|#)J}TkFS7L20lg~z_wKdy-`kt{GvAB!8c_iuRmdo zo4Ivb{kW$*_-h&txQ{tUR9@z0Ncl2R2d|U%xxvl!8|zduei8dO#-FUb&vx3Q&xbfT zd@8;yxVWq^@h`|42bTYFp@J4N z!HS@tyfm4x*os&wMh;h3WK|~lS67;BMkIDD|?S4g<HyNrH*1=5;$x_SMqaM)<6Cilf?p zeco4zt8MWGuX@tBKwqd_c_}r4z<`qW95aYd`q5?Y`_cxR5=eXptN*fknC}uF%VZN7 z8zPO!*kSpd+ML@NsnOZz^LP*#BdU!>9Tr4Fw8R?9tEP?4vYmW)l<``9Wa{ldEi6dA z;OXgwOiMi_@EzYrd434yC!V9g+_t3xz@eOt6b53!F8I}@*gonVEqfEfM z*w0n2YWrA0>0yY9Cz}kJ*$Yd_xVaY1dVNnP?6l>2^y-yfLR;*4Bt0JvQMOm5Fsli!K&Tx&2CH?d zk?B{?Z284#c2DAzVD_E^2Kt#^0FOv#V5Fj8aOXjG0Y&3baeX?&)Em5nKu!&~Pi>F& zmCe*{)i4dqX>P9SGsW|2E3$2v56P(xYc1hw{30&j@D)_&DC>))kDPTX5GASCX|EtF z_>3!a{Z+6`)*XmmA-|Ngy;CuzA)Dgk@?VvI5ACbH5Aq1KCK;@&jC;^`RWpGl<-wl< zPefUSQJNTD9~V2NXBkhbY@pVlGdrVih-F!Cd}*wp9b`X`4_V1$_41Sw2syvj?(+6lf2Q-`jFN8s87d8{X_J>M7OsB@6%*KWxn_Az9H?i+eS3MA*=@Z z+Ht$lJNG?}Zkcs|X8#knI|qK0YW$7XTcwegg{$S>ddK~3c{wMG9C>?9<;Pyb0E+gN zm%hS2ftZtZ@e&P!yxFoE33Y?<~spicsm$n{#k_#&k3)3#GDB+?V82(lckx|F;x z{3x9~<&9s-`cHV&SstwU|8i7H+b^ju(P`lSC7f|l9gx5 z!E4OMp6)*mZE5__2?HGQXjQ<~z z%q5CBr`y{!T@2l?cTp5wk-!7+x0~w{n1*tPI)}s?;QvD9w?1vH{Pd9k_*MNT&JS#>W zSO|l=BFN4vMs_S?S+(*>jDZKHM%xkvEmzJq=!f{CbCl#$9jn%f)IfBD<(O$Q(SEj3mNKj{-sqyclPYc9~@Y>R^ z)0s!)4O+sJnGrR7&h!K=9eLZe36NtC+l{(l>J}eP36Pu)4h&DK6L>(LWO?_1TYAuY zmDl#bc1NVMImj3|?mso;iU&W;^u*vlLT;q2osE@%`6C z$aAhD2V+EF8EfdftgqvDC5zPsdQdQB10t|@qKC`xc@P3v+EnF1xp*S5@hQMXL?#(D zBA|23Z(?9h=|R^1cq*>De;2WS%^3zPXY801lvsVzw>)uJNo<1 zUh$L#kjM<~!^)MT4tXne!TD_h#MVGm2Bf&=+{}oM&6RAT3+pu2DcU5)Uk$Z4erA^F zWkn%+KH8?xFHcAEgJH=g>G#zp39@UG1i7_IT0jF*Gw_r9#?gQ8w@K&W>nEIcMOzj& zi9AwYb+L)i;MYVp)UOs;z94vscRf7Ceir}mAe+Yj!2Zw5bjkjY*#t?3j(kP?FM$lK z4@)=rkf{?BWo``YXKJOvWfmN24YHH4LoTQuH~k zCu2>~eK~>_T=vV-&|afN4GD+>uaUFO#Xc&&i-7BBs2pEmhmsn1XUA%_fVd%%$K+X7 z9F*iM@1hO|tjJM0*3WfH_-5tb8Tl_=HE;Z2(W5|M8S;~|OwK;y3mFDWh!bOEytWFju~H-d zlGQNVL16iJQpmPK- zzK^yDufqf5;O~))1Cku(U7y4cej@scXS&&bPi@!4hsLQZ9!^`(KRE&NEX;RE%;h`; zMH7R%Oyn@5DxXBg=9(8s8P4?SO##7yT$S5xAd{>!K&l(ilFDSrUWQWJ!)^54)PMl%cZ4+0x(4xTU~MbHx}6*CAdj5YFVA(kU@nQMqTQt*HQ zU}|icAR)4|R@70E--Pn5I+N1ay362@qC-T=wH%(seU`TU0-m*$cMmYCCZt-HkV@u~O<{NkcmB?)&~m z_cni{Kv>zb^5mrlpIc+K|7=%NTtDM?7MFw?+X0n(Z~94XLd|~k*DbYq4b;g!m&v~= zoO;0o=#2e0R*-y$?MDB_;bE?%_R2GE#h`#FQ%Z8(l@1qFq(6^5WE&cSkhJ^ZRkzR$ zO}~Zj4>o^cb;n98PNI$9uuA*A4?+^;xFdI>ZQk`Inmy+qqyZ*$q!{&KJsIDHi8a2s zsWODu0Bl!dAELfh+SlABe$%+uJ}=8r;pmwXv>Pa z{W`8ZCyo+jzFZ=T%t-Z?_g$3_y=j*RP9U+~739TY68dr>PGYpp^TyNlD*sqWhfYc8TLieeiX8Y3 z`5~Wqtsa8P6~`!i9kZ7rtWF)~+ZivUA-vL!SuVMU3la9PsV z$Y-pNuyzuE&S&KlWo%3KJ*KWn=Fbb&1Gi5RTxUz;Yxl|Goq6hjrgZ$I};!aE;!aItj8aFlK$P`-@0uJ zEzo{G@pwGwhm2xWrRF>+V2?_Y3N5U5TGb{h`t}vqJ!D1ZMWKtoy?h!44Ng|LzQ6)8 zgE;=A2WQ2J>;YzKl*to~FnT=Wf*;fSK7I;iwoCO>x)`>%+HAwAwBr`*wda2H!I1~P zo!+p+M@1FZ41;K%=Klp2j6tR+pVaI<>SvEHL*SqoGs<_SYutMlXnWVBNJIH zz+B}4PwohSZHlyP9iTL$s?+Z> zB*f7T^*1Uqv@Nu2{0X0`O?^r>KwXrX>a8g?bwa6dFl?i^eC<#V*IC#-@Hq0jNje%Y z-?am@1s9BZWcb^_ zsH9KX<|j5Q^d<752OFw7kyKv^ZvBihHWtwsA158W5D_MIto_d=Cf99sP@5SW^3$7s zL;tz<0jhT@qRaBX&8DlXW2Ww@5^-EjNh1k4tjEd=KB**j)UHgm8`$@5uHfe zq#@C7u06W5-v7P$2Kw-)&Zbf^8sk>ioqnA9;MlKxpN>22GKzK$X%x?;3GG{Sk%j0L zD=yR0Cj|MIo%HrlBK(pz8p>JRC= zm(FPYh_6MT}O zGarBaN%S7LCb<&6h2+j)*`T-dUkhDo!|18fsf*_ThZfTfCtYcUQb?%m!f+?#LRoJ`@Z;WYYF;)EcQWb zw<+;2&Zyn4CN6G>L{31CL0DT@N~mQu!6Ku5~y16;hzEhX5KkyHcNS5j1b=TlTXVf2NJ zoAjP72gfyC_;lUzx+Q8Fb1$^eSgT8(e1hM^nn5nWXT~r(Yd%JpLfrVn* zpL`7cNU!nLWIJreDA5jN!b2TC<7(*>r@w`p%{VOeAMcnW%F&T^EmhGV-{j-s06|9v z``yMR$Ki&{J0rEXAZY4u8W|89ZG3Xq^+CQe+0 z7J5z$q(9jV>>l{rBkkwEIxMij7)^NY!fg;GP$RVI?|=D+9PIb6454ikpSMVA8_}bW zK1p-_9-Vp=5)-tf4sB_e8?xN6cXQM(pfJ7fO@c_#jMPULH{B*m-eQpyL({J3zF<*WU@SiIcw-=Dhki@+)xbfCqtBX}f6v>XeBg`$W8;tq zov`&_zNL0F1U^$b;b#c!O?dtyscl4$Jp4rJJ3%4714f01j!H0>1x<KeSsHx!7HvrwteOi z5kClYf=Cj!Iir*sNe68y-wm+vA`8%x6Bib`JskS2X`4Flsq-{?XbMCr_NIKF44AX~ zbPL{|`ZNg6o*@XFW=|!@2FikJ7G88gT71cc#HoJx;m7IWIgiH~b}s9GwVLc^rv5iA zs^E#AI_N_jJ$I-$2Oh3d=}#IXPvAIdKzotJo3<^npgi>8>__R*e>^Evky+QS)JC=e zscdh9+_`QkR{a1N8FWB9zS?|z|Hr?eb+$TG1r%r8IIG_lU1A|xZ1IKK-@zGsaQ0*E z1cou-1;)vc$pc-5Ppv~NlHznA=_yM@vm+)#19sGQc$EeOd?ho z{Qa?Z08|67h>}ShzymsK)FxYa@Qz!MA)!!@yNv0IS!?Mx&f*_(p+Zphxi46l9)9p~ zdhF5hgf3bT`5n_3iI`(S=lDTz@+?SZEn%nA%MPhFe7@22@BD47G9ve9{BQxn}63Pla^ij z`Sj(ZcBNH%Rz$2h8Hl;67wa*f%{JZS^0SNsz@p%g;nR_&z z6~KkYf{F^yyLblOI_p0A`tf^pCJsWomuT*VRRonHl-5}v*1&iC#+lyS+u?f{sD^%9 zpz)c*@9`%WqzC@`m^o(y1MA_+(vzM?L!gOO#US>l(emxUo1iK6e|wzFuBGDdM|`*5bT#UOu+>!f1FR@-cYqsa{+{0SwqxkM zyKPACYyP@mm+jV}Z=C&8n$z?>wv}M)6lwn4-oz7+y~R05Uu#g~u^Na^lz7j~F!w;Z zYT0ZN$>=Uyx7R*M5XPcQK5rqRWAOj~@!%7JP%f%D&-m;nS|t(t7H=mnqq>*!~0D%sJGSt@z?VxrSH}R4Jk;=I^T)g`0dr?KPFIK<|37miNZaRfI|q+S zJ6VsXhM`sW74dguRq0Rb<>1Er@a@8^jAsV@w(JHL}uWBOs`%*^In?fq? zduPhz_JuxMWbw$CVY28$v!9G(oJ;|FKTf4)M4kY@UL+;gJ`S!kZ#pZB-gYPJb|5E3 zY0A;CJihpZ1sfkZPR{kgk9^>Xwtc7r6*Ev`BKr|LoHXk*rJqk)#C}p8=vAkHuc1ni z^@$g~R-ahpO#51STO#@*VKU{Mzdzo#4{4~$2~fU?s;pmfd!_czQN}V=9q#d>Hb>~= zaZ4^iOzEUtpg0G9418H=%f%L5sByr?1d|Y0=fK0iI)rvC2nHfJ(~B(j@6fvz%@Tgr)+u#9lGvO?Qe$K_|eM%v()}3d*8Qn-*Gd0Z}02YL%cxs<){GN512_79GFedGDX;?fZX$uDVs(;OeGE! ztFlnkLcR9f%WI4fveB(-(ic_Q!k`C3Wqs;$@^Y|o7xQN1?OPUDprEokY5+M@J2r3 zbBiyzFqF~gmc_Jfj3lpC5gX<#>Up1ev`b#x60+MXb!!mR5xJAAbSP&*`E;EFMj_xl zHm3S(u^?*;Bq|$$z|xh+O}VKb@>vs>rpSvfYm+1DYO;fOb3JDsi)D;8cCAf*I8n^8 zAIH=t*h0E#ZSXU{D-WULQ|WlE6>rA=nEl{C=&t+zLU%R#^zM8AN_RKk@4oM^@vr&q zQu`Kccn^J$Fe_z3BY)!XFmkB-xKA>jc#X{@Z0y)s0%mv=?pig?8``cwC$!fK7 z9CXGa3rg~%ZC7IlLUN9qQz?VxTdAsMnztP+GIf-t$ z{odYE*PQb5_EY5o1r6i~zPC>~P0%VIQ+n1yWC`?IT;+Q|1YNTDgoQGh&4o`H>eo%X zzxM5``--GBnxN zue&xu`$6!&&|v75L{;My=Tx?_!>l9uF|UbKeNP)D-_zfsjcsfFd;=KT70|67o{N6+LTzG>X}8EC&6s=9d~E77{H&bwrM8+eMb4;m zS5faWmWzo;4|`}~@LmI^UVbb1>{B0DVqz0d7}L9Em;Fj{F{lQddMq3 z`jW#G9gYzg6w7DHkQlBSliap#3}On4G`eLWXq%bf(Z1{Cx@88{-6##?-pUi-;K?VL z7i}j~#^*x&COmH; z^Im)>@rKl+<$J#0{+ryg(XDaI(#j&e~FkbyC35Tu1$UfC{}>z>=T7R zjDH6R$s9{j*9P_;eu)0%A+*D%OfNI~f(xhz!vV(^EcQY=XswSmNskw`x0ajm5_;Eb z-%UsV^iyPJO$KoGlUXX+mQ=JS^iI$Tb`@ohMv~=Sl{YBcH0vhznJ3)mH7K6P+U5OT z&w4P5%A4|r)FZ#>I<7;(@T{XxpLiZ!^p#bp3)WqIm87RKWdIP9joO4z@|f(E8E2im zWa$@4|2^>F!!$b_nC($vm&zqNjexH>#Gb74)7@fuzOBNiZt%4Hq!$XpAsJ*PN`LWo zY+7#E!X^yRpAZGOY`c}1Z}(1~-L$RCxn*WiBf{V!DJ!P_3=A7})^fTP{cBh?uK zvVWibFepn8{t#!^V>t^fU>)Z0Oc=O6_Lv&-2}>?U2ko^Ltuu8c>V@QhVSnMQ79>HP zG-^4^WsDKG<(7VdlyT?1e=!3JwPn6dqVg;;90Y~{J3S6F(>*#z4je~UI1l2lB%_To zStdQS*BIvjcQrVZqN9T-=QAo;U7@Sqspfrha^JyaZdbF6|-9^7#{&bjF%lQA8H6 zQK}X_pO{*@)LT2>&Qwi=9BdV<8<6uh&TDESN8LpUqV`pdCv z%Lb!47d)}-v=xt;=|*8ja8NQ&7Wyn~!F2F`o3)384?~UeUjOxmdWx&qFk2QTaKmx~xM*BD~? z2*I9w&-~O7Gom0~&$_7f@cP2QW%KMyW2|j@39Knf+J3 zQ(9Mh*{jyVV06^`R&Ol1#KN&J8+hoUM;p7HdjK(U{KR7^6o-CKqF5dxX1k)|fNg>Y z+7H(zp>TV#d++M2}$e zftBJr{K+;5uY(wba+V0~YVJMwQ1D$I0r@8j&NR6LtbRlLA7H@+9OZsuNEXwh_D!ED z7F#N7IWN+{KCTARsZ`ggkfkS0luP&C_kiA(e#6SWa*gn*EBq+l(#1f~B@JJOm8qyx zdE!L4HVL-B3%Ep{weg3ppdI^X5)2ooM5!Qp8=I8mKFHJ(OFW0EMfcr5o6zrINooC$ z?ha4*c-g5#J%~)NaP^EUUv2qPnOFN7Elyc~xHF;U--X+|4?Y-W!6r-ye9wd(@P$kg zZSF0;*uu2<;?IfCJ@Fv@^{@XR42m-*tT;5G83l@cBQDSJ{&wcwj2>JZw`Gav$ouz( z{z!put;U)D#>uBX`wU}lH2L9sVA0U#u%a001Cj^&Q}H#tiwcCW&AFT=DIF)_>!p{P zAWzMC@G)7{$gR+}5hxjzbH;0-O6-`o!y12*dgR~P3(&vuEHR(??MP9k7m@cBjpR{> zI2a>HGsuBnCM-4mUT9%w^nUEev1DTa4_q+1Qo~Y~jXORF2fglaa#zLQX{9k|js{l_t@uXc|99)(0e~-2Wr*~`t>kvH7`{Yt& zgs{>BlOGH#J^vN)nOqQZO`R^X(zCkN72k2WAG}@pZmhlu;D`O*^JSf3-+sqZk_ie% zb|g4E&w$Dk2@!?rnwxHIx5Vn&;)u@)$#e_g8TVFQAggkX*Q`hzueB;|w&9fOStAcL zLC{||^DYxP&YoZh(3YiZLBrZjj;739k+OW`#A)A@BCkFpBD1ge4c#fWijDpYRbXN z(UMCnMz5N@Y`gMgovD*M+xg4e@1k#C_>+d#w>SOv=a$Y-B!^1}D%28RmOc_?4jou= zFooC-Nxr4+=t?I!1lAX)?KfYmO%}a!@^U8m!SKu5@20z(gxmBV-Av#6(a-3CHu%ma z&ITJ&v55~NgM?+bt)3in=00yZ6lnG44OWdbYmy&%-vyfes=*=9>+FlJZC5H-W6cgX zf%74xp`1a*Kr_LTGqKjx73t0EzjhFhYj2uG=Un{LHaYb86LD`hbx2}$v2E&*dYTJJ z{k-;+6>0Y!H)=jtC~yg@HUb{s`|;1{dsqIvaFDYCP49(0SJ%*T1$t9c$D7xGb(7GtJQeEr^{l(;oQtk& z-n*mWt-lZkl*~-f*sSCfE4~IZ$aGDZuqbW2>6&d{uGP|Q(W35Ke{(Ng@}n7a<1c6}{58gD}5D+z$2|qVd5esdTii@WiQfXik z&)w10X0Z;WlPdOXm^4DODh8Ywf5pqlKhd!Jlgf1PgLSmc^t28F{4h?OT# zqBT~1S$lRy4k0-aR%rb2$G6b+Gk@3c+232=YC)Zl80*13sRb>aM73nkHd8U6g9#@n z1o_7p@YtS1jy#WkaL)eiZBBfIzX$jL^u$b|pO##F5!z+@wOd?PX=wktfip=0toF*~ zX}2BM6TbvC$MrLR-)_l8f@y5;JGNcR1pZM5PB`@nl0&kIQUd3t4KFNZXmrSt=QqLK zzZqPN`GbBA6HZ)s(wdHB`w!IVcf}23|18qNE@#EX+#+&anNfGur z)gGe#*Xw(}hJJuhxT5g&9gi7dSo>fU17tJ}I)TH!ycvDAp&z; z*sy@>q@|XmEgRfwzRPX1{zO+^JxhL1U2QqqVBHmI!}V570dPXoAN+Cv|J$*gfN>4KA6Ot z@>ON2{($=i>#jf>thWM9Zu%qiPY$==@u!wQue|CvEgo~4Bu}Ir*8xJ4jdz}WQe`hZ z@Q&?X*Is|*;U|s17s@>2oEgAFjgDAt*#@_l)1-z+7_UIv0}sA{AF<%oZ$SB%F}BT(;@s37u^WeRkzlcQl{(B>At{%=9y~ImV6`)XFI)KE^wbUj_v6nizhPB#$8u za5R5IQLugq0dLvso>KP#s*q7-0k{NGGo$!5( z+u{&I5A8~plKn8k@f(#wO$4@A{k2>#wPOJBebQ^=@p_EuCOzKO|EA9{MdGFLlKf|T z&wekF@o(jOr7E?@%FDU`pZ^|*q+*c(dF0{8+wELw_#m}cBKllz>^R<&Z%b5V}3ftm@vd+Bln%p0f{#0MW&Z1QQiqC|= z!-w{I%SZ`{7KhZHPaU{pliazDK6><-P4NBB^h7iovzvaKFmd5_7J9(!(MO+X&)s=d z!wUyBG@BdPYsWWs-aD&lf4eefTzRi00X*Xb_r;sCHg5XsjU%-)BpY~jN=Sqpee#8E z0xO)au*8zjp(KWl{(quPW@$px5sWSft*H1e9-WjN+vFTH?=0UWIzDm0_OwZpco>3^ z)Cqs#*%0*q$&B0Sa}CbCT~Zrh6W+)SqmK?*(DzGB(Cy2@@3(Eb79FtX=GCN2PP4U} zq(t~TV6V-a!2j*^fy2MnCPLIHqbwI}IG5NQ$17fbhgn{G?ywQqw^mDs z{Xg;bHX)*FS<_RPEDM8;5a|Elo|{(74P~9$BtQa$U~}lF#g>R8^2slqMDN-8O?8A$ zxumT>;PttWzr9V~bV1MyYfV|P{R{P-bJ0)f^Iw@>*sth(fyYdlX(XlX#0iVhZriQj zCLi*oM_%_DtG>Mb3vg1C=se^6tLg5${!SaOxeR?^k7@N68~m=D`5QaX1>MIG^z{e! z*rc=mpU%9a4Pcx7V^fR7E+-=^ZDboSfp7=Gg;8v*Z}-~P!Dr@`la(K1Z~bU&i^+iM zbxwxp9T`-O2JAbIw*%C$?fF(z(bC9=q}qDfQO?c4lA1wcpwq6~cW;Gx-OS%Mf$iTBZ=ckzlyZ@0iw4}aNyzVQvOpshFU-+n2FeRkit^WO2NUQW?3Mw_npquq&q zb4a#?GcsZ#s6X)%0_))~By0kF_mY|PrLSI2a~^#-j!T>J9)B{*pH>!8Fss*kAOy7& z#^AnSQWEq%CxVmi2nm^Rc=~NkqUO9yZZ`f-TzRNI$ixYY^qw11gVkR3lJ>6#{1;CzwH=+QL6vVt7%VWUNs8@6t<6Y;ah=O@0hPNX~@6ki@vRNvwVO zv>!J-b+gzmmUWy(?!ZWdy56(f8>(ebzxZAGiSy8FDpkeu1DNf?E{ z_w4?L7LW6%|2(z|#>A_y8tD6mCh-1}(aLI`{n!x~v_Wy9R+ax-$IFO@BxEsh(ERuC zoG02X%oa$Crh`p*^x<)K>e9PXstv%Udr|yVH`sdO)d@|Yb>}A0uyYgi?Mqk&2>lTL zHe5H3AupKz3p(-it4t!Ku>T&f6TN%4^{Qou;Pp4px~_eG?{}`-;In!!J}a&GAMM{x z+pgZ?ank8mw`H*Wi|^|qMJbWOB&9sB#&GS?lp*N6_q*0@5)7{zq(z&UY5sPW`mbs0 z=kwJ%A&b!<_;fxd_L#&C64F6$?)|R19lNkeWP}7rNEjUUkxd)^U5>gSw69GnG=F=) zYn=xFpEU3Pija3hy&;Km(7qeBiH9x-^({T^l}*yDRWabzHI?#KnW137=uoVepINd2+t7 zlWSD#2yHv_+!^in%{O@^9kA~P)kHI)mDRzQ+o!K_(qQ8Oe8ACkOW=I zZ?JuHMn`&Lzo`&EB$E<`bW9N^kNRr-j|`b@Jn->H)7Y)y$sz#~8uiydKitmT4uiU` z13CW{AtZDDUEB6V)3(1fZHrrBh1DP9qL5zLll=J0KmJ5t{n<(7z@auKb@>c$NP2*f z)s}1Hz4jBt9R-j-Q=Fw;#qzg5KhiEQ3-5%CGAbow$ywmC;7}JXrhTeIq3za9aMq_9 z36K^MXH>*-0KWJ_i_w=qxfiW7Wo4Qd*m28s+rR%gu}MChd>-XXC4EJ$47DM=asJ64 zuCDm#gRrV(hb`8nt@ipf-F45O=`VkJn5Mk)rS!kYeQ2cB5Da0}!f}W1LDM#vLi-+e zYFr_KxO+AdIOt9@V0kay=Eq(;{TF?>Nq)>t-3Vc&$Q5TE)~;~*?8z6 zbMfu0bPjxK<&JPBi_Z+JF~EW)$U*b(Cl1`cP1wu}gk;6`ORwF?%w#&{%pbOYb|4!e ze3cdNjkggF;%pDkZZ1yxkLS^epL=(^(qdj9Bp|N4;D{#qa1kAS%EhTZU(tn%i;Sx| zs1nMVvI2eK!J7e1?^Hw;8BSd?5Z;~;G?f*8K z8wgv5o&Dtx&@oLC;`2-oGkoIeLD3HYKk<);9;Zi}#CJ$IJ~Zd?-si)rxo>}IzxKf9 zxxqaoW8S>MYiN&yzLJt!FmMXcF?e*TExYfqVN=Gm-o!^2?A;_mH*0j=_U}2a?gawa z0i80J%pj%F6B6-hXA>bJzhoR!be>u7@??b})%RqhPyY7jN6C(3Oh{ZU7TbRkF+pFt z7c3regrTu482D!1_UNix8}QJBk2Qgzu{Ky8e94$(9S3{wO&8&Q%#|3;h;1Um0iSuB z8!8PRg<$$c1~U|s-j6*N+tjXV8P78C6lcG80dM!lvs(-K?-|UHb>FIegCfaImXVd|7hi35s=nnA1fuyABQf1q0I<>d#Iq3j&G2YGpmtFPi-ULV}GbBK$YcS}P zRw$Pt8Pk{ixTOiw-*S80vTIl)%q=9{-l`(28*xzj#y6}&M;`pvkyf14;4Pc3)&$#M zMkkzhIbHOFpUF6Y^1v17i~w^U3|k!5lLBEi#xhMXH3Y<4ybJ#y87kgDyZ-4fPA9`O z>FanV|KooCQ{4&^4cm+6?|tvufZn_N27~41#i9I#VD)=;+n`CdtVQzzlU_WLK6S`j z+N8xtk2t?wH`Ae(7jZS3Y=@Gb3bSNq|MjtUd!BKb`CFF4qQY-VpN*j&*AW0FD0bdKILbFVX0^!#}b~ zN@mO(Y|$hr!uuf!5>{=r;7Wgnzy9N)Cc)TFJQ?y_i1vEtT5Zyz4|v?`JN(SBO7+l> zys2G1GA|GkCgJa*OMgwr9RDMlGv`rK`FAP#8J`V-^GE&>;|U>_5La$G;3rq$-fnY6 zWaQRSO@#5P`fBD09;;AAcTwp-68M(nse)y!Xt%-*zrzaE=>O{&jQwBr2b{Qs zs0<`70DUDoM06|HtKXTg`6UU@I7hW1Hn*os4eFRO7Wv3S<4vMxJZ;4`F7Y<0-?(46 z>V#~AoN5#z_5bsB`PCtc0Am`{e>txs_;n?uxV~>ne=iwe9Nc8WNAVBzc zY#Z}PNEkd0Tb8|W@fYWV`k+ioflF&@JQMo9ki5&Bm{P4SoL` zhs<;G17ZKYHg6IbyQKQ^!B_3O7yjL2hYjf5llGtIdgZqXuWX{j%#M3bpWo<=kqbd)(?Rv%8`${%RYm_{!#2<0qLbMFbLbm z#$=rJk^MQD; zVV6t4vpg!F6<^Ku=q$V9P6uY}JN7{c@P$DuZ|kD`QW=&zUiC=rEc-Q9`_JC8ub=r_ zSl%BC3R{MSzb@GL4X=>km$oGT^yuQW@VZrBMt$)0vo#1bPki1B75gu25(mg(b;|Ka z?L5!P4~9VZBM;ez_S$9r)_(JrftGo_%8R`Pq^7rrx~eJ!>`y!Xo%5XhKnN>GPCstfCJD8axh?^F@ERP*Wmr{q z+Ht$gbMgbBZBJ8HNXo<-GeppD8z}4KW9BaTf$;Y2)}T**WXrbM@1BR`2SRxF-S3Jk z9FT6^pra-RV-d&W4DN9b?onxVJp3b4;IbeUzL50uyWh1geQ3Wo&U5mEAq3CAa_r7+ z0-(!B7$3nN1UPWtH_mnP1MxWJ*c}_5ezBfk=3J4O$M3AK4%}yBI%waGpE4~1O~Zw6zsKMUx6Il0fIdAX_nw{hHMC%Gj(;=E9Th%`nE z`UhiY&S8@bCuVr~w!gwQs-B6TBkWTwHc6Stn$XRb?2tTwlP4+?P6X&-x{Qq9PY`7Q zymXL9HhHT$E%^Wc9;ciCKMHI_Ik+VWy!5+0^JC5K}b+$8`bo zJ1T`&4Qfrm)v4xz93&Nq6`IQt_GAWsdVc!YQn7xbT#Z3?@`;(&ZG@napB?h^8z6Obm#}R zA;!@|pj`fV^xD7&_MAo^?Ao$wE+OFFw{=y%4OMLgCe4i=g5YkfK>jJ~q|*M+3&;%p zs{L0QBaS22l{&`+?aA@~SrB4u?wa5zvq3-;huWFoyED)0Qv?I40RSZ9R-kE^kp)zW z@40`}RlHZ7P{YS#^h-w_y>fQ_Dkg)VVh?AoM(9zCpffzj>RyD59`{1=IO`1lU80~ zDVkpp&a^nKNrLd%793y^`fId&R-3+tzIf!ePbvAq5XyL+**eSWO$BYGCArVu0-Bg^aZ-w<4^I~?6u3Ou zCTcpiqMBDYs7a=*^zs)Yy8uS{ml6Vxw@H+z03m^K%#qu)i8?1X3H^Vov%{!g}>H1y*_cE0;%KGX2*>!wuJ4VV;v83_CSRkk1|YmZy~bU7GgvEb@GZYqLaV4eQ{pNQ-yXV$g$fsYs8&a#5FgkE05Vn9h2Awu5@sckRkJYNl@=|JK&94 z(g|DI2wwzvJTk5L`5YI*=UqlC0o2hRiq7c)bx71H1*^R`Sc)$uEAJBqR-4&!pG|=L z3j=N?!i>!W%@-~@;>r(Zd;%eLT8_=+ssX`)B07u~KavB7ah4xpS)_vuoGpT8*L&(T zyxe9hP;)#=4pV#4%oI$Jm{duqn~YH|2;Qr z&+m9TAS5tOJ$mo9t)SLw{?OA3#~iv#d$tK%7e0%qMQH>lwC> z?3l9my8HI)&$r~qC?JCYpC=)6Lq0-T$&2)0BX9sL_CMUfWBfGYzWDsk(DgNerZom?U6&L&L z{>CPt{zlq&w~d?6__tqsEq)Klg?*dfhkRgj`sN9H4kkYW9CzwvHep1{cjsMlQ}4E6 zVXLUT&D>P>abs)ae<6V1htGMJ%xKT6cv_+6n>W|qvF$o=fOKJphu>ISd0h%*}fbr?a?%F2*Fks{5A4TUw`@N|>$76m&NM0PY z@0(395?2gnxvgp&<_CncJmwdC;@~aX&)lTNwzc0#|MfbiCm5%bwZVK*Z1T9r%Vl{) zGI0V|m2TN2d)~d9|KOlP*af zQ+tKR$!3|vkjJ{cl;$dfu-r38P`i;Hw#q^cHq#6z5GexWTsZ;E6bZHK*g*fHhGRAIbC=3k;Rc%GkehYsg5Prhpd-WC>4oH_k z5sy_;*%zGLzw#p_J5D^~dvwi>x6;+kA2%Wd_SbC^3m@8h>)s%LSiv#gTMn>!}c)iuD;4VCrUyfKC~%d@!Y12aB%o235&gV`Y+n|@Kecn zmtaW(M;&p%4kl4Dghx2!oT(93CycV~S7`UwKDQ5TwBup)bc1di1G_&qmzH1Vh4iTd zw(os+cEdv_opBkRebKda*L^AZ(Y*Vrm6oIJHh(=$+u*gm3918|2~_wl{dGCtk0hFNK^kJ^vZ^2+it%0;Feh-x$?Gmf1Yr4QVwC8rcsk0 zp$~s@)2wzs^T6SOM?;cjX!S~12@+PsZ2O+itC%<*%y^m`2sr#|*4^!4^8uD=@E>LC zu#kue=VIu2AQ4)8#LMggb|`&ehUON2)$r15Mztvqb`gZ3;NN7SO~QBX z><5;u+5#O@g88EU*HKi9O#I51bzq)STNk5wP&bupFfj5 z@AC!`$s~}Wc5yQV=j^_7g-;iP#QW{>U%ka%_Tyhm1xR{RG*s5bwsl}7_ix(!e4xcQ&i+Y*<4n5e-oFcSAtABLwre+STdnu~qYi#6 zZS$@ZTKjBrzaHehffG)>oIWyuOMr0TIv=`z{mkFBhh&E{S;9FLStJ4UQ))BUUh#eA z*47RJt7CI*?&}Ciid$~KUz^kvF=x&rln(~qyW56?D?hHE@q0S)^dHf!cii9hM}V;9 z+3Ksll-{x3n!T$w!U~XZnE9uV{hkCXWK@`l8DwH;>#fk9^Dp^X(`SEZ@d&U?lib*9 z)7Q2uBKlToglE2W?sbtKtd(mjW<^;o<=_o6%W_T@KF#Tt8E!rT0 zV3;O6bc9~_>1)@z%s-bYMn%RgzU>3vqN@+Cxa#)yj}LVZ?U}s7i|Os#t=`*@;T(?e z7v3|&LsvI#Ll6#Ezwu`ghb0$Zm{wZx#Urh72+Bop!S*aDt(Yf-1+2E%|T5%W4blZw2$)d*BWdAJEOCJcPc8c*m7wtFJomEB|l2 z`L1-(d{}ibT3I159}Y9WY3AJ&4~mX$a%r}HC~Jv^o+r&k^5gb9{?zoxAKNyC^Fl(q zR$AdjgYShiGY;5i1Nz+YSEeg^Zh~`e&}Zp_kf^}3UzktO9SpGNJJ%jeeq4F=Z|KZ( zX3(rV{v6LTqqvn<*e+|&clEy?+PA~oR;9Dfy_ryd8`kmpocwOUxS3od{GI%5P7Jtg zOhbT%!NbNM^U|FnE3t!kSI4CBf(M&reFPpuLAX=vz(*lALEamA^H7&}ST*?j4#(0u zR?B^M9PHHmB?YeoOTiab&KQ55HAUD;$_c*atZ03V>?jFPB1af)8vRlfOLr*G%&d$Dw zLWIf*9WT%~>R^GO$`=+UFXkf+@SF_d`S-k-lQD1z>jBIr2)Xo&=v&8pU@&MO5*W31 ze0U&v5mtL_x#v+Dw1#)@yys7JW(wRNalnqW>4x2d;BX-M)qCASRP;5`sDq|}%RV3f zN>kshqNKx{0skGhShuZXR0w5-1I@3#@fJ|@F(LDwo!?BKI&jC{_rrN0AN|~!X=^bT zH+LON{MeMW;})-PSBeb5^ebo3N#FVbT{GjhT)(ynfl$stdvDcSM%cnBBnXZ^`GWR0 zx8;&6W;V3?u+h|kR_C33P-j_N@AcW1HZ`~4?)&~yn&~mu*4>x9_+^tkc;^8pG|7v< zm;hh+{)^l0YW~imQ_i}KPCxp+o!e1`AbUt!y#Mg8cGi;{IyT(xbujL0Pg!xKGe5#% z=0~4=QR93)T(Ic!P2ytz2A}OW?_UPI|DKz-NervPT${MsuIJql=>PaJ=g_w=`YAX| zp6>E7ArlT6-(!c3=vB5grIz8lh`{JI+5PGPRU3P8FDZ~2~N8Q6T;foF&W6~SyK#W$d_vL^g-Q*;7 zTQ&GhMS{c(c!!6B*aoe`RVJI*7rY;#XJj^;Q{p(dmklIC^5dH)ynApZ#Pz)O64(Tx zhu4|G{k$broBR2Dmd1MRnS>DdeaAkh*ji;^u0G|^Vdz^=n?lE*cDcQnHHG_p&DCDk zSx(rB>pDCGqe0-vV=rpT{-K~2$_cATjyj|}iM#RJj<$IC92bzO^!p?G_3PEJGUcda zFKGkrA_1w~TW8%z2Osgjbi(PE)7OsMy$xd5AO^+PZW0_jO000Z}>e1qyFn{$4J@S-mf0_uFh2zUqAcW2JfFz z_EHOTk}b;Re^hS2Vdn4Ygww77|3Co0q#K%~h09*jz(%|g0(&7j(Fgx??4?a2>pDXg zPcfNt`Bk^lqjdQMx2hyW{_EFNqVcC6f`Bk^IhpM+LPrzW@ z+awZ0dzYCM&->^Lo^P=3%54HfL78dTx-lNN(`TAQP6(W%tc3ax+V4&6c3GoBNPK+k z$O~JVsFg@bgx%giTTOdS@B3R#dv#2J@OatSAPlmhozf?Wvf(0JH^0FqDL?w+xj@R0 zoahVMhoJHY4?Z{1PZdk}9THm?PXBpB$N%bGH4%~ud%XXQXx7wp8NMEZAhRDo@?yHF z3Eq!qVURX)vD>=6?Fb2qEjN92lLWcJ#1Qy<*dl9`RWJdM6HmK_uDog%&3Wh%!hQ?= zHML0qgjFPguJZ!9msd{FAQP+MfbA%7#Z`CEVMk3bR)Yn)9rlrF4bGz{LPFx>up_6p zL4M)M29HTEp3rV{wZ*ho^}ZjT+3V)B+W{#zAtoLo&+q-twFVOdVI@R3%seCqM9+X9 zr?~V_s@QScDNT~$jz+%kmVQi*{9Jo17f%0GdkFbWH^=c!mm?J}Z?VZM8r)vdSyrI! zVMl$BX54%ayhUw+4>oPTu&L*wOK+jQ-nnL*2}L$`8d4JVxV2)Rh+j}YpZT?o6?n*#yYHJg`8Aj(@>oFC1R^kq$iPK?gf5IKzyy(ol>1n>#}YCaB$! z4B^0wGOfMeepd-H%!I&hc>t6)hjJeub;XK z?X=~3gR37xkiSh}WO^+GM|a$^dln2PKPvi};^B{;{&4S~=4_t`;v^(QSt;v^(c&br{5%%O8qUZDGD zPClQ`y674@@1zg)CaS`UlvB>UtSy&$CVZd$;KSvJp$EbWixBWe@I9|Bx6})0hb`9W zDeo_BQiTW0GAQ?CjN+a5{F&am_vh%cZ+)~gnX-LT&&NJ@b`0oe2%$mpnPC+Jo1D8Z z9`;V^gHZl%2Y$ItT=<@Leekfa(X}_;)*gD^wF)AvP6)I7!_0qdZ|Ivfw>+d>1(GL1 zLj7Uo#xI-XP%(1?jB`i`grImRqYKt)g4vh;=;zthNRW`Y7&`Dgtk^m1nE!2XdWek1 z6`7$n850s4U-|6bY1^$j?6JefZ6aV;+Dq8~6W^e7ntEa^!aC@8h6GJ>|AB_r_t>F( ztCNs~i3y>^i=icBH76y9(;J+qmi@pVbnY6;`Hf|DNNTWXvWbB~*A@DzULRxbRBX z(8dElc}8bBAwWuCqs2KSmT9GPKgE5ou3`uYkoWKL)DN#61q|jgNKMzR|4T6MW4K(W z&y{Wo+fvBYoTP|yC2!^H^v)*&>-)Pr;PNnaB^?fam)?nA| z)@g$8*S5*0GMKMiuSfN8|Sc-+bWUv+0u`*`i%-G6a|Z z`1bbs7~Ekk8NG*lnqSq%^bo>v2 zH*d@I@{lJEPI2uQOpiWsIR7J0AcW+{9{YVux7^9H`Jtpa4?RkU9(hq4tnOL~6WYzy z^Vmcu8w^WHNILAX-x*CnIL@Ls{z3D3!KJ@wS2cX)*qwTlAYp}u*g1zQY2yl!q177~ zPX8r+_P8Gw{ii;fZ}GVC{dYEj_jQ}Z&+BOvFcd)3N;p{q6#G~%}J+U)BOFU zdM~V2*!u(Dro;YwlflGAfGe9s%KnFZmol`atiwKiY0ER=?2s;)9L_}nytx^Hl%XGX z+_rxuWsCFs&yI;X#KS3f-~Y!s4KCknSL%d=-1}g!cdpYUK+dN6EcelT!jn(`Y4i7! zD4!l<8Qe(wd(VNhL-v0EIcXJ1KE{$c_3eKrfAy#Bs+W++sXgo%sA9D1!B>CY?ds7Q-XVJcg zokD#OR%t|DVdG%cdLL}H=ci-xqkSCu6QV#To$-Tqo30@Ui3fWIg;(nkzBXy$ur1a} zXMDf699^vdMzi@cZT-~-SLB4%Cud!FjT&ZUbuLj*3(0}4_x^0}xhsJW!dV$O@I`~~ zdYKqNtCdgJ^Kdx$ybnV1BLtk;$un;Q8-(wFpZyTM|FEz2mKV+fA?Wj(vtZtT_}7}m*6mgV0}{zV24J{wl>V8Ug6P4EoU zM0MVXo%2ipDmWM*vF^fsb88NG7vRJUZ$>xZw5MP8x=-fLYIgO4hAOtcmpVtRe4Y3@ zIJsa1@uGKbzaCxrorB}w|9+(TJ6L}=e^;byU;gwv+h>Q89|4a2$`2A>aQMzEEy|{8 zvnt?W(53Qh-^ST~xMkZj34D%7!ov8?axHxet3bLS1ZdmU2c7808+}QJ03p%BkLRRS zHXg-4$?PHg^jV-f{OsGhDg=VV$`9j*vOk#(00R9&;^6CN|D?0L5a8Wt-IW0!ix&^J zLxNsvioeJJG75&3raPWzP00%Tra?Xt$ zDmQHDb;7Av8u#A>qwKJvUA6F*O;_zK@BF5`uxbNAVmV@Gm0!NqBtgQelP=h*sVi(V zByHoyC;2~r`p;;SZI7jo9(jITDMHkKw#g5uv!+KvaUqcW&9krTtbgSua4zk@8zbn@ zfJaEuX#aXMOyY7rbLsd3xM~(1dep^+ zR~%)+1$Sb?;ToD7;O%*IoEpovs>i|8_*^%HWWk9h`B53eHT52S+~p(4!tC}rDJfG` zTyjVR+zVSkW2>%Z<8PUeOr?sN~+`ogOAdDh7}^8JMN0!GN-P# zY`X%6bp@HvVF<~ElfQbc5X7Mk%7_y_rmVVb?+TZYOyMoGaLXXo!r(tQ|Ar(;-`OCc zeaz&EO0#!Y4!r8|hC@Q>>>&cedMCv4AQDJ8jXu`XeL&F1{k}+stwwWt$uBL|3u!-`NDRuI@=dv|D8P=eJ*!m$gha%pSKe%{;Y{}y zQ*=a{@853P$q9@Q?El=!7ttC`QsZrVA4AvPG|L)ebOw^nXcHla$3(~}XI|cvcWr8) zN(L@n=K(?Z9+FG4Em8$0PO#@oFquLkpl`KCSOxU)W6sqMOSp@6D}riaFZF-WVUP?8 z380V^S!JUG>6nu*jtM;LyNv|l+>S1u%$a~1en@?&eW;T;L+=$2jFCi%`_FdXpLp=Cld+LdBhGu6`9MoY#ia~Ul!*6FpIq*r4 zVxxr=2pN{D1+m`Zb~wuT|Cxj1PW?f<5`t&l$})YT-qsGO0x$o>lJHLSNx7UzqkjfB zh6B^X!RZnd@i^RbvXArEzI{#a;oNw(M@be>%P#f2CIQmDoyB)9nbEEwU^|>ksc_NA z%%OvF3?`sq4c9~RX6sG6{jeYY_}6Jg33R26$jf);=dc}AAFbAy@}E*n4KEhckOX<> zzNgVqU%aF@a6Br!rAhRB?fBi=^DUeeYVi|l{{JX8PoT!cspA}Wq90DAwktnCefV*L zzyZMkEaJZUl$Z9GclwXWI9d5vjdZBMxL$tsZJp(X!1cjG7N||p_QWL2^}S`?FyqcByS^_y z?oz!s_LkKq=n4gp{dU8lZJh&-UBk(CpXp{V|3$kro_iPV?+YLi@~v}jh{+JolYJav z9y<>N^4TDLpkq}c9h3D#ICtcp`~I%4r~!vDPYjve5LREz9L7WFl-fSD4Op98IqH&X zIZ8+)AnorHPrrIZeE1D-VhbW=&L%|W7S1^5rlP-Nu`EzNB_tnfw{Yr%&>l=|7@3Cg z?Ch{b(?D5~=FakgqjnpyJ~-^COX=P}&bDrsgNZ>dO%CHWHh*EOtgy{hAFRLb%Ts%t zw8L9LszRVg*p5ox1h>^?u`kv`8?M{EZEQ$nobuIc%{34I;oNG6PqhD^%*g^&zr z69P#Yf&bM6Mi=irWc!jUZ<6-2Ei+x@(;kDQ`?ZI=7hlos2!~Y)%P-A|v8W(&<52@% z)uHMo(Q%B-U?W@$+XnT)Pr{Z}xsvSo9=5^iTXmtlYn|e08+6Y+4CS45;nm%|=!tX* zW4e_3?&LEsYw+(LxCQ#IGj*l(4pC;aXe93QM&;}G~HQ=&Jo-@pCA zrC0teZH4Al0e~ZbL0SpmHgIi|^ayPTiI45x^M!WHD~EanXyE$AzJ;)&B+!K&M>GrU zK&rDz^u1!cuNwG~E+Mea!Dat)gZl9=`3T=r-5HW+zrOt*8o~o%$tB|f=3NkI7gkwF zUD^^U(V<+YJ0U=F+F3uMA@CV?IPfWwt`1)E_BSU;G{K?gOPC^1-`9ly|EHkhV;y_} z5B%&WCG5=MxX6<1Ls+UGdAK& zR{V)_*TmDH5+)*DO=NWzm&h^{wu|b;Yx+!UOVGZVh=6iKSjl$l?e}$-8PDqQgSv@r zSvV79*L_ZF4@bY}DJDX~Dv7Thw_AHqI794ipL{Ey`Ce+vM}jeZT$0(ude|tIUbyX! z`(sj)th&en(b{OemHW$U0>v8F)xFWd)zHsKj`mEDKG6XA^4Px|WcDv(@03HwPp$&=*~ePL+)aC^buXa`B!6JRKjbA+%9Oc~6=Z?FQ`XHPYq6ugRB@O-*?i{VO{HPWa@SOt&T7uPZ#17OD$8<&DYt7OL;m z{m-5O@-)I?3oYIxCYGnWX5UE&pn$RzT3EijHkQ3gi{ z?xycPS7a5XM@|GZ>Lo46rGj1ldOpfYzdinD1mwe$8?xH-2{8FVP6eBl)vG4=A6B;G z7VFVw8%(vdq*B4)@9=$Sd!cojq|2Qb;(_XZ&>6flonJEMARFzYR`r=u3+DiYRUTbi zP=$LkFeK7M8uvZenQ$qrMwqx#7pc!nRm_+meMt&)ZcILRgzT;lsLf{^Cb2 zxnhPSIcgB<4@nY-ofaEPqW~HN)3=a7QiR`1s11 zSBTRf{#agAf+4O9t4icq;9=}yM@qZ9?*9u7froz`GEvVP(PTLzo1^IRUo{C09@**?>%M)xfwOgnQFw*GW07eFps-vcA$tq;uJW zEZ~SUC}H1$^V11OeDQ*IWdo7!C9b-dl70pI58!}>#waI=ItR$>KG!7~3^n_RFJ4GL zgsrI1{F})T3DAcD*Wf-cXM_ZJ-)|84jl15S}d{nB6Rw3yVCrIr5m}@ zBvIyQRw2LP+C;}HO@Mq-ga1lR!XtcNI`PO5U{y%rq4i|Em6JHb!gugyx^?TU{sc$} ze&aT0I$n2D1!Hv2ef}f|-ctA?YWEWjF zAurKxVw32Y-1J>I(<3AkLee9AhW;HDeBuB1KOX|i?1#yCBNtoHd$$errP*dDRUXa; z=>rYqdsB|cc{*oI1~33&#YEtrAzsh>LFM1_eS8-CWmt3FbKh(#C5fnP6UnwqT@Z9S z+8L_@De3h1J0!{n0RmIuWA%a6AH0eK$CJicq14CV*Z5S;y$v10;pAa8L=D<)xtiq5 zefQ5HwO4WWejnU+$DgeK1RW-JIr~0&g%@>}H+jYXpp%Z>mgW}X_IlkgY0`ue!GgO= z|3ck!@KSv8TGCh=HH`0JOmyK`$HY&5U(wQPeWvi_WkXbzZDdUNa4N2nctL;3WjyRq z>ng2cl`w8eaol_YosFANMhGf&pEe0s*{ZAdZV`urV zf_^i$QY-8Q*Yn%lYYKnmk8ZOC+a*3nTw7(c9`NC-z{JI;co~h(DEllz2vn zGJ(&$5lmJN)|%{*b145cD}nvM10{M|;kp^WZC8F=H}f~@_fWPy0LTx6aEL#C>3y!rQZL-QA|tuf`LwAHlL z+Cp4vJjdmTA^*=u_0YHC%vkY!KoKNO9?Q<)WsU1?lj0j5O&{^ovcZpxAXbJL!|K zs$;`-C%66hx>c8NlN?W}AHgLl{Qn+!@S#V=))M6wBo-)oPao^S!%OmlWo@MuyAvQ` zMMQZnh7%=g5^914>Jvv-{CE~^xoO`SBaSe*f;OAKfumvHqZ%g`rIU`Sv#~nihs3jY73p4A@#LIOipA!S>qhSJ7mT;@n8Y3cjn0Qas0NPv)- zhzXF0lj7M81m`d_lWFyC-sSbRIw#Q&8TFMTlNu} zV3z&U1tDOkvq)0XYk(-RYn&QZn0eAtbzEo2j6`6o)m7PgSE+coAk0kb7GHI!ZmH!7 z#x058D~deazx%%a8SWDxAZmCx`_>6)Uwh;%{2p5E^K`+4B^Fcp&3rv}5}osE*jjLd z!Qx-tUT&YJ3D5W=)&~JbQb!1b0*)M+8B54>WWR^!!d6Cm?ywQvr9B1_=G3ebGY$uQs|5ypbcg2J~k= z6jsUnGa%G^&%J+B*>I)#H~mQ@2~y;na7g;~Gk@RSf8DAtrH$8Lg*IMym63w|Az*vt zA#b5w_c>jzg%vocO9}j!UO@W<$jg{UjJv)t3b!KoJ6S9==#*Fo?qbL{u>ja(NEjp4?e`pF13 zjU3BHe>x`dqY#aIouTa0-~>q|*3Rps5})G+zL?e+X5cSR?|IjHa$xv;12sEZ*$9B| z_|!O^;qR?Np<&x?e5v$sUt&iN+AbYAV&Bjj%(9_<+j8+U$c9`D_7_eBfVZejz>HoG zCW6f1u@9V4afa_4`dXvP7I6Ww)V|e3A)zkG2A699_KD@I2{tpHLn~Y+w7ig8s($db z3(giHOvNH(>IL3TaL0RDgbGaHxGR+}ZxvObBg*nbat4|P1t7JQT(0C9plKl#G`RB+*v8ZqrCWnXI1CN-{WTNrG@FF zauQm3ZWPiLFq68ZmojXDSFPS7@jJCVYp1lunc2?tc<$%m&u0@LPZKP<(BkIzVhb(y zl#(DUh+*5SgL;!6pQOJ${AUdSl$pCWuVNwiLph9 z+1WKtlLMjiWa9?0abqr1l$0sV3cfW6TQpsLV?J1opCN#|*@ja)-`#A(DYV||E7MhQ z5P5U}87~^m*guW%z?_E&9TM;Xx&esSwqcyCBMaT-#)gX$KFpaX>zz^PWfF5lgTd=| zizN)`iE>m6VeFJqn!Y7gNTPHF^CwC`G!NXR_eX?6QG=y(*6KauFgvZvL7T+1Vji)Q z6TeNIhr|LVJk*#+#^Y^0jI5IlUg36EiYNhsp7v-G9|!EU`Fu}&2oA1AYm%Vk5ZQoMjWgTbcNk3 z-LX0f#*U0oe=R{`2ZN<3qdvne$Z~KfYy|!7iU+k`>_i81Ji(#$j2M?m7T+2sHD|gD zLQ?0t8NVT%=zxO(1W%yvaPZ&2np0NjttS?(v(nB;_4YlCGsLgzZrd*#ho7q)?@ zq-8mn9s!ch!ZsOuMxb}oGtP8uH-yC0t+Vd4We^p<(_Kw~Ic%?V>+Sc_ukX0m3^rt^ zrA)5lmc_}wCi-^j6Tp9b+@~_JZ65Gxp0Um%l{3RefNXRG<^ei6+JE(r3*-&_ zS65uRA@OX85W;`DYk#5=ZKyFK{455jg@ zA;8&gV??ncJFbZpI5!uBa-`#?kWd*1dWX{7Xf_N#%iw@D5_5&$e1vvOr$DapIu0wX zuoQjx{coP{i4Otez$U#VHwIozwB%KnK2vlUVCn^@0WV7f2dauC&ktdx2@JRzo5{gI z{blYNe=FA}m{d^*AYmP9CHCCWXJrV9-A{aE^ZB3n0C2ex^EB9vIAn;wxkb=kuSE`l z&-!p^rhS_L@u*W{P0~waxN_K0*+dstvGn4kCHlfgaEh}vuOxec4a!1Cy_x^sc84E& zr$mFC>UaXIN9hq8Y^7fL2?-Ewu2=sUeb;33cnqd^#UFD9R%jJIkYU=Mb`aCAq9?Pi zo5${&Z=n9Rv)96x8g5?Y2G5`16(Brzwa@5yp;)Er(f(udz^OBkY^?G5QkmjY8}G+i zcB|+Y-_cffiHX$DbX4D{0J*Q{v4esUka-*r*ZVS1QY{i!ZPcJOZ~te2xMbQW2n%$s$=Q0Z%`0{GeG)) z&X7_3tnUf}>1fcm~tmRM95J72EjFfV=K1 zx7HaP!ZTXV?(7*!9I^$)x z5Fl`j!r2~+(`lc5H?1>uGCdP8N{~H=$Tn7oxHORDc8n)SB`@1JN0jTuBx9p+5(F(7 zDdPaqT(CFQ<^SmdUA5pdUR9pVg92T^aXm%b^(H6+Oq{SN*@hwyxFQ+CDDYFgXN-VD zi33$L7_!wtU9cKL)`B}zG=r>MaCQEYxm0t}k7Ap>+J9V;Vo>(LZQlAZy>)mZJ3A0? z7QQG~yNo(JR}suXI>wk0Tp3~<_qhZ~esDEjSA!YZEO@&gF8lGX+bygFP?5)qtMAEU zDE|)H3y!7)YpIlq_?>;#NWZZ$O@4RjFnmwzQT;YDoqhaAd>jY(C0_FKoXSu*$o#Ua ze$^x?>XT!_?9Q-Hb{j|m*+e}aR*Hqg(ASvqpVczLc_W+v2^elOZECx{Ru`N%eMWk= zD*hRt=bv3*{qvHtPVk#&=6;G00_Ud9nNCBNY`C;8`w#zO z-GZ)9{*%=pR5lL$)b`(Tb8X!C@iF=Fm1B2q&+~Y?z!Bh@+8l-s;{&p%c7@>If%&g#Z^dA#u7=K^%%22q{} z>3xsD?#rhtF%0C60!%(3-QWv2`yRL|3$$ZN4g$lYf$_R&6eZyk4kl1-?7+y%=4k`w z^>J@K2y277z-8nAXh+9*J4uiS?g#IccftKH{6-lPdT)5ju2_!mNsjii;~QB15S>yQ!hiRj#~V^(pG;s6=|r6{xZ(W%P)fNsPH1K{EN?14S}U%m26;vwkV z7BHMv;gYluaT!|0@b?f9Ma3_q(-{Q4EmA)-)=!xnB!aiW*EtXOmUY)iJXBEv#%h(u zE^N`nd@S-xWN0V9NrMSP!Qy4pwoqM;kr;XzxamrQ_MXRCOP~j&08%5_Ts>gV&F3lk z5$JyBeSf82-+mYU>bAQ^SUqBy+6|Py?9$ISZ{~*q=Rq{lEgc01Qj8e|)S+KH0C_g| zY52QQ<%0!k0d0Tz;g?K+x_vP^Lqm!O69FoJ;JCRm$=wIi{>10M%C;-ZVXY}E&^Z@f z4?#B=EcuL%SzA__yiD&|F%chC7@^E@91LMc5t+)AmfkcQmlm_Ubm^?p{O1)8VD7Dw zbX>pF)m-)!Pw3PPg|=O4r+wYdaK#m4&W&t%v<@DiIrvRFV8D9xlAT31SK!e{i)D?e zx|4Roc0fn)Np#$4KcsJTBtSx-J**@Nhnk0WZv2K-I_nCn zbHWx*HEHyqC+30sL`Ipis4pC;j0GHsUe;O8(4o!q0%7$>@c(e4maqt8>f)iTyKJ{k zo1B=F4%cnLd+`0h)>y`FuY@x`zI5sp^xyBF)``!`D^B8K!A2)u^`lFp%N!zaaC5Ti zYP0}72~PI6Psv7oAbcJ2r^C$Vkq#Z6OSoa?A5?e2^<|r&`KJ!visl8v`6svD@yGTv z1emvK5-I)Qg?Hk|D9Kdi7*uws7CAsS*jqBlvU-lFrt3%Hr=Zl?Uxws_vH#)vn0yPD zBY(NFtV|}tznJpqOY$$h)VwD@!a?)5HT`(ceGkxm&EG-$b)Ui1S|G3er(=>~5dB#; zHR(C@RffPznW6J$56FyeSL9*rNNKE%b`a#>)I>CC1lqDD_bJ&JFRG8N;|pkE&9HQo zZNU}3OSIKA>sXi9!AWg))kk}UQmr1+3;#t6}%Eqb%9rzJ6GFYd9M3sEt zneN#nn#v_77Rr+1H~x;}MJmk|sZVYBHFleacAyWRUKIb0s$(^^h1THu?73{H5%G8G zzdoA)d79wi#~*H!95HF}Qgd%^lOV$fp2uyk)K#+rtARnP?#*d_6H#vdj1s6o_bs1Q z@&!hi-_tu?d9C_f* z?KWCrro78q&h~Tm?EZm8I7{Rgx7``z2&4q61x`@uT7~TGU@$f$zMVW(H;SRn^f2~W zPESW8fYI@;;5}dA!w$@#$dnX#usm|{*l4FuN|J;{z-LAp9f5Mou2L-!7?H9izR(+ZFVLnB0&UN} z=vv@qmRWDVW93ynply)$aG|NJ?Y3CEJ?~=(!j@^*&bYnB{jU4}8b6zBsOR?FapTSe z2pe{5+G7%_>u~kuCcUsNFZ7+vBBIQn$oNuZ+hvXbWo|`!MpfcS5?k~&J8|Zm8rL`E ztru2HqE}zRgq9nr7K3ec{)jXhB_5gVcrrdhp(romS2(0R1c|y56>oaOYns8&ciP}w zYzI4+PKv4fypFcrY)u-(haFCWEjMCCRM`GhHamP`kU>TJJs~av?g5L>QJBvx}w9D|&u5dDN&>`69U;_zc zbbD51ud3_>N5=O<+_+^Z|M5X#Fz_=qh~mxr{7S9uzO0MX|B)mjJj2hSFIgzf{^n}% zj+^1E7%5$n{|bFR6gY^!lJ6amT{oluF!WuwUx%)55+KVi^*nmx8(u+OaQvx1jCgS% zhALzzE;I8j-;{sP{uc$FcuUqY< z?bcNrulI^XV@JoIc6l}dNc{}`smz3rexpgCym$8vJ6C~(8SXk6gOpJz)4@aFBQ;cs zQ94N7;!~6VKG0`~rq^>ref62}C>0`e~HJqK%Nmf7BxzcLQT8iMb<94AT z2>f;1to!MfS%0M4o6lQ+^MCERFb}4!Yyv)8ZStBC5+Goo5@-F8reM>PMhXcqIhd-o4wpBPBn=Vc@ql{n-As z{rLBI9z)Uv;Y^;s1W5E%$k_ij(C3D!UmN%MTutTQdoh7uO<`f1tFE&r+AYDdZdLhI z-G>MY{nLA^ue#g_7^xp>{BpTSRy`-XBIEV}DC{z^?e=NBkm?`m4)7DfaPR%It^OX>zlPw9(#Dqr zYT*8Xb4ZRk?niXtrN1IqZCM22F$Z-N&m&mf(yrd1G#@|wpLoekyk;A3#{VR3#5#oE z<%4}ht-kO*p<^(4slJUzr&1Fm6^GC(7K#(}dv5;4c60ywC z%SOqE*HAtS^9-B>sUVvS71TpZ88)_w|_X+yQC}?9G?6pKVm>yn-yr&&mC7VAx zK;rsKSbjI_6o4~&16*^{ZN1NLy1{B$nM%kp2TI@Bg_FMEHJo>BK?<^E8bAge^ zF2I+$f51o+cznN{)t^v!H709}1#&7g;K(|tU+h};$%c|=kd`*j6|%=qgq1gat5!By ze^v9FodA{}nH64fbY*4`)6b(+q;`RB*nP+D{ni77nf-5j_c65QmWR*>5C0l{<*du; z(kpIm0^WZiHx~@<5argay>3k;y(_cAx8F^0}B?!<08^k)iH-ilRH;;oOPV5{G zwxN2>8@?%Bm=S@M+W_FI9{CNQy;XP(y_5z~-yb>;r5GS4r>t)kNa)KC?lFz1kQT;` zAi$#4gu{H_wEnAU5Wq&;#E>Iv_%aax0D?LoBT%&Y&3DJg$Eg#Ukw6W-&x{oJl?g(6 z;APZTBSJo4$JIj`oQCHIN_Pb>Xt^>;0gR*!iVaR`SGb&!+LZY?9%LxD%VzL31nhr# zUtBI8tq#t#16d!`6C76Tt!5-5Dg%usXzGEIPD}JquBZw>THC`jW1v?nV_gv`Pb7gy zZr?IX^&gJyT&c5a!OUcJ(zZD{PchHcRowukyxR95|Blq!N4n_j z%Uhbja~Fi!u=X%RnbzChR`vCfDjBB>xo6w0N@$uE;ccZTzzdLQc=@dyY z?Xvya64=k>W^By*5n@xpWeRt~mRQ43S<%M&cgQF7>IX%0b%@XOthGF4 zQs%avzFcX=rMm0k;?pmc>Y6qn!KP?H`n}b(*S0GM`ryl_|A^ka?XmQ(eZNkhJ??w- z-RVDX`slv62ftIlcFBR2l}uwN`X;?Nih`~Q7uef*vtQKXcaA<8A;*E=&#gqwuVSAs z%72MN`8-kH*WsxUOx|+ZYp4&tbu6-yg! zus4>OGJ?58i($i>!rWAQ&?iO`-(`r1&JiY4b>bBGyxkBZ@Y84t%Q(72k{0!O=KPszdlQSvd#T`eJ%GuwcA1CPv-e%s-fyX2c+k%vWig1kLjJ%TErwm<2APb3@@xPV?@}E6mJ!?&VC<+;)dee;J ztA`S)@@P#H@q`hK&+)T0ZYw;>g8ta*SkJQwkf#}*N)lw0Ge7?F@SjMRcvhGa1wpeQcE0iY)mNr3`~p`wKmttb7?obeg6cIPeiL}T?e5-0-1b|nV^KkwPr`+P zd1=4Me@FFXb%7cwZXwRtweZWHVDWNGzo6Zc3Ij!AcE$2poyGcUyUo|4>n=Ew_S|8k zxP=rLNMrq)>&s1g0ljMSvYmK@6&@k^aqUgFn^;5Xc(`_@M%PLX1)QxBOZ(oHH}}2~ zw&!yBsMn<#G6e1jI)e$WJO7jPg^%w-YfoJ<*68(F6n&z)maakZ4#@wgW$639c5xU7 zr?Y)WT?t}TVhqO5Nj`>(UuIO(M-N|f

wC1^i{$n3e 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 YJS0U4Kn>P#4@gG&Ah3|%rqHIW>YtD9JhiaY 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

8vkhiVJ+=zE8BF!3%`JZvyr1olJOg`6>o~D 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

-LuPt9#jp}Ry;|zSLV#rAiAxvBMW&_UT|A@+ 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 + + + +Customize the arguments that will be passed to the `deno install` command (Deno >= v2), when the +`InstallDeps` action is triggered in the pipeline. These arguments are used both locally and in CI. + +```yaml title=".moon/toolchain.yml" {2} +deno: + installArgs: ['--frozen'] +``` + ### `lockfile` -Enables lockfile (`deno.lock`) support for Deno dependencies. When enabled, will run -[`deno cache`](https://deno.land/manual/basics/modules/integrity_checking) as part of the dependency -installation action. Defaults to `false`. +Enables lockfile (`deno.lock`) support for Deno dependencies. When enabled, will run `deno cache` +(v1) or `deno install` (v2+) as part of the dependency installation action. Defaults to `false`. ```yaml title=".moon/toolchain.yml" {2} deno: @@ -757,17 +768,29 @@ Python installation's are based on pre-built binaries provided by > Version can also be defined with [`.prototools`](../proto/config). -### `rootRequirementsOnly` +### `packageManager` + + - +Defines which package manager to utilize. Supports `pip` (default) or `uv`. + +```yaml title=".moon/toolchain.yml" {2} +python: + packageManager: 'uv' +``` + +### `rootVenvOnly` + + Supports the "single version policy" or "one version rule" patterns by only allowing dependencies in -the root `requirements.txt`, and only installing dependencies in the workspace root, and not within -individual projects. It also bypasses all `workspaces` checks to determine package locations. +the root `requirements.txt` (pip) or `uv.lock` (uv), and only installing dependencies in the +workspace root, and not within individual projects. It also bypasses all `workspaces` checks to +determine package locations. ```yaml title=".moon/toolchain.yml" {2} python: - rootRequirementsOnly: true + rootVenvOnly: true ``` ### `venvName` @@ -790,7 +813,7 @@ Optional fields for defining pip specific configuration. #### `installArgs` - + Customize the arguments that will be passed to the pip install command, when the `InstallDeps` action is triggered in the pipeline. These arguments are used both locally and in CI. @@ -801,6 +824,41 @@ python: installArgs: ['--trusted-host company.repo.com', '-i https://company.repo.com/simple'] ``` +### `uv` + + + +Optional fields for defining uv specific configuration. + +#### `syncArgs` + + + +Customize the arguments that will be passed to the uv sync command, when the `InstallDeps` action is +triggered in the pipeline. These arguments are used both locally and in CI. + +```yaml title=".moon/toolchain.yml" {4} +python: + packageManager: 'uv' + uv: + syncArgs: ['--all-packages'] +``` + +#### `version` + + + +Defines the explicit uv toolchain +[version specification](../concepts/toolchain#version-specification) to use. If this field is _not +defined_, the global `uv` binary will be used. + +```yaml title=".moon/toolchain.yml" {4} +python: + packageManager: 'uv' + uv: + version: '0.5.26' +``` + ## Rust ## `rust` diff --git a/website/docs/guides/javascript/deno-handbook.mdx b/website/docs/guides/javascript/deno-handbook.mdx index 6d88d481851..075336bb2bc 100644 --- a/website/docs/guides/javascript/deno-handbook.mdx +++ b/website/docs/guides/javascript/deno-handbook.mdx @@ -59,7 +59,6 @@ Deno support is currently experimental while we finalize the implementation. The following features are not supported: - `deno.jsonc` files (use `deno.json` instead). -- `npm:` imports do not consider Node.js dependencies as hash sources. - `files.exclude` are currently considered an input. These will be filtered in a future release. ## Coming soon! diff --git a/website/docs/guides/pkl-config.mdx b/website/docs/guides/pkl-config.mdx index 7c943ad601d..35d09101a30 100644 --- a/website/docs/guides/pkl-config.mdx +++ b/website/docs/guides/pkl-config.mdx @@ -64,10 +64,10 @@ some key differences to be aware of! - `default` is a [special feature](https://pkl-lang.org/main/current/language-reference/index.html#default-element) in Pkl and cannot be used as a setting name. This only applies to - [`template.yml`](../config/template#default), but can be worked around by using `defaultValue` + [`template.pkl`](../config/template#default), but can be worked around by using `defaultValue` instead. -```pkl title="template.yml" +```pkl title="template.pkl" variables { ["age"] { type = "number" @@ -91,7 +91,7 @@ tasks { ## Example configs -### `.moon/workspace.yml` +### `.moon/workspace.pkl` ```pkl projects { @@ -106,7 +106,7 @@ vcs { } ``` -### `.moon/toolchain.yml` +### `.moon/toolchain.pkl` ```pkl node { @@ -120,7 +120,7 @@ node { } ``` -### `moon.yml` +### `moon.pkl` ```pkl type = "application"