From 76cfff2f24249c85b610e2223dfefab607c4e4ff Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Mon, 10 Aug 2026 23:40:43 +0200 Subject: [PATCH 1/9] Resolve zenoh-flat-jni source in the build, not in the workflow CI tracked zenoh-flat-jni's default branch, which never went stale and was never reproducible: a CI result here stopped being determined by this repository's commit. Record the commit under test in a Cargo.lock instead, through a pin crate at the root that compiles to nothing anyone ships, and let settings.gradle.kts decide where zenoh-flat-jni source comes from - a directory given by -PflatJniDir, a path= in Cargo.toml, or the pinned commit fetched on demand with -PuseLocalFlatJni. A release takes none of those and resolves the Maven artifact; build.gradle.kts fails any publish task while a composite build is present. A lockfile is the pin eclipse-zenoh/ci's lockfile sync already knows how to move, so this repository stays an ordinary dependant of it. The workflow loses its zenoh-flat-jni checkout: the build fetches its own bindings, which is what makes 'gradlew jvmTest -PuseLocalFlatJni=true' reproduce a CI run anywhere. --- .github/workflows/ci.yml | 38 +- .gitignore | 3 + Cargo.lock | 4379 ++++++++++++++++++++++++++++++++++++++ Cargo.toml | 23 + PUBLISHING.md | 89 +- build.gradle.kts | 13 + ci/pin.rs | 1 + rust-toolchain.toml | 5 + settings.gradle.kts | 71 +- 9 files changed, 4582 insertions(+), 40 deletions(-) create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 ci/pin.rs create mode 100644 rust-toolchain.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28edab1b..a3959568 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,34 +27,21 @@ jobs: with: path: zenoh-java - - name: Check out zenoh-flat-jni - uses: actions/checkout@v4 - with: - repository: eclipse-zenoh/zenoh-flat-jni - # No ref: track that repository's default branch. A pinned commit has - # to be hand-edited for every upstream fix, and this is the one hop - # in the chain no bot covers - zenoh-flat-jni's own Cargo.lock is - # kept aligned with zenoh for it, so following its main keeps the - # whole chain automatic. zenoh-flat is not checked out at all: it is - # resolved from git by that lockfile. - path: zenoh-flat-jni - - uses: actions/setup-java@v4 with: distribution: temurin java-version: 11 - # zenoh-flat-jni pins its toolchain in rust-toolchain.toml. Install it - # from that directory, so a missing toolchain fails here rather than - # inside the Gradle build - and so this repo never has to name a version - # its dependency is free to change. + # rust-toolchain.toml here tracks zenoh-flat-jni's own, because that is + # what has to compile. Installing it up front keeps a missing toolchain + # from surfacing in the middle of the Gradle build. # # Nothing else Rust runs here. Formatting, clippy, the feature-leak test # and the native build are zenoh-flat-jni's own CI, on three platforms, - # for the very commit pinned above; re-running them from this repo only - # adds ways for the two toolchains to disagree. + # for the very commit pinned here; re-running them from this repository + # only adds ways for the two toolchains to disagree. - name: Install Rust toolchain - working-directory: zenoh-flat-jni + working-directory: zenoh-java run: rustup show - name: Setup Gradle @@ -62,12 +49,15 @@ jobs: - name: Gradle Test working-directory: zenoh-java - # CI builds against the sibling checkout above, so it opts into the - # composite build explicitly. A release does not: it resolves - # zenoh-flat-jni from Maven Central like any other consumer. + # CI tests against zenoh-flat-jni's source, so it opts into the composite + # build; settings.gradle.kts then fetches the commit Cargo.lock pins. A + # release does not opt in: it resolves zenoh-flat-jni from Maven Central + # like any other consumer. # - # No cargo step precedes this: the composite build's test task depends - # on zenoh-flat-jni's own native build, so Gradle drives cargo. + # No checkout or cargo step precedes this. The build fetches its own + # pinned bindings, and their test task depends on their native build, so + # Gradle drives both git and cargo - which is why `./gradlew jvmTest + # -PuseLocalFlatJni=true` reproduces this run anywhere. run: ./gradlew jvmTest --info -PuseLocalFlatJni=true markdown_lint: diff --git a/.gitignore b/.gitignore index 53d109f6..8f1928d3 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ /build/ /.gradle/ */build/ + +# Fetched by settings.gradle.kts when building against the pinned zenoh-flat-jni +/.zenoh-flat-jni/ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..c19ea899 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4379 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-logd-logger" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0483169d5fac0887f85c2fa8fecfe08669791712d8260de1a6ec30630a62932f" +dependencies = [ + "bytes", + "env_logger", + "lazy_static", + "libc", + "log", + "parking_lot", + "redox_syscall 0.4.1", + "thiserror 1.0.69", + "time", + "winapi", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "asn1-rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.20", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +dependencies = [ + "const_format_proc_macros", + "konst 0.2.20", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_panic" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652" +dependencies = [ + "typewit", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "data-encoding" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "fastbloom" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef975e30683b2d965054bb0a836f8973857c4ebf6acf274fe46617cd285060d8" +dependencies = [ + "foldhash 0.2.0", + "libm", + "portable-atomic", + "siphasher", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin 0.9.9", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +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 = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "humantime" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "if_rust_version" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46dbcb333e86939721589d25a3557e180b52778cb33c7fdfe9e0158ff790d5ec" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipnetwork" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" +dependencies = [ + "serde", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.20", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "keccak" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +dependencies = [ + "cpufeatures 0.2.17", +] + +[[package]] +name = "keyed-set" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d255a6b6ecd77bb93ce91de984d7039bff7503f500eb4851a1269732f22baf" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97feab15b395d1860944abe6a8dd8ed9f8eadfae01750fada8427abda531d887" +dependencies = [ + "const_panic", + "konst_kernel", + "konst_proc_macros", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b1eb7788f3824c629b1116a7a9060d6e898c358ebff59070093d51103dcc3c" +dependencies = [ + "typewit", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + +[[package]] +name = "konst_proc_macros" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00af7901ba50898c9e545c24d5c580c96a982298134e8037d8978b6594782c07" + +[[package]] +name = "kotlin-codegen" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bba9922acc37e9f38dce99ed966c2777c09a458566b75932bdcf2a1717b46b1" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.9", +] + +[[package]] +name = "leb128" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" +dependencies = [ + "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 = "lz4_flex" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8c72594ac26bfd34f2d99dfced2edfaddfe8a476e3ff2ca0eb293d925c4f83" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonempty-collections" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e216d0e8cf9d54fa66e5780f6e1d5dc96d1c1b3c25aeba3b6758548bcbbd8b9d" +dependencies = [ + "serde", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.7", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pest_meta" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c" +dependencies = [ + "pest", +] + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "serde", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pnet_base" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc190d4067df16af3aba49b3b74c469e611cad6314676eaf1157f31aa0fb2f7" +dependencies = [ + "no-std-net", +] + +[[package]] +name = "pnet_datalink" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e70ec0be163102a332e1d2d5586d362ad76b01cec86f830241f2b6452a7b7" +dependencies = [ + "ipnetwork", + "libc", + "pnet_base", + "pnet_sys", + "winapi", +] + +[[package]] +name = "pnet_sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d4643d3d4db6b08741050c2f3afa9a892c4244c085a72fcda93c9c2c9a00f4b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "portable-atomic" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prebindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df70aa887ea86326a03ccd4ddffcad0858c5c1ade86a9b25047f0b6b27222ce2" +dependencies = [ + "if_rust_version", + "itertools", + "konst 0.3.17", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "roxygen", + "serde", + "serde_json", + "syn 2.0.119", + "toml", +] + +[[package]] +name = "prebindgen-flat" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b61ae0f7eea879df64ed40837b4111b09084533648c71a7b5f528ec67063cb05" +dependencies = [ + "prebindgen", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "prebindgen-jni" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa15d7c2b59f15249fa5fd0f97beeff2785587e6046e749c1bbcc15cc00340a9" +dependencies = [ + "jni 0.21.1", + "kotlin-codegen", + "prebindgen", + "prebindgen-jni-runtime", + "prebindgen-registry", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "prebindgen-jni-runtime" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e1c12ad857da45a8c6977a4b5b3395b4f53c8082239dcde925f3b964144531" +dependencies = [ + "jni 0.21.1", +] + +[[package]] +name = "prebindgen-proc-macro" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ec12eecd2811fd1395a20bdd40e3740026be0603bf2812172445fc524c98e7" +dependencies = [ + "prebindgen", + "proc-macro2", + "quote", + "rand 0.9.5", + "serde", + "serde_json", + "syn 2.0.119", +] + +[[package]] +name = "prebindgen-registry" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56a3be56008ab6c8631ea5d6b0df8f7a9142134d39befe6e695679a7d618a12a" +dependencies = [ + "itertools", + "prebindgen", + "prebindgen-flat", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.6.5", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +dependencies = [ + "bytes", + "fastbloom", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.5", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "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]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "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 = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "rcgen" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f6d249aad744e274e682777a50283a225a32705394ee6d5fcc01efa25e4055" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "x509-parser", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.20", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ringbuffer-spsc" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3e7aa0a681b232e7cd7f856a53b10603df88ca74b79a8d8088845185492e35" +dependencies = [ + "array-init", + "crossbeam", +] + +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags 2.13.1", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + +[[package]] +name = "roxygen" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b11e62528dc14c3ea67395458ebb97072fba454c99106da93e1e096152e9104b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni 0.22.4", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[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", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "either", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.3", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "serde", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.14.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2-const-stable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" + +[[package]] +name = "sha3" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shellexpand" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" +dependencies = [ + "dirs", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stabby" +version = "72.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d53d2428934c46277fafd2d41e39357595aa1e47954c75db2b14ed90632f3cc" +dependencies = [ + "rustversion", + "stabby-abi", +] + +[[package]] +name = "stabby-abi" +version = "72.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f375eae680bb54203ee5e47d4cd2ae7b79c0a79ed90919279f38f500ad53f190" +dependencies = [ + "rustc_version", + "rustversion", + "sha2-const-stable", + "stabby-macros", +] + +[[package]] +name = "stabby-macros" +version = "72.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea664671a576c5f7e32fee291ac123d82af5e92b0689beb3555347c00c76eef1" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tls-listener" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1461056cc1ef47003f7ee16e4cef3741068d4c7f6b627bfce49b7c00c120a530" +dependencies = [ + "futures-util", + "pin-project-lite", + "thiserror 2.0.20", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "token-cell" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb48920ae769b58126c8c93269805011c793201f95fde28b479b81a9a531bbde" +dependencies = [ + "paste", + "portable-atomic", + "rustversion", +] + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2 0.6.5", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.7", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "typewit" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "214ca0b2191785cbc06209b9ca1861e048e39b5ba33574b3cedd58363d5bb5f6" +dependencies = [ + "typewit_proc_macros", +] + +[[package]] +name = "typewit_proc_macros" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uhlc" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62a645e3e4e6c85b7abe49b086aa3204119431f42b6123b0070419fb6e9d24e" +dependencies = [ + "humantime", + "lazy_static", + "log", + "rand 0.8.7", + "serde", + "spin 0.10.1", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unzip-n" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5bb2756c16fb66f80cfbf5fb0e0c09a7001e739f453c9ec241b9c8b1556fda" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[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", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "validated_struct" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "869a93e8a7286e339e1128630051d82babbcd75d585975af07b9f3327220e60e" +dependencies = [ + "json5", + "serde", + "serde_json", + "validated_struct_macros", +] + +[[package]] +name = "validated_struct_macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c44ce98e7227a04eeb4cf9c784109a5c9710e54849ceb4f09f8597247897f1e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "unzip-n", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[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.119", +] + +[[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.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[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.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "x509-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "ring", + "rusticata-macros", + "thiserror 2.0.20", + "time", +] + +[[package]] +name = "yasna" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5f6765e852b9b4dc8e2a76843e4d64d1cea8e79bcde0b6901aea8e7c7f08282" +dependencies = [ + "bit-vec", + "time", +] + +[[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", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zenoh" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "ahash", + "arc-swap", + "async-trait", + "bytes", + "const_format", + "flate2", + "flume", + "futures", + "git-version", + "itertools", + "json5", + "lazy_static", + "nonempty-collections", + "once_cell", + "petgraph", + "phf", + "rand 0.8.7", + "rustc_version", + "serde", + "serde_json", + "socket2 0.5.10", + "tokio", + "tokio-util", + "tracing", + "uhlc", + "vec_map", + "zenoh-buffers", + "zenoh-codec", + "zenoh-collections", + "zenoh-config", + "zenoh-core", + "zenoh-keyexpr", + "zenoh-link", + "zenoh-link-commons", + "zenoh-macros", + "zenoh-plugin-trait", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", + "zenoh-sync", + "zenoh-task", + "zenoh-transport", + "zenoh-util", +] + +[[package]] +name = "zenoh-buffers" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "zenoh-collections", +] + +[[package]] +name = "zenoh-codec" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "tracing", + "uhlc", + "zenoh-buffers", + "zenoh-protocol", +] + +[[package]] +name = "zenoh-collections" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "ahash", +] + +[[package]] +name = "zenoh-config" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "json5", + "nonempty-collections", + "num_cpus", + "secrecy", + "serde", + "serde_json", + "serde_with", + "serde_yaml", + "toml", + "tracing", + "uhlc", + "validated_struct", + "zenoh-core", + "zenoh-keyexpr", + "zenoh-macros", + "zenoh-protocol", + "zenoh-result", + "zenoh-util", +] + +[[package]] +name = "zenoh-core" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "lazy_static", + "tokio", + "zenoh-result", + "zenoh-runtime", +] + +[[package]] +name = "zenoh-crypto" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "aes", + "hmac", + "rand 0.8.7", + "rand_chacha 0.3.1", + "sha3", + "zenoh-result", +] + +[[package]] +name = "zenoh-ext" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "bincode", + "flume", + "futures", + "leb128", + "lru", + "serde", + "tokio", + "tokio-util", + "tracing", + "uhlc", + "zenoh", + "zenoh-macros", + "zenoh-util", +] + +[[package]] +name = "zenoh-flat" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh-flat.git?branch=main#8c84a1a4a592114c1638cce98507e6d3fb428676" +dependencies = [ + "android-logd-logger", + "prebindgen", + "prebindgen-proc-macro", + "serde_yaml", + "tracing", + "zenoh", + "zenoh-ext", +] + +[[package]] +name = "zenoh-flat-jni" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh-flat-jni.git?branch=main#e75529ce3758401ce213456e7b8e4e5667635cf8" +dependencies = [ + "jni 0.21.1", + "konst 0.3.17", + "prebindgen-jni", + "prebindgen-jni-runtime", + "prebindgen-registry", + "syn 2.0.119", + "tracing", + "zenoh", + "zenoh-ext", + "zenoh-flat", +] + +[[package]] +name = "zenoh-flat-jni-pin" +version = "0.0.0" +dependencies = [ + "zenoh-flat-jni", +] + +[[package]] +name = "zenoh-keyexpr" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "getrandom 0.2.17", + "hashbrown 0.16.1", + "keyed-set", + "rand 0.8.7", + "schemars 1.2.2", + "serde", + "token-cell", + "zenoh-result", +] + +[[package]] +name = "zenoh-link" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "zenoh-config", + "zenoh-link-commons", + "zenoh-link-quic", + "zenoh-link-quic_datagram", + "zenoh-link-tcp", + "zenoh-link-tls", + "zenoh-link-udp", + "zenoh-link-unixsock_stream", + "zenoh-link-ws", + "zenoh-protocol", + "zenoh-result", +] + +[[package]] +name = "zenoh-link-commons" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "base64", + "bytes", + "flume", + "futures", + "quinn", + "quinn-proto", + "rcgen", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "rustls-webpki", + "secrecy", + "serde", + "socket2 0.5.10", + "time", + "tokio", + "tokio-util", + "tracing", + "webpki-roots", + "x509-parser", + "zenoh-buffers", + "zenoh-codec", + "zenoh-config", + "zenoh-core", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-quic" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "rustls-webpki", + "time", + "tracing", + "zenoh-core", + "zenoh-link-commons", + "zenoh-link-quic_datagram", + "zenoh-protocol", + "zenoh-result", +] + +[[package]] +name = "zenoh-link-quic_datagram" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "rustls-webpki", + "time", + "tokio-util", + "tracing", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", +] + +[[package]] +name = "zenoh-link-tcp" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "socket2 0.5.10", + "tokio", + "tokio-util", + "tracing", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", +] + +[[package]] +name = "zenoh-link-tls" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "base64", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "rustls-webpki", + "secrecy", + "socket2 0.5.10", + "time", + "tls-listener", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "webpki-roots", + "x509-parser", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", +] + +[[package]] +name = "zenoh-link-udp" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "libc", + "socket2 0.5.10", + "tokio", + "tokio-util", + "tracing", + "windows-sys 0.61.2", + "zenoh-buffers", + "zenoh-core", + "zenoh-link-commons", + "zenoh-link-quic_datagram", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-unixsock_stream" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "nix", + "tokio", + "tokio-util", + "tracing", + "uuid", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", +] + +[[package]] +name = "zenoh-link-ws" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "futures-util", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tracing", + "url", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", + "zenoh-util", +] + +[[package]] +name = "zenoh-macros" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "zenoh-keyexpr", +] + +[[package]] +name = "zenoh-plugin-trait" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "git-version", + "libloading", + "serde", + "stabby", + "tracing", + "zenoh-config", + "zenoh-keyexpr", + "zenoh-macros", + "zenoh-result", + "zenoh-util", +] + +[[package]] +name = "zenoh-protocol" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "const_format", + "rand 0.8.7", + "serde", + "uhlc", + "zenoh-buffers", + "zenoh-keyexpr", + "zenoh-macros", + "zenoh-result", +] + +[[package]] +name = "zenoh-result" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "anyhow", +] + +[[package]] +name = "zenoh-runtime" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "lazy_static", + "ron", + "serde", + "tokio", + "tracing", + "zenoh-macros", + "zenoh-result", +] + +[[package]] +name = "zenoh-sync" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "arc-swap", + "event-listener", + "futures", + "tokio", + "zenoh-buffers", + "zenoh-collections", + "zenoh-core", +] + +[[package]] +name = "zenoh-task" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "futures", + "tokio", + "tokio-util", + "tracing", + "zenoh-core", + "zenoh-runtime", +] + +[[package]] +name = "zenoh-transport" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "crossbeam-utils", + "flume", + "futures", + "lazy_static", + "lz4_flex", + "rand 0.8.7", + "ringbuffer-spsc", + "rsa", + "serde", + "sha3", + "tokio", + "tokio-util", + "tracing", + "zenoh-buffers", + "zenoh-codec", + "zenoh-config", + "zenoh-core", + "zenoh-crypto", + "zenoh-link", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", + "zenoh-sync", + "zenoh-task", + "zenoh-util", +] + +[[package]] +name = "zenoh-util" +version = "1.9.0" +source = "git+https://github.com/eclipse-zenoh/zenoh.git?branch=main#773126fd4e1fe55270e3c1b29d16fecc2884b34e" +dependencies = [ + "async-trait", + "const_format", + "flume", + "home", + "humantime", + "lazy_static", + "libc", + "libloading", + "pnet_datalink", + "schemars 1.2.2", + "serde", + "serde_json", + "shellexpand", + "tokio", + "tracing", + "tracing-subscriber", + "winapi", + "zenoh-core", + "zenoh-result", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..77955a47 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,23 @@ +# This crate builds nothing that ships. It exists so that the zenoh-flat-jni +# commit this SDK is tested against is recorded in a Cargo.lock, which is the +# artifact eclipse-zenoh/ci's lockfile sync knows how to move: it overwrites the +# lockfile with zenoh's, and resolving this manifest again writes back the +# current zenoh-flat-jni commit. CI reads that commit out of Cargo.lock and +# checks it out; see PUBLISHING.md. +# +# It sits at the repository root so this repository is an ordinary dependant of +# that workflow rather than a special case in it. +[package] +name = "zenoh-flat-jni-pin" +version = "0.0.0" +edition = "2021" +publish = false + +[lib] +# Out of the way: the repository root is a Gradle project. +path = "ci/pin.rs" + +[dependencies] +# No features: the pin must resolve the same way the real build does, and the +# real build is zenoh-flat-jni's own `cargo build`. +zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } diff --git a/PUBLISHING.md b/PUBLISHING.md index 05e219a3..70960fb6 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -228,21 +228,90 @@ Portal, signed with the organization GPG key, exactly as in zenoh-flat-jni. ## Local development The default build resolves `zenoh-flat-jni` from Maven Central like any consumer. -To work against a local checkout of it: +A build can be pointed at its *source* instead, through a Gradle composite build. +`settings.gradle.kts` decides where that source comes from, in this order: + +| | says "use this source" | where it comes from | +| --- | --- | --- | +| 1 | `-PflatJniDir=` | that directory, as it is | +| 2 | `path = "…"` in `Cargo.toml` | that directory, as it is | +| 3 | `-PuseLocalFlatJni=true` | the commit `Cargo.lock` pins, fetched into `.zenoh-flat-jni/` | +| 4 | nothing | Maven Central — no composite build at all | + +So working against a checkout of your own is the ordinary Cargo edit, in +`Cargo.toml`: + +```toml +# zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } +zenoh-flat-jni = { path = "../zenoh-flat-jni" } +``` + +and `./gradlew build` picks it up with no properties at all. `-PflatJniDir=…` +does the same without editing anything, for a checkout somewhere else. + +Reproducing what CI tested is `./gradlew jvmTest -PuseLocalFlatJni=true`, which +fetches the pinned commit into `.zenoh-flat-jni/` — that is the whole of what CI +does, so the same command reproduces a CI run anywhere. It fetches only when that +directory is not already at the pinned commit, and `-PflatJniCommit=` tries a +different one without touching the lockfile. + +**A release takes row 4, and must.** With a composite build the published +artifact would be built against whatever was on the builder's disk while the POM +still claimed the released version. Nothing opts in by default; CI opts in +explicitly. + +### The pin crate + +Rows 2 and 3 read a Rust crate at the repository root — `Cargo.toml`, +`ci/pin.rs`, `rust-toolchain.toml`, `Cargo.lock` — that compiles to nothing +anyone ships. Its only content is a dependency on `zenoh-flat-jni`, and its only +purpose is to make the commit under test a *resolved lockfile entry*: + +```toml +zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } +``` + +```text +Cargo.lock: source = "git+https://github.com/eclipse-zenoh/zenoh-flat-jni.git?branch=main#<40-hex commit>" +``` + +A lockfile is the one pin `eclipse-zenoh/ci` already knows how to move. Its +lockfile sync overwrites a dependant's `Cargo.lock` with zenoh's, resolves the +manifest again — which writes back the current zenoh-flat-jni commit — compiles +the result, and opens an auto-merging pull request. This repository is an +ordinary dependant of that workflow, not a special case in it, which is why the +crate sits at the root rather than in a subdirectory. + +The pin keeps a CI run reproducible from this repository's commit alone; the bot +keeps it from going stale. + +Nothing here builds that crate. Running `cargo build` at the repository root +compiles zenoh and the bindings to produce an empty library — if an IDE offers to +load the root `Cargo.toml` as a Rust project, decline. Gradle only *reads* these +two files; it never runs Cargo against them, so switching to `path = "…"` leaves +`Cargo.lock` untouched. + +### Moving the pin + +Normally you don't — the bot's pull request does. When you need to: ```bash -./gradlew build -PuseLocalFlatJni=true +cargo update -p zenoh-flat-jni # to zenoh-flat-jni's main tip +cargo update -p zenoh-flat-jni --precise # to one specific commit ``` -That substitutes `../zenoh-flat-jni` through a Gradle composite build, so changes -there are picked up without publishing anything. Set it in your personal -`gradle.properties` if you want it always on. +Commit the resulting `Cargo.lock`. Two things to avoid, because both defeat the +mechanism rather than steering it: + +- **Do not add `rev = "…"` to `Cargo.toml`.** That freezes resolution at a + commit, so the sync can no longer move the pin and the bot goes silent. +- **Do not commit the `path = "…"` form.** It is meant to be a local edit: the + lockfile then pins no commit, CI says so and fails, and the lockfile sync + cannot resolve `../zenoh-flat-jni` on a runner either. `git checkout Cargo.toml` + when you are done — and `Cargo.lock` too, if you ran Cargo while it was set. -**It must never be enabled for a release.** With it on, the published artifact -would be built against whatever happens to be on the builder's disk rather than -the resolved dependency, and the POM would still claim the released version. It -is off by default and CI passes it explicitly only where it checks the sibling -out. +The pin governs source builds only. Which `zenoh-flat-jni` *release* this SDK is +built and published against is `zenohFlatJniVersion` in `gradle.properties`. ## Required secrets diff --git a/build.gradle.kts b/build.gradle.kts index f6d1eb5c..b8b8edb9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -57,6 +57,19 @@ nexusPublishing { // The zenoh-flat-jni release this SDK builds against. Overridable per-invocation // (`-PzenohFlatJniVersion=…`) so a rehearsal can point at a snapshot without // editing anything tracked. +// A composite build must never reach a publication: the artifact would be built +// from zenoh-flat-jni source on the builder's disk, while the POM went on +// naming the released version it was supposed to be built against. Nothing opts +// in by default, so this only catches a leftover - `-PuseLocalFlatJni`, +// `-PflatJniDir`, or a `path = "..."` left in Cargo.toml. +gradle.taskGraph.whenReady { + val included = gradle.includedBuilds.map { it.name } + check(included.isEmpty() || allTasks.none { it.name.startsWith("publish") }) { + "Refusing to publish while zenoh-flat-jni is an included build $included. " + + "See PUBLISHING.md, Local development." + } +} + val zenohFlatJniVersion: String by project subprojects { diff --git a/ci/pin.rs b/ci/pin.rs new file mode 100644 index 00000000..0bbbc70f --- /dev/null +++ b/ci/pin.rs @@ -0,0 +1 @@ +//! Empty on purpose: this crate exists only to carry a dependency. diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 00000000..f888b627 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,5 @@ +# The toolchain the pin crate (see Cargo.toml) resolves under. It tracks +# zenoh-flat-jni's own rust-toolchain.toml, because that is what has to compile +# when eclipse-zenoh/ci's lockfile sync rectifies the lockfile here. +[toolchain] +channel = "1.97.1" diff --git a/settings.gradle.kts b/settings.gradle.kts index 63adc44d..f843491f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,12 +27,71 @@ include(":examples") // zenoh-flat-jni (https://github.com/eclipse-zenoh/zenoh-flat-jni) is consumed as // an ordinary Maven artifact: org.eclipse.zenoh:zenoh-flat-jni:$zenohFlatJniVersion. // -// For coordinated local development, `-PuseLocalFlatJni=true` substitutes a -// sibling checkout through a composite build. It is off by default and must stay -// off for a release: with it on, the published artifact would be built against -// whatever is on that developer's disk rather than the resolved dependency. -if (providers.gradleProperty("useLocalFlatJni").orNull?.toBoolean() == true) { - includeBuild("../zenoh-flat-jni") +// A build can be pointed at its *source* instead, through a composite build. +// Where that source comes from is decided here, in this order: +// +// 1. -PflatJniDir= an existing checkout, used as it is +// 2. path = "…" in Cargo.toml the ordinary Cargo way of saying "use my copy", +// and the only switch that lives in a tracked file +// 3. -PuseLocalFlatJni=true the commit Cargo.lock pins - fetched into +// .zenoh-flat-jni/ unless it is already there, or +// overridden with -PflatJniCommit= +// 4. otherwise the Maven artifact, with no composite at all +// +// A release takes 4, and must: with a composite build the published artifact +// would carry whatever was on the builder's disk while the POM still claimed the +// released version. +val flatJniRepository = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git" + +fun git(dir: File, vararg args: String): String { + val process = ProcessBuilder(listOf("git", *args)) + .directory(dir) + .redirectErrorStream(true) + .start() + val output = process.inputStream.bufferedReader().readText().trim() + check(process.waitFor() == 0) { "git ${args.joinToString(" ")} failed in $dir:\n$output" } + return output +} + +/** The pinned commit, checked out under [into]; fetched only when it is not already there. */ +fun checkoutPinned(commit: String, into: File): File { + if (File(into, ".git").isDirectory && git(into, "rev-parse", "HEAD") == commit) return into + into.mkdirs() + if (!File(into, ".git").isDirectory) git(into, "init", "--quiet") + println("Fetching zenoh-flat-jni $commit into $into") + git(into, "fetch", "--depth", "1", "--quiet", flatJniRepository, commit) + git(into, "checkout", "--quiet", "--detach", "FETCH_HEAD") + return into +} + +/** The `path = "…"` of a zenoh-flat-jni dependency written as a single-line inline table. */ +fun cargoTomlPath(): String? = + File(settingsDir, "Cargo.toml").takeIf { it.isFile }?.readText() + ?.let { Regex("""^\s*zenoh-flat-jni\s*=\s*\{[^}\n]*\bpath\s*=\s*"([^"]+)"""", RegexOption.MULTILINE).find(it) } + ?.groupValues?.get(1) + +/** The commit Cargo.lock pins for the root pin crate; null if a path override erased it. */ +fun cargoLockCommit(): String? = + File(settingsDir, "Cargo.lock").takeIf { it.isFile }?.readText() + ?.let { Regex("""/zenoh-flat-jni\.git[^#"]*#([0-9a-f]{40})"""").find(it) } + ?.groupValues?.get(1) + +val flatJniSource: File? = + providers.gradleProperty("flatJniDir").orNull?.let { File(settingsDir, it) } + ?: cargoTomlPath()?.let { File(settingsDir, it) } + ?: if (providers.gradleProperty("useLocalFlatJni").orNull?.toBoolean() == true) { + val commit = providers.gradleProperty("flatJniCommit").orNull ?: cargoLockCommit() + checkNotNull(commit) { + "Cargo.lock pins no zenoh-flat-jni commit. A path override or [patch] erases it - see PUBLISHING.md." + } + checkoutPinned(commit, File(settingsDir, ".zenoh-flat-jni")) + } else null + +if (flatJniSource != null) { + check(File(flatJniSource, "settings.gradle.kts").isFile) { + "$flatJniSource is not a zenoh-flat-jni checkout" + } + includeBuild(flatJniSource) } plugins { From 0100540ff996aaebe765476d4377a8e7ebfd4c52 Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Mon, 10 Aug 2026 23:59:33 +0200 Subject: [PATCH 2/9] Move local-build docs from PUBLISHING.md to the README Pointing a build at zenoh-flat-jni source is how you develop against it, not how you publish. PUBLISHING.md keeps only the part that is a release constraint: a composite build must never reach a publication. --- PUBLISHING.md | 100 +++++++--------------------------------------- README.md | 102 +++++++++++++++++++++++++++++++++++++++++++++-- build.gradle.kts | 2 +- 3 files changed, 113 insertions(+), 91 deletions(-) diff --git a/PUBLISHING.md b/PUBLISHING.md index 70960fb6..a0f79310 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -23,7 +23,7 @@ which covers them once for both repositories. - [After a release](#after-a-release) - [Rehearsing before zenoh-flat-jni is released](#rehearsing-before-zenoh-flat-jni-is-released) - [How the pipeline works](#how-the-pipeline-works) -- [Local development](#local-development) +- [Building against zenoh-flat-jni source](#building-against-zenoh-flat-jni-source) - [Required secrets](#required-secrets) - [Known gaps](#known-gaps) - [Release checklist](#release-checklist) @@ -203,7 +203,7 @@ oversight, and not by someone leaving a flag set. The guarantee is structural rather than procedural. While developing, prefer not to involve a repository at all — see -[Local development](#local-development). +[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README. ## How the pipeline works @@ -225,93 +225,21 @@ While developing, prefer not to involve a repository at all — see Publishing goes through `io.github.gradle-nexus.publish-plugin` to the Central Portal, signed with the organization GPG key, exactly as in zenoh-flat-jni. -## Local development +## Building against zenoh-flat-jni source -The default build resolves `zenoh-flat-jni` from Maven Central like any consumer. -A build can be pointed at its *source* instead, through a Gradle composite build. -`settings.gradle.kts` decides where that source comes from, in this order: +A build can be pointed at zenoh-flat-jni's *source* through a Gradle composite +build, which is what CI and local development do — see +[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README. -| | says "use this source" | where it comes from | -| --- | --- | --- | -| 1 | `-PflatJniDir=` | that directory, as it is | -| 2 | `path = "…"` in `Cargo.toml` | that directory, as it is | -| 3 | `-PuseLocalFlatJni=true` | the commit `Cargo.lock` pins, fetched into `.zenoh-flat-jni/` | -| 4 | nothing | Maven Central — no composite build at all | - -So working against a checkout of your own is the ordinary Cargo edit, in -`Cargo.toml`: - -```toml -# zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } -zenoh-flat-jni = { path = "../zenoh-flat-jni" } -``` - -and `./gradlew build` picks it up with no properties at all. `-PflatJniDir=…` -does the same without editing anything, for a checkout somewhere else. - -Reproducing what CI tested is `./gradlew jvmTest -PuseLocalFlatJni=true`, which -fetches the pinned commit into `.zenoh-flat-jni/` — that is the whole of what CI -does, so the same command reproduces a CI run anywhere. It fetches only when that -directory is not already at the pinned commit, and `-PflatJniCommit=` tries a -different one without touching the lockfile. - -**A release takes row 4, and must.** With a composite build the published -artifact would be built against whatever was on the builder's disk while the POM -still claimed the released version. Nothing opts in by default; CI opts in -explicitly. - -### The pin crate - -Rows 2 and 3 read a Rust crate at the repository root — `Cargo.toml`, -`ci/pin.rs`, `rust-toolchain.toml`, `Cargo.lock` — that compiles to nothing -anyone ships. Its only content is a dependency on `zenoh-flat-jni`, and its only -purpose is to make the commit under test a *resolved lockfile entry*: - -```toml -zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } -``` - -```text -Cargo.lock: source = "git+https://github.com/eclipse-zenoh/zenoh-flat-jni.git?branch=main#<40-hex commit>" -``` - -A lockfile is the one pin `eclipse-zenoh/ci` already knows how to move. Its -lockfile sync overwrites a dependant's `Cargo.lock` with zenoh's, resolves the -manifest again — which writes back the current zenoh-flat-jni commit — compiles -the result, and opens an auto-merging pull request. This repository is an -ordinary dependant of that workflow, not a special case in it, which is why the -crate sits at the root rather than in a subdirectory. - -The pin keeps a CI run reproducible from this repository's commit alone; the bot -keeps it from going stale. - -Nothing here builds that crate. Running `cargo build` at the repository root -compiles zenoh and the bindings to produce an empty library — if an IDE offers to -load the root `Cargo.toml` as a Rust project, decline. Gradle only *reads* these -two files; it never runs Cargo against them, so switching to `path = "…"` leaves -`Cargo.lock` untouched. - -### Moving the pin - -Normally you don't — the bot's pull request does. When you need to: - -```bash -cargo update -p zenoh-flat-jni # to zenoh-flat-jni's main tip -cargo update -p zenoh-flat-jni --precise # to one specific commit -``` - -Commit the resulting `Cargo.lock`. Two things to avoid, because both defeat the -mechanism rather than steering it: - -- **Do not add `rev = "…"` to `Cargo.toml`.** That freezes resolution at a - commit, so the sync can no longer move the pin and the bot goes silent. -- **Do not commit the `path = "…"` form.** It is meant to be a local edit: the - lockfile then pins no commit, CI says so and fails, and the lockfile sync - cannot resolve `../zenoh-flat-jni` on a runner either. `git checkout Cargo.toml` - when you are done — and `Cargo.lock` too, if you ran Cargo while it was set. +**A release must not.** With a composite build the published artifact would be +built from source on the builder's disk while the POM still claimed the released +version it was supposed to be built against. Nothing opts in by default, and +`build.gradle.kts` fails any `publish*` task while an included build is present, +so a leftover `-PuseLocalFlatJni`, `-PflatJniDir` or `path = "…"` cannot reach a +publication silently. -The pin governs source builds only. Which `zenoh-flat-jni` *release* this SDK is -built and published against is `zenohFlatJniVersion` in `gradle.properties`. +Which `zenoh-flat-jni` *release* this SDK is built and published against is +`zenohFlatJniVersion` in `gradle.properties`, and that is unrelated to the above. ## Required secrets diff --git a/README.md b/README.md index 7390d9f9..7cd8f875 100644 --- a/README.md +++ b/README.md @@ -125,10 +125,104 @@ This repository ships a [Gradle wrapper](https://docs.gradle.org/current/usergui Use `./gradlew` on Unix/macOS/Linux (or `gradlew.bat` on Windows) in place of `gradle` for all commands listed below. The native libraries are not built here — they arrive inside the -`org.eclipse.zenoh:zenoh-flat-jni` dependency. To build against a local checkout -of that repository instead of the published artifact, pass -`-PuseLocalFlatJni=true`. Releasing is documented in -[PUBLISHING.md](PUBLISHING.md). +`org.eclipse.zenoh:zenoh-flat-jni` dependency, so no Rust toolchain is needed. +Building against that repository's source instead does need one — see below. +Releasing is documented in [PUBLISHING.md](PUBLISHING.md). + +## Building against zenoh-flat-jni source + +The default build resolves `zenoh-flat-jni` from Maven Central like any consumer, +and needs nothing from this section. A build can be pointed at its source instead, +through a Gradle composite build — for working on the bindings and this SDK +together, or for reproducing a CI run. `settings.gradle.kts` decides where that +source comes from, in this order: + +| | says "use this source" | where it comes from | +| --- | --- | --- | +| 1 | `-PflatJniDir=` | that directory, as it is | +| 2 | `path = "…"` in `Cargo.toml` | that directory, as it is | +| 3 | `-PuseLocalFlatJni=true` | the commit `Cargo.lock` pins, fetched into `.zenoh-flat-jni/` | +| 4 | nothing | Maven Central — no composite build at all | + +Rows 1–3 build the native library from source, so they need a Rust toolchain +([rustup.rs](https://rustup.rs)); Gradle drives cargo for you. Row 4 — the +default — needs none. + +Working against a checkout of your own is the ordinary Cargo edit, in +`Cargo.toml`: + +```toml +# zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } +zenoh-flat-jni = { path = "../zenoh-flat-jni" } +``` + +and `./gradlew build` picks it up with no properties at all. `-PflatJniDir=…` +does the same without editing anything, for a checkout somewhere else. + +Reproducing what CI tested is: + +```bash +./gradlew jvmTest -PuseLocalFlatJni=true +``` + +which fetches the pinned commit into `.zenoh-flat-jni/` — that is the whole of +what CI does, so this one command reproduces a CI run anywhere. It fetches only +when that directory is not already at the pinned commit, and +`-PflatJniCommit=` tries a different commit without touching the lockfile. + +### Where the pinned commit comes from + +Rows 2 and 3 read a Rust crate at the repository root — `Cargo.toml`, +`ci/pin.rs`, `rust-toolchain.toml`, `Cargo.lock` — that compiles to nothing +anyone ships. Its only content is a dependency on `zenoh-flat-jni`, and its only +purpose is to make the commit this SDK is tested against a _resolved lockfile +entry_: + +```toml +zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } +``` + +```text +Cargo.lock: source = "git+https://github.com/eclipse-zenoh/zenoh-flat-jni.git?branch=main#<40-hex commit>" +``` + +A lockfile is the one pin `eclipse-zenoh/ci` already knows how to move. Its +lockfile sync overwrites a dependant's `Cargo.lock` with zenoh's, resolves the +manifest again — which writes back the current zenoh-flat-jni commit — compiles +the result, and opens an auto-merging pull request. This repository is an +ordinary dependant of that workflow, not a special case in it, which is why the +crate sits at the root rather than in a subdirectory. + +The pin keeps a CI run reproducible from this repository's commit alone; the bot +keeps it from going stale. + +Nothing here builds that crate. Running `cargo build` at the repository root +compiles zenoh and the bindings to produce an empty library — if an IDE offers to +load the root `Cargo.toml` as a Rust project, decline. Gradle only _reads_ these +two files; it never runs Cargo against them, so switching to `path = "…"` leaves +`Cargo.lock` untouched. + +### Moving the pin + +Normally you don't — the bot's pull request does. When you need to: + +```bash +cargo update -p zenoh-flat-jni # to zenoh-flat-jni's main tip +cargo update -p zenoh-flat-jni --precise # to one specific commit +``` + +Commit the resulting `Cargo.lock`. Two things to avoid, because both defeat the +mechanism rather than steering it: + +- **Do not add `rev = "…"` to `Cargo.toml`.** That freezes resolution at a + commit, so the sync can no longer move the pin and the bot goes silent. +- **Do not commit the `path = "…"` form.** It is meant to be a local edit: the + lockfile then pins no commit, CI says so and fails, and the lockfile sync + cannot resolve `../zenoh-flat-jni` on a runner either. `git checkout Cargo.toml` + when you are done — and `Cargo.lock` too, if you ran Cargo while it was set. + +A release resolves the Maven artifact and must never use a composite build; see +[PUBLISHING.md](PUBLISHING.md#building-against-zenoh-flat-jni-source). ## JVM JVM diff --git a/build.gradle.kts b/build.gradle.kts index b8b8edb9..33320c71 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -66,7 +66,7 @@ gradle.taskGraph.whenReady { val included = gradle.includedBuilds.map { it.name } check(included.isEmpty() || allTasks.none { it.name.startsWith("publish") }) { "Refusing to publish while zenoh-flat-jni is an included build $included. " + - "See PUBLISHING.md, Local development." + "See README.md, Building against zenoh-flat-jni source." } } From e46454d170af132f6c6ee496c37bf31f35c721a6 Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Tue, 11 Aug 2026 00:11:05 +0200 Subject: [PATCH 3/9] Document the commit pin in CI.md, not in the README The README answers how to work on this project, including across the stack: how to point a build at zenoh-flat-jni source, and how to reproduce a CI run. Which commit that is, and the lockfile sync that keeps it current, is CI's business - and it does not touch publishing, which resolves a release from Maven Central. --- CI.md | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++ PUBLISHING.md | 6 ++- README.md | 58 +++------------------- 3 files changed, 142 insertions(+), 54 deletions(-) create mode 100644 CI.md diff --git a/CI.md b/CI.md new file mode 100644 index 00000000..3172a311 --- /dev/null +++ b/CI.md @@ -0,0 +1,132 @@ +# CI in zenoh-java + +What CI here checks, and how it stays current with the rest of the stack. For +releases see [PUBLISHING.md](PUBLISHING.md); for building against zenoh-flat-jni +source yourself, [README.md](README.md#building-against-zenoh-flat-jni-source). + +## Contents + +- [What CI runs](#what-ci-runs) +- [The pin](#the-pin) +- [Lockfile synchronization](#lockfile-synchronization) +- [Moving the pin by hand](#moving-the-pin-by-hand) +- [Publishing does not use any of this](#publishing-does-not-use-any-of-this) + +## What CI runs + +One job per platform, and one command that matters: + +```bash +./gradlew jvmTest --info -PuseLocalFlatJni=true +``` + +That property makes the build resolve `zenoh-flat-jni` from **source** rather +than from Maven Central: `settings.gradle.kts` fetches the commit this +repository's `Cargo.lock` pins, includes it as a composite build, and Gradle +drives cargo for its native library. So the same command reproduces a CI run on +any machine, and CI checks out nothing but this repository. + +Nothing else Rust runs here. Formatting, clippy and the native build belong to +zenoh-flat-jni's own CI, which runs them on three platforms for the very commit +pinned here; repeating them from this repository would only add ways for two +toolchains to disagree. + +## The pin + +CI has to answer one question — *which* `zenoh-flat-jni` is this SDK tested +against? — and both easy answers are bad. A commit written into the workflow is +reproducible and goes stale, because moving it is somebody's chore. Tracking +that repository's `main` is never stale and is not reproducible: a CI result +stops being determined by this repository's commit. + +A lockfile is neither, because a bot moves it. That is what the crate at the +repository root is for — `Cargo.toml`, `ci/pin.rs`, `rust-toolchain.toml`, +`Cargo.lock`. It compiles to nothing anyone ships. Its entire content is one +dependency: + +```toml +zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } +``` + +whose only job is to make the commit under test a resolved lockfile entry: + +```text +Cargo.lock: source = "git+https://github.com/eclipse-zenoh/zenoh-flat-jni.git?branch=main#<40-hex commit>" +``` + +Nothing here builds that crate. `cargo build` at the repository root would +compile zenoh and the bindings only to produce an empty library — if an IDE +offers to load the root `Cargo.toml` as a Rust project, decline. Gradle only +*reads* these two files; it never runs Cargo against them. + +## Lockfile synchronization + +The pin makes a run reproducible. What keeps it from going stale is +[`eclipse-zenoh/ci`](https://github.com/eclipse-zenoh/ci)'s **`sync-lockfiles`** +workflow, which every zenoh dependant already uses to stay aligned with zenoh: + +```text +zenoh ──> zenoh-flat ──> zenoh-flat-jni ──> zenoh-java +``` + +It is triggered by a push to zenoh's `main` that touches its `Cargo.lock`, and +for each dependant it: + +1. **overwrites** the dependant's `Cargo.lock` with zenoh's; +2. **rectifies** it — resolves and compiles the manifest again — which restores + whatever zenoh's lockfile did not carry, while keeping the dependency + versions zenoh pins; +3. opens a pull request that **auto-merges** once that repository's own CI + passes. + +For this repository, step 1 removes the `zenoh-flat-jni` entry — zenoh's +lockfile has never heard of it — and step 2 writes it back at zenoh-flat-jni's +current `main`, having compiled it first. So the pin advances only to a commit +that builds, and only if the tests here pass against it. That is also why the +pin crate sits at the repository **root**: it makes this repository an ordinary +dependant of that workflow rather than a special case inside it. + +One consequence worth knowing: the sync also re-pins `zenoh` in this lockfile, +where zenoh is merely a transitive dependency of the pin crate. Harmless — +nothing is built from this lockfile — but it means the zenoh revision recorded +here is not necessarily the one inside the zenoh-flat-jni commit it pins. The +commit is the pin; the rest of the lockfile is a by-product. + +## Moving the pin by hand + +Normally you don't — the bot's pull request does. When you need to, for example +to test against an unreleased zenoh-flat-jni change: + +```bash +cargo update -p zenoh-flat-jni # to zenoh-flat-jni's main tip +cargo update -p zenoh-flat-jni --precise # to one specific commit +``` + +Commit the resulting `Cargo.lock`. Two edits defeat the mechanism rather than +steering it: + +- **`rev = "…"` in `Cargo.toml`** freezes resolution at a commit, so the sync can + no longer move the pin and the bot goes silent. +- **A committed `path = "…"`** leaves the lockfile pinning no commit at all: CI + says so and fails, and the sync cannot resolve a sibling directory on a runner + either. It is meant to be a local edit — `git checkout Cargo.toml` when you are + done, and `Cargo.lock` too if you ran Cargo while it was set. + +To try a commit without touching the lockfile at all, pass +`-PflatJniCommit=`. + +## Publishing does not use any of this + +A release resolves `org.eclipse.zenoh:zenoh-flat-jni:$zenohFlatJniVersion` from +Maven Central, like any other consumer. The pin, the lockfile and the composite +build play no part in it — they exist so that *testing* against unreleased +bindings is reproducible. + +The two are deliberately independent: `zenohFlatJniVersion` in +`gradle.properties` says which **release** this SDK is built and published +against, `Cargo.lock` says which **commit** it is tested against, and moving one +does not move the other. A release must in fact avoid the composite build +entirely — the artifact would be built from source on the builder's disk while +the POM still claimed the released version — so `build.gradle.kts` fails any +`publish*` task while an included build is present. See +[PUBLISHING.md](PUBLISHING.md#building-against-zenoh-flat-jni-source). diff --git a/PUBLISHING.md b/PUBLISHING.md index a0f79310..70a44cd5 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -203,7 +203,8 @@ oversight, and not by someone leaving a flag set. The guarantee is structural rather than procedural. While developing, prefer not to involve a repository at all — see -[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README. +[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README, +and [CI.md](CI.md) for the commit pin behind it. ## How the pipeline works @@ -229,7 +230,8 @@ Portal, signed with the organization GPG key, exactly as in zenoh-flat-jni. A build can be pointed at zenoh-flat-jni's *source* through a Gradle composite build, which is what CI and local development do — see -[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README. +[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README, +and [CI.md](CI.md) for the commit pin behind it. **A release must not.** With a composite build the published artifact would be built from source on the builder's disk while the POM still claimed the released diff --git a/README.md b/README.md index 7cd8f875..2a12fcb0 100644 --- a/README.md +++ b/README.md @@ -170,59 +170,13 @@ what CI does, so this one command reproduces a CI run anywhere. It fetches only when that directory is not already at the pinned commit, and `-PflatJniCommit=` tries a different commit without touching the lockfile. -### Where the pinned commit comes from +Which commit row 3 fetches is recorded in this repository's `Cargo.lock`, kept +current by a bot — that is [CI.md](CI.md). Working further down the stack, on +`zenoh-flat` or `zenoh` themselves, is an edit inside your `zenoh-flat-jni` +checkout (rows 1 and 2), whose own `Cargo.toml` points at them the same way. -Rows 2 and 3 read a Rust crate at the repository root — `Cargo.toml`, -`ci/pin.rs`, `rust-toolchain.toml`, `Cargo.lock` — that compiles to nothing -anyone ships. Its only content is a dependency on `zenoh-flat-jni`, and its only -purpose is to make the commit this SDK is tested against a _resolved lockfile -entry_: - -```toml -zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } -``` - -```text -Cargo.lock: source = "git+https://github.com/eclipse-zenoh/zenoh-flat-jni.git?branch=main#<40-hex commit>" -``` - -A lockfile is the one pin `eclipse-zenoh/ci` already knows how to move. Its -lockfile sync overwrites a dependant's `Cargo.lock` with zenoh's, resolves the -manifest again — which writes back the current zenoh-flat-jni commit — compiles -the result, and opens an auto-merging pull request. This repository is an -ordinary dependant of that workflow, not a special case in it, which is why the -crate sits at the root rather than in a subdirectory. - -The pin keeps a CI run reproducible from this repository's commit alone; the bot -keeps it from going stale. - -Nothing here builds that crate. Running `cargo build` at the repository root -compiles zenoh and the bindings to produce an empty library — if an IDE offers to -load the root `Cargo.toml` as a Rust project, decline. Gradle only _reads_ these -two files; it never runs Cargo against them, so switching to `path = "…"` leaves -`Cargo.lock` untouched. - -### Moving the pin - -Normally you don't — the bot's pull request does. When you need to: - -```bash -cargo update -p zenoh-flat-jni # to zenoh-flat-jni's main tip -cargo update -p zenoh-flat-jni --precise # to one specific commit -``` - -Commit the resulting `Cargo.lock`. Two things to avoid, because both defeat the -mechanism rather than steering it: - -- **Do not add `rev = "…"` to `Cargo.toml`.** That freezes resolution at a - commit, so the sync can no longer move the pin and the bot goes silent. -- **Do not commit the `path = "…"` form.** It is meant to be a local edit: the - lockfile then pins no commit, CI says so and fails, and the lockfile sync - cannot resolve `../zenoh-flat-jni` on a runner either. `git checkout Cargo.toml` - when you are done — and `Cargo.lock` too, if you ran Cargo while it was set. - -A release resolves the Maven artifact and must never use a composite build; see -[PUBLISHING.md](PUBLISHING.md#building-against-zenoh-flat-jni-source). +The `path = "…"` form is a local edit — don't commit it. Row 4 is what a release +uses, and must be: see [PUBLISHING.md](PUBLISHING.md#building-against-zenoh-flat-jni-source). ## JVM JVM From ea92686ebc654c718f3cb24be5de1244cb762163 Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Tue, 11 Aug 2026 00:32:29 +0200 Subject: [PATCH 4/9] Three ways to build, and Cargo.toml decides one of them The README now answers what a user asks: use the published bindings (default, no Rust), build them from source as Cargo.toml says, or point at a checkout. Everything behind that - the pin crate, the fetch, the lockfile sync - moved to CI.md, which is where it belongs. -PuseLocalFlatJni now follows the manifest rather than only the lockfile: a git dependency with no Cargo.lock resolves one with Cargo instead of failing, so a fresh tree works the way a Rust developer expects. -PflatJniDir accepts an absolute path. --- CI.md | 58 ++++++++++++++++++++++++++++++++------------ PUBLISHING.md | 4 +-- README.md | 59 ++++++++++++++++++--------------------------- build.gradle.kts | 2 +- settings.gradle.kts | 55 ++++++++++++++++++++++++++---------------- 5 files changed, 103 insertions(+), 75 deletions(-) diff --git a/CI.md b/CI.md index 3172a311..8467aad5 100644 --- a/CI.md +++ b/CI.md @@ -2,11 +2,12 @@ What CI here checks, and how it stays current with the rest of the stack. For releases see [PUBLISHING.md](PUBLISHING.md); for building against zenoh-flat-jni -source yourself, [README.md](README.md#building-against-zenoh-flat-jni-source). +source yourself, [README.md](README.md#where-the-native-library-comes-from). ## Contents - [What CI runs](#what-ci-runs) +- [How the source is resolved](#how-the-source-is-resolved) - [The pin](#the-pin) - [Lockfile synchronization](#lockfile-synchronization) - [Moving the pin by hand](#moving-the-pin-by-hand) @@ -31,6 +32,40 @@ zenoh-flat-jni's own CI, which runs them on three platforms for the very commit pinned here; repeating them from this repository would only add ways for two toolchains to disagree. +## How the source is resolved + +`settings.gradle.kts` decides where `zenoh-flat-jni` comes from before any +project is configured, because a composite build has to be declared at settings +time. In order: + +| | | | +| --- | --- | --- | +| `-PflatJniDir=` | that directory, as it is | `Cargo.toml` not read | +| `-PuseLocalFlatJni=true` | whatever `Cargo.toml` says | `git` → the `Cargo.lock` commit; `path` → that directory | +| neither | Maven Central | no composite build | + +The middle row is the Rust-shaped one: the manifest is the switch, exactly as it +would be for a Cargo build. + +- **`git`** (the committed form) resolves to the commit `Cargo.lock` records. If + there is no lockfile, or none mentioning zenoh-flat-jni, Gradle runs `cargo + generate-lockfile` to produce one — the same resolution a `cargo build` here + would do, needing the network but no compiler. The commit is then fetched into + `.zenoh-flat-jni/` (gitignored), shallow, and only when that directory is not + already at it. `-PflatJniCommit=` overrides the commit without touching + the lockfile. +- **`path`** is honoured with or without the property — it is a deliberate local + edit, and Cargo would honour it too: + + ```toml + # zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } + zenoh-flat-jni = { path = "../zenoh-flat-jni" } + ``` + + Don't commit that form: the lockfile then pins no commit, and the sync below + cannot resolve a sibling directory on a runner. `git checkout Cargo.toml` when + you are done — and `Cargo.lock` too, if you ran Cargo while it was set. + ## The pin CI has to answer one question — *which* `zenoh-flat-jni` is this SDK tested @@ -56,8 +91,9 @@ Cargo.lock: source = "git+https://github.com/eclipse-zenoh/zenoh-flat-jni.git?b Nothing here builds that crate. `cargo build` at the repository root would compile zenoh and the bindings only to produce an empty library — if an IDE -offers to load the root `Cargo.toml` as a Rust project, decline. Gradle only -*reads* these two files; it never runs Cargo against them. +offers to load the root `Cargo.toml` as a Rust project, decline. Gradle reads +these two files, and runs Cargo against them only to *resolve* a missing +lockfile, never to compile. ## Lockfile synchronization @@ -102,18 +138,10 @@ cargo update -p zenoh-flat-jni # to zenoh-flat-jni's main tip cargo update -p zenoh-flat-jni --precise # to one specific commit ``` -Commit the resulting `Cargo.lock`. Two edits defeat the mechanism rather than -steering it: - -- **`rev = "…"` in `Cargo.toml`** freezes resolution at a commit, so the sync can - no longer move the pin and the bot goes silent. -- **A committed `path = "…"`** leaves the lockfile pinning no commit at all: CI - says so and fails, and the sync cannot resolve a sibling directory on a runner - either. It is meant to be a local edit — `git checkout Cargo.toml` when you are - done, and `Cargo.lock` too if you ran Cargo while it was set. - -To try a commit without touching the lockfile at all, pass -`-PflatJniCommit=`. +Commit the resulting `Cargo.lock`. Do not add `rev = "…"` to `Cargo.toml`: that +freezes resolution at a commit, so the sync can no longer move the pin and the +bot goes silent. (The other way to defeat it — committing the `path = "…"` form — +is covered above.) ## Publishing does not use any of this diff --git a/PUBLISHING.md b/PUBLISHING.md index 70a44cd5..94f1ce32 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -203,7 +203,7 @@ oversight, and not by someone leaving a flag set. The guarantee is structural rather than procedural. While developing, prefer not to involve a repository at all — see -[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README, +[Where the native library comes from](README.md#where-the-native-library-comes-from) in the README, and [CI.md](CI.md) for the commit pin behind it. ## How the pipeline works @@ -230,7 +230,7 @@ Portal, signed with the organization GPG key, exactly as in zenoh-flat-jni. A build can be pointed at zenoh-flat-jni's *source* through a Gradle composite build, which is what CI and local development do — see -[How to build it](README.md#building-against-zenoh-flat-jni-source) in the README, +[Where the native library comes from](README.md#where-the-native-library-comes-from) in the README, and [CI.md](CI.md) for the commit pin behind it. **A release must not.** With a composite build the published artifact would be diff --git a/README.md b/README.md index 2a12fcb0..6d830a8d 100644 --- a/README.md +++ b/README.md @@ -129,54 +129,41 @@ The native libraries are not built here — they arrive inside the Building against that repository's source instead does need one — see below. Releasing is documented in [PUBLISHING.md](PUBLISHING.md). -## Building against zenoh-flat-jni source +## Where the native library comes from -The default build resolves `zenoh-flat-jni` from Maven Central like any consumer, -and needs nothing from this section. A build can be pointed at its source instead, -through a Gradle composite build — for working on the bindings and this SDK -together, or for reproducing a CI run. `settings.gradle.kts` decides where that -source comes from, in this order: +Three ways to build. Pick by what you are doing: -| | says "use this source" | where it comes from | +| I want to… | build with | Rust needed | | --- | --- | --- | -| 1 | `-PflatJniDir=` | that directory, as it is | -| 2 | `path = "…"` in `Cargo.toml` | that directory, as it is | -| 3 | `-PuseLocalFlatJni=true` | the commit `Cargo.lock` pins, fetched into `.zenoh-flat-jni/` | -| 4 | nothing | Maven Central — no composite build at all | +| just build or use the SDK | `./gradlew build` | no | +| build the bindings from source too | `./gradlew build -PuseLocalFlatJni=true` | yes | +| build against my own checkout | `./gradlew build -PflatJniDir=../zenoh-flat-jni` | yes | -Rows 1–3 build the native library from source, so they need a Rust toolchain -([rustup.rs](https://rustup.rs)); Gradle drives cargo for you. Row 4 — the -default — needs none. +**The default** downloads `org.eclipse.zenoh:zenoh-flat-jni` from Maven Central +with the native library already inside it. Nothing is compiled from Rust and no +toolchain is needed. -Working against a checkout of your own is the ordinary Cargo edit, in -`Cargo.toml`: - -```toml -# zenoh-flat-jni = { git = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git", branch = "main" } -zenoh-flat-jni = { path = "../zenoh-flat-jni" } -``` - -and `./gradlew build` picks it up with no properties at all. `-PflatJniDir=…` -does the same without editing anything, for a checkout somewhere else. - -Reproducing what CI tested is: +**`-PuseLocalFlatJni=true`** builds the bindings from source, as `Cargo.toml` +says — the usual Rust arrangement, and the one CI uses. A `git` dependency there +means the exact commit recorded in `Cargo.lock` (resolved on the spot if there is +no lockfile yet); a `path` means that directory. So ```bash ./gradlew jvmTest -PuseLocalFlatJni=true ``` -which fetches the pinned commit into `.zenoh-flat-jni/` — that is the whole of -what CI does, so this one command reproduces a CI run anywhere. It fetches only -when that directory is not already at the pinned commit, and -`-PflatJniCommit=` tries a different commit without touching the lockfile. +reproduces a CI run exactly. See [CI.md](CI.md) for how that commit is chosen and +kept current. + +**`-PflatJniDir=`** points straight at a checkout, no `Cargo.toml` involved. +Use it to try a branch or a scratch copy without editing anything. -Which commit row 3 fetches is recorded in this repository's `Cargo.lock`, kept -current by a bot — that is [CI.md](CI.md). Working further down the stack, on -`zenoh-flat` or `zenoh` themselves, is an edit inside your `zenoh-flat-jni` -checkout (rows 1 and 2), whose own `Cargo.toml` points at them the same way. +Both source options need a Rust toolchain ([rustup.rs](https://rustup.rs)); +Gradle drives cargo for you. To work further down the stack — on `zenoh-flat` or +`zenoh` themselves — edit inside your `zenoh-flat-jni` checkout, whose own +`Cargo.toml` points at them the same way. -The `path = "…"` form is a local edit — don't commit it. Row 4 is what a release -uses, and must be: see [PUBLISHING.md](PUBLISHING.md#building-against-zenoh-flat-jni-source). +Releases always use the first option; see [PUBLISHING.md](PUBLISHING.md). ## JVM JVM diff --git a/build.gradle.kts b/build.gradle.kts index 33320c71..1b2b54e6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -66,7 +66,7 @@ gradle.taskGraph.whenReady { val included = gradle.includedBuilds.map { it.name } check(included.isEmpty() || allTasks.none { it.name.startsWith("publish") }) { "Refusing to publish while zenoh-flat-jni is an included build $included. " + - "See README.md, Building against zenoh-flat-jni source." + "See README.md, Where the native library comes from." } } diff --git a/settings.gradle.kts b/settings.gradle.kts index f843491f..c611308b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -28,31 +28,34 @@ include(":examples") // an ordinary Maven artifact: org.eclipse.zenoh:zenoh-flat-jni:$zenohFlatJniVersion. // // A build can be pointed at its *source* instead, through a composite build. -// Where that source comes from is decided here, in this order: +// Three ways to build, and nothing else to know: // -// 1. -PflatJniDir= an existing checkout, used as it is -// 2. path = "…" in Cargo.toml the ordinary Cargo way of saying "use my copy", -// and the only switch that lives in a tracked file -// 3. -PuseLocalFlatJni=true the commit Cargo.lock pins - fetched into -// .zenoh-flat-jni/ unless it is already there, or -// overridden with -PflatJniCommit= -// 4. otherwise the Maven artifact, with no composite at all +// nothing the Maven artifact, no composite build, no Rust +// -PuseLocalFlatJni=true whatever Cargo.toml says: `git` means the commit +// Cargo.lock pins (resolved with Cargo if there is no +// lockfile yet), `path` means that directory +// -PflatJniDir= that directory, skipping Cargo.toml altogether // -// A release takes 4, and must: with a composite build the published artifact -// would carry whatever was on the builder's disk while the POM still claimed the -// released version. +// A release takes the first, and must: with a composite build the published +// artifact would carry whatever was on the builder's disk while the POM still +// claimed the released version. +// +// A `path = "…"` in Cargo.toml is honoured with or without the property - it is +// a deliberate local edit, and Cargo would honour it too. val flatJniRepository = "https://github.com/eclipse-zenoh/zenoh-flat-jni.git" -fun git(dir: File, vararg args: String): String { - val process = ProcessBuilder(listOf("git", *args)) +fun run(command: String, dir: File, vararg args: String): String { + val process = ProcessBuilder(listOf(command, *args)) .directory(dir) .redirectErrorStream(true) .start() val output = process.inputStream.bufferedReader().readText().trim() - check(process.waitFor() == 0) { "git ${args.joinToString(" ")} failed in $dir:\n$output" } + check(process.waitFor() == 0) { "$command ${args.joinToString(" ")} failed in $dir:\n$output" } return output } +fun git(dir: File, vararg args: String): String = run("git", dir, *args) + /** The pinned commit, checked out under [into]; fetched only when it is not already there. */ fun checkoutPinned(commit: String, into: File): File { if (File(into, ".git").isDirectory && git(into, "rev-parse", "HEAD") == commit) return into @@ -70,20 +73,30 @@ fun cargoTomlPath(): String? = ?.let { Regex("""^\s*zenoh-flat-jni\s*=\s*\{[^}\n]*\bpath\s*=\s*"([^"]+)"""", RegexOption.MULTILINE).find(it) } ?.groupValues?.get(1) -/** The commit Cargo.lock pins for the root pin crate; null if a path override erased it. */ +/** The commit Cargo.lock pins for the root pin crate; null if there is no lockfile or no entry. */ fun cargoLockCommit(): String? = File(settingsDir, "Cargo.lock").takeIf { it.isFile }?.readText() ?.let { Regex("""/zenoh-flat-jni\.git[^#"]*#([0-9a-f]{40})"""").find(it) } ?.groupValues?.get(1) +/** The commit the git dependency in Cargo.toml resolves to, resolving it first if need be. */ +fun pinnedCommit(): String { + cargoLockCommit()?.let { return it } + // No lockfile, or none that mentions zenoh-flat-jni: let Cargo write one. That + // is the same resolution a `cargo build` here would do, and it needs the + // network but not a compiler. + println("No zenoh-flat-jni commit in Cargo.lock; resolving it with Cargo") + run("cargo", settingsDir, "generate-lockfile") + return checkNotNull(cargoLockCommit()) { + "Cargo.toml declares no git dependency on zenoh-flat-jni to resolve - see CI.md." + } +} + val flatJniSource: File? = - providers.gradleProperty("flatJniDir").orNull?.let { File(settingsDir, it) } - ?: cargoTomlPath()?.let { File(settingsDir, it) } + providers.gradleProperty("flatJniDir").orNull?.let { settingsDir.resolve(it) } + ?: cargoTomlPath()?.let { settingsDir.resolve(it) } ?: if (providers.gradleProperty("useLocalFlatJni").orNull?.toBoolean() == true) { - val commit = providers.gradleProperty("flatJniCommit").orNull ?: cargoLockCommit() - checkNotNull(commit) { - "Cargo.lock pins no zenoh-flat-jni commit. A path override or [patch] erases it - see PUBLISHING.md." - } + val commit = providers.gradleProperty("flatJniCommit").orNull ?: pinnedCommit() checkoutPinned(commit, File(settingsDir, ".zenoh-flat-jni")) } else null From 50c908bb19d864b6dff60ba9bc8e2fb2cb54c6db Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Tue, 11 Aug 2026 00:37:37 +0200 Subject: [PATCH 5/9] Rename the source-build properties to useLocalJni / localJniDir Also localJniCommit, so the three share one prefix. --- .github/workflows/ci.yml | 4 ++-- CI.md | 8 ++++---- PUBLISHING.md | 6 +++--- README.md | 10 +++++----- build.gradle.kts | 4 ++-- gradle.properties | 6 +++--- settings.gradle.kts | 10 +++++----- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a3959568..ad2d6037 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,8 +57,8 @@ jobs: # No checkout or cargo step precedes this. The build fetches its own # pinned bindings, and their test task depends on their native build, so # Gradle drives both git and cargo - which is why `./gradlew jvmTest - # -PuseLocalFlatJni=true` reproduces this run anywhere. - run: ./gradlew jvmTest --info -PuseLocalFlatJni=true + # -PuseLocalJni=true` reproduces this run anywhere. + run: ./gradlew jvmTest --info -PuseLocalJni=true markdown_lint: runs-on: ubuntu-latest diff --git a/CI.md b/CI.md index 8467aad5..a7fdbcdb 100644 --- a/CI.md +++ b/CI.md @@ -18,7 +18,7 @@ source yourself, [README.md](README.md#where-the-native-library-comes-from). One job per platform, and one command that matters: ```bash -./gradlew jvmTest --info -PuseLocalFlatJni=true +./gradlew jvmTest --info -PuseLocalJni=true ``` That property makes the build resolve `zenoh-flat-jni` from **source** rather @@ -40,8 +40,8 @@ time. In order: | | | | | --- | --- | --- | -| `-PflatJniDir=` | that directory, as it is | `Cargo.toml` not read | -| `-PuseLocalFlatJni=true` | whatever `Cargo.toml` says | `git` → the `Cargo.lock` commit; `path` → that directory | +| `-PlocalJniDir=` | that directory, as it is | `Cargo.toml` not read | +| `-PuseLocalJni=true` | whatever `Cargo.toml` says | `git` → the `Cargo.lock` commit; `path` → that directory | | neither | Maven Central | no composite build | The middle row is the Rust-shaped one: the manifest is the switch, exactly as it @@ -52,7 +52,7 @@ would be for a Cargo build. generate-lockfile` to produce one — the same resolution a `cargo build` here would do, needing the network but no compiler. The commit is then fetched into `.zenoh-flat-jni/` (gitignored), shallow, and only when that directory is not - already at it. `-PflatJniCommit=` overrides the commit without touching + already at it. `-PlocalJniCommit=` overrides the commit without touching the lockfile. - **`path`** is honoured with or without the property — it is a deliberate local edit, and Cargo would honour it too: diff --git a/PUBLISHING.md b/PUBLISHING.md index 94f1ce32..bc8639ad 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -160,7 +160,7 @@ release is blocked. | Rehearsal | resolves zenoh-flat-jni from | proves | | --- | --- | --- | -| local build and tests | a sibling checkout, via `-PuseLocalFlatJni=true` | the code compiles and the tests pass | +| local build and tests | a sibling checkout, via `-PuseLocalJni=true` | the code compiles and the tests pass | | CI, `maven_publish` unchecked | the snapshot repository | the artifact assembles | | CI, snapshot publication | `zenoh-flat-jni:-SNAPSHOT` | signing, credentials, a real upload | | live release | `zenoh-flat-jni:` on Central | **blocked until that exists** | @@ -237,7 +237,7 @@ and [CI.md](CI.md) for the commit pin behind it. built from source on the builder's disk while the POM still claimed the released version it was supposed to be built against. Nothing opts in by default, and `build.gradle.kts` fails any `publish*` task while an included build is present, -so a leftover `-PuseLocalFlatJni`, `-PflatJniDir` or `path = "…"` cannot reach a +so a leftover `-PuseLocalJni`, `-PlocalJniDir` or `path = "…"` cannot reach a publication silently. Which `zenoh-flat-jni` *release* this SDK is built and published against is @@ -274,7 +274,7 @@ repository. - [ ] `version.txt` and the intended tag agree. - [ ] A rehearsal completed under a fresh version, with publication enabled at least once so signing and credentials were exercised. -- [ ] `useLocalFlatJni` is off — the release resolves from Central. +- [ ] `useLocalJni` is off — the release resolves from Central. - [ ] The published POM references a released `zenoh-flat-jni`, not a snapshot. - [ ] For an Android release: the Android POM references `zenoh-flat-jni-android`, not the desktop coordinate. diff --git a/README.md b/README.md index 6d830a8d..a6dc48c1 100644 --- a/README.md +++ b/README.md @@ -136,26 +136,26 @@ Three ways to build. Pick by what you are doing: | I want to… | build with | Rust needed | | --- | --- | --- | | just build or use the SDK | `./gradlew build` | no | -| build the bindings from source too | `./gradlew build -PuseLocalFlatJni=true` | yes | -| build against my own checkout | `./gradlew build -PflatJniDir=../zenoh-flat-jni` | yes | +| build the bindings from source too | `./gradlew build -PuseLocalJni=true` | yes | +| build against my own checkout | `./gradlew build -PlocalJniDir=../zenoh-flat-jni` | yes | **The default** downloads `org.eclipse.zenoh:zenoh-flat-jni` from Maven Central with the native library already inside it. Nothing is compiled from Rust and no toolchain is needed. -**`-PuseLocalFlatJni=true`** builds the bindings from source, as `Cargo.toml` +**`-PuseLocalJni=true`** builds the bindings from source, as `Cargo.toml` says — the usual Rust arrangement, and the one CI uses. A `git` dependency there means the exact commit recorded in `Cargo.lock` (resolved on the spot if there is no lockfile yet); a `path` means that directory. So ```bash -./gradlew jvmTest -PuseLocalFlatJni=true +./gradlew jvmTest -PuseLocalJni=true ``` reproduces a CI run exactly. See [CI.md](CI.md) for how that commit is chosen and kept current. -**`-PflatJniDir=`** points straight at a checkout, no `Cargo.toml` involved. +**`-PlocalJniDir=`** points straight at a checkout, no `Cargo.toml` involved. Use it to try a branch or a scratch copy without editing anything. Both source options need a Rust toolchain ([rustup.rs](https://rustup.rs)); diff --git a/build.gradle.kts b/build.gradle.kts index 1b2b54e6..b9234aee 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -60,8 +60,8 @@ nexusPublishing { // A composite build must never reach a publication: the artifact would be built // from zenoh-flat-jni source on the builder's disk, while the POM went on // naming the released version it was supposed to be built against. Nothing opts -// in by default, so this only catches a leftover - `-PuseLocalFlatJni`, -// `-PflatJniDir`, or a `path = "..."` left in Cargo.toml. +// in by default, so this only catches a leftover - `-PuseLocalJni`, +// `-PlocalJniDir`, or a `path = "..."` left in Cargo.toml. gradle.taskGraph.whenReady { val included = gradle.includedBuilds.map { it.name } check(included.isEmpty() || allTasks.none { it.name.startsWith("publish") }) { diff --git a/gradle.properties b/gradle.properties index 3d1a48df..b14ed9ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true # -PzenohFlatJniVersion=1.9.0-rc3-SNAPSHOT. zenohFlatJniVersion=1.9.0 -# Substitute a sibling ../zenoh-flat-jni checkout instead of resolving the -# artifact. Never enable this for a release. -useLocalFlatJni=false +# Build zenoh-flat-jni from source, as Cargo.toml says, instead of resolving the +# published artifact. See README.md. Never enable this for a release. +useLocalJni=false diff --git a/settings.gradle.kts b/settings.gradle.kts index c611308b..66c242eb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -31,10 +31,10 @@ include(":examples") // Three ways to build, and nothing else to know: // // nothing the Maven artifact, no composite build, no Rust -// -PuseLocalFlatJni=true whatever Cargo.toml says: `git` means the commit +// -PuseLocalJni=true whatever Cargo.toml says: `git` means the commit // Cargo.lock pins (resolved with Cargo if there is no // lockfile yet), `path` means that directory -// -PflatJniDir= that directory, skipping Cargo.toml altogether +// -PlocalJniDir= that directory, skipping Cargo.toml altogether // // A release takes the first, and must: with a composite build the published // artifact would carry whatever was on the builder's disk while the POM still @@ -93,10 +93,10 @@ fun pinnedCommit(): String { } val flatJniSource: File? = - providers.gradleProperty("flatJniDir").orNull?.let { settingsDir.resolve(it) } + providers.gradleProperty("localJniDir").orNull?.let { settingsDir.resolve(it) } ?: cargoTomlPath()?.let { settingsDir.resolve(it) } - ?: if (providers.gradleProperty("useLocalFlatJni").orNull?.toBoolean() == true) { - val commit = providers.gradleProperty("flatJniCommit").orNull ?: pinnedCommit() + ?: if (providers.gradleProperty("useLocalJni").orNull?.toBoolean() == true) { + val commit = providers.gradleProperty("localJniCommit").orNull ?: pinnedCommit() checkoutPinned(commit, File(settingsDir, ".zenoh-flat-jni")) } else null From 4f865780c1ac64b3f788a9f745f881fa50ecbde0 Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Tue, 11 Aug 2026 00:49:41 +0200 Subject: [PATCH 6/9] Give the pin a second mover, for changes that never touch zenoh Review on the zenoh-kotlin twin caught that the lockfile sync only fires when zenoh's Cargo.lock moves, so a zenoh-flat-jni-only fix would leave this pin sitting still - reproducible, but not current. update-flat-jni.yml runs cargo update -p zenoh-flat-jni on a schedule and opens the same kind of auto-merging pull request, gated on this repository's CI. Also: the pin crate pointed at PUBLISHING.md instead of CI.md, checkoutPinned hard-failed on a half-initialised checkout and refetched for an abbreviated commit, and the test section did not mention the two source options. --- .github/workflows/update-flat-jni.yml | 80 +++++++++++++++++++++++++++ CI.md | 28 +++++++++- Cargo.toml | 4 +- README.md | 12 +++- settings.gradle.kts | 5 +- 5 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/update-flat-jni.yml diff --git a/.github/workflows/update-flat-jni.yml b/.github/workflows/update-flat-jni.yml new file mode 100644 index 00000000..a119a13b --- /dev/null +++ b/.github/workflows/update-flat-jni.yml @@ -0,0 +1,80 @@ +# Moves the zenoh-flat-jni commit this SDK is tested against - see CI.md. +# +# eclipse-zenoh/ci's lockfile sync only runs when *zenoh's* Cargo.lock moves, so +# it cannot advance this pin for a change that never touches zenoh - a JNI fix, +# a generator change. This does, on a schedule, and produces the same artifact: +# a pull request that auto-merges once this repository's own CI has passed +# against the new commit. +name: Update zenoh-flat-jni pin + +on: + schedule: + - cron: "0 3 * * 1-5" + workflow_dispatch: + inputs: + commit: + type: string + description: The zenoh-flat-jni commit to pin. Defaults to its main tip. + required: false + +jobs: + update: + name: Update the pinned commit + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Rust toolchain + run: rustup show + + - name: cargo update zenoh-flat-jni + run: | + if [[ -n "${{ inputs.commit }}" ]]; then + cargo update -p zenoh-flat-jni --precise "${{ inputs.commit }}" + else + cargo update -p zenoh-flat-jni + fi + + - name: Read the pinned commit + id: pin + run: | + commit=$(sed -n 's|.*zenoh-flat-jni\.git[^#]*#\([0-9a-f]\{40\}\).*|\1|p' Cargo.lock | head -1) + echo "commit=$commit" >> $GITHUB_OUTPUT + echo "short=${commit:0:7}" >> $GITHUB_OUTPUT + + - name: Create/Update a pull request if the lockfile changed + id: cpr + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 + with: + title: "build: Pin zenoh-flat-jni ${{ steps.pin.outputs.short }}" + body: | + Moves the zenoh-flat-jni commit this SDK is built and tested against. + + - **sha**: eclipse-zenoh/zenoh-flat-jni@${{ steps.pin.outputs.commit }} + - **workflow**: [${{ github.run_id }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) + + Merging is gated on this repository's CI, which runs its tests against + that very commit. See [CI.md](../blob/main/CI.md). + commit-message: "build: Pin zenoh-flat-jni ${{ steps.pin.outputs.short }}" + committer: eclipse-zenoh-bot + author: eclipse-zenoh-bot + branch: eclipse-zenoh-bot/update-flat-jni-pin + delete-branch: true + labels: dependencies, internal + token: ${{ secrets.BOT_TOKEN_WORKFLOW }} + + - name: Enable auto merge for the pull request + if: contains(fromJSON('["created", "updated"]'), steps.cpr.outputs.pull-request-operation) + run: > + gh pr merge "${{ steps.cpr.outputs.pull-request-number }}" + --subject "build: Pin zenoh-flat-jni ${{ steps.pin.outputs.short }} (#${{ steps.cpr.outputs.pull-request-number }})" + --squash + --auto + env: + GH_TOKEN: ${{ secrets.BOT_TOKEN_WORKFLOW }} + + - name: Add the PR as annotation to workflow run + if: contains(fromJSON('["created", "updated"]'), steps.cpr.outputs.pull-request-operation) + run: > + echo "::notice:: PR ${{ steps.cpr.outputs.pull-request-operation }}: + https://github.com/${{ github.repository }}/pull/${{ steps.cpr.outputs.pull-request-number }}" diff --git a/CI.md b/CI.md index a7fdbcdb..22539081 100644 --- a/CI.md +++ b/CI.md @@ -10,6 +10,7 @@ source yourself, [README.md](README.md#where-the-native-library-comes-from). - [How the source is resolved](#how-the-source-is-resolved) - [The pin](#the-pin) - [Lockfile synchronization](#lockfile-synchronization) +- [Moving the pin: the two bots](#moving-the-pin-the-two-bots) - [Moving the pin by hand](#moving-the-pin-by-hand) - [Publishing does not use any of this](#publishing-does-not-use-any-of-this) @@ -97,9 +98,10 @@ lockfile, never to compile. ## Lockfile synchronization -The pin makes a run reproducible. What keeps it from going stale is -[`eclipse-zenoh/ci`](https://github.com/eclipse-zenoh/ci)'s **`sync-lockfiles`** -workflow, which every zenoh dependant already uses to stay aligned with zenoh: +The pin makes a run reproducible. Two bots keep it from going stale; this is the +first. [`eclipse-zenoh/ci`](https://github.com/eclipse-zenoh/ci)'s +**`sync-lockfiles`** workflow is what every zenoh dependant already uses to stay +aligned with zenoh: ```text zenoh ──> zenoh-flat ──> zenoh-flat-jni ──> zenoh-java @@ -128,6 +130,26 @@ nothing is built from this lockfile — but it means the zenoh revision recorded here is not necessarily the one inside the zenoh-flat-jni commit it pins. The commit is the pin; the rest of the lockfile is a by-product. +## Moving the pin: the two bots + +The lockfile sync above runs only when **zenoh's** `Cargo.lock` moves. That +covers the case it was built for — an ABI change rippling down the stack — but +not a change that never touches zenoh: a JNI fix, a generator change, anything +landing in zenoh-flat-jni alone. Left at that, the pin would sit still until an +unrelated zenoh change happened to drag it forward. + +So the pin has a second mover, in this repository: +[`update-flat-jni.yml`](.github/workflows/update-flat-jni.yml). It runs +`cargo update -p zenoh-flat-jni` on a weekday schedule, and opens the same kind +of pull request — auto-merging once this repository's CI has passed against the +new commit. `workflow_dispatch` runs it on demand, optionally with a `commit` +input to pin something specific. + +Between the two: zenoh's lockfile moves → the sync brings this one along; +zenoh-flat-jni's `main` moves → the scheduled job brings the pin along. Both +land through a pull request whose merge is gated on the tests here, so the pin +only ever advances to a commit this SDK actually passes against. + ## Moving the pin by hand Normally you don't — the bot's pull request does. When you need to, for example diff --git a/Cargo.toml b/Cargo.toml index 77955a47..d0fcb92b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,8 +2,8 @@ # commit this SDK is tested against is recorded in a Cargo.lock, which is the # artifact eclipse-zenoh/ci's lockfile sync knows how to move: it overwrites the # lockfile with zenoh's, and resolving this manifest again writes back the -# current zenoh-flat-jni commit. CI reads that commit out of Cargo.lock and -# checks it out; see PUBLISHING.md. +# current zenoh-flat-jni commit. The Gradle build reads that commit out of +# Cargo.lock and checks it out; see CI.md. # # It sits at the repository root so this repository is an ordinary dependant of # that workflow rather than a special case in it. diff --git a/README.md b/README.md index a6dc48c1..43340f5d 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,17 @@ To run the tests, run: ``` This runs the tests against the JVM target. Nothing native is compiled: the -libraries come from the `zenoh-flat-jni` dependency. +libraries come from the `zenoh-flat-jni` dependency. The two source options from +[Where the native library comes from](#where-the-native-library-comes-from) +apply here as well, and both do compile it: + +```bash +./gradlew jvmTest -PuseLocalJni=true # the pinned commit — what CI runs +./gradlew jvmTest -PlocalJniDir=../zenoh-flat-jni # your own checkout +``` + +Use the second when you are changing both repositories together — the first +tests the commit `Cargo.lock` pins, not your working tree. ## Logging diff --git a/settings.gradle.kts b/settings.gradle.kts index 66c242eb..d118586d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -58,7 +58,10 @@ fun git(dir: File, vararg args: String): String = run("git", dir, *args) /** The pinned commit, checked out under [into]; fetched only when it is not already there. */ fun checkoutPinned(commit: String, into: File): File { - if (File(into, ".git").isDirectory && git(into, "rev-parse", "HEAD") == commit) return into + // rev-parse fails on a directory that was initialised but never fetched, and + // -PlocalJniCommit may be abbreviated: both mean "not there yet", not "give up". + val head = runCatching { git(into, "rev-parse", "HEAD") }.getOrNull() + if (head?.startsWith(commit.lowercase()) == true) return into into.mkdirs() if (!File(into, ".git").isDirectory) git(into, "init", "--quiet") println("Fetching zenoh-flat-jni $commit into $into") From 71cecfe1c05720804f2ebbc1fb609742beee45d5 Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Tue, 11 Aug 2026 01:04:48 +0200 Subject: [PATCH 7/9] Drop the second updater: the lockfile sync already covers this Verified rather than assumed: zenoh's Cargo.lock carries no zenoh-flat-jni entry, so overwriting this lockfile with it removes the pin, and rectifying re-resolves it to zenoh-flat-jni's main tip. zenoh's lockfile moves every day or two, and the resulting PR is gated on this repository's CI, so a zenoh-flat-jni commit that breaks these tests cannot land - detection and gating are already there without a second bot. --- .github/workflows/update-flat-jni.yml | 80 --------------------------- CI.md | 35 ++++-------- 2 files changed, 10 insertions(+), 105 deletions(-) delete mode 100644 .github/workflows/update-flat-jni.yml diff --git a/.github/workflows/update-flat-jni.yml b/.github/workflows/update-flat-jni.yml deleted file mode 100644 index a119a13b..00000000 --- a/.github/workflows/update-flat-jni.yml +++ /dev/null @@ -1,80 +0,0 @@ -# Moves the zenoh-flat-jni commit this SDK is tested against - see CI.md. -# -# eclipse-zenoh/ci's lockfile sync only runs when *zenoh's* Cargo.lock moves, so -# it cannot advance this pin for a change that never touches zenoh - a JNI fix, -# a generator change. This does, on a schedule, and produces the same artifact: -# a pull request that auto-merges once this repository's own CI has passed -# against the new commit. -name: Update zenoh-flat-jni pin - -on: - schedule: - - cron: "0 3 * * 1-5" - workflow_dispatch: - inputs: - commit: - type: string - description: The zenoh-flat-jni commit to pin. Defaults to its main tip. - required: false - -jobs: - update: - name: Update the pinned commit - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install Rust toolchain - run: rustup show - - - name: cargo update zenoh-flat-jni - run: | - if [[ -n "${{ inputs.commit }}" ]]; then - cargo update -p zenoh-flat-jni --precise "${{ inputs.commit }}" - else - cargo update -p zenoh-flat-jni - fi - - - name: Read the pinned commit - id: pin - run: | - commit=$(sed -n 's|.*zenoh-flat-jni\.git[^#]*#\([0-9a-f]\{40\}\).*|\1|p' Cargo.lock | head -1) - echo "commit=$commit" >> $GITHUB_OUTPUT - echo "short=${commit:0:7}" >> $GITHUB_OUTPUT - - - name: Create/Update a pull request if the lockfile changed - id: cpr - uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1 - with: - title: "build: Pin zenoh-flat-jni ${{ steps.pin.outputs.short }}" - body: | - Moves the zenoh-flat-jni commit this SDK is built and tested against. - - - **sha**: eclipse-zenoh/zenoh-flat-jni@${{ steps.pin.outputs.commit }} - - **workflow**: [${{ github.run_id }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) - - Merging is gated on this repository's CI, which runs its tests against - that very commit. See [CI.md](../blob/main/CI.md). - commit-message: "build: Pin zenoh-flat-jni ${{ steps.pin.outputs.short }}" - committer: eclipse-zenoh-bot - author: eclipse-zenoh-bot - branch: eclipse-zenoh-bot/update-flat-jni-pin - delete-branch: true - labels: dependencies, internal - token: ${{ secrets.BOT_TOKEN_WORKFLOW }} - - - name: Enable auto merge for the pull request - if: contains(fromJSON('["created", "updated"]'), steps.cpr.outputs.pull-request-operation) - run: > - gh pr merge "${{ steps.cpr.outputs.pull-request-number }}" - --subject "build: Pin zenoh-flat-jni ${{ steps.pin.outputs.short }} (#${{ steps.cpr.outputs.pull-request-number }})" - --squash - --auto - env: - GH_TOKEN: ${{ secrets.BOT_TOKEN_WORKFLOW }} - - - name: Add the PR as annotation to workflow run - if: contains(fromJSON('["created", "updated"]'), steps.cpr.outputs.pull-request-operation) - run: > - echo "::notice:: PR ${{ steps.cpr.outputs.pull-request-operation }}: - https://github.com/${{ github.repository }}/pull/${{ steps.cpr.outputs.pull-request-number }}" diff --git a/CI.md b/CI.md index 22539081..248f0fc4 100644 --- a/CI.md +++ b/CI.md @@ -10,7 +10,6 @@ source yourself, [README.md](README.md#where-the-native-library-comes-from). - [How the source is resolved](#how-the-source-is-resolved) - [The pin](#the-pin) - [Lockfile synchronization](#lockfile-synchronization) -- [Moving the pin: the two bots](#moving-the-pin-the-two-bots) - [Moving the pin by hand](#moving-the-pin-by-hand) - [Publishing does not use any of this](#publishing-does-not-use-any-of-this) @@ -98,10 +97,9 @@ lockfile, never to compile. ## Lockfile synchronization -The pin makes a run reproducible. Two bots keep it from going stale; this is the -first. [`eclipse-zenoh/ci`](https://github.com/eclipse-zenoh/ci)'s -**`sync-lockfiles`** workflow is what every zenoh dependant already uses to stay -aligned with zenoh: +The pin makes a run reproducible. What keeps it from going stale is +[`eclipse-zenoh/ci`](https://github.com/eclipse-zenoh/ci)'s **`sync-lockfiles`** +workflow, which every zenoh dependant already uses to stay aligned with zenoh: ```text zenoh ──> zenoh-flat ──> zenoh-flat-jni ──> zenoh-java @@ -124,32 +122,19 @@ that builds, and only if the tests here pass against it. That is also why the pin crate sits at the repository **root**: it makes this repository an ordinary dependant of that workflow rather than a special case inside it. +Note what moves the pin, and what does not: the trigger is a change to *zenoh's* +lockfile, not to zenoh-flat-jni. The pin advances because every sync run +re-resolves it, not because zenoh-flat-jni moved. In practice that is frequent +enough — zenoh's lockfile changes every day or two — but it is a side effect, so +when you need a zenoh-flat-jni commit picked up now rather than at the next sync, +move the pin by hand as below. + One consequence worth knowing: the sync also re-pins `zenoh` in this lockfile, where zenoh is merely a transitive dependency of the pin crate. Harmless — nothing is built from this lockfile — but it means the zenoh revision recorded here is not necessarily the one inside the zenoh-flat-jni commit it pins. The commit is the pin; the rest of the lockfile is a by-product. -## Moving the pin: the two bots - -The lockfile sync above runs only when **zenoh's** `Cargo.lock` moves. That -covers the case it was built for — an ABI change rippling down the stack — but -not a change that never touches zenoh: a JNI fix, a generator change, anything -landing in zenoh-flat-jni alone. Left at that, the pin would sit still until an -unrelated zenoh change happened to drag it forward. - -So the pin has a second mover, in this repository: -[`update-flat-jni.yml`](.github/workflows/update-flat-jni.yml). It runs -`cargo update -p zenoh-flat-jni` on a weekday schedule, and opens the same kind -of pull request — auto-merging once this repository's CI has passed against the -new commit. `workflow_dispatch` runs it on demand, optionally with a `commit` -input to pin something specific. - -Between the two: zenoh's lockfile moves → the sync brings this one along; -zenoh-flat-jni's `main` moves → the scheduled job brings the pin along. Both -land through a pull request whose merge is gated on the tests here, so the pin -only ever advances to a commit this SDK actually passes against. - ## Moving the pin by hand Normally you don't — the bot's pull request does. When you need to, for example From eeda8c017188bc6753ac1abcebbe6f56a89dab14 Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Tue, 11 Aug 2026 01:14:22 +0200 Subject: [PATCH 8/9] Require a full commit hash for -PlocalJniCommit The prefix compare only avoided a refetch when an abbreviation happened to match a cached HEAD; on a cold or different checkout it reached 'git fetch ', which no remote can answer. An empty value was accepted outright. Validate 40 hex digits before anything is fetched. --- CI.md | 3 ++- settings.gradle.kts | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CI.md b/CI.md index 248f0fc4..b8f2f6b4 100644 --- a/CI.md +++ b/CI.md @@ -53,7 +53,8 @@ would be for a Cargo build. would do, needing the network but no compiler. The commit is then fetched into `.zenoh-flat-jni/` (gitignored), shallow, and only when that directory is not already at it. `-PlocalJniCommit=` overrides the commit without touching - the lockfile. + the lockfile; it has to be a full 40-character hash, because that is what a + remote can be asked to fetch. - **`path`** is honoured with or without the property — it is a deliberate local edit, and Cargo would honour it too: diff --git a/settings.gradle.kts b/settings.gradle.kts index d118586d..0c452a83 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -56,12 +56,20 @@ fun run(command: String, dir: File, vararg args: String): String { fun git(dir: File, vararg args: String): String = run("git", dir, *args) +/** A commit that `git fetch ` can actually ask for: a full 40-hex hash. */ +fun fullCommit(value: String): String = value.lowercase().also { + check(it.matches(Regex("[0-9a-f]{40}"))) { + "-PlocalJniCommit must be a full 40-character commit hash, not \"$value\": " + + "a remote cannot be asked to fetch an abbreviation." + } +} + /** The pinned commit, checked out under [into]; fetched only when it is not already there. */ fun checkoutPinned(commit: String, into: File): File { - // rev-parse fails on a directory that was initialised but never fetched, and - // -PlocalJniCommit may be abbreviated: both mean "not there yet", not "give up". + // rev-parse fails on a directory that was initialised but never fetched: that + // means "not there yet", not "give up". val head = runCatching { git(into, "rev-parse", "HEAD") }.getOrNull() - if (head?.startsWith(commit.lowercase()) == true) return into + if (head == commit) return into into.mkdirs() if (!File(into, ".git").isDirectory) git(into, "init", "--quiet") println("Fetching zenoh-flat-jni $commit into $into") @@ -99,7 +107,8 @@ val flatJniSource: File? = providers.gradleProperty("localJniDir").orNull?.let { settingsDir.resolve(it) } ?: cargoTomlPath()?.let { settingsDir.resolve(it) } ?: if (providers.gradleProperty("useLocalJni").orNull?.toBoolean() == true) { - val commit = providers.gradleProperty("localJniCommit").orNull ?: pinnedCommit() + val commit = providers.gradleProperty("localJniCommit").orNull?.let { fullCommit(it) } + ?: pinnedCommit() checkoutPinned(commit, File(settingsDir, ".zenoh-flat-jni")) } else null From 1592cf2061fc9356dd1a2c91f32d048677c33a66 Mon Sep 17 00:00:00 2001 From: Michael Ilyin Date: Tue, 11 Aug 2026 01:24:10 +0200 Subject: [PATCH 9/9] Finish the port: two spots still described the old behaviour The rehearsal table and the test section were updated by renaming the property rather than by saying what it now does - it fetches the pinned commit, not a sibling checkout - and the test section did not mention that both source options need a Rust toolchain. --- PUBLISHING.md | 6 +++--- README.md | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/PUBLISHING.md b/PUBLISHING.md index bc8639ad..1bc607f6 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -160,7 +160,7 @@ release is blocked. | Rehearsal | resolves zenoh-flat-jni from | proves | | --- | --- | --- | -| local build and tests | a sibling checkout, via `-PuseLocalJni=true` | the code compiles and the tests pass | +| local build and tests | its source — the pinned commit, or your own checkout ([README](README.md#where-the-native-library-comes-from)) | the code compiles and the tests pass | | CI, `maven_publish` unchecked | the snapshot repository | the artifact assembles | | CI, snapshot publication | `zenoh-flat-jni:-SNAPSHOT` | signing, credentials, a real upload | | live release | `zenoh-flat-jni:` on Central | **blocked until that exists** | @@ -203,8 +203,8 @@ oversight, and not by someone leaving a flag set. The guarantee is structural rather than procedural. While developing, prefer not to involve a repository at all — see -[Where the native library comes from](README.md#where-the-native-library-comes-from) in the README, -and [CI.md](CI.md) for the commit pin behind it. +[Where the native library comes from](README.md#where-the-native-library-comes-from) +in the README. ## How the pipeline works diff --git a/README.md b/README.md index 43340f5d..c4b3a32a 100644 --- a/README.md +++ b/README.md @@ -256,7 +256,8 @@ To run the tests, run: This runs the tests against the JVM target. Nothing native is compiled: the libraries come from the `zenoh-flat-jni` dependency. The two source options from [Where the native library comes from](#where-the-native-library-comes-from) -apply here as well, and both do compile it: +apply here as well, and both do compile it, so both need a Rust toolchain (see +[rustup.rs](https://rustup.rs)): ```bash ./gradlew jvmTest -PuseLocalJni=true # the pinned commit — what CI runs