diff --git a/.github/workflows/check-radicle-httpd.yml b/.github/workflows/check-rust.yml similarity index 52% rename from .github/workflows/check-radicle-httpd.yml rename to .github/workflows/check-rust.yml index 5e16b8f52..14c643785 100644 --- a/.github/workflows/check-radicle-httpd.yml +++ b/.github/workflows/check-rust.yml @@ -1,4 +1,4 @@ -name: check-radicle-httpd +name: check-rust on: push: workflow_dispatch: @@ -10,54 +10,49 @@ jobs: test: name: Build & Test runs-on: ubuntu-latest - defaults: - run: - working-directory: ./radicle-httpd steps: - uses: actions/checkout@v6 - - uses: dtolnay/rust-toolchain@1.87 + - uses: dtolnay/rust-toolchain@1.95 - uses: Swatinem/rust-cache@v2 with: - workspaces: radicle-httpd -> target - - name: Build - run: cargo build --all-features + workspaces: ". -> target" + - name: Build (all features) + run: cargo build --workspace --all-features env: RUSTFLAGS: -D warnings - - name: Run tests - run: cargo test --all-features + - name: Test (all features) + run: cargo test --workspace --all-features + - name: Test httpd without search + run: cargo test -p radicle-httpd + docs: name: Docs runs-on: ubuntu-latest - defaults: - run: - working-directory: ./radicle-httpd steps: - uses: actions/checkout@v6 - - uses: dtolnay/rust-toolchain@1.87 + - uses: dtolnay/rust-toolchain@1.95 - uses: Swatinem/rust-cache@v2 with: - workspaces: radicle-httpd -> target + workspaces: ". -> target" - name: Docs - run: cargo doc --all-features + run: cargo doc --workspace --all-features env: RUSTDOCFLAGS: -D warnings + lint: name: Lint runs-on: ubuntu-latest - defaults: - run: - working-directory: ./radicle-httpd steps: - uses: actions/checkout@v6 - - uses: dtolnay/rust-toolchain@1.87 + - uses: dtolnay/rust-toolchain@1.95 with: components: rustfmt, clippy - uses: Swatinem/rust-cache@v2 with: - workspaces: radicle-httpd -> target + workspaces: ". -> target" - name: Run clippy - run: cargo clippy --tests + run: cargo clippy --workspace --all-features --tests env: RUSTFLAGS: -D warnings - name: Check formatting - run: cargo fmt -- --check + run: cargo fmt --all -- --check diff --git a/radicle-httpd/Cargo.lock b/Cargo.lock similarity index 73% rename from radicle-httpd/Cargo.lock rename to Cargo.lock index b23564240..8e9ee5e3b 100644 --- a/radicle-httpd/Cargo.lock +++ b/Cargo.lock @@ -2,26 +2,11 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -60,9 +45,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -84,19 +69,21 @@ 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 = "amplify" -version = "4.7.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7147b742325842988dd6c793d55f58df3ae36bccf7d9b6e07db10ab035be343d" +checksum = "3f7fb4ac7c881e54a8e7015e399b6112a2a5bc958b6c89ac510840ff20273b31" dependencies = [ "amplify_derive", "amplify_num", "ascii", + "getrandom 0.2.17", + "getrandom 0.3.4", "wasm-bindgen", ] @@ -114,9 +101,9 @@ dependencies = [ [[package]] name = "amplify_num" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99bcb75a2982047f733547042fc3968c0f460dfcf7d90b90dea3b2744580e9ad" +checksum = "afed304556696656d2d71495e1e5f2c4b524a3fb6eb0f2f3778ffc482a40b8a8" dependencies = [ "wasm-bindgen", ] @@ -143,9 +130,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -158,26 +145,26 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -193,9 +180,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "ascii" @@ -216,16 +203,56 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.3.0" +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "aws-lc-rs" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +dependencies = [ + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] [[package]] name = "axum" -version = "0.8.4" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" dependencies = [ "axum-core", "bytes", @@ -242,23 +269,22 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "serde_json", "serde_path_to_error", "serde_urlencoded", "sync_wrapper", "tokio", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.5.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", @@ -267,7 +293,6 @@ dependencies = [ "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -285,21 +310,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "backtrace" -version = "0.3.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide 0.7.4", - "object", - "rustc-demangle", -] - [[package]] name = "base-x" version = "0.2.11" @@ -312,6 +322,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base256emoji" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" +dependencies = [ + "const-str", + "match-lookup", +] + [[package]] name = "base64" version = "0.21.7" @@ -326,9 +346,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bcrypt-pbkdf" @@ -343,9 +363,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "84d7ced0ae9557296835c32bf1b1e02b44c746701f898460fb000d7eaa84f00a" [[package]] name = "block-buffer" @@ -377,9 +397,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.2" +version = "8.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +checksum = "8119e4516436f5708bbc474a9d395bf12f1b5395e93a92a56e647ac3388c8610" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -388,9 +408,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.0" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +checksum = "5962523e1b92ce1b5e793d9169b9943eece10d39f62550bc04bb605d75b94924" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -398,9 +418,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byteorder" @@ -410,17 +430,17 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "bytesize" -version = "2.0.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3c8f83209414aacf0eeae3cf730b18d6981697fba62f200fcfb92b9f082acba" +checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -434,13 +454,14 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.15" +version = "1.2.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" dependencies = [ + "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -456,9 +477,15 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chacha20" @@ -494,9 +521,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -504,9 +531,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -517,9 +544,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -529,15 +556,24 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "compression-codecs" @@ -561,13 +597,12 @@ checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" [[package]] name = "console" -version = "0.16.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", - "once_cell", "unicode-width", "windows-sys 0.61.2", ] @@ -579,10 +614,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] -name = "convert_case" -version = "0.7.1" +name = "const-str" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7" +checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" + +[[package]] +name = "convert_case" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" dependencies = [ "unicode-segmentation", ] @@ -595,36 +645,36 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[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" @@ -638,7 +688,7 @@ dependencies = [ "document-features", "mio", "parking_lot", - "rustix 1.0.8", + "rustix", "signal-hook", "signal-hook-mio", "winapi", @@ -660,16 +710,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -677,9 +727,9 @@ dependencies = [ [[package]] name = "ct-codecs" -version = "1.1.2" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "026ac6ceace6298d2c557ef5ed798894962296469ec7842288ea64674201a2d1" +checksum = "49fb0c6640b4507ebd99ff67677009e381ba5eee1d14df78de4a3d16eb123c39" [[package]] name = "ctr" @@ -749,15 +799,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] name = "data-encoding-macro" -version = "0.1.15" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1559b6cba622276d6d63706db152618eeb15b89b3e4041446b05876e352e639" +checksum = "3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -765,12 +815,12 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.13" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332d754c0af53bc87c108fed664d121ecf59207ec4196041f04d6ab9002ad33f" +checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] @@ -781,9 +831,9 @@ checksum = "5053691e3e6c0e5979cfb55503b7eb4b06531897b5c15b0f617110096b05a0e1" [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -791,31 +841,33 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", + "serde_core", ] [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ - "convert_case", + "convert_case 0.10.0", "proc-macro2", "quote", + "rustc_version", "syn 2.0.117", ] @@ -839,9 +891,9 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", @@ -850,9 +902,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] @@ -865,9 +917,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ec25519" @@ -877,7 +929,7 @@ checksum = "bdfd533a2fc01178c738c99412ae1f7e1ad2cb37c2e14bfd87e9d4618171c825" dependencies = [ "ct-codecs", "ed25519 1.5.3", - "getrandom 0.2.15", + "getrandom 0.2.17", ] [[package]] @@ -924,6 +976,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +dependencies = [ + "serde", +] + [[package]] name = "elliptic-curve" version = "0.13.8" @@ -937,7 +998,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -951,28 +1012,29 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -983,17 +1045,17 @@ checksum = "3afcf4effa2c44390b9912544582d5af29e10dc4c816c5dbebf748e1c7416faa" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1005,16 +1067,20 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" dependencies = [ "cfg-if", "libc", - "libredox", - "windows-sys 0.59.0", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "flate2" version = "1.1.9" @@ -1022,7 +1088,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", - "miniz_oxide 0.8.9", + "miniz_oxide", ] [[package]] @@ -1038,19 +1104,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "foldhash" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] [[package]] -name = "futures" -version = "0.3.30" +name = "fs_extra" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -1079,9 +1157,9 @@ checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -1147,25 +1225,29 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", + "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 5.3.0", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", + "wasm-bindgen", ] [[package]] @@ -1191,12 +1273,6 @@ dependencies = [ "polyval", ] -[[package]] -name = "gimli" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - [[package]] name = "git-ref-format" version = "0.6.0" @@ -1214,7 +1290,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1955ef3abddd586f24c834d28f959d610157ab5cb71f2200911932a0018d0364" dependencies = [ "serde", - "thiserror 1.0.63", + "thiserror 1.0.69", ] [[package]] @@ -1249,19 +1325,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "h2" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -1269,6 +1362,17 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -1276,12 +1380,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hmac" version = "0.12.1" @@ -1293,12 +1391,11 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -1314,12 +1411,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -1327,9 +1424,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1339,13 +1436,15 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", + "h2", "http", "http-body", "httparse", @@ -1358,34 +1457,57 @@ dependencies = [ ] [[package]] -name = "hyper-util" -version = "0.1.7" +name = "hyper-rustls" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", "bytes", + "futures-channel", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", + "socket2", "tokio", - "tower 0.4.13", "tower-service", + "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.62.2", ] [[package]] @@ -1399,12 +1521,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1412,9 +1535,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1425,11 +1548,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -1440,42 +1562,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -1491,9 +1609,9 @@ checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1502,9 +1620,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1512,12 +1630,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "serde", "serde_core", ] @@ -1546,9 +1664,9 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", "generic-array", @@ -1569,15 +1687,10 @@ dependencies = [ ] [[package]] -name = "io-uring" -version = "0.7.9" +name = "ipnet" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "is_terminal_polyfill" @@ -1586,30 +1699,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] -name = "itoa" -version = "1.0.11" +name = "iso8601" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "e1082f0c48f143442a1ac6122f67e360ceee130b967af4d50996e5154a45df46" +dependencies = [ + "nom", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "10.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" +dependencies = [ + "aws-lc-rs", + "base64 0.22.1", + "getrandom 0.2.17", + "js-sys", + "serde", + "serde_json", + "signature 2.2.0", + "zeroize", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1627,21 +1768,21 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "lexopt" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa0e2a1fcbe2f6be6c42e342259976206b383122fc152e872795338b5a3f3a7" +checksum = "803ec87c9cfb29b9d2633f20cba1f488db3fd53f2158b1024cbefb47ba05d413" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libgit2-sys" -version = "0.18.3+1.9.2" +version = "0.18.5+1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" +checksum = "005d6ae6eac1912906073e069f7db60b1fa98e052a68227824afe3e3a1c59ca2" dependencies = [ "cc", "libc", @@ -1651,26 +1792,15 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags", - "libc", - "redox_syscall", -] +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libz-sys" -version = "1.1.20" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -1680,60 +1810,70 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "litrs" -version = "0.4.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.22" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" [[package]] name = "lru" -version = "0.16.0" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ea4e65087ff52f3862caff188d489f1fab49a0cb09e01b2e3f1a617b10aaed" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "match-lookup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -1743,10 +1883,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] -name = "memchr" -version = "2.7.4" +name = "meilisearch-index-setting-macro" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "93b5b21df781c820a9cc387b808d4128cbc164dd28d67ac6ed666a00996f8f15" +dependencies = [ + "convert_case 0.8.0", + "proc-macro2", + "quote", + "structmeta", + "syn 2.0.117", +] + +[[package]] +name = "meilisearch-sdk" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e6e3646ba2a9a306296c1edf4a050508a408c1b59ca456d9ad4965ec6e91e9" +dependencies = [ + "async-trait", + "bytes", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "iso8601", + "jsonwebtoken", + "log", + "meilisearch-index-setting-macro", + "pin-project-lite", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.18", + "time", + "tokio", + "uuid", + "wasm-bindgen-futures", + "web-sys", + "yaup", +] + +[[package]] +name = "memchr" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "memoffset" @@ -1773,15 +1956,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1794,28 +1968,37 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ - "hermit-abi", "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] name = "multibase" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" dependencies = [ "base-x", + "base256emoji", "data-encoding", "data-encoding-macro", ] +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "nonempty" version = "0.9.0" @@ -1842,36 +2025,34 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi", + "windows-sys 0.61.2", ] [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.6", "smallvec", "zeroize", ] [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -1903,20 +2084,11 @@ dependencies = [ "libm", ] -[[package]] -name = "object" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -1930,12 +2102,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.13.2" @@ -1950,9 +2116,9 @@ dependencies = [ [[package]] name = "p384" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" dependencies = [ "ecdsa", "elliptic-curve", @@ -1970,15 +2136,15 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "rand_core", + "rand_core 0.6.4", "sha2", ] [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1986,15 +2152,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -2017,35 +2183,15 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkcs1" @@ -2070,9 +2216,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "poly1305" @@ -2105,9 +2251,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2120,9 +2266,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -2193,14 +2339,69 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b439bd4242da51d62d18c95e6a6add749346756b0d1a587dfd0cc22fa6b5f3f0" dependencies = [ - "rand", + "rand 0.8.6", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -2250,7 +2451,7 @@ dependencies = [ "siphasher", "sqlite", "tempfile", - "thiserror 2.0.14", + "thiserror 2.0.18", "uds_windows", "unicode-normalization", ] @@ -2273,7 +2474,7 @@ dependencies = [ "serde", "serde_json", "signature 2.2.0", - "thiserror 2.0.14", + "thiserror 2.0.18", ] [[package]] @@ -2290,7 +2491,7 @@ dependencies = [ "schemars", "serde", "sqlite", - "thiserror 2.0.14", + "thiserror 2.0.18", ] [[package]] @@ -2311,7 +2512,7 @@ dependencies = [ "sqlite", "ssh-agent-lib", "ssh-key", - "thiserror 2.0.14", + "thiserror 2.0.18", "winpipe", "zeroize", ] @@ -2336,7 +2537,7 @@ dependencies = [ "percent-encoding", "radicle-std-ext", "serde", - "thiserror 1.0.63", + "thiserror 1.0.69", ] [[package]] @@ -2345,7 +2546,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db7817cae00f00f0e9a804b08e32d7846e97ae66fff8114d5a0d8c848de80ad5" dependencies = [ - "thiserror 2.0.14", + "thiserror 2.0.18", ] [[package]] @@ -2377,15 +2578,16 @@ dependencies = [ "radicle", "radicle-crypto", "radicle-job", + "radicle-search", "radicle-surf", "radicle-term", "serde", "serde_json", "tempfile", - "thiserror 2.0.14", + "thiserror 2.0.18", "tokio", "tokio-util", - "tower 0.5.2", + "tower", "tower-http", "tracing", "tracing-logfmt", @@ -2410,7 +2612,7 @@ dependencies = [ "radicle", "serde", "serde_json", - "thiserror 2.0.14", + "thiserror 2.0.18", "url", "uuid", ] @@ -2435,6 +2637,24 @@ dependencies = [ "serde", ] +[[package]] +name = "radicle-search" +version = "0.1.0" +dependencies = [ + "anyhow", + "chrono", + "lexopt", + "meilisearch-sdk", + "radicle", + "radicle-surf", + "serde", + "serde_json", + "thiserror 2.0.18", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "radicle-signals" version = "0.11.0" @@ -2468,7 +2688,7 @@ dependencies = [ "radicle-std-ext", "serde", "tar", - "thiserror 1.0.63", + "thiserror 1.0.69", "url", ] @@ -2485,8 +2705,8 @@ dependencies = [ "inquire", "libc", "radicle-signals", - "shlex", - "thiserror 2.0.14", + "shlex 1.3.0", + "thiserror 2.0.18", "unicode-display-width", "unicode-segmentation", "winsplit", @@ -2495,13 +2715,23 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", ] [[package]] @@ -2511,7 +2741,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", ] [[package]] @@ -2520,14 +2760,23 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", ] [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] @@ -2553,48 +2802,63 @@ dependencies = [ ] [[package]] -name = "regex" -version = "1.10.6" +name = "regex-automata" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.4", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] -name = "regex-syntax" -version = "0.8.4" +name = "reqwest" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", +] [[package]] name = "rfc6979" @@ -2607,10 +2871,24 @@ dependencies = [ ] [[package]] -name = "rsa" -version = "0.9.6" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ "const-oid", "digest", @@ -2619,7 +2897,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sha2", "signature 2.2.0", "spki", @@ -2628,10 +2906,10 @@ dependencies = [ ] [[package]] -name = "rustc-demangle" -version = "0.1.24" +name = "rustc-hash" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -2644,41 +2922,63 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "linux-raw-sys", + "windows-sys 0.61.2", ] [[package]] -name = "rustix" -version = "1.0.8" +name = "rustls" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "schemars" @@ -2742,15 +3042,15 @@ checksum = "be9665e92f9b596cf2b20a8c0f55126cfee3514307740a859f1b25bc929e4947" dependencies = [ "base64 0.22.1", "errno", - "getrandom 0.2.15", + "getrandom 0.2.17", "libc", ] [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -2764,12 +3064,13 @@ dependencies = [ [[package]] name = "serde-untagged" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" dependencies = [ "erased-serde", "serde", + "serde_core", "typeid", ] @@ -2806,9 +3107,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "indexmap", "itoa", @@ -2820,12 +3121,13 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -2842,9 +3144,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2866,6 +3168,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "signal-hook" version = "0.3.18" @@ -2878,9 +3186,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio", @@ -2889,18 +3197,19 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] [[package]] name = "signals_receipts" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3adf3706076a9fdded5de487d2a0f378353c240b0dfec9028ba7ab299ca4a14f" +checksum = "8400878c2b53f6e3e224fcbdf20d87743a5c6547129f0a6a227f8282b6c6910b" dependencies = [ "cfg-if", "errno", @@ -2921,41 +3230,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3025,7 +3334,7 @@ dependencies = [ "ssh-encoding", "ssh-key", "subtle", - "thiserror 2.0.14", + "thiserror 2.0.18", ] [[package]] @@ -3058,9 +3367,9 @@ dependencies = [ [[package]] name = "ssh-key" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca9b366a80cf18bb6406f4cf4d10aebfb46140a8c0c33f666a144c5c76ecbafc" +checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" dependencies = [ "bcrypt-pbkdf", "ed25519-dalek", @@ -3068,7 +3377,7 @@ dependencies = [ "p256", "p384", "p521", - "rand_core", + "rand_core 0.6.4", "rsa", "sec1", "sha2", @@ -3081,9 +3390,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" @@ -3091,6 +3400,29 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "structmeta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive", + "syn 2.0.117", +] + +[[package]] +name = "structmeta-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "subtle" version = "2.6.1" @@ -3127,9 +3459,12 @@ checksum = "2b115b4cc742d11625f50e0e48ab15baf6fa548c2ec33a8d4113711886316a4f" [[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", +] [[package]] name = "synstructure" @@ -3144,9 +3479,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.45" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" dependencies = [ "filetime", "libc", @@ -3155,50 +3490,50 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.20.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.4.2", "once_cell", - "rustix 1.0.8", - "windows-sys 0.59.0", + "rustix", + "windows-sys 0.61.2", ] [[package]] name = "terminal_size" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +checksum = "230a1b821ccbd75b185820a1f1ff7b14d21da1e442e22c0863ea5f08771a8874" dependencies = [ - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix", + "windows-sys 0.61.2", ] [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.63", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.14" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.14", + "thiserror-impl 2.0.18", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", @@ -3207,9 +3542,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.14" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -3218,40 +3553,39 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -3259,9 +3593,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -3269,9 +3603,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -3284,34 +3618,41 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.18" @@ -3327,24 +3668,9 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -3357,23 +3683,26 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ "async-compression", "bitflags", "bytes", "futures-core", + "futures-util", "http", "http-body", "http-body-util", "pin-project-lite", "tokio", "tokio-util", + "tower", "tower-layer", "tower-service", "tracing", + "url", ] [[package]] @@ -3390,9 +3719,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -3402,9 +3731,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -3413,9 +3742,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -3423,9 +3752,9 @@ dependencies = [ [[package]] name = "tracing-logfmt" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" +checksum = "a250055a3518b5efba928a18ffac8d32d42ea607a9affff4532144cd5b2e378e" dependencies = [ "time", "tracing", @@ -3435,14 +3764,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "thread_local", "tracing", @@ -3463,26 +3792,26 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "uds_windows" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "winapi", + "windows-sys 0.61.2", ] [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-display-width" @@ -3495,24 +3824,24 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -3543,15 +3872,28 @@ dependencies = [ ] [[package]] -name = "url" -version = "2.5.4" +name = "untrusted" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -3568,9 +3910,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -3580,9 +3922,9 @@ dependencies = [ [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -3607,26 +3949,17 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -3635,14 +3968,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" dependencies = [ "cfg-if", "once_cell", @@ -3652,10 +3985,20 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.114" +name = "wasm-bindgen-futures" +version = "0.4.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.122" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3663,9 +4006,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" dependencies = [ "bumpalo", "proc-macro2", @@ -3676,9 +4019,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" dependencies = [ "unicode-ident", ] @@ -3705,6 +4048,19 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wasmparser" version = "0.244.0" @@ -3717,6 +4073,16 @@ dependencies = [ "semver", ] +[[package]] +name = "web-sys" +version = "0.3.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-time" version = "1.1.0" @@ -3727,6 +4093,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" @@ -3761,24 +4136,28 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +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.58.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", - "windows-targets 0.52.6", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -3792,6 +4171,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "windows-interface" version = "0.58.0" @@ -3803,6 +4193,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "windows-link" version = "0.2.1" @@ -3818,16 +4219,34 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -3837,15 +4256,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" @@ -4001,7 +4411,7 @@ checksum = "1ccf671d62d1bd0c913d9059e69bb4a6b51f7a4c899ab83c62d921e35f206053" dependencies = [ "defer-heavy", "log", - "rand", + "rand 0.8.6", "sync-ptr", "windows", ] @@ -4021,6 +4431,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -4032,15 +4448,6 @@ dependencies = [ "wit-parser", ] -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] - [[package]] name = "wit-bindgen-rust" version = "0.51.0" @@ -4111,19 +4518,18 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "xattr" -version = "1.3.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "linux-raw-sys 0.4.14", - "rustix 0.38.35", + "rustix", ] [[package]] @@ -4133,12 +4539,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] -name = "yoke" -version = "0.8.0" +name = "yaup" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "b0144f1a16a199846cb21024da74edd930b43443463292f536b7110b4855b5c6" dependencies = [ + "form_urlencoded", "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ "stable_deref_trait", "yoke-derive", "zerofrom", @@ -4146,9 +4562,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -4158,19 +4574,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" dependencies = [ "proc-macro2", "quote", @@ -4179,18 +4594,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -4200,15 +4615,29 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -4217,9 +4646,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -4228,9 +4657,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..e5dd47a57 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,21 @@ +[workspace] +members = ["crates/*"] +resolver = "2" + +[workspace.package] +license = "MIT OR Apache-2.0" +homepage = "https://radicle.dev" + +[workspace.dependencies] +anyhow = "1" +chrono = { version = "0.4.41", default-features = false, features = ["clock"] } +lexopt = "0.3.1" +meilisearch-sdk = "0.33.0" +radicle = "0.24.0" +radicle-surf = { version = "0.27.1", default-features = false } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +thiserror = "2" +tokio = { version = "1.47.1", default-features = false } +tracing = { version = "0.1.41", default-features = false, features = ["std", "log"] } +tracing-subscriber = { version = "0.3.19", default-features = false, features = ["std", "ansi", "fmt"] } diff --git a/radicle-httpd/CHANGELOG.md b/crates/radicle-httpd/CHANGELOG.md similarity index 100% rename from radicle-httpd/CHANGELOG.md rename to crates/radicle-httpd/CHANGELOG.md diff --git a/radicle-httpd/Cargo.toml b/crates/radicle-httpd/Cargo.toml similarity index 65% rename from radicle-httpd/Cargo.toml rename to crates/radicle-httpd/Cargo.toml index 1b9b93589..c4df87e24 100644 --- a/radicle-httpd/Cargo.toml +++ b/crates/radicle-httpd/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "radicle-httpd" description = "Radicle HTTP daemon" -homepage = "https://radicle.dev" -license = "MIT OR Apache-2.0" +homepage.workspace = true +license.workspace = true version = "0.25.0" authors = ["cloudhead ", "sebastinez "] edition = "2021" @@ -21,38 +21,39 @@ name = "radicle-httpd" path = "src/main.rs" [dependencies] -anyhow = { version = "1" } +anyhow.workspace = true axum = { version = "0.8.4", default-features = false, features = ["json", "query", "tokio", "http1"] } axum-listener = { version = "0.2.2" } base64 = { version = "0.22.1" } -chrono = { version = "0.4.41", default-features = false, features = ["clock"] } +chrono.workspace = true futures-util = { version = "0.3.32", default-features = false } hyper = { version = "1.6.0", default-features = false } infer = { version = "0.19.0" } -lexopt = { version = "0.3.1" } +lexopt.workspace = true lru = { version = "0.16.0" } mime_guess = { version = "2.0.5" } nonempty = { version = "0.12.0", features = ["serialize"] } -radicle = { version = "0.24.0" } +radicle.workspace = true radicle-job = { version = "0.6.0" } -radicle-surf = { version = "0.27.1", default-features = false, features = ["serde"] } +radicle-search = { path = "../radicle-search" } +radicle-surf = { workspace = true, features = ["serde"] } radicle-term = { version = "0.18.0", default-features = false } -serde = { version = "1", features = ["derive"] } -serde_json = { version = "1", features = ["preserve_order"] } -thiserror = { version = "2" } -tokio = { version = "1.47.1", default-features = false, features = ["macros", "rt-multi-thread", "signal", "process", "io-util"] } +serde.workspace = true +serde_json = { workspace = true, features = ["preserve_order"] } +thiserror.workspace = true +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "signal", "process", "io-util"] } tokio-util = { version = "0.7.18", default-features = false, features = ["io"] } tower-http = { version = "0.6.6", default-features = false, features = ["trace", "cors", "set-header", "decompression-full"] } -tracing = { version = "0.1.41", default-features = false, features = ["std", "log"] } +tracing.workspace = true tracing-logfmt = { version = "0.3.5", optional = true } -tracing-subscriber = { version = "0.3.19", default-features = false, features = ["std", "ansi", "fmt"] } +tracing-subscriber.workspace = true url = { version = "2.5.4", features = ["serde"] } uuid = { version = "1.13.1", features = ["serde"] } [dev-dependencies] hyper = { version = "1.6", default-features = false, features = ["client"] } pretty_assertions = { version = "1.4.1" } -radicle = { version = "0.24.0", features = ["test"] } +radicle = { workspace = true, features = ["test"] } radicle-crypto = { version = "0.17.0", features = ["test"] } tempfile = { version = "3.20.0" } tower = { version = "0.5.2", features = ["util"] } diff --git a/radicle-httpd/LICENSE-APACHE b/crates/radicle-httpd/LICENSE-APACHE similarity index 100% rename from radicle-httpd/LICENSE-APACHE rename to crates/radicle-httpd/LICENSE-APACHE diff --git a/radicle-httpd/LICENSE-MIT b/crates/radicle-httpd/LICENSE-MIT similarity index 100% rename from radicle-httpd/LICENSE-MIT rename to crates/radicle-httpd/LICENSE-MIT diff --git a/radicle-httpd/RELEASE.md b/crates/radicle-httpd/RELEASE.md similarity index 100% rename from radicle-httpd/RELEASE.md rename to crates/radicle-httpd/RELEASE.md diff --git a/radicle-httpd/build.rs b/crates/radicle-httpd/build.rs similarity index 100% rename from radicle-httpd/build.rs rename to crates/radicle-httpd/build.rs diff --git a/radicle-httpd/build/Dockerfile b/crates/radicle-httpd/build/Dockerfile similarity index 100% rename from radicle-httpd/build/Dockerfile rename to crates/radicle-httpd/build/Dockerfile diff --git a/radicle-httpd/build/TARGETS b/crates/radicle-httpd/build/TARGETS similarity index 100% rename from radicle-httpd/build/TARGETS rename to crates/radicle-httpd/build/TARGETS diff --git a/radicle-httpd/build/build b/crates/radicle-httpd/build/build similarity index 100% rename from radicle-httpd/build/build rename to crates/radicle-httpd/build/build diff --git a/radicle-httpd/build/changelog b/crates/radicle-httpd/build/changelog similarity index 100% rename from radicle-httpd/build/changelog rename to crates/radicle-httpd/build/changelog diff --git a/radicle-httpd/build/checksums b/crates/radicle-httpd/build/checksums similarity index 100% rename from radicle-httpd/build/checksums rename to crates/radicle-httpd/build/checksums diff --git a/radicle-httpd/build/config.toml b/crates/radicle-httpd/build/config.toml similarity index 100% rename from radicle-httpd/build/config.toml rename to crates/radicle-httpd/build/config.toml diff --git a/radicle-httpd/build/macos-sdk-11.3.tar.xz b/crates/radicle-httpd/build/macos-sdk-11.3.tar.xz similarity index 100% rename from radicle-httpd/build/macos-sdk-11.3.tar.xz rename to crates/radicle-httpd/build/macos-sdk-11.3.tar.xz diff --git a/radicle-httpd/build/tag b/crates/radicle-httpd/build/tag similarity index 100% rename from radicle-httpd/build/tag rename to crates/radicle-httpd/build/tag diff --git a/radicle-httpd/build/upload b/crates/radicle-httpd/build/upload similarity index 100% rename from radicle-httpd/build/upload rename to crates/radicle-httpd/build/upload diff --git a/radicle-httpd/build/version b/crates/radicle-httpd/build/version similarity index 100% rename from radicle-httpd/build/version rename to crates/radicle-httpd/build/version diff --git a/radicle-httpd/debian/build-deb b/crates/radicle-httpd/debian/build-deb similarity index 100% rename from radicle-httpd/debian/build-deb rename to crates/radicle-httpd/debian/build-deb diff --git a/radicle-httpd/debian/cargo-checksum.json b/crates/radicle-httpd/debian/cargo-checksum.json similarity index 100% rename from radicle-httpd/debian/cargo-checksum.json rename to crates/radicle-httpd/debian/cargo-checksum.json diff --git a/radicle-httpd/debian/changelog b/crates/radicle-httpd/debian/changelog similarity index 100% rename from radicle-httpd/debian/changelog rename to crates/radicle-httpd/debian/changelog diff --git a/radicle-httpd/debian/compat b/crates/radicle-httpd/debian/compat similarity index 100% rename from radicle-httpd/debian/compat rename to crates/radicle-httpd/debian/compat diff --git a/radicle-httpd/debian/control b/crates/radicle-httpd/debian/control similarity index 100% rename from radicle-httpd/debian/control rename to crates/radicle-httpd/debian/control diff --git a/radicle-httpd/debian/copyright b/crates/radicle-httpd/debian/copyright similarity index 100% rename from radicle-httpd/debian/copyright rename to crates/radicle-httpd/debian/copyright diff --git a/radicle-httpd/debian/install b/crates/radicle-httpd/debian/install similarity index 100% rename from radicle-httpd/debian/install rename to crates/radicle-httpd/debian/install diff --git a/radicle-httpd/debian/lintian-overrides b/crates/radicle-httpd/debian/lintian-overrides similarity index 100% rename from radicle-httpd/debian/lintian-overrides rename to crates/radicle-httpd/debian/lintian-overrides diff --git a/radicle-httpd/debian/rules b/crates/radicle-httpd/debian/rules similarity index 100% rename from radicle-httpd/debian/rules rename to crates/radicle-httpd/debian/rules diff --git a/radicle-httpd/debian/source/format b/crates/radicle-httpd/debian/source/format similarity index 100% rename from radicle-httpd/debian/source/format rename to crates/radicle-httpd/debian/source/format diff --git a/radicle-httpd/debian/source/lintian-overrides b/crates/radicle-httpd/debian/source/lintian-overrides similarity index 100% rename from radicle-httpd/debian/source/lintian-overrides rename to crates/radicle-httpd/debian/source/lintian-overrides diff --git a/radicle-httpd/radicle-httpd.1.adoc b/crates/radicle-httpd/radicle-httpd.1.adoc similarity index 100% rename from radicle-httpd/radicle-httpd.1.adoc rename to crates/radicle-httpd/radicle-httpd.1.adoc diff --git a/radicle-httpd/src/api.rs b/crates/radicle-httpd/src/api.rs similarity index 93% rename from radicle-httpd/src/api.rs rename to crates/radicle-httpd/src/api.rs index ff32e76ad..dc926a3d6 100644 --- a/radicle-httpd/src/api.rs +++ b/crates/radicle-httpd/src/api.rs @@ -21,6 +21,8 @@ mod json; pub(crate) mod query; mod v1; +pub(crate) use radicle_search::query::SearchClient; + use crate::api::error::Error; use crate::cache::Cache; use crate::Options; @@ -69,15 +71,59 @@ pub struct Context { profile: Arc, cache: Option, web_config: WebConfig, + /// Search backend client, present only when configured via + /// `RADICLE_SEARCH_URL`. When absent, listing and search fall back to + /// the storage walk. + search: Option, } impl Context { - pub fn new(profile: Arc, web_config: WebConfig, options: &Options) -> Self { - Self { + pub fn new( + profile: Arc, + web_config: WebConfig, + options: &Options, + ) -> anyhow::Result { + // Search is optional and resolved at runtime: build a client only + // when configured. A construction failure is non-fatal — httpd still + // starts and serves everything from the storage walk. + let search = match &options.search { + Some(cfg) => match SearchClient::new( + &cfg.url, + cfg.api_key.as_deref(), + &cfg.index_name, + cfg.query_timeout, + ) { + Ok(client) => { + tracing::info!( + "search backend enabled: url={} index={}", + cfg.url, + cfg.index_name + ); + Some(client) + } + Err(e) => { + tracing::warn!( + "failed to construct search backend client, \ + falling back to storage walk: {e:#}" + ); + None + } + }, + None => None, + }; + + Ok(Self { profile: profile.clone(), cache: options.cache.map(Cache::new), web_config, - } + search, + }) + } + + /// The search backend client, if one is configured and reachable at + /// startup. `None` means listing and search use the storage walk. + pub fn search(&self) -> Option<&SearchClient> { + self.search.as_ref() } #[allow(clippy::result_large_err)] @@ -366,13 +412,13 @@ mod search { impl Ord for SearchResult { fn cmp(&self, other: &Self) -> Ordering { - match (self.index, other.index) { + let primary = match (self.index, other.index) { (0, 0) => self.seeds.cmp(&other.seeds), - (0, _) => std::cmp::Ordering::Less, - (_, 0) => std::cmp::Ordering::Greater, - (ai, bi) if ai == bi => self.seeds.cmp(&other.seeds), - (_, _) => self.seeds.cmp(&other.seeds), - } + (0, _) => Ordering::Less, + (_, 0) => Ordering::Greater, + _ => self.seeds.cmp(&other.seeds), + }; + primary.then_with(|| self.rid.cmp(&other.rid)) } } diff --git a/radicle-httpd/src/api/error.rs b/crates/radicle-httpd/src/api/error.rs similarity index 95% rename from radicle-httpd/src/api/error.rs rename to crates/radicle-httpd/src/api/error.rs index 4b105ed24..7c438d554 100644 --- a/radicle-httpd/src/api/error.rs +++ b/crates/radicle-httpd/src/api/error.rs @@ -152,3 +152,14 @@ impl IntoResponse for Error { (status, body).into_response() } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn not_found_maps_to_404() { + let response = Error::NotFound.into_response(); + assert_eq!(response.status(), StatusCode::NOT_FOUND); + } +} diff --git a/radicle-httpd/src/api/json.rs b/crates/radicle-httpd/src/api/json.rs similarity index 100% rename from radicle-httpd/src/api/json.rs rename to crates/radicle-httpd/src/api/json.rs diff --git a/radicle-httpd/src/api/json/cobs.rs b/crates/radicle-httpd/src/api/json/cobs.rs similarity index 100% rename from radicle-httpd/src/api/json/cobs.rs rename to crates/radicle-httpd/src/api/json/cobs.rs diff --git a/radicle-httpd/src/api/json/commit.rs b/crates/radicle-httpd/src/api/json/commit.rs similarity index 100% rename from radicle-httpd/src/api/json/commit.rs rename to crates/radicle-httpd/src/api/json/commit.rs diff --git a/radicle-httpd/src/api/json/diff.rs b/crates/radicle-httpd/src/api/json/diff.rs similarity index 100% rename from radicle-httpd/src/api/json/diff.rs rename to crates/radicle-httpd/src/api/json/diff.rs diff --git a/radicle-httpd/src/api/json/thread.rs b/crates/radicle-httpd/src/api/json/thread.rs similarity index 100% rename from radicle-httpd/src/api/json/thread.rs rename to crates/radicle-httpd/src/api/json/thread.rs diff --git a/radicle-httpd/src/api/query.rs b/crates/radicle-httpd/src/api/query.rs similarity index 72% rename from radicle-httpd/src/api/query.rs rename to crates/radicle-httpd/src/api/query.rs index 839acf5b7..87202e557 100644 --- a/radicle-httpd/src/api/query.rs +++ b/crates/radicle-httpd/src/api/query.rs @@ -2,11 +2,22 @@ use serde::{Deserialize, Serialize}; use radicle::cob::{issue, patch}; +/// Upper bound on caller-supplied `per_page` for paginated list and search +/// endpoints. Larger requests are silently clamped to this value to avoid +/// unbounded fan-out (e.g. N repository lookups, or N Meili results). +pub const MAX_PER_PAGE: usize = 100; + +/// Upper bound on caller-supplied `q` length on search endpoints. Queries +/// longer than this are truncated before being forwarded to the search +/// backend. +pub const MAX_QUERY_LEN: usize = 256; + #[derive(Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct PaginationQuery { #[serde(default)] pub show: RepoQuery, + pub sort: Option, pub page: Option, pub per_page: Option, } @@ -19,6 +30,15 @@ pub enum RepoQuery { Pinned, } +#[derive(Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub enum RepoSort { + #[default] + Rid, + Activity, + Seeding, +} + #[derive(Serialize, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct RawQuery { diff --git a/radicle-httpd/src/api/v1.rs b/crates/radicle-httpd/src/api/v1.rs similarity index 91% rename from radicle-httpd/src/api/v1.rs rename to crates/radicle-httpd/src/api/v1.rs index 12e6637f2..d84037674 100644 --- a/radicle-httpd/src/api/v1.rs +++ b/crates/radicle-httpd/src/api/v1.rs @@ -1,4 +1,5 @@ mod delegates; +mod info; mod node; mod repos; mod stats; @@ -18,6 +19,7 @@ pub fn router(ctx: Context) -> Router { let routes = Router::new() .merge(root_router) + .merge(info::router(ctx.clone())) .merge(node::router(ctx.clone())) .merge(delegates::router(ctx.clone())) .merge(repos::router(ctx.clone())) @@ -45,6 +47,11 @@ async fn root_handler(State(ctx): State) -> impl IntoResponse { "rel": "repo", "type": "GET" }, + { + "href": "/info", + "rel": "info", + "type": "GET" + }, { "href": "/node", "rel": "node", diff --git a/radicle-httpd/src/api/v1/delegates.rs b/crates/radicle-httpd/src/api/v1/delegates.rs similarity index 98% rename from radicle-httpd/src/api/v1/delegates.rs rename to crates/radicle-httpd/src/api/v1/delegates.rs index 9c9a82b06..3734acd8e 100644 --- a/radicle-httpd/src/api/v1/delegates.rs +++ b/crates/radicle-httpd/src/api/v1/delegates.rs @@ -7,7 +7,7 @@ use radicle::identity::Did; use radicle::storage::ReadStorage; use crate::api::error::Error; -use crate::api::query::{PaginationQuery, RepoQuery}; +use crate::api::query::{PaginationQuery, RepoQuery, MAX_PER_PAGE}; use crate::api::Context; use crate::axum_extra::{Path, Query}; @@ -28,9 +28,10 @@ async fn delegates_repos_handler( show, page, per_page, + .. } = qs; let page = page.unwrap_or(0); - let per_page = per_page.unwrap_or(10); + let per_page = per_page.unwrap_or(10).min(MAX_PER_PAGE); let storage = &ctx.profile.storage; let web_config = ctx.web_config().read().await; let pinned = &web_config.pinned; diff --git a/crates/radicle-httpd/src/api/v1/info.rs b/crates/radicle-httpd/src/api/v1/info.rs new file mode 100644 index 000000000..ec5381ea4 --- /dev/null +++ b/crates/radicle-httpd/src/api/v1/info.rs @@ -0,0 +1,70 @@ +use axum::extract::State; +use axum::response::IntoResponse; +use axum::routing::get; +use axum::Router; +use serde::Serialize; + +use crate::api::error::Error; +use crate::api::v1::node; +use crate::api::Context; +use crate::axum_extra::cached_response; + +pub fn router(ctx: Context) -> Router { + Router::new() + .route("/info", get(info_handler)) + .with_state(ctx) +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct HttpdInfo { + /// Whether an external search index is configured for this httpd. + /// Reflects only configuration — `true` does not guarantee the + /// backend is currently reachable. + search_available: bool, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct Info { + node: node::Response, + httpd: HttpdInfo, +} + +/// Aggregate state about this httpd plus the node it sits in front of. +/// Allows clients to bootstrap with a single request instead of hitting +/// `/node` plus any future per-feature endpoints. +/// `GET /info` +async fn info_handler(State(ctx): State) -> impl IntoResponse { + let node = node::build_response(&ctx).await?; + let httpd = HttpdInfo { + search_available: ctx.search().is_some(), + }; + Ok::<_, Error>(cached_response(Info { node, httpd }, 600)) +} + +#[cfg(test)] +mod routes { + use std::net::SocketAddr; + + use axum::extract::connect_info::MockConnectInfo; + use axum::http::StatusCode; + use pretty_assertions::assert_eq; + use serde_json::Value; + + use crate::test::*; + + #[tokio::test] + async fn test_info_without_search() { + let tmp = tempfile::tempdir().unwrap(); + let seed = seed(tmp.path()); + let app = super::router(seed.clone()) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + let response = get(&app, "/info").await; + + assert_eq!(response.status(), StatusCode::OK); + let body: Value = response.json().await; + assert_eq!(body["httpd"]["searchAvailable"], false); + assert!(body["node"].is_object()); + } +} diff --git a/radicle-httpd/src/api/v1/node.rs b/crates/radicle-httpd/src/api/v1/node.rs similarity index 97% rename from radicle-httpd/src/api/v1/node.rs rename to crates/radicle-httpd/src/api/v1/node.rs index b454bd0d6..7489d7f6c 100644 --- a/radicle-httpd/src/api/v1/node.rs +++ b/crates/radicle-httpd/src/api/v1/node.rs @@ -35,7 +35,7 @@ pub fn router(ctx: Context) -> Router { #[derive(Clone, Debug, Default, Serialize)] #[serde(rename_all = "camelCase")] -struct Response { +pub(crate) struct Response { id: String, agent: Option, config: Option, @@ -68,9 +68,9 @@ impl Response { } } -/// Return local node information. -/// `GET /node` -async fn node_handler(State(ctx): State) -> impl IntoResponse { +/// Build the local node response. Used by `GET /node` and by the +/// `GET /info` aggregate. +pub(crate) async fn build_response(ctx: &Context) -> Result { let node_id = ctx.profile.public_key; let home = ctx.profile.database()?; let agent = AddressStore::get(&home, &node_id) @@ -79,7 +79,7 @@ async fn node_handler(State(ctx): State) -> impl IntoResponse { // The call to `is_running` is a blocking call, which has been, anecdotally, slow to respond. // Spawn a thread with a timeout to ensure that the call to `is_running` does not slow down the - // response of the `/node` route too much. + // response of the route too much. let node_state = { let socket = ctx.profile.socket_from_env(); let is_running = timeout( @@ -116,14 +116,19 @@ async fn node_handler(State(ctx): State) -> impl IntoResponse { } }; - let response = Response::new( + Ok(Response::new( node_id, agent, config, node_state.to_string(), ctx.web_config().read().await, - ); + )) +} +/// Return local node information. +/// `GET /node` +async fn node_handler(State(ctx): State) -> impl IntoResponse { + let response = build_response(&ctx).await?; Ok::<_, Error>(cached_response(response, 600)) } diff --git a/radicle-httpd/src/api/v1/repos.rs b/crates/radicle-httpd/src/api/v1/repos.rs similarity index 78% rename from radicle-httpd/src/api/v1/repos.rs rename to crates/radicle-httpd/src/api/v1/repos.rs index c72bd7236..cb0398914 100644 --- a/radicle-httpd/src/api/v1/repos.rs +++ b/crates/radicle-httpd/src/api/v1/repos.rs @@ -1,6 +1,6 @@ mod job; -use std::collections::{BTreeMap, BTreeSet, HashMap}; +use std::collections::{BTreeMap, HashMap}; use axum::extract::{DefaultBodyLimit, State}; use axum::http::header; @@ -17,12 +17,12 @@ use serde_json::json; use radicle::cob::{issue::cache::Issues as _, patch::cache::Patches as _}; use radicle::identity::RepoId; use radicle::node::{Alias, AliasStore, NodeId}; -use radicle::storage::{ReadRepository, ReadStorage, RemoteRepository}; +use radicle::storage::{ReadRepository, RemoteRepository}; use crate::api; use crate::api::error::Error; -use crate::api::query::{CobsQuery, PaginationQuery, RepoQuery}; -use crate::api::search::{SearchQueryString, SearchResult}; +use crate::api::query::{CobsQuery, PaginationQuery, RepoQuery, MAX_PER_PAGE, MAX_QUERY_LEN}; +use crate::api::search::SearchQueryString; use crate::api::Context; use crate::api::PeelToCommit; use crate::axum_extra::{cached_response, immutable_response, Path, Query}; @@ -54,6 +54,295 @@ pub fn router(ctx: Context) -> Router { .layer(DefaultBodyLimit::max(MAX_BODY_LIMIT)) } +/// Storage-walk implementations for repo listing and search. Used directly +/// when no search backend is configured, and as a fallback for sort modes +/// the index doesn't serve (pinned, rid) or when a configured backend is +/// unreachable. +mod storage { + use std::collections::BTreeSet; + + use radicle::node::routing::Store as _; + use radicle::storage::{ReadRepository, ReadStorage}; + use radicle_surf::Repository; + + use crate::api; + use crate::api::error::Error; + use crate::api::query::{RepoQuery, RepoSort}; + use crate::api::search::SearchResult; + use crate::api::Context; + use crate::axum_extra::cached_response; + + /// Repo listing via storage walk. Activity/seeding sorts are collapsed + /// to rid sort — walking storage for every repo per request is too + /// expensive without a pre-computed index. + #[allow(clippy::result_large_err)] + pub fn list_repos( + ctx: &Context, + show: RepoQuery, + sort: RepoSort, + page: usize, + per_page: usize, + web_config: &radicle::web::Config, + ) -> Result, Error> { + let sort = if matches!(show, RepoQuery::All) + && matches!(sort, RepoSort::Activity | RepoSort::Seeding) + { + RepoSort::Rid + } else { + sort + }; + + let storage = &ctx.profile.storage; + let pinned = &web_config.pinned; + let policies = ctx.profile.policies()?; + + let repos = match show { + RepoQuery::All => storage + .repositories()? + .into_iter() + .filter(|repo| repo.doc.visibility().is_public()) + .collect::>(), + RepoQuery::Pinned => storage + .repositories_by_id(pinned.repositories.iter()) + .filter_map(|result| match result { + Ok(repo) => Some(repo), + Err(e) => { + tracing::warn!("Failed to load pinned repository: {}", e); + None + } + }) + .filter(|repo| repo.doc.visibility().is_public()) + .collect::>(), + }; + + let infos = match sort { + RepoSort::Rid => { + let mut repos = repos; + repos.sort_by_key(|p| p.rid); + repos + .into_iter() + .filter_map(|info| { + if !policies.is_seeding(&info.rid).unwrap_or_default() { + return None; + } + let (repo, doc) = ctx.repo(info.rid).ok()?; + ctx.repo_info(&repo, doc).ok() + }) + .skip(page * per_page) + .take(per_page) + .collect::>() + } + RepoSort::Activity => { + let mut with_time: Vec<(radicle::identity::RepoId, i64)> = repos + .into_iter() + .filter_map(|info| { + if !policies.is_seeding(&info.rid).unwrap_or_default() { + return None; + } + let (repo, _doc) = ctx.repo(info.rid).ok()?; + let surf = Repository::open(repo.path()).ok()?; + let head = surf.head().ok()?; + let commit = surf.commit(head).ok()?; + Some((info.rid, commit.committer.time.seconds())) + }) + .collect(); + with_time.sort_by_key(|x| std::cmp::Reverse(x.1)); + with_time + .into_iter() + .skip(page * per_page) + .take(per_page) + .filter_map(|(rid, _)| { + let (repo, doc) = ctx.repo(rid).ok()?; + ctx.repo_info(&repo, doc).ok() + }) + .collect::>() + } + RepoSort::Seeding => { + let db = ctx.profile.database()?; + let mut with_count: Vec<(radicle::identity::RepoId, usize)> = repos + .into_iter() + .filter_map(|info| { + if !policies.is_seeding(&info.rid).unwrap_or_default() { + return None; + } + let count = db.count(&info.rid).unwrap_or_default(); + Some((info.rid, count)) + }) + .collect(); + with_count.sort_by(|a, b| b.1.cmp(&a.1).then_with(|| a.0.cmp(&b.0))); + with_count + .into_iter() + .skip(page * per_page) + .take(per_page) + .filter_map(|(rid, _)| { + let (repo, doc) = ctx.repo(rid).ok()?; + ctx.repo_info(&repo, doc).ok() + }) + .collect::>() + } + }; + + Ok(infos) + } + + /// Substring search via storage walk. Matches are sorted by position + /// of the first match in the name (prefix matches first), with seeding + /// count as tie-breaker. Results are cached for 10 minutes. + #[allow(clippy::result_large_err)] + pub async fn search_repos( + ctx: &Context, + q: &str, + page: usize, + per_page: usize, + ) -> Result { + use axum::response::IntoResponse; + + let storage = &ctx.profile.storage; + let aliases = &ctx.profile.aliases(); + let db = &ctx.profile.database()?; + let found_repos = storage + .repositories()? + .into_iter() + .filter_map(|info| SearchResult::new(q, info, db, aliases)) + .collect::>(); + + let found_repos = found_repos + .into_iter() + .skip(page * per_page) + .take(per_page) + .collect::>(); + + Ok(cached_response(found_repos, 600).into_response()) + } +} + +/// Repo listing and search dispatch. When a search backend is configured +/// (`ctx.search()` is `Some`), activity/seeding sorts and `/repos/search` are +/// served from the Meilisearch index, transparently falling back to the +/// storage walk on any backend failure. Without a backend, or for sort modes +/// the index doesn't serve (pinned, rid), everything uses the storage walk. +mod listing { + use axum::response::IntoResponse; + use axum::Json; + use radicle::node::routing::Store as _; + use radicle::node::AliasStore; + use radicle_search::query::{SearchClient, SortField}; + use serde_json::json; + + use crate::api; + use crate::api::error::Error; + use crate::api::query::{RepoQuery, RepoSort}; + use crate::api::search::SearchResult; + use crate::api::Context; + + #[allow(clippy::result_large_err)] + pub async fn list_repos( + ctx: &Context, + show: RepoQuery, + sort: RepoSort, + page: usize, + per_page: usize, + web_config: &radicle::web::Config, + ) -> Result, Error> { + let search_sort = match (&show, sort) { + (RepoQuery::All, RepoSort::Activity) => Some(SortField::HeadCommitterTime), + (RepoQuery::All, RepoSort::Seeding) => Some(SortField::SeedingCount), + _ => None, + }; + if let (Some(field), Some(client)) = (search_sort, ctx.search()) { + match sorted_repos(ctx, client, field, page, per_page).await { + Ok(infos) => return Ok(infos), + Err(e) => { + tracing::warn!("search backend failed, falling back to storage walk ({e:#})") + } + } + } + super::storage::list_repos(ctx, show, sort, page, per_page, web_config) + } + + #[allow(clippy::result_large_err)] + pub async fn search_repos( + ctx: &Context, + q: &str, + page: usize, + per_page: usize, + ) -> Result { + if let Some(client) = ctx.search() { + match search_by_query(ctx, client, q, page, per_page).await { + Ok(response) => return Ok(response), + Err(e) => { + tracing::warn!("search backend failed, falling back to storage walk ({e:#})") + } + } + } + super::storage::search_repos(ctx, q, page, per_page).await + } + + /// Full-text search via Meilisearch. Typo-tolerant prefix matching with + /// seedingCount tie-breaking. Returns `Err` on any backend failure so the + /// caller falls back to the storage walk. + async fn search_by_query( + ctx: &Context, + client: &SearchClient, + q: &str, + page: usize, + per_page: usize, + ) -> anyhow::Result { + let rids = client.search_by_query(q, page * per_page, per_page).await?; + let aliases = ctx.profile.aliases(); + let db = ctx.profile.database()?; + let found_repos: Vec = rids + .into_iter() + .enumerate() + .filter_map(|(i, rid)| { + let (_repo, doc_at) = ctx.repo(rid).ok()?; + let seeds = db.count(&rid).unwrap_or_default(); + let delegates = doc_at + .doc + .delegates() + .iter() + .map(|did| match aliases.alias(did) { + Some(alias) => json!({ "id": did, "alias": alias }), + None => json!({ "id": did }), + }) + .collect(); + Some(SearchResult { + rid, + payloads: doc_at.doc.payload().clone(), + delegates, + seeds, + index: i, + }) + }) + .collect(); + Ok(Json(found_repos).into_response()) + } + + /// Sorted repo listing (activity/seeding) via the index. Returns `Err` on + /// backend failure so the caller falls back to the storage walk. + async fn sorted_repos( + ctx: &Context, + client: &SearchClient, + field: SortField, + page: usize, + per_page: usize, + ) -> anyhow::Result> { + let policies = ctx.profile.policies()?; + let offset = page.saturating_mul(per_page); + let rids = client.sorted_rids(field, offset, per_page).await?; + Ok(rids + .into_iter() + .filter_map(|rid| { + if !policies.is_seeding(&rid).unwrap_or_default() { + return None; + } + let (repo, doc) = ctx.repo(rid).ok()?; + ctx.repo_info(&repo, doc).ok() + }) + .collect()) + } +} + /// List all repos. /// `GET /repos` async fn repo_root_handler( @@ -62,95 +351,36 @@ async fn repo_root_handler( ) -> impl IntoResponse { let PaginationQuery { show, + sort, page, per_page, } = qs; let page = page.unwrap_or(0); + let sort = sort.unwrap_or_default(); let web_config = ctx.web_config().read().await; - let per_page = per_page.unwrap_or_else(|| match show { - RepoQuery::Pinned => web_config.pinned.repositories.len(), - _ => 10, - }); - let storage = &ctx.profile.storage; - let pinned = &web_config.pinned; - let policies = ctx.profile.policies()?; - - let mut repos = match show { - RepoQuery::All => storage - .repositories()? - .into_iter() - .filter(|repo| repo.doc.visibility().is_public()) - .collect::>(), - RepoQuery::Pinned => storage - .repositories_by_id(pinned.repositories.iter()) - .filter_map(|result| match result { - Ok(repo) => Some(repo), - Err(e) => { - tracing::warn!("Failed to load pinned repository: {}", e); - None - } - }) - .filter(|repo| repo.doc.visibility().is_public()) - .collect::>(), + let per_page = match per_page { + Some(n) => n.min(MAX_PER_PAGE), + None => match show { + RepoQuery::Pinned => web_config.pinned.repositories.len(), + _ => 10, + }, }; - repos.sort_by_key(|p| p.rid); - - let infos = repos - .into_iter() - .filter_map(|info| { - if !policies.is_seeding(&info.rid).unwrap_or_default() { - return None; - } - let Ok((repo, doc)) = ctx.repo(info.rid) else { - return None; - }; - let Ok(repo_info) = ctx.repo_info(&repo, doc) else { - return None; - }; - - Some(repo_info) - }) - .skip(page * per_page) - .take(per_page) - .collect::>(); + let infos = listing::list_repos(&ctx, show, sort, page, per_page, &web_config).await?; Ok::<_, Error>(Json(infos)) } /// Search repositories by name. /// `GET /repos/search?q=` -/// -/// We obtain the byte index of the first character of the query that matches the repo name. -/// And skip if the query doesn't match the repo name. -/// -/// Sorting algorithm: -/// If both byte indices are 0, compare by seeding count. -/// A repo name with a byte index of 0 should come before non-zero indices. -/// If both indices are non-zero and equal, then compare by seeding count. -/// If none of the above, all non-zero indices are compared by their seeding count primarily. async fn repo_search_handler( State(ctx): State, Query(SearchQueryString { q, per_page, page }): Query, ) -> impl IntoResponse { - let q = q.unwrap_or_default(); + let q: String = q.unwrap_or_default().chars().take(MAX_QUERY_LEN).collect(); let page = page.unwrap_or(0); - let per_page = per_page.unwrap_or(10); - let storage = &ctx.profile.storage; - let aliases = &ctx.profile.aliases(); - let db = &ctx.profile.database()?; - let found_repos = storage - .repositories()? - .into_iter() - .filter_map(|info| SearchResult::new(&q, info, db, aliases)) - .collect::>(); + let per_page = per_page.unwrap_or(10).min(MAX_PER_PAGE); - let found_repos = found_repos - .into_iter() - .skip(page * per_page) - .take(per_page) - .collect::>(); - - Ok::<_, Error>(cached_response(found_repos, 600).into_response()) + listing::search_repos(&ctx, &q, page, per_page).await } /// Get repo metadata. @@ -690,7 +920,7 @@ async fn issues_handler( }) .collect::>(); - issues.sort_by(|(_, a), (_, b)| b.timestamp().cmp(&a.timestamp())); + issues.sort_by_key(|(_, b)| std::cmp::Reverse(b.timestamp())); let aliases = &ctx.profile.aliases(); let issues = issues .into_iter() @@ -745,7 +975,7 @@ async fn patches_handler( (status.matches(patch.state())).then_some((id, patch)) }) .collect::>(); - patches.sort_by(|(_, a), (_, b)| b.timestamp().cmp(&a.timestamp())); + patches.sort_by_key(|(_, b)| std::cmp::Reverse(b.timestamp())); let aliases = ctx.profile.aliases(); let patches = patches .into_iter() @@ -964,6 +1194,136 @@ mod routes { ); } + #[tokio::test] + async fn test_repos_root_sort_seeding() { + let tmp = tempfile::tempdir().unwrap(); + let app = super::router(seed(tmp.path())) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + let response = get(&app, "/repos?show=all&sort=seeding").await; + + assert_eq!(response.status(), StatusCode::OK); + let body: serde_json::Value = response.json().await; + let rids: Vec<&str> = body + .as_array() + .unwrap() + .iter() + .map(|repo| repo["rid"].as_str().unwrap()) + .collect(); + assert_eq!(rids.len(), 2); + assert!(rids.contains(&RID)); + assert!(rids.contains(&"rad:z4GypKmh1gkEfmkXtarcYnkvtFUfE")); + } + + #[tokio::test] + async fn test_repos_root_sort_activity() { + let tmp = tempfile::tempdir().unwrap(); + let app = super::router(seed(tmp.path())) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + let response = get(&app, "/repos?show=all&sort=activity").await; + + assert_eq!(response.status(), StatusCode::OK); + let body: serde_json::Value = response.json().await; + let rids: Vec<&str> = body + .as_array() + .unwrap() + .iter() + .map(|repo| repo["rid"].as_str().unwrap()) + .collect(); + // Without a search backend, activity sort collapses to rid sort. + // hello-world's rid sorts before again-hello-world's. + assert_eq!(rids, vec![RID, "rad:z4GypKmh1gkEfmkXtarcYnkvtFUfE"]); + } + + #[tokio::test] + async fn test_repos_root_sort_falls_back_without_search() { + // Without a search backend, sort=activity and sort=seeding should + // produce the same response as the default rid sort, instead of + // walking storage and opening every repo per request. + let tmp = tempfile::tempdir().unwrap(); + let app = super::router(seed(tmp.path())) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + + let rid_sorted: serde_json::Value = get(&app, "/repos?show=all").await.json().await; + let activity_sorted: serde_json::Value = get(&app, "/repos?show=all&sort=activity") + .await + .json() + .await; + let seeding_sorted: serde_json::Value = + get(&app, "/repos?show=all&sort=seeding").await.json().await; + + assert_eq!(rid_sorted, activity_sorted); + assert_eq!(rid_sorted, seeding_sorted); + } + + #[tokio::test] + async fn test_repos_per_page_is_clamped() { + // A caller requesting more than MAX_PER_PAGE must not be able to + // pull an unbounded result set. With the small fixture we can't + // observe the cap directly, but the request must succeed and the + // returned length must respect the cap. + let tmp = tempfile::tempdir().unwrap(); + let app = super::router(seed(tmp.path())) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + let response = get(&app, "/repos?show=all&perPage=99999").await; + + assert_eq!(response.status(), StatusCode::OK); + let body: serde_json::Value = response.json().await; + let len = body.as_array().unwrap().len(); + assert!(len <= super::MAX_PER_PAGE); + } + + #[tokio::test] + async fn test_repos_search_per_page_is_clamped() { + let tmp = tempfile::tempdir().unwrap(); + let app = super::router(seed(tmp.path())) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + let response = get(&app, "/repos/search?q=hello&perPage=99999").await; + + assert_eq!(response.status(), StatusCode::OK); + let body: serde_json::Value = response.json().await; + let len = body.as_array().unwrap().len(); + assert!(len <= super::MAX_PER_PAGE); + } + + #[tokio::test] + async fn test_repos_search_fallback_sets_cache_control() { + // Without a search backend, /repos/search runs the storage-walk + // substring scan and must still set Cache-Control so intermediaries + // can serve repeat queries from cache. + let tmp = tempfile::tempdir().unwrap(); + let app = super::router(seed(tmp.path())) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + let response = get(&app, "/repos/search?q=hello").await; + + assert_eq!(response.status(), StatusCode::OK); + let cache_control = response + .headers() + .get("cache-control") + .expect("cache-control header should be present") + .to_str() + .unwrap(); + assert!( + cache_control.contains("max-age=600"), + "unexpected cache-control: {cache_control}" + ); + } + + #[tokio::test] + async fn test_repos_search_clamps_long_query() { + // A user-supplied `q` longer than MAX_QUERY_LEN is truncated rather + // than rejected; the request still succeeds. + let tmp = tempfile::tempdir().unwrap(); + let app = super::router(seed(tmp.path())) + .layer(MockConnectInfo(SocketAddr::from(([127, 0, 0, 1], 8080)))); + let long_q = "a".repeat(super::MAX_QUERY_LEN * 4); + let response = get(&app, format!("/repos/search?q={long_q}")).await; + + assert_eq!(response.status(), StatusCode::OK); + let body: serde_json::Value = response.json().await; + // Substring scan over "aaa…" finds no repo names; clamp didn't crash. + assert_eq!(body.as_array().unwrap().len(), 0); + } + #[tokio::test] async fn test_repos() { let tmp = tempfile::tempdir().unwrap(); diff --git a/radicle-httpd/src/api/v1/repos/job.rs b/crates/radicle-httpd/src/api/v1/repos/job.rs similarity index 100% rename from radicle-httpd/src/api/v1/repos/job.rs rename to crates/radicle-httpd/src/api/v1/repos/job.rs diff --git a/radicle-httpd/src/api/v1/stats.rs b/crates/radicle-httpd/src/api/v1/stats.rs similarity index 100% rename from radicle-httpd/src/api/v1/stats.rs rename to crates/radicle-httpd/src/api/v1/stats.rs diff --git a/radicle-httpd/src/axum_extra.rs b/crates/radicle-httpd/src/axum_extra.rs similarity index 100% rename from radicle-httpd/src/axum_extra.rs rename to crates/radicle-httpd/src/axum_extra.rs diff --git a/radicle-httpd/src/cache.rs b/crates/radicle-httpd/src/cache.rs similarity index 100% rename from radicle-httpd/src/cache.rs rename to crates/radicle-httpd/src/cache.rs diff --git a/radicle-httpd/src/error.rs b/crates/radicle-httpd/src/error.rs similarity index 100% rename from radicle-httpd/src/error.rs rename to crates/radicle-httpd/src/error.rs diff --git a/radicle-httpd/src/git.rs b/crates/radicle-httpd/src/git.rs similarity index 100% rename from radicle-httpd/src/git.rs rename to crates/radicle-httpd/src/git.rs diff --git a/radicle-httpd/src/lib.rs b/crates/radicle-httpd/src/lib.rs similarity index 95% rename from radicle-httpd/src/lib.rs rename to crates/radicle-httpd/src/lib.rs index 0c395f45a..ec0d03a18 100644 --- a/radicle-httpd/src/lib.rs +++ b/crates/radicle-httpd/src/lib.rs @@ -51,6 +51,17 @@ pub struct Options { pub aliases: HashMap, pub listen: DualAddr, pub cache: Option, + /// Search backend configuration. `None` disables search at runtime and + /// falls back to the built-in storage walk. + pub search: Option, +} + +#[derive(Debug, Clone)] +pub struct SearchOptions { + pub url: String, + pub api_key: Option, + pub index_name: String, + pub query_timeout: std::time::Duration, } /// Run the Server. @@ -73,7 +84,7 @@ pub async fn run(options: Options) -> anyhow::Result<()> { let web_config = api::WebConfig::from_profile(&profile); let profile = Arc::new(profile); - let ctx = api::Context::new(profile.clone(), web_config.clone(), &options); + let ctx = api::Context::new(profile.clone(), web_config.clone(), &options)?; #[cfg(unix)] tokio::spawn(async move { @@ -251,11 +262,12 @@ mod routes { aliases: HashMap::new(), listen: DualAddr::Tcp(SocketAddr::from(([0, 0, 0, 0], 8080))), cache: None, + search: None, }; let profile = test::profile(tmp.path(), [0xff; 32]); let web_config = crate::api::WebConfig::from_profile(&profile); let profile = std::sync::Arc::new(profile); - let ctx = crate::api::Context::new(profile.clone(), web_config, &options); + let ctx = crate::api::Context::new(profile.clone(), web_config, &options).unwrap(); let app = super::router(options, profile, ctx) .unwrap() .layer(MockConnectInfo(DualAddr::Tcp(SocketAddr::from(( diff --git a/crates/radicle-httpd/src/main.rs b/crates/radicle-httpd/src/main.rs new file mode 100644 index 000000000..59d3dff17 --- /dev/null +++ b/crates/radicle-httpd/src/main.rs @@ -0,0 +1,218 @@ +use std::num::NonZeroUsize; +use std::{collections::HashMap, process}; + +use anyhow::bail; +use axum_listener::DualAddr; +use radicle::prelude::RepoId; +use radicle::version::Version; +use radicle_httpd as httpd; + +pub const VERSION: Version = Version { + name: "radicle-httpd", + commit: env!("GIT_HEAD"), + version: env!("RADICLE_VERSION"), + timestamp: env!("SOURCE_DATE_EPOCH"), +}; + +pub const HELP_MSG: &str = r#" +Usage + + radicle-httpd [