difftreelog
refactor c bindings
in: trunk
26 files changed
Cargo.lockdiffbeforeafterboth314 packageslockfile v3
Might be heavy and slow!
abort-on-drop
0.2.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5dd6d700ad9af641490c1f7d67980d2de4d1433016e5b12f819448d3c832142adepends onused byaddr2line
0.21.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cbdepends onused byadler
1.0.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35feused byaead
0.5.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0depends onaes
0.8.4crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0depends onused byaes-gcm
0.10.3crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1used byage
0.10.0crates.io↘ 27↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumedeef7d7b199195a2d7d7a8155d2d04aee736e60c5c7bdd7097d115369a8817ddepends on- aes
0.8.4 - aes-gcm
0.10.3 - age-core
0.10.0 - base64
0.21.7 - bcrypt-pbkdf
0.10.0 - bech32
0.9.1 - cbc
0.1.2 - chacha20poly1305
0.10.1 - cipher
0.4.4 - cookie-factory
0.3.3 - ctr
0.9.2 - curve25519-dalek
4.1.2 - hmac
0.12.1 - i18n-embed
0.14.1 - i18n-embed-fl
0.7.0 - lazy_static
1.4.0 - nom
7.1.3 - num-traits
0.2.19 - pin-project
1.1.5 - rand
0.8.5 - rsa
0.9.6 - rust-embed
8.4.0 - scrypt
0.11.0 - sha2
0.10.8 - subtle
2.5.0 - x25519-dalek
2.0.1 - zeroize
1.7.0
- aes
age-core
0.10.0crates.io↘ 9↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5f11899bc2bbddd135edbc30c36b1924fa59d0746bb45beb5933fafe3fe509bdepends onused byaho-corasick
1.1.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916depends onalejandra
3.0.0github.com/kamadorueda/alejandra↘ 3↖ 1sourcegit+https://github.com/kamadorueda/alejandra#bb688cc2c22e43b3cd710eadc0340399c2de3151depends onused byandroid_system_properties
0.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311depends onused byandroid-tzdata
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0used byanstream
0.6.14crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15bdepends onused byanstyle
1.0.7crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1banstyle-parse
0.2.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4depends onused byanstyle-query
1.0.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5depends onused byanstyle-wincon
3.0.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19depends onused byanyhow
1.0.83crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3arc-swap
1.7.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457used byasync-trait
0.1.80crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737cadepends onused byautocfg
1.3.0crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0backtrace
0.3.71crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9ddepends onused bybase64
0.21.7crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567base64
0.22.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6used bybcrypt-pbkdf
0.10.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6aeac2e1fe888769f34f05ac343bbef98b14d1ffb292ab69d4608b3abc86f2a2depends onused bybetter-command
0.1.0workspace↘ 6↖ 1bitflags
2.5.0crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1depends onblock-buffer
0.10.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71depends onused byblock-padding
0.3.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93depends onused byblowfish
0.9.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7depends onused bybumpalo
3.16.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012cused bybytecount
0.6.8crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ceused bybyteorder
1.5.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64bbytes
1.6.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9used bycbc
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6depends onused bycbitset
0.2.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29b6ad25ae296159fb0da12b970b2fe179b234584d7cd294c891e2bbb284466bdepends onused bycc
1.0.97crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4cfg-if
1.0.0crates.io↘ 0↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbaf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fdchacha20
0.9.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818depends onused bychacha20poly1305
0.10.1crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35used bychrono
0.4.38crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401depends onused bycipher
0.4.4crates.io↘ 3↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3daddepends onclap
4.4.18crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865cdepends onclap_builder
4.4.18crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7depends onused byclap_derive
4.4.7crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442used byclap_lex
0.6.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1used bycolorchoice
1.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422used byconsole
0.15.8crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4ebused byconst-oid
0.9.6crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8used bycookie-factory
0.3.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2depends onused bycore-foundation-sys
0.8.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868fused bycountme
2.0.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum328b822bdcba4d4e402be8d9adb6eebf269f969f8eadef977a553ff3c4fbcb58used bycpufeatures
0.2.12crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504depends oncrossterm
0.27.0crates.io↘ 9↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824dfdepends onused bycrossterm_winapi
0.9.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumacdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2bdepends onused bycrypto-common
0.1.6crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3ctr
0.9.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835depends onused bycurve25519-dalek
4.1.2crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348depends onused bycurve25519-dalek-derive
0.1.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3depends onused bydashmap
5.5.3crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856used byder
0.7.9crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0depends onderanged
0.3.11crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4depends onused bydigest
0.10.7crates.io↘ 4↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292displaydoc
0.2.4crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175ddepends onused byeither
1.11.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2used byencode_unicode
0.3.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831fused byequivalent
1.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5used byerrno
0.3.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820badepends onused byfastrand
2.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51aused byfiat-crypto
0.2.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811dused byfiledescriptor
0.8.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46edepends onused byfind-crate
0.6.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2depends onfleet
0.2.0workspace↘ 35↖ 0depends on- abort-on-drop
0.2.2 - age
0.10.0 - age-core
0.10.0 - anyhow
1.0.83 - async-trait
0.1.80 - base64
0.22.1 - better-command
0.1.0 - chrono
0.4.38 - clap
4.4.18 - crossterm
0.27.0 - fleet-shared
0.1.0 - futures
0.3.30 - hostname
0.3.1 - human-repr
1.1.0 - indicatif
0.17.8 - itertools
0.12.1 - nixlike
0.1.0 - once_cell
1.19.0 - openssh
0.10.4 - owo-colors
4.0.0 - peg
0.8.3 - r2d2
0.8.10 - regex
1.10.4 - serde
1.0.202 - serde_json
1.0.117 - shlex
1.3.0 - tabled
0.15.0 - tempfile
3.10.1 - time
0.3.36 - tokio
1.37.0 - tokio-util
0.7.11 - tracing
0.1.40 - tracing-indicatif
0.3.6 - tracing-subscriber
0.3.18 - unindent
0.2.3
- abort-on-drop
fleet-install-secrets
0.1.0workspace↘ 10↖ 0fluent
0.16.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbb74634707bebd0ce645a981148e8fb8c7bccd4c33c652aeffd28bf2f96d555adepends onfluent-bundle
0.15.3crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493depends onused byfluent-langneg
0.13.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94depends onfluent-syntax
0.11.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33ddepends onfnv
1.0.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1used byfutures
0.3.30crates.io↘ 7↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0depends onfutures-channel
0.3.30crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78depends onfutures-core
0.3.30crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1dfutures-executor
0.3.30crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01dused byfutures-io
0.3.30crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1futures-macro
0.3.30crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489acdepends onused byfutures-sink
0.3.30crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5futures-task
0.3.30crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004futures-util
0.3.30crates.io↘ 10↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48depends ongeneric-array
0.14.7crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9adepends ongetrandom
0.2.15crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7used byghash
0.5.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1depends onused bygimli
0.28.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253used byhashbrown
0.9.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04used byhashbrown
0.14.5crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1used byheck
0.4.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8hermit-abi
0.3.9crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024hkdf
0.12.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7depends onused byhmac
0.12.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5edepends onhostname
0.3.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867depends onused byhuman-repr
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1used byi18n-config
0.4.6crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c9ce3c48cbc21fd5b22b9331f32b5b51f6ad85d969b99e793427332e76e7640i18n-embed
0.14.1crates.io↘ 13↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum94205d95764f5bb9db9ea98fa77f89653365ca748e27161f5bbea2ffd50e459cdepends onused byi18n-embed-fl
0.7.0crates.io↘ 13↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9fc1f8715195dffc4caddcf1cf3128da15fe5d8a137606ea8856c9300047d5a2depends onused byi18n-embed-impl
0.8.3crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum81093c4701672f59416582fe3145676126fd23ba5db910acad0793c1108aaa58used byiana-time-zone
0.1.60crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141depends onused byiana-time-zone-haiku
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269fdepends onused byindexmap
2.2.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26depends onused byindicatif
0.17.8crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3depends oninout
0.1.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5depends onused byinstant
0.1.12crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2cdepends onused byintl_pluralrules
7.0.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972depends onused byintl-memoizer
0.5.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfe22e020fce238ae18a6d5d8c502ee76a52a6e880d99477657e6acc30ec57bdadepends onio_tee
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4b3f7cef34251886990511df1c61443aa928499d598a9473929ab5a90a527304used byis_ci
1.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45used byis_terminal_polyfill
1.70.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800used byis-terminal
0.4.12crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738bused byitertools
0.12.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569depends onused byitoa
1.0.11crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695bused byjs-sys
0.3.69crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296ddepends onlazy_static
1.4.0crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646depends onlibc
0.2.154crates.io↘ 0↖ 24sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346used by- android_system_properties
0.1.5 - backtrace
0.3.71 - console
0.15.8 - cpufeatures
0.2.12 - crossterm
0.27.0 - errno
0.3.9 - filedescriptor
0.8.2 - getrandom
0.2.15 - hostname
0.3.1 - is-terminal
0.4.12 - libmimalloc-sys
0.1.37 - mio
0.8.11 - nix
0.27.1 - num_cpus
1.16.0 - openssh
0.10.4 - parking_lot_core
0.9.10 - rand
0.8.5 - rustix
0.38.34 - signal-hook
0.3.17 - signal-hook-mio
0.2.3 - signal-hook-registry
1.4.2 - socket2
0.5.7 - tokio
1.37.0 - tokio-pipe
0.2.12
- android_system_properties
libm
0.2.8crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058libmimalloc-sys
0.1.37crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum81eb4061c0582dedea1cbc7aff2240300dd6982e0239d1c99e65c1dbf4a30ba7depends onused bylinked-hash-map
0.5.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770fused bylinux-raw-sys
0.4.13crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539cused bylock_api
0.4.12crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17depends onlog
0.4.21crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901cmatch_cfg
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4used bymatchers
0.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558depends onused bymemchr
2.7.2crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1dmemoffset
0.6.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79cedepends onused bymimalloc
0.1.41crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9f41a2280ded0da56c8cf898babb86e8f10651a34adcfff190ae9a1159c6908ddepends onused byminimal-lexical
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79aused byminiz_oxide
0.7.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7depends onused bymio
0.8.11crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0cnix
0.27.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053depends onused bynixlike
0.1.0workspace↘ 8↖ 1nom
7.1.3crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4adepends onused bynu-ansi-term
0.46.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84depends onused bynum_cpus
1.16.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43depends onused bynum-bigint-dig
0.8.4crates.io↘ 9↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151depends onused bynum-conv
0.1.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9used bynum-integer
0.1.46crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858fdepends onnum-iter
0.1.45crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bfused bynum-traits
0.2.19crates.io↘ 2↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841depends onnumber_prefix
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3used byobject
0.32.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441depends onused byonce_cell
1.19.0crates.io↘ 0↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92opaque-debug
0.3.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381openssh
0.10.4crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum432f4a7e4d194272876710557e6b712fc304e7b4711e2063655df1e446b4b8e3depends onused byoverload
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39used byowo-colors
4.0.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcaff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3fdepends onused bypapergrid
0.11.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ad43c07024ef767f9160710b3a6773976194758c7919b17e63b863db0bdf7fbused byparking_lot
0.12.2crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fbdepends onparking_lot_core
0.9.10crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8pbkdf2
0.12.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2depends onpeg
0.8.3crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a625d12ad770914cbf7eff6f9314c3ef803bfe364a1b20bc36ddf56673e71e5depends onused bypeg-macros
0.8.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf241d42067ed3ab6a4fece1db720838e1418f36d868585a27931f95d6bc03582used bypeg-runtime
0.8.3crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3aused bypin-project
1.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3depends onused bypin-project-internal
1.1.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965depends onused bypin-project-lite
0.2.14crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02pin-utils
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184used bypkcs1
0.7.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47fdepends onused bypkcs8
0.10.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7used byplatforms
3.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7used bypoly1305
0.8.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abfused bypolyval
0.6.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25used byportable-atomic
1.6.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0used bypowerfmt
0.2.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391used byppv-lite86
0.2.17crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6deused byproc-macro-error
1.0.4crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumda25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38cproc-macro-error-attr
1.0.4crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869used byproc-macro2
1.0.82crates.io↘ 1↖ 24sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131bdepends onused by- async-trait
0.1.80 - clap_derive
4.4.7 - curve25519-dalek-derive
0.1.1 - displaydoc
0.2.4 - futures-macro
0.3.30 - i18n-embed-fl
0.7.0 - i18n-embed-impl
0.8.3 - peg-macros
0.8.3 - pin-project-internal
1.1.5 - proc-macro-error
1.0.4 - proc-macro-error-attr
1.0.4 - quote
1.0.36 - rust-embed-impl
8.4.0 - serde_derive
1.0.202 - syn
1.0.109 - syn
2.0.63 - tabled_derive
0.7.0 - thiserror-impl
1.0.60 - tokio-macros
2.2.0 - tracing-attributes
0.1.27 - vte_generate_state_changes
0.1.1 - wasm-bindgen-backend
0.2.92 - wasm-bindgen-macro-support
0.2.92 - zeroize_derive
1.4.2
- async-trait
quote
1.0.36crates.io↘ 1↖ 24sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7depends onused by- async-trait
0.1.80 - clap_derive
4.4.7 - curve25519-dalek-derive
0.1.1 - displaydoc
0.2.4 - futures-macro
0.3.30 - i18n-embed-fl
0.7.0 - i18n-embed-impl
0.8.3 - peg-macros
0.8.3 - pin-project-internal
1.1.5 - proc-macro-error
1.0.4 - proc-macro-error-attr
1.0.4 - rust-embed-impl
8.4.0 - serde_derive
1.0.202 - syn
1.0.109 - syn
2.0.63 - tabled_derive
0.7.0 - thiserror-impl
1.0.60 - tokio-macros
2.2.0 - tracing-attributes
0.1.27 - vte_generate_state_changes
0.1.1 - wasm-bindgen-backend
0.2.92 - wasm-bindgen-macro
0.2.92 - wasm-bindgen-macro-support
0.2.92 - zeroize_derive
1.4.2
- async-trait
r2d2
0.8.10crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93used byrand
0.8.5crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404rand_chacha
0.3.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88depends onused byrand_core
0.6.4crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922cdepends onredox_syscall
0.5.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7edepends onused byregex
1.10.4crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4cregex-automata
0.1.10crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132depends onused byregex-automata
0.4.6crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaeaused byregex-syntax
0.6.29crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1used byregex-syntax
0.8.3crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumadad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56remowt-agent
0.1.0workspace↘ 0↖ 0remowt-fs
0.1.0workspace↘ 0↖ 0rnix
0.10.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8024a523e8836f1a5d051203dc00d833357fee94e351b51348dfaeca5364daa9depends onused byron
0.8.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94used byrowan
0.12.6crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1b36e449f3702f3b0c821411db1cbdf30fb451726a9456dce5dabcd44420043used byrsa
0.9.6crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfcdepends onused byrust-embed
8.4.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum19549741604902eb99a7ed0ee177a0663ee1eda51a29f71401f166e47e77806aused byrust-embed-impl
8.4.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcb9f96e283ec64401f30d3df8ee2aaeb2561f34c824381efa24a35f79bf40ee4used byrust-embed-utils
8.4.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum38c74a686185620830701348de757fd36bef4aa9680fd23c49fc539ddcc1af32depends onrustc_version
0.4.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366depends onused byrustc-demangle
0.1.24crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1fused byrustc-hash
1.1.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2rustix
0.38.34crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730fryu
1.0.18crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9fused bysalsa20
0.10.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213depends onused bysame-file
1.0.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502depends onused byscheduled-thread-pool
0.2.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19depends onused byscopeguard
1.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49used byscrypt
0.11.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1fdepends onused bysecrecy
0.8.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91edepends onused byself_cell
0.10.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915ddepends onused byself_cell
1.0.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714aused bysemver
1.0.23crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988bused byserde
1.0.202crates.io↘ 1↖ 21sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395depends onused by- better-command
0.1.0 - bitflags
2.5.0 - chrono
0.4.38 - deranged
0.3.11 - fleet
0.2.0 - fleet-install-secrets
0.1.0 - fleet-shared
0.1.0 - i18n-config
0.4.6 - nixlike
0.1.0 - ron
0.8.1 - serde-transcode
1.1.1 - serde_json
1.0.117 - serde_spanned
0.6.5 - smol_str
0.1.24 - time
0.3.36 - toml
0.5.11 - toml
0.8.12 - toml_datetime
0.6.5 - toml_edit
0.22.12 - unic-langid-impl
0.9.5 - x25519-dalek
2.0.1
- better-command
serde_derive
1.0.202crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838depends onserde_json
1.0.117crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3depends onserde_spanned
0.6.5crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1depends onused byserde-transcode
1.1.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2depends onused bysha2
0.10.8crates.io↘ 3↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8depends onsharded-slab
0.1.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6depends onused byshell-escape
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184fused byshlex
1.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64used bysignal-hook
0.3.17crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801depends onsignal-hook-mio
0.2.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99afdepends onused bysignal-hook-registry
1.4.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1depends onused bysignature
2.2.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329dedepends onused byslab
0.4.9crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67depends onused bysmallvec
1.13.2crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67smol_str
0.1.24crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9depends onused bysocket2
0.5.7crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191cdepends onused byspin
0.5.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042dused byspki
0.7.3crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29ddepends onstrsim
0.10.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623subtle
2.5.0crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebcsupports-color
2.1.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89depends onused bysyn
1.0.109crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237syn
2.0.63crates.io↘ 3↖ 16sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704used by- async-trait
0.1.80 - clap_derive
4.4.7 - curve25519-dalek-derive
0.1.1 - displaydoc
0.2.4 - futures-macro
0.3.30 - i18n-embed-fl
0.7.0 - i18n-embed-impl
0.8.3 - pin-project-internal
1.1.5 - rust-embed-impl
8.4.0 - serde_derive
1.0.202 - thiserror-impl
1.0.60 - tokio-macros
2.2.0 - tracing-attributes
0.1.27 - wasm-bindgen-backend
0.2.92 - wasm-bindgen-macro-support
0.2.92 - zeroize_derive
1.4.2
- async-trait
tabled
0.15.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4c998b0c8b921495196a48aabaf1901ff28be0760136e31604f7967b0792050eused bytabled_derive
0.7.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4c138f99377e5d653a371cdad263615634cfc8467685dfe8e73e2b8e98f44b17used bytempfile
3.10.1crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1terminal_size
0.3.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7depends onused bytext-size
1.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233used bythiserror
1.0.60crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18depends onthiserror-impl
1.0.60crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524depends onused bythread_local
1.1.8crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719cdepends onused bytime
0.3.36crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885used bytime-core
0.1.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3used bytime-macros
0.2.18crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccfdepends onused bytinystr
0.7.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ecedepends onused bytokio
1.37.0crates.io↘ 10↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787depends ontokio-macros
2.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923bdepends onused bytokio-pipe
0.2.12crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf213a84bffbd61b8fa0ba8a044b4bbe35d471d0b518867181e82bd5c15542784depends onused bytokio-util
0.7.11crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1used bytoml
0.5.11crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234depends onused bytoml
0.8.12crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3used bytoml_datetime
0.6.5crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1depends onused bytoml_edit
0.22.12crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddefused bytracing
0.1.40crates.io↘ 3↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364eftracing-attributes
0.1.27crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7depends onused bytracing-core
0.1.32crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54depends ontracing-indicatif
0.3.6crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum069580424efe11d97c3fef4197fa98c004fa26672cc71ad8770d224e23b1951dtracing-log
0.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3used bytracing-subscriber
0.3.18crates.io↘ 10↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8bdepends ontype-map
0.5.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdeb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9fdepends onused bytypenum
1.17.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825unic-langid
0.9.5crates.io↘ 1↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum23dd9d1e72a73b25e07123a80776aae3e7b0ec461ef94f9151eed6ec88005a44depends onunic-langid-impl
0.9.5crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0a5422c1f65949306c99240b81de9f3f15929f5a8bfe05bb44b034cc8bf593e5depends onused byunicase
2.7.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89depends onused byunicode_categories
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14eused byunicode-ident
1.0.12crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4bunicode-width
0.1.12crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6unindent
0.2.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ceused byuniversal-hash
0.5.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07eadepends onused byutf8parse
0.2.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370avaluable
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6dused byversion_check
0.9.4crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483fvt100
0.15.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274deused byvte
0.11.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197used byvte_generate_state_changes
0.1.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ffdepends onused bywalkdir
2.5.0crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4bdepends onwasi
0.11.0+wasi-snapshot-preview1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423used bywasm-bindgen
0.2.92crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8depends onwasm-bindgen-backend
0.2.92crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747dadepends onwasm-bindgen-macro
0.2.92crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726used bywasm-bindgen-macro-support
0.2.92crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7used bywinapi
0.3.9crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419winapi-i686-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6used bywinapi-util
0.1.8crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6bdepends onused bywinapi-x86_64-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183fused bywindows_aarch64_gnullvm
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8used bywindows_aarch64_gnullvm
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263used bywindows_aarch64_msvc
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bcused bywindows_aarch64_msvc
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6used bywindows_i686_gnu
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743eused bywindows_i686_gnu
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670used bywindows_i686_gnullvm
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9used bywindows_i686_msvc
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406used bywindows_i686_msvc
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bfused bywindows_x86_64_gnu
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718eused bywindows_x86_64_gnu
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9used bywindows_x86_64_gnullvm
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044ccused bywindows_x86_64_gnullvm
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596used bywindows_x86_64_msvc
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538used bywindows_x86_64_msvc
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0used bywindows-core
0.52.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9depends onused bywindows-sys
0.48.0crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9depends onwindows-sys
0.52.0crates.io↘ 1↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33ddepends onwindows-targets
0.48.5crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940cdepends onused bywindows-targets
0.52.5crates.io↘ 8↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7ebdepends onwinnow
0.6.8crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618ddepends onused byx25519-dalek
2.0.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277used byz85
3.0.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a599daf1b507819c1121f0bf87fa37eb19daac6aff3aefefd4e6e2e0f2020fcused byzeroize
1.7.0crates.io↘ 1↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2ddepends onzeroize_derive
1.4.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69depends onused by
317 packageslockfile v3
Might be heavy and slow!
abort-on-drop
0.2.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5dd6d700ad9af641490c1f7d67980d2de4d1433016e5b12f819448d3c832142adepends onused byaddr2line
0.21.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cbdepends onused byadler
1.0.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35feused byaead
0.5.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0depends onaes
0.8.4crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0depends onused byaes-gcm
0.10.3crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1used byage
0.10.0crates.io↘ 27↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumedeef7d7b199195a2d7d7a8155d2d04aee736e60c5c7bdd7097d115369a8817ddepends on- aes
0.8.4 - aes-gcm
0.10.3 - age-core
0.10.0 - base64
0.21.7 - bcrypt-pbkdf
0.10.0 - bech32
0.9.1 - cbc
0.1.2 - chacha20poly1305
0.10.1 - cipher
0.4.4 - cookie-factory
0.3.3 - ctr
0.9.2 - curve25519-dalek
4.1.2 - hmac
0.12.1 - i18n-embed
0.14.1 - i18n-embed-fl
0.7.0 - lazy_static
1.4.0 - nom
7.1.3 - num-traits
0.2.19 - pin-project
1.1.5 - rand
0.8.5 - rsa
0.9.6 - rust-embed
8.4.0 - scrypt
0.11.0 - sha2
0.10.8 - subtle
2.5.0 - x25519-dalek
2.0.1 - zeroize
1.7.0
- aes
age-core
0.10.0crates.io↘ 9↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5f11899bc2bbddd135edbc30c36b1924fa59d0746bb45beb5933fafe3fe509bdepends onused byaho-corasick
1.1.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916depends onalejandra
3.0.0github.com/kamadorueda/alejandra↘ 3↖ 1sourcegit+https://github.com/kamadorueda/alejandra#bb688cc2c22e43b3cd710eadc0340399c2de3151depends onused byandroid_system_properties
0.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311depends onused byandroid-tzdata
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0used byanstream
0.6.14crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15bdepends onused byanstyle
1.0.7crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1banstyle-parse
0.2.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4depends onused byanstyle-query
1.0.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5depends onused byanstyle-wincon
3.0.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19depends onused byanyhow
1.0.86crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063daarc-swap
1.7.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457used byasync-trait
0.1.80crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737cadepends onused byautocfg
1.3.0crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0backtrace
0.3.71crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9ddepends onused bybase64
0.21.7crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567base64
0.22.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6used bybcrypt-pbkdf
0.10.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6aeac2e1fe888769f34f05ac343bbef98b14d1ffb292ab69d4608b3abc86f2a2depends onused bybetter-command
0.1.0workspace↘ 6↖ 1bitflags
2.5.0crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1depends onblock-buffer
0.10.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71depends onused byblock-padding
0.3.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93depends onused byblowfish
0.9.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7depends onused bybumpalo
3.16.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012cused bybytecount
0.6.8crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ceused bybyteorder
1.5.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64bbytes
1.6.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9used bycbc
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6depends onused bycbitset
0.2.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29b6ad25ae296159fb0da12b970b2fe179b234584d7cd294c891e2bbb284466bdepends onused bycc
1.0.98crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03fcfg-if
1.0.0crates.io↘ 0↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbaf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fdchacha20
0.9.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818depends onused bychacha20poly1305
0.10.1crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35used bychrono
0.4.38crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401depends onused bycipher
0.4.4crates.io↘ 3↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3daddepends onclap
4.4.18crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865cdepends onclap_builder
4.4.18crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7depends onused byclap_derive
4.4.7crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442used byclap_lex
0.6.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1used bycolorchoice
1.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422used byconsole
0.15.8crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4ebused byconst-oid
0.9.6crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8used bycookie-factory
0.3.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2depends onused bycore-foundation-sys
0.8.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868fused bycountme
2.0.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum328b822bdcba4d4e402be8d9adb6eebf269f969f8eadef977a553ff3c4fbcb58used bycpufeatures
0.2.12crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504depends oncrossterm
0.27.0crates.io↘ 9↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824dfdepends onused bycrossterm_winapi
0.9.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumacdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2bdepends onused bycrypto-common
0.1.6crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3ctr
0.9.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835depends onused bycurve25519-dalek
4.1.2crates.io↘ 9↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348depends oncurve25519-dalek-derive
0.1.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3depends onused bydashmap
5.5.3crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856used byder
0.7.9crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0depends onderanged
0.3.11crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4depends onused bydigest
0.10.7crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292displaydoc
0.2.4crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175ddepends onused byed25519
2.2.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53depends onused byed25519-dalek
2.1.1crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871depends onused byeither
1.12.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58bused byencode_unicode
0.3.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831fused byequivalent
1.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5used byerrno
0.3.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820badepends onused byfastrand
2.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51aused byfiat-crypto
0.2.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811dused byfiledescriptor
0.8.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46edepends onused byfind-crate
0.6.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2depends onfleet
0.2.0workspace↘ 35↖ 0depends on- abort-on-drop
0.2.2 - age
0.10.0 - age-core
0.10.0 - anyhow
1.0.86 - async-trait
0.1.80 - base64
0.22.1 - better-command
0.1.0 - chrono
0.4.38 - clap
4.4.18 - crossterm
0.27.0 - fleet-shared
0.1.0 - futures
0.3.30 - hostname
0.3.1 - human-repr
1.1.0 - indicatif
0.17.8 - itertools
0.12.1 - nixlike
0.1.0 - once_cell
1.19.0 - openssh
0.10.4 - owo-colors
4.0.0 - peg
0.8.3 - r2d2
0.8.10 - regex
1.10.4 - serde
1.0.203 - serde_json
1.0.117 - shlex
1.3.0 - tabled
0.15.0 - tempfile
3.10.1 - time
0.3.36 - tokio
1.37.0 - tokio-util
0.7.11 - tracing
0.1.40 - tracing-indicatif
0.3.6 - tracing-subscriber
0.3.18 - unindent
0.2.3
- abort-on-drop
fleet-install-secrets
0.1.0workspace↘ 10↖ 0fluent
0.16.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbb74634707bebd0ce645a981148e8fb8c7bccd4c33c652aeffd28bf2f96d555adepends onfluent-bundle
0.15.3crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493depends onused byfluent-langneg
0.13.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94depends onfluent-syntax
0.11.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33ddepends onfnv
1.0.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1used byfutures
0.3.30crates.io↘ 7↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0depends onfutures-channel
0.3.30crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78depends onfutures-core
0.3.30crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1dfutures-executor
0.3.30crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01dused byfutures-io
0.3.30crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1futures-macro
0.3.30crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489acdepends onused byfutures-sink
0.3.30crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5futures-task
0.3.30crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004futures-util
0.3.30crates.io↘ 10↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48depends ongenerator-helper
0.1.0workspace↘ 6↖ 0generic-array
0.14.7crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9adepends ongetrandom
0.2.15crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7used byghash
0.5.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1depends onused bygimli
0.28.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253used byhashbrown
0.9.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04used byhashbrown
0.14.5crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1used byheck
0.4.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8hermit-abi
0.3.9crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024hkdf
0.12.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7depends onused byhmac
0.12.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5edepends onhostname
0.3.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867depends onused byhuman-repr
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1used byi18n-config
0.4.6crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0c9ce3c48cbc21fd5b22b9331f32b5b51f6ad85d969b99e793427332e76e7640i18n-embed
0.14.1crates.io↘ 13↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum94205d95764f5bb9db9ea98fa77f89653365ca748e27161f5bbea2ffd50e459cdepends onused byi18n-embed-fl
0.7.0crates.io↘ 13↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9fc1f8715195dffc4caddcf1cf3128da15fe5d8a137606ea8856c9300047d5a2depends onused byi18n-embed-impl
0.8.3crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum81093c4701672f59416582fe3145676126fd23ba5db910acad0793c1108aaa58used byiana-time-zone
0.1.60crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141depends onused byiana-time-zone-haiku
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269fdepends onused byindexmap
2.2.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26depends onused byindicatif
0.17.8crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3depends oninout
0.1.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5depends onused byinstant
0.1.13crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222depends onused byintl_pluralrules
7.0.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972depends onused byintl-memoizer
0.5.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfe22e020fce238ae18a6d5d8c502ee76a52a6e880d99477657e6acc30ec57bdadepends onio_tee
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4b3f7cef34251886990511df1c61443aa928499d598a9473929ab5a90a527304used byis_ci
1.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45used byis_terminal_polyfill
1.70.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800used byis-terminal
0.4.12crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738bused byitertools
0.12.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569depends onused byitoa
1.0.11crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695bused byjs-sys
0.3.69crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296ddepends onlazy_static
1.4.0crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646depends onlibc
0.2.155crates.io↘ 0↖ 24sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847cused by- android_system_properties
0.1.5 - backtrace
0.3.71 - console
0.15.8 - cpufeatures
0.2.12 - crossterm
0.27.0 - errno
0.3.9 - filedescriptor
0.8.2 - getrandom
0.2.15 - hostname
0.3.1 - is-terminal
0.4.12 - libmimalloc-sys
0.1.38 - mio
0.8.11 - nix
0.27.1 - num_cpus
1.16.0 - openssh
0.10.4 - parking_lot_core
0.9.10 - rand
0.8.5 - rustix
0.38.34 - signal-hook
0.3.17 - signal-hook-mio
0.2.3 - signal-hook-registry
1.4.2 - socket2
0.5.7 - tokio
1.37.0 - tokio-pipe
0.2.12
- android_system_properties
libm
0.2.8crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058libmimalloc-sys
0.1.38crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0e7bb23d733dfcc8af652a78b7bf232f0e967710d044732185e561e47c0336b6depends onused bylinked-hash-map
0.5.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770fused bylinux-raw-sys
0.4.14crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89used bylock_api
0.4.12crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17depends onlog
0.4.21crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901cmatch_cfg
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4used bymatchers
0.1.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558depends onused bymemchr
2.7.2crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1dmemoffset
0.6.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79cedepends onused bymimalloc
0.1.42crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume9186d86b79b52f4a77af65604b51225e8db1d6ee7e3f41aec1e40829c71a176depends onused byminimal-lexical
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79aused byminiz_oxide
0.7.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdaedepends onused bymio
0.8.11crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0cnix
0.27.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053depends onused bynixlike
0.1.0workspace↘ 8↖ 1nom
7.1.3crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4adepends onused bynu-ansi-term
0.46.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84depends onused bynum_cpus
1.16.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43depends onused bynum-bigint-dig
0.8.4crates.io↘ 9↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151depends onused bynum-conv
0.1.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9used bynum-integer
0.1.46crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858fdepends onnum-iter
0.1.45crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bfused bynum-traits
0.2.19crates.io↘ 2↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841depends onnumber_prefix
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3used byobject
0.32.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441depends onused byonce_cell
1.19.0crates.io↘ 0↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92opaque-debug
0.3.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381openssh
0.10.4crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum432f4a7e4d194272876710557e6b712fc304e7b4711e2063655df1e446b4b8e3depends onused byoverload
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39used byowo-colors
4.0.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcaff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3fdepends onused bypapergrid
0.11.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ad43c07024ef767f9160710b3a6773976194758c7919b17e63b863db0bdf7fbused byparking_lot
0.12.3crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27depends onparking_lot_core
0.9.10crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8pbkdf2
0.12.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2depends onpeg
0.8.3crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a625d12ad770914cbf7eff6f9314c3ef803bfe364a1b20bc36ddf56673e71e5depends onused bypeg-macros
0.8.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf241d42067ed3ab6a4fece1db720838e1418f36d868585a27931f95d6bc03582used bypeg-runtime
0.8.3crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3aused bypin-project
1.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3depends onused bypin-project-internal
1.1.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965depends onused bypin-project-lite
0.2.14crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02pin-utils
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184used bypkcs1
0.7.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47fdepends onused bypkcs8
0.10.2crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7platforms
3.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7used bypoly1305
0.8.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abfused bypolyval
0.6.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25used byportable-atomic
1.6.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0used bypowerfmt
0.2.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391used byppv-lite86
0.2.17crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6deused byproc-macro-error
1.0.4crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumda25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38cproc-macro-error-attr
1.0.4crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869used byproc-macro2
1.0.84crates.io↘ 1↖ 24sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6depends onused by- async-trait
0.1.80 - clap_derive
4.4.7 - curve25519-dalek-derive
0.1.1 - displaydoc
0.2.4 - futures-macro
0.3.30 - i18n-embed-fl
0.7.0 - i18n-embed-impl
0.8.3 - peg-macros
0.8.3 - pin-project-internal
1.1.5 - proc-macro-error
1.0.4 - proc-macro-error-attr
1.0.4 - quote
1.0.36 - rust-embed-impl
8.4.0 - serde_derive
1.0.203 - syn
1.0.109 - syn
2.0.66 - tabled_derive
0.7.0 - thiserror-impl
1.0.61 - tokio-macros
2.2.0 - tracing-attributes
0.1.27 - vte_generate_state_changes
0.1.1 - wasm-bindgen-backend
0.2.92 - wasm-bindgen-macro-support
0.2.92 - zeroize_derive
1.4.2
- async-trait
quote
1.0.36crates.io↘ 1↖ 24sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7depends onused by- async-trait
0.1.80 - clap_derive
4.4.7 - curve25519-dalek-derive
0.1.1 - displaydoc
0.2.4 - futures-macro
0.3.30 - i18n-embed-fl
0.7.0 - i18n-embed-impl
0.8.3 - peg-macros
0.8.3 - pin-project-internal
1.1.5 - proc-macro-error
1.0.4 - proc-macro-error-attr
1.0.4 - rust-embed-impl
8.4.0 - serde_derive
1.0.203 - syn
1.0.109 - syn
2.0.66 - tabled_derive
0.7.0 - thiserror-impl
1.0.61 - tokio-macros
2.2.0 - tracing-attributes
0.1.27 - vte_generate_state_changes
0.1.1 - wasm-bindgen-backend
0.2.92 - wasm-bindgen-macro
0.2.92 - wasm-bindgen-macro-support
0.2.92 - zeroize_derive
1.4.2
- async-trait
r2d2
0.8.10crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93used byrand
0.8.5crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404rand_chacha
0.3.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88depends onused byrand_core
0.6.4crates.io↘ 1↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922cdepends onredox_syscall
0.5.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7edepends onused byregex
1.10.4crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4cregex-automata
0.1.10crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132depends onused byregex-automata
0.4.6crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaeaused byregex-syntax
0.6.29crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1used byregex-syntax
0.8.3crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumadad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56remowt-agent
0.1.0workspace↘ 0↖ 0remowt-fs
0.1.0workspace↘ 0↖ 0rnix
0.10.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8024a523e8836f1a5d051203dc00d833357fee94e351b51348dfaeca5364daa9depends onused byron
0.8.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94used byrowan
0.12.6crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1b36e449f3702f3b0c821411db1cbdf30fb451726a9456dce5dabcd44420043used byrsa
0.9.6crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfcdepends onused byrust-embed
8.4.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum19549741604902eb99a7ed0ee177a0663ee1eda51a29f71401f166e47e77806aused byrust-embed-impl
8.4.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcb9f96e283ec64401f30d3df8ee2aaeb2561f34c824381efa24a35f79bf40ee4used byrust-embed-utils
8.4.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum38c74a686185620830701348de757fd36bef4aa9680fd23c49fc539ddcc1af32depends onrustc_version
0.4.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366depends onused byrustc-demangle
0.1.24crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1fused byrustc-hash
1.1.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2rustix
0.38.34crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730fryu
1.0.18crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9fused bysalsa20
0.10.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213depends onused bysame-file
1.0.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502depends onused byscheduled-thread-pool
0.2.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19depends onused byscopeguard
1.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49used byscrypt
0.11.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1fdepends onused bysecrecy
0.8.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91edepends onused byself_cell
0.10.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915ddepends onused byself_cell
1.0.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714aused bysemver
1.0.23crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988bused byserde
1.0.203crates.io↘ 1↖ 22sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094depends onused by- better-command
0.1.0 - bitflags
2.5.0 - chrono
0.4.38 - deranged
0.3.11 - ed25519-dalek
2.1.1 - fleet
0.2.0 - fleet-install-secrets
0.1.0 - fleet-shared
0.1.0 - i18n-config
0.4.6 - nixlike
0.1.0 - ron
0.8.1 - serde-transcode
1.1.1 - serde_json
1.0.117 - serde_spanned
0.6.6 - smol_str
0.1.24 - time
0.3.36 - toml
0.5.11 - toml
0.8.13 - toml_datetime
0.6.6 - toml_edit
0.22.13 - unic-langid-impl
0.9.5 - x25519-dalek
2.0.1
- better-command
serde_derive
1.0.203crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5badepends onserde_json
1.0.117crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3depends onserde_spanned
0.6.6crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0depends onused byserde-transcode
1.1.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2depends onused bysha2
0.10.8crates.io↘ 3↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8depends onsharded-slab
0.1.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6depends onused byshell-escape
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184fused byshlex
1.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64used bysignal-hook
0.3.17crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801depends onsignal-hook-mio
0.2.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99afdepends onused bysignal-hook-registry
1.4.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1depends onused bysignature
2.2.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329dedepends onused byslab
0.4.9crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67depends onused bysmallvec
1.13.2crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67smol_str
0.1.24crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9depends onused bysocket2
0.5.7crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191cdepends onused byspin
0.5.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042dused byspki
0.7.3crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29ddepends onstrsim
0.10.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623subtle
2.5.0crates.io↘ 0↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebcsupports-color
2.1.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89depends onused bysyn
1.0.109crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237syn
2.0.66crates.io↘ 3↖ 16sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5used by- async-trait
0.1.80 - clap_derive
4.4.7 - curve25519-dalek-derive
0.1.1 - displaydoc
0.2.4 - futures-macro
0.3.30 - i18n-embed-fl
0.7.0 - i18n-embed-impl
0.8.3 - pin-project-internal
1.1.5 - rust-embed-impl
8.4.0 - serde_derive
1.0.203 - thiserror-impl
1.0.61 - tokio-macros
2.2.0 - tracing-attributes
0.1.27 - wasm-bindgen-backend
0.2.92 - wasm-bindgen-macro-support
0.2.92 - zeroize_derive
1.4.2
- async-trait
tabled
0.15.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4c998b0c8b921495196a48aabaf1901ff28be0760136e31604f7967b0792050eused bytabled_derive
0.7.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4c138f99377e5d653a371cdad263615634cfc8467685dfe8e73e2b8e98f44b17used bytempfile
3.10.1crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1terminal_size
0.3.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7depends onused bytext-size
1.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233used bythiserror
1.0.61crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709depends onthiserror-impl
1.0.61crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533depends onused bythread_local
1.1.8crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719cdepends onused bytime
0.3.36crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885used bytime-core
0.1.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3used bytime-macros
0.2.18crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccfdepends onused bytinystr
0.7.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ecedepends onused bytokio
1.37.0crates.io↘ 10↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787depends ontokio-macros
2.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923bdepends onused bytokio-pipe
0.2.12crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf213a84bffbd61b8fa0ba8a044b4bbe35d471d0b518867181e82bd5c15542784depends onused bytokio-util
0.7.11crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1used bytoml
0.5.11crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234depends onused bytoml
0.8.13crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bbaused bytoml_datetime
0.6.6crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbfdepends onused bytoml_edit
0.22.13crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96cused bytracing
0.1.40crates.io↘ 3↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364eftracing-attributes
0.1.27crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7depends onused bytracing-core
0.1.32crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54depends ontracing-indicatif
0.3.6crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum069580424efe11d97c3fef4197fa98c004fa26672cc71ad8770d224e23b1951dtracing-log
0.2.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3used bytracing-subscriber
0.3.18crates.io↘ 10↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8bdepends ontype-map
0.5.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdeb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9fdepends onused bytypenum
1.17.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825unic-langid
0.9.5crates.io↘ 1↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum23dd9d1e72a73b25e07123a80776aae3e7b0ec461ef94f9151eed6ec88005a44depends onunic-langid-impl
0.9.5crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0a5422c1f65949306c99240b81de9f3f15929f5a8bfe05bb44b034cc8bf593e5depends onused byunicase
2.7.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89depends onused byunicode_categories
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14eused byunicode-ident
1.0.12crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4bunicode-width
0.1.12crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6unindent
0.2.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ceused byuniversal-hash
0.5.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07eadepends onused byutf8parse
0.2.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370avaluable
0.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6dused byversion_check
0.9.4crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483fvt100
0.15.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274deused byvte
0.11.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197used byvte_generate_state_changes
0.1.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ffdepends onused bywalkdir
2.5.0crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4bdepends onwasi
0.11.0+wasi-snapshot-preview1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423used bywasm-bindgen
0.2.92crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8depends onwasm-bindgen-backend
0.2.92crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747dadepends onwasm-bindgen-macro
0.2.92crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726used bywasm-bindgen-macro-support
0.2.92crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7used bywinapi
0.3.9crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419winapi-i686-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6used bywinapi-util
0.1.8crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6bdepends onused bywinapi-x86_64-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183fused bywindows_aarch64_gnullvm
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8used bywindows_aarch64_gnullvm
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263used bywindows_aarch64_msvc
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bcused bywindows_aarch64_msvc
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6used bywindows_i686_gnu
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743eused bywindows_i686_gnu
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670used bywindows_i686_gnullvm
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9used bywindows_i686_msvc
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406used bywindows_i686_msvc
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bfused bywindows_x86_64_gnu
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718eused bywindows_x86_64_gnu
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9used bywindows_x86_64_gnullvm
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044ccused bywindows_x86_64_gnullvm
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596used bywindows_x86_64_msvc
0.48.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538used bywindows_x86_64_msvc
0.52.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0used bywindows-core
0.52.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9depends onused bywindows-sys
0.48.0crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9depends onwindows-sys
0.52.0crates.io↘ 1↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33ddepends onwindows-targets
0.48.5crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940cdepends onused bywindows-targets
0.52.5crates.io↘ 8↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7ebdepends onwinnow
0.6.8crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618ddepends onused byx25519-dalek
2.0.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277used byz85
3.0.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a599daf1b507819c1121f0bf87fa37eb19daac6aff3aefefd4e6e2e0f2020fcused byzeroize
1.7.0crates.io↘ 1↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2ddepends onzeroize_derive
1.4.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69depends onused by
Cargo.tomldiffbeforeafterboth--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,7 +6,27 @@
[workspace.dependencies]
nixlike = { path = "./crates/nixlike" }
better-command = { path = "./crates/better-command" }
-bifrostlink = "0.1.0"
-uuid = { version = "1.7.0", features = ["v4"] }
-tokio = { version = "1.36.0", features = ["fs", "rt", "macros", "sync", "time", "rt-multi-thread"] }
fleet-shared = { path = "./crates/fleet-shared" }
+tokio = { version = "1.36.0", features = [
+ "fs",
+ "rt",
+ "macros",
+ "sync",
+ "time",
+ "rt-multi-thread",
+] }
+# Using fixed version for rust on stable nixos branches.
+clap = { version = ">=4.4, <4.5", features = [
+ "derive",
+ "env",
+ "wrap_help",
+ "unicode",
+] }
+age = { version = "0.10", features = ["ssh"] }
+anyhow = "1.0"
+tracing = "0.1"
+tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
+tempfile = "3.10"
+nix = {version = "0.27.1", features = ["user", "fs"]}
cmds/fleet/Cargo.tomldiffbeforeafterboth--- a/cmds/fleet/Cargo.toml
+++ b/cmds/fleet/Cargo.toml
@@ -9,27 +9,21 @@
nixlike.workspace = true
better-command.workspace = true
tokio.workspace = true
-anyhow = "1.0"
-serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
+clap.workspace = true
+age = { workspace = true, features = ["armor"] }
+anyhow.workspace = true
+tracing.workspace = true
+tracing-subscriber.workspace = true
+serde.workspace = true
+serde_json.workspace = true
+tempfile.workspace = true
time = { version = "0.3", features = ["serde"] }
-tempfile = "3.10"
once_cell = "1.19"
hostname = "0.3"
age-core = "0.10"
peg = "0.8"
-age = { version = "0.10", features = ["ssh", "armor"] }
base64 = "0.22.1"
chrono = { version = "0.4", features = ["serde"] }
-# Using fixed version for rust on stable nixos branches.
-clap = { version = ">=4.4, <4.5", features = [
- "derive",
- "env",
- "wrap_help",
- "unicode",
-] }
-tracing = "0.1"
-tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
tokio-util = { version = "0.7", features = ["codec"] }
async-trait = "0.1"
futures = "0.3"
@@ -40,9 +34,7 @@
"supports-color",
"supports-colors",
] }
-r2d2 = "0.8.10"
abort-on-drop = "0.2"
-unindent = "0.2"
regex = "1.10"
openssh = "0.10"
crossterm = { version = "0.27.0", features = ["use-dev-tty"] }
@@ -51,12 +43,13 @@
tracing-indicatif = { version = "0.3", optional = true }
human-repr = { version = "1.1", optional = true }
indicatif = { version = "0.17", optional = true }
+nix-eval = { version = "0.1.0", path = "../../crates/nix-eval" }
[features]
# Not quite stable
indicatif = [
- "tracing-indicatif",
+ "dep:tracing-indicatif",
"dep:indicatif",
- "human-repr",
+ "dep:human-repr",
"better-command/indicatif",
]
cmds/fleet/src/better_nix_eval.rsdiffbeforeafterboth--- a/cmds/fleet/src/better_nix_eval.rs
+++ b/cmds/fleet/src/better_nix_eval.rs
@@ -12,892 +12,14 @@
use better_command::{ClonableHandler, Handler, NixHandler, NoopHandler};
use futures::StreamExt;
use itertools::Itertools;
-use r2d2::{Pool, PooledConnection};
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use tokio::io::AsyncWriteExt;
use tokio::process::{ChildStderr, ChildStdin, ChildStdout, Command};
use tokio::select;
use tokio::sync::{mpsc, oneshot, Mutex};
-use tokio_util::codec::{FramedRead, LinesCodec};
use tracing::{debug, error, warn, Level};
-
-const REPL_DELIMITER: &str = "\"FLEET_MAGIC_REPL_DELIMITER\"";
-
-pub struct NixSessionInner {
- full_delimiter: String,
- nix_handler: ClonableHandler<NixHandler>,
- out: OutputHandler,
- stdin: ChildStdin,
- string_wrapping: (String, String),
- number_wrapping: (String, String),
-
- executing_command: Arc<Mutex<()>>,
-
- next_id: u32,
- free_list: Vec<u32>,
-}
-const TRAIN_STRING: &str = "\"TRAIN_STRING\"";
-const TRAIN_NUMBER: &str = "13141516";
-
-#[must_use]
-struct ErrorCollector<'i, H> {
- collected: Vec<String>,
- inner: &'i mut H,
-}
-impl<'i, H> ErrorCollector<'i, H> {
- fn new(inner: &'i mut H) -> Self {
- Self {
- collected: vec![],
- inner,
- }
- }
-}
-impl<H> ErrorCollector<'_, H> {
- fn handle_line_inner(&mut self, msg: &str) -> bool {
- let Some(msg) = msg.strip_prefix("@nix ") else {
- return false;
- };
- #[derive(Deserialize)]
- struct ErrorAction {
- action: String,
- level: u32,
- msg: String,
- }
- let Ok(act) = serde_json::from_str::<ErrorAction>(msg) else {
- return false;
- };
- if act.action != "msg" || act.level != 0 {
- return false;
- }
- self.collected.push(act.msg);
- true
- }
- fn finish(self) -> Result<()> {
- // fn dedent(s: String) -> String {
- // s.split('\n').filter(|s| !s.trim().is_empty()).map(|v| v.)
- // }
- if !self.collected.is_empty() {
- bail!(
- "{}",
- self.collected
- .iter()
- .map(|v| {
- if let Some(f) = v.strip_prefix("\u{1b}[31;1merror:\u{1b}[0m ") {
- let v = unindent::unindent(f.trim_start());
- v.trim().to_owned()
- } else {
- v.to_owned()
- }
- })
- .join("\n")
- );
- }
- Ok(())
- }
- fn flush(self) {
- for line in self.collected {
- warn!("{line}");
- }
- }
-}
-impl<H: Handler> Handler for ErrorCollector<'_, H> {
- fn handle_line(&mut self, e: &str) {
- if self.handle_line_inner(e) {
- return;
- }
- self.inner.handle_line(e)
- }
-}
-
-enum OutputLine {
- Out(String),
- Err(String),
-}
-struct OutputHandler {
- rx: mpsc::Receiver<OutputLine>,
- _cancel_handle: oneshot::Receiver<()>,
-}
-impl OutputHandler {
- fn new(out: ChildStdout, err: ChildStderr) -> Self {
- let mut out = FramedRead::new(out, LinesCodec::new());
- let mut err = FramedRead::new(err, LinesCodec::new());
- let (tx, rx) = mpsc::channel(20);
- let (mut cancelled, _cancel_handle) = oneshot::channel();
- tokio::spawn(async move {
- loop {
- select! {
- // We should receive errors earlier than synchronization
- biased;
- e = err.next() => {
- let Some(Ok(e)) = e else {
- if e.is_some() {
- error!("bad repl stderr: {e:?}");
- }
- continue;
- };
- let _ = tx.send(OutputLine::Err(e)).await;
- }
- o = out.next() => {
- let Some(Ok(o)) = o else {
- if o.is_some() {
- error!("bad repl stdout: {o:?}");
- }
- continue;
- };
- let _ = tx.send(OutputLine::Out(o)).await;
- }
- // Reader doesn't care about stdout, as this is cancelled.
- // Error still might be useful, to process leftover span closures?
- _ = cancelled.closed() => {
- break;
- }
- }
- }
- });
- Self { rx, _cancel_handle }
- }
- async fn next(&mut self) -> Option<OutputLine> {
- self.rx.recv().await
- }
-}
-
-struct WarnHandler;
-impl Handler for WarnHandler {
- fn handle_line(&mut self, e: &str) {
- warn!(target: "nix", "{e}")
- }
-}
-
-impl NixSessionInner {
- async fn new(flake: &OsStr, extra_args: impl IntoIterator<Item = &OsStr>) -> Result<Self> {
- let mut cmd = Command::new("nix");
- cmd.arg("repl")
- .arg(flake)
- .arg("--log-format")
- .arg("internal-json");
- for arg in extra_args {
- cmd.arg(arg);
- }
- cmd.stdin(Stdio::piped());
- cmd.stdout(Stdio::piped());
- cmd.stderr(Stdio::piped());
- let cmd = cmd.spawn()?;
- let stdout = cmd.stdout.unwrap();
- let stderr = cmd.stderr.unwrap();
- let mut out = OutputHandler::new(stdout, stderr);
- let mut stdin = cmd.stdin.unwrap();
- // Standard repl hello doesn't work with internal-json logger
- stdin.write_all(REPL_DELIMITER.as_bytes()).await?;
- stdin.write_all(b"\n").await?;
- stdin.flush().await?;
- let nix_handler = NixHandler::default();
- let mut full_delimiter = None;
- let mut errors = vec![];
- while let Some(line) = out.next().await {
- let line = match line {
- OutputLine::Out(o) => o,
- OutputLine::Err(_e) => {
- // Handle startup errors, but skip repl hello?
- errors.push(_e);
- continue;
- }
- };
- if line.contains(REPL_DELIMITER) {
- debug!("discovered repl delimiter with added colors: {line}");
- full_delimiter = Some(line.to_owned());
- break;
- }
- }
- let Some(full_delimiter) = full_delimiter else {
- for e in errors {
- error!("{e}");
- }
- bail!("failed to discover delimiter");
- };
- let mut res = Self {
- full_delimiter,
- nix_handler: ClonableHandler::new(nix_handler),
- out,
- stdin,
- string_wrapping: Default::default(),
- number_wrapping: Default::default(),
-
- executing_command: Arc::new(Mutex::new(())),
-
- next_id: 0,
- free_list: vec![],
- };
- res.train().await?;
- Ok(res)
- }
- async fn train(&mut self) -> Result<()> {
- {
- let full_string = self
- .execute_expression_raw(TRAIN_STRING, &mut NoopHandler)
- .await?;
- let string_offset = full_string.find(TRAIN_STRING).expect("contained");
- let string_prefix = &full_string[..string_offset];
- let string_suffix = &full_string[string_offset + TRAIN_STRING.len()..];
- self.string_wrapping = (string_prefix.to_owned(), string_suffix.to_owned());
- }
- {
- let full_number = self
- .execute_expression_raw(TRAIN_NUMBER, &mut NoopHandler)
- .await?;
- let number_offset = full_number.find(TRAIN_NUMBER).expect("contained");
- let number_prefix = &full_number[..number_offset];
- let number_suffix = &full_number[number_offset + TRAIN_NUMBER.len()..];
- self.number_wrapping = (number_prefix.to_owned(), number_suffix.to_owned());
- }
- Ok(())
- }
- async fn send_command(&mut self, cmd: impl AsRef<[u8]>) -> Result<()> {
- if tracing::enabled!(Level::DEBUG) && cmd.as_ref() != REPL_DELIMITER.as_bytes() {
- let cmd_str = String::from_utf8_lossy(cmd.as_ref());
- tracing::debug!("{cmd_str}");
- };
- self.stdin.write_all(cmd.as_ref()).await?;
- self.stdin.write_all(b"\n").await?;
- Ok(())
- }
- async fn read_until_delimiter(&mut self, err_handler: &mut dyn Handler) -> Result<String> {
- let mut out = String::new();
- while let Some(line) = self.out.next().await {
- let line = match line {
- OutputLine::Out(out) => out,
- OutputLine::Err(err) => {
- err_handler.handle_line(&err);
- continue;
- }
- };
- if line == self.full_delimiter {
- return Ok(out);
- }
- if !out.is_empty() {
- out.push('\n');
- }
- out.push_str(&line);
- }
- bail!("didn't reached delimiter");
- }
- async fn execute_expression_number(&mut self, expr: impl AsRef<[u8]>) -> Result<u64> {
- let num = self.number_wrapping.clone();
- let n = self.execute_expression_wrapping(expr, &num).await?;
- Ok(n.parse::<u64>()?)
- }
- async fn execute_expression_string(&mut self, expr: impl AsRef<[u8]>) -> Result<String> {
- let num = self.string_wrapping.clone();
- let n = self.execute_expression_wrapping(expr, &num).await?;
- let str: String = serde_json::from_str(&n)?;
- Ok(str)
- }
- async fn execute_expression_to_json<V: DeserializeOwned>(
- &mut self,
- expr: impl AsRef<[u8]>,
- ) -> Result<V> {
- let mut fexpr = b"builtins.toJSON (".to_vec();
- fexpr.extend_from_slice(expr.as_ref());
- fexpr.push(b')');
- let v = self
- .execute_expression_string(fexpr)
- .await
- .context("string expression")?;
- serde_json::from_str(&v).context("json parse")
- }
- async fn execute_expression_wrapping(
- &mut self,
- expr: impl AsRef<[u8]>,
- wrapping: &(String, String),
- ) -> Result<String> {
- let mut nix_handler = self.nix_handler.clone();
- let mut collected = ErrorCollector::new(&mut nix_handler);
- let res = self.execute_expression_raw(expr, &mut collected).await?;
- if res.is_empty() {
- collected.finish()?;
- bail!("expected expression, got nothing")
- } else {
- collected.flush()
- };
- let Some(res) = res.strip_prefix(&wrapping.0) else {
- bail!("invalid type")
- };
- let Some(res) = res.strip_suffix(&wrapping.1) else {
- bail!("invalid type")
- };
- Ok(res.to_owned())
- }
- async fn execute_expression_empty(&mut self, expr: impl AsRef<[u8]>) -> Result<()> {
- let mut nix_handler = self.nix_handler.clone();
- let mut collected = ErrorCollector::new(&mut nix_handler);
- let v = self.execute_expression_raw(expr, &mut collected).await?;
- collected.finish()?;
- ensure!(v.is_empty(), "unexpected expression result");
- Ok(())
- }
- async fn execute_expression_raw(
- &mut self,
- expr: impl AsRef<[u8]>,
- err_handler: &mut dyn Handler,
- ) -> Result<String> {
- // Prevent two commands from being executed in parallel, messing with each other.
- let _lock = self.executing_command.clone();
- let _guard = _lock.lock().await;
-
- self.send_command(expr).await?;
- // It will be echoed
- self.send_command(REPL_DELIMITER).await?;
- self.read_until_delimiter(err_handler).await
- }
- async fn execute_assign(&mut self, expr: impl AsRef<str>) -> Result<u32> {
- let id = self.allocate_id();
- self.execute_expression_empty(format!("sess_field_{id} = {}", expr.as_ref()))
- .await?;
- Ok(id)
- }
-
- /// Id should be immediately used
- fn allocate_id(&mut self) -> u32 {
- if let Some(free) = self.free_list.pop() {
- free
- } else {
- let v = self.next_id;
- self.next_id += 1;
- v
- }
- }
- // Nix has no way to deallocate variable, yet GC will correct everything not reachable.
- // async fn free_id(&mut self, id: u32) -> Result<()> {
- // self.execute_expression_empty(format!("sess_field_{id} = null"))
- // .await?;
- // self.free_list.push(id);
- // Ok(())
- // }
-}
-
-#[derive(Clone)]
-pub struct NixSession(Arc<tokio::sync::Mutex<PooledConnection<NixSessionPoolInner>>>);
-
-#[derive(Clone)]
-pub struct NixExprBuilder {
- out: String,
- used_fields: Vec<Field>,
-}
-impl NixExprBuilder {
- pub fn object() -> Self {
- NixExprBuilder {
- out: "{ ".to_owned(),
- used_fields: Vec::new(),
- }
- }
- pub fn string(s: &str) -> Self {
- NixExprBuilder {
- out: nixlike::serialize(s)
- .expect("no problems with serializing_string")
- .trim_end()
- .to_owned(),
- used_fields: Vec::new(),
- }
- }
- pub fn serialized(v: impl Serialize) -> Self {
- let serialized = nixlike::serialize(v).expect("invalid value for apply");
- Self {
- out: serialized.trim_end().to_owned(),
- used_fields: Vec::new(),
- }
- }
- pub fn field(f: Field) -> Self {
- Self {
- out: format!("sess_field_{}", f.0.value.expect("no value")),
- used_fields: vec![f],
- }
- }
- pub fn end_obj(&mut self) {
- self.out.push('}');
- }
- pub fn obj_key(&mut self, name: Self, value: Self) {
- self.out.push_str(r#""${"#);
- self.extend(name);
- self.out.push_str(r#"}" = "#);
- self.extend(value);
- self.out.push_str("; ");
- }
-
- pub fn extend(&mut self, e: Self) {
- self.out.push_str(&e.out);
- self.used_fields.extend(e.used_fields);
- }
-
- #[allow(dead_code)]
- pub fn session(&self) -> NixSession {
- let mut session = None;
- for ele in &self.used_fields {
- if session.is_none() {
- session = Some(ele.0.session.clone());
- continue;
- }
- let session = &session.as_ref().expect("checked").0;
- let ele_sess = &ele.0.session.0;
- assert!(
- Arc::ptr_eq(session, ele_sess),
- "can't mix fields from different session"
- );
- }
- session.expect("expr without fields used")
- }
- #[allow(dead_code)]
- pub fn index_attr(&mut self, s: &str) {
- let escaped = nixlike::serialize(s).expect("string");
- self.out.push('.');
- self.out.push_str(escaped.trim_end());
- }
-}
-
-#[macro_export]
-macro_rules! nix_expr_inner {
- //(@munch_object FIXME: value should be arbitrary nix_expr_inner input... Time to write proc-macro?
- (@obj($o:ident) $field:ident, $($tt:tt)*) => {{
- $o.obj_key(
- NixExprBuilder::string(stringify!($field)),
- NixExprBuilder::field($field),
- );
- nix_expr_inner!(@obj($o) $($tt)*);
- }};
- (@obj($o:ident) $field:ident: $v:block, $($tt:tt)*) => {{
- $o.obj_key(
- NixExprBuilder::string(stringify!($field)),
- NixExprBuilder::serialized(&$v),
- );
- nix_expr_inner!(@obj($o) $($tt)*);
- }};
- (@obj($o:ident)) => {{}};
- (Obj { $($tt:tt)* }) => {{
- use $crate::{better_nix_eval::NixExprBuilder, nix_expr_inner};
- let mut out = NixExprBuilder::object();
- nix_expr_inner!(@obj(out) $($tt)*);
- out.end_obj();
- out
- }};
- (@field($o:ident) . $var:ident $($tt:tt)*) => {{
- $o.index_attr(stringify!($var));
- nix_expr_inner!(@field($o) $($tt)*);
- }};
- (@field($o:ident) [{ $v:expr }] $($tt:tt)*) => {{
- $o.push(Index::attr(&$v));
- nix_expr_inner!(@o($o) $($tt)*);
- }};
- (@field($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{
- $o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));
- nix_expr_inner!(@o($o) $($tt)*);
- }};
- (@field($o:ident) ($($var:tt)*) $($tt:tt)*) => {
- $o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));
- nix_expr_inner!(@o($o) $($tt)*);
- };
- (@field($o:ident)) => {};
- ($field:ident $($tt:tt)*) => {{
- use $crate::{better_nix_eval::NixExprBuilder, nix_expr_inner};
- #[allow(unused_mut, reason = "might be used if indexed")]
- let mut out = NixExprBuilder::field($field.clone());
- nix_expr_inner!(@field(out) $($tt)*);
- out
- }};
- ($v:literal) => {{
- use $crate::better_nix_eval::NixExprBuilder;
- NixExprBuilder::string($v)
- }};
- ({$v:expr}) => {{
- use $crate::better_nix_eval::NixExprBuilder;
- NixExprBuilder::serialized(&$v)
- }}
-}
-#[macro_export]
-macro_rules! nix_expr {
- ($($tt:tt)+) => {{
- use $crate::{better_nix_eval::{NixExprBuilder, Field}, nix_expr_inner};
- let expr = nix_expr_inner!($($tt)+);
- Field::new(expr.session(), expr.out)
- }};
-}
-#[macro_export]
-macro_rules! nix_go {
- (@o($o:ident) . $var:ident $($tt:tt)*) => {{
- $o.push(Index::attr(stringify!($var)));
- nix_go!(@o($o) $($tt)*);
- }};
- (@o($o:ident) [{ $v:expr }] $($tt:tt)*) => {{
- $o.push(Index::attr(&$v));
- nix_go!(@o($o) $($tt)*);
- }};
- (@o($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{
- $o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));
- nix_go!(@o($o) $($tt)*);
- }};
- (@o($o:ident) ($($var:tt)*) $($tt:tt)*) => {
- $o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));
- nix_go!(@o($o) $($tt)*);
- };
- (@o($o:ident) | $($var:tt)*) => {
- $o.push(Index::Pipe($crate::nix_expr_inner!($($var)+)));
- };
- (@o($o:ident)) => {};
- ($field:ident $($tt:tt)+) => {{
- use $crate::{nix_go, better_nix_eval::Index};
- let field = $field.clone();
- let mut out = vec![];
- nix_go!(@o(out) $($tt)*);
- field.select(out).await?
- }}
-}
-#[macro_export]
-macro_rules! nix_go_json {
- ($($tt:tt)*) => {{
- $crate::nix_go!($($tt)*).as_json().await?
- }};
-}
-#[derive(Clone)]
-pub enum Index {
- Var(String),
- String(String),
- #[allow(dead_code)]
- Apply(String),
- #[allow(dead_code)]
- Expr(NixExprBuilder),
- ExprApply(NixExprBuilder),
- Pipe(NixExprBuilder),
-}
-impl Index {
- pub fn var(v: impl AsRef<str>) -> Self {
- let v = v.as_ref();
- assert!(
- !(v.contains('.') | v.contains(' ')),
- "bad variable name: {v}"
- );
- Self::Var(v.to_owned())
- }
- pub fn attr(v: impl AsRef<str>) -> Self {
- Self::String(v.as_ref().to_owned())
- }
- #[allow(dead_code)]
- pub fn apply(v: impl Serialize) -> Self {
- let serialized = nixlike::serialize(v).expect("invalid value for apply");
- Self::Apply(serialized.trim_end().to_owned())
- }
-}
-impl Display for Index {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- match self {
- Index::Var(v) => {
- write!(f, "{v}")
- }
- Index::String(k) => {
- let v = nixlike::format_identifier(k.as_str());
- write!(f, ".{v}")
- }
- Index::Apply(o) => {
- write!(f, "<apply>({o})")
- }
- Index::Expr(e) => {
- write!(f, "[{}]", e.out)
- }
- Index::ExprApply(e) => {
- write!(f, "<apply>({})", e.out)
- }
- Index::Pipe(e) => {
- write!(f, "<map>({})", e.out)
- }
- }
- }
-}
-impl fmt::Debug for Index {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "{self}")
- }
-}
-struct PathDisplay<'i>(&'i [Index]);
-impl Display for PathDisplay<'_> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- for i in self.0 {
- write!(f, "{i}")?;
- }
- Ok(())
- }
-}
-struct FieldInner {
- full_path: Option<Vec<Index>>,
- session: NixSession,
- value: Option<u32>,
-}
-fn context(op: &str, full_path: Option<&[Index]>, query: &str) -> String {
- if let Some(full_path) = &full_path {
- format!("on {op}, full path: {}", PathDisplay(full_path))
- } else {
- format!("query: {query:?}")
- }
-}
-#[derive(Clone)]
-pub struct Field(Arc<FieldInner>);
-impl Field {
- fn root(session: NixSession) -> Self {
- Self(Arc::new(FieldInner {
- full_path: Some(vec![]),
- session,
- value: None,
- }))
- }
- async fn new(session: NixSession, query: &str) -> Result<Self> {
- let vid = session
- .0
- .lock()
- .await
- .execute_assign(query)
- .await
- .with_context(|| context("new root", None, query))?;
- Ok(Self(Arc::new(FieldInner {
- full_path: None,
- session,
- value: Some(vid),
- })))
- }
- pub async fn field(session: NixSession, field: &str) -> Result<Self> {
- Self::root(session).select([Index::var(field)]).await
- }
- pub async fn select<'a>(&self, name: impl IntoIterator<Item = Index>) -> Result<Self> {
- let mut used_fields = Vec::new();
- let mut name = name.into_iter();
- let mut full_path = self.0.full_path.clone();
- let mut query = if let Some(id) = self.0.value {
- format!("sess_field_{id}")
- } else {
- let first = name.next();
- if let Some(Index::Var(i)) = first {
- if let Some(full_path) = &mut full_path {
- full_path.push(Index::Var(i.clone()));
- }
- i.clone()
- } else {
- panic!("first path item should be variable, got {first:?}")
- }
- };
- for v in name {
- if let Some(full_path) = &mut full_path {
- full_path.push(v.clone());
- }
- match v {
- Index::Var(_) => panic!("var item may only be first"),
- Index::String(s) => {
- let escaped = nixlike::serialize(s)?;
- query.push('.');
- query.push_str(escaped.trim());
- }
- Index::Apply(a) => {
- // In cases like `a {}.b` first `{}.b` will be evaluated, so `a {}` should be encased in `()`
- query = format!("({query} {a})");
- }
- Index::Expr(e) => {
- let index = Field::new(self.0.session.clone(), &e.out).await?;
- used_fields.push(index.clone());
- query.push('.');
- let index = format!("${{sess_field_{}}}", index.0.value.expect("value"));
- query.push_str(&index);
- }
- Index::ExprApply(e) => {
- let index = Field::new(self.0.session.clone(), &e.out).await?;
- used_fields.push(index.clone());
- query.push(' ');
- let index = format!("sess_field_{}", index.0.value.expect("value"));
- query.push_str(&index);
- query = format!("({query})");
- }
- Index::Pipe(v) => {
- let index = Field::new(self.0.session.clone(), &v.out).await?;
- used_fields.push(index.clone());
- let index = format!("sess_field_{}", index.0.value.expect("value"));
- query = format!("({index} {query})");
- }
- }
- }
- let vid = self
- .0
- .session
- .0
- .lock()
- .await
- .execute_assign(&query)
- .await
- .with_context(|| {
- if let Some(full_path) = &full_path {
- format!("full path: {}", PathDisplay(full_path))
- } else {
- format!("query: {query:?}")
- }
- })?;
- Ok(Self(Arc::new(FieldInner {
- full_path,
- session: self.0.session.clone(),
- value: Some(vid),
- })))
- }
- pub async fn as_json<V: DeserializeOwned>(&self) -> Result<V> {
- let id = self.0.value.expect("can't serialize root field");
- let query = format!("sess_field_{id}");
- self.0
- .session
- .0
- .lock()
- .await
- .execute_expression_to_json(&query)
- .await
- .with_context(|| context("as_json", self.0.full_path.as_deref(), &query))
- }
- #[allow(dead_code)]
- pub async fn has_field(&self, name: &str) -> Result<bool> {
- let id = self.0.value.expect("can't list root fields");
- let key = nixlike::escape_string(name);
- let query = format!("sess_field_{id} ? {key}");
- self.0
- .session
- .0
- .lock()
- .await
- .execute_expression_to_json(&query)
- .await
- .with_context(|| context("has_field", self.0.full_path.as_deref(), &query))
- }
- pub async fn list_fields(&self) -> Result<Vec<String>> {
- let id = self.0.value.expect("can't list root fields");
- let query = format!("builtins.attrNames sess_field_{id}");
- self.0
- .session
- .0
- .lock()
- .await
- .execute_expression_to_json(&query)
- .await
- .with_context(|| context("list field", self.0.full_path.as_deref(), &query))
- }
- pub async fn type_of(&self) -> Result<String> {
- let id = self.0.value.expect("can't list root fields");
- let query = format!("builtins.typeOf sess_field_{id}");
- self.0
- .session
- .0
- .lock()
- .await
- .execute_expression_to_json(&query)
- .await
- .with_context(|| context("type_of", self.0.full_path.as_deref(), &query))
- }
- #[allow(dead_code)]
- pub async fn import(&self) -> Result<Self> {
- let import = Self::new(self.0.session.clone(), "import").await?;
- Ok(nix_go!(self | import))
- }
- pub async fn build(&self) -> Result<HashMap<String, PathBuf>> {
- let id = self.0.value.expect("can't use build on not-value");
- let query = format!(":b sess_field_{id}");
- let vid = self
- .0
- .session
- .0
- .lock()
- .await
- .execute_expression_raw(&query, &mut NixHandler::default())
- .await?;
- ensure!(
- !vid.is_empty(),
- "build failed: {}",
- context("build", self.0.full_path.as_deref(), &query),
- );
- let Some(vid) = vid.strip_prefix("This derivation produced the following outputs:\n")
- else {
- panic!("unexpected build output: {vid:?}");
- };
- let outputs = vid
- .split('\n')
- .filter(|v| !v.is_empty())
- .map(|v| v.split_once(" -> ").expect("unexpected build output"))
- .map(|(a, b)| (a.trim_start().to_owned(), PathBuf::from(b)))
- .collect();
- Ok(outputs)
- }
-}
-impl Drop for FieldInner {
- fn drop(&mut self) {
- if let Some(id) = self.value {
- if let Ok(mut lock) = self.session.0.try_lock() {
- lock.free_list.push(id)
- }
- // Leaked
- }
- }
-}
-struct NixSessionPoolInner {
- flake: OsString,
- nix_args: Vec<OsString>,
-}
-
-#[derive(Debug)]
-pub struct NixPoolError(anyhow::Error);
-impl From<anyhow::Error> for NixPoolError {
- fn from(value: anyhow::Error) -> Self {
- Self(value)
- }
-}
-impl std::error::Error for NixPoolError {}
-impl std::fmt::Display for NixPoolError {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- self.0.fmt(f)
- }
-}
-impl r2d2::ManageConnection for NixSessionPoolInner {
- type Connection = NixSessionInner;
- type Error = NixPoolError;
- fn connect(&self) -> std::result::Result<Self::Connection, Self::Error> {
- let _v = TOKIO_RUNTIME
- .get()
- .expect("missed tokio runtime init!")
- .enter();
- Ok(futures::executor::block_on(NixSessionInner::new(
- self.flake.as_os_str(),
- self.nix_args.iter().map(OsString::as_os_str),
- ))?)
- }
-
- fn is_valid(&self, conn: &mut Self::Connection) -> std::result::Result<(), Self::Error> {
- let _v = TOKIO_RUNTIME
- .get()
- .expect("missed tokio runtime init!")
- .enter();
- let res = futures::executor::block_on(conn.execute_expression_number("2 + 2"))?;
- if res != 4 {
- return Err(anyhow!("sanity check failed").into());
- };
- Ok(())
- }
-
- fn has_broken(&self, _conn: &mut Self::Connection) -> bool {
- false
- }
-}
-pub struct NixSessionPool(Pool<NixSessionPoolInner>);
-impl NixSessionPool {
- pub async fn new(flake: OsString, nix_args: Vec<OsString>) -> Result<Self> {
- let inner = tokio::task::block_in_place(|| {
- r2d2::Builder::<NixSessionPoolInner>::new()
- .min_idle(Some(0))
- .build(NixSessionPoolInner { flake, nix_args })
- })?;
- Ok(Self(inner))
- }
- pub async fn get(&self) -> Result<NixSession> {
- let v = tokio::task::block_in_place(|| self.0.get())?;
- Ok(NixSession(Arc::new(tokio::sync::Mutex::new(v))))
- }
-}
-
-pub static TOKIO_RUNTIME: OnceLock<tokio::runtime::Handle> = OnceLock::new();
cmds/fleet/src/cmds/build_systems.rsdiffbeforeafterboth--- a/cmds/fleet/src/cmds/build_systems.rs
+++ b/cmds/fleet/src/cmds/build_systems.rs
@@ -4,10 +4,10 @@
use crate::command::MyCommand;
use crate::host::{Config, ConfigHost};
-use crate::nix_go;
use anyhow::{anyhow, Result};
use clap::{Parser, ValueEnum};
use itertools::Itertools as _;
+use nix_eval::nix_go;
use tokio::{task::LocalSet, time::sleep};
use tracing::{error, field, info, info_span, warn, Instrument};
cmds/fleet/src/cmds/info.rsdiffbeforeafterboth--- a/cmds/fleet/src/cmds/info.rs
+++ b/cmds/fleet/src/cmds/info.rs
@@ -1,9 +1,9 @@
use std::collections::BTreeSet;
use crate::host::Config;
-use crate::nix_go_json;
use anyhow::{ensure, Result};
use clap::Parser;
+use nix_eval::nix_go_json;
#[derive(Parser)]
pub struct Info {
cmds/fleet/src/cmds/secrets/mod.rsdiffbeforeafterboth--- a/cmds/fleet/src/cmds/secrets/mod.rs
+++ b/cmds/fleet/src/cmds/secrets/mod.rs
@@ -11,6 +11,7 @@
use crossterm::{terminal, tty::IsTty};
use fleet_shared::SecretData;
use itertools::Itertools;
+use nix_eval::{nix_go, nix_go_json, Value};
use owo_colors::OwoColorize;
use serde::Deserialize;
use tabled::{Table, Tabled};
@@ -18,10 +19,8 @@
use tracing::{error, info, info_span, warn, Instrument};
use crate::{
- better_nix_eval::Field,
fleetdata::{encrypt_secret_data, FleetSecret, FleetSecretPart, FleetSharedSecret},
host::Config,
- nix_go, nix_go_json,
};
#[derive(Parser)]
@@ -130,7 +129,7 @@
secret_name: &str,
config: &Config,
mut secret: FleetSharedSecret,
- field: Field,
+ field: Value,
updated_set: &[String],
prefer_identities: &[String],
) -> Result<FleetSharedSecret> {
@@ -197,8 +196,8 @@
async fn generate_pure(
_config: &Config,
_display_name: &str,
- _secret: Field,
- _default_generator: Field,
+ _secret: Value,
+ _default_generator: Value,
_owners: &[String],
) -> Result<FleetSecret> {
bail!("pure generators are broken for now")
@@ -206,8 +205,8 @@
async fn generate_impure(
config: &Config,
_display_name: &str,
- secret: Field,
- default_generator: Field,
+ secret: Value,
+ default_generator: Value,
owners: &[String],
) -> Result<FleetSecret> {
let generator = nix_go!(secret.generator);
@@ -289,7 +288,7 @@
async fn generate(
config: &Config,
display_name: &str,
- secret: Field,
+ secret: Value,
owners: &[String],
) -> Result<FleetSecret> {
let generator = nix_go!(secret.generator);
@@ -332,7 +331,7 @@
async fn generate_shared(
config: &Config,
display_name: &str,
- secret: Field,
+ secret: Value,
expected_owners: Vec<String>,
) -> Result<FleetSharedSecret> {
// let owners: Vec<String> = nix_go_json!(secret.expectedOwners);
cmds/fleet/src/host.rsdiffbeforeafterboth--- a/cmds/fleet/src/host.rs
+++ b/cmds/fleet/src/host.rs
@@ -12,15 +12,14 @@
use anyhow::{anyhow, bail, ensure, Context, Result};
use clap::{ArgGroup, Parser};
use fleet_shared::SecretData;
+use nix_eval::{nix_go, nix_go_json, NixSessionPool, Value};
use openssh::SessionBuilder;
use serde::de::DeserializeOwned;
use tempfile::NamedTempFile;
use crate::{
- better_nix_eval::{Field, NixSessionPool},
command::MyCommand,
fleetdata::{FleetData, FleetSecret, FleetSharedSecret},
- nix_go, nix_go_json,
};
pub struct FleetConfigInternals {
@@ -30,12 +29,12 @@
pub data: Mutex<FleetData>,
pub nix_args: Vec<OsString>,
/// fleet_config.config
- pub config_field: Field,
+ pub config_field: Value,
/// fleet_config.unchecked.config
- pub config_unchecked_field: Field,
+ pub config_unchecked_field: Value,
/// import nixpkgs {system = local};
- pub default_pkgs: Field,
+ pub default_pkgs: Value,
}
#[derive(Clone)]
@@ -55,7 +54,7 @@
pub local: bool,
pub session: OnceLock<Arc<openssh::Session>>,
- pub nixos_config: Option<Field>,
+ pub nixos_config: Option<Value>,
}
impl ConfigHost {
async fn open_session(&self) -> Result<Arc<openssh::Session>> {
@@ -201,7 +200,7 @@
}
Ok(out)
}
- pub async fn secret_field(&self, name: &str) -> Result<Field> {
+ pub async fn secret_field(&self, name: &str) -> Result<Value> {
let Some(nixos) = &self.nixos_config else {
bail!("host is virtual and has no secrets");
};
@@ -209,7 +208,7 @@
}
/// Packages for this host, resolved with nixpkgs overlays
- pub async fn pkgs(&self) -> Result<Field> {
+ pub async fn pkgs(&self) -> Result<Value> {
let Some(nixos) = &self.nixos_config else {
return Ok(self.config.default_pkgs.clone());
};
@@ -261,7 +260,7 @@
}
Ok(out)
}
- pub async fn system_config(&self, host: &str) -> Result<Field> {
+ pub async fn system_config(&self, host: &str) -> Result<Value> {
let fleet_field = &self.config_unchecked_field;
Ok(nix_go!(fleet_field.hosts[{ host }].nixosSystem.config))
}
@@ -275,7 +274,7 @@
/// Shared secrets configured in fleet.nix or in flake
pub async fn list_configured_shared(&self) -> Result<Vec<String>> {
let config_field = &self.config_unchecked_field;
- nix_go!(config_field.sharedSecrets).list_fields().await
+ Ok(nix_go!(config_field.sharedSecrets).list_fields().await?)
}
/// Shared secrets configured in fleet.nix
pub fn list_shared(&self) -> Vec<String> {
@@ -389,13 +388,13 @@
let pool = NixSessionPool::new(directory.as_os_str().to_owned(), nix_args.clone()).await?;
let root_field = pool.get().await?;
- let builtins_field = Field::field(root_field.clone(), "builtins").await?;
+ let builtins_field = Value::binding(root_field.clone(), "builtins").await?;
if self.local_system == "detect" {
self.local_system = nix_go_json!(builtins_field.currentSystem);
}
let local_system = self.local_system.clone();
- let fleet_root = Field::field(root_field, "fleetConfigurations").await?;
+ let fleet_root = Value::binding(root_field, "fleetConfigurations").await?;
let fleet_field = nix_go!(fleet_root.default);
let config_field = nix_go!(fleet_field.config);
cmds/fleet/src/main.rsdiffbeforeafterboth--- a/cmds/fleet/src/main.rs
+++ b/cmds/fleet/src/main.rs
@@ -1,5 +1,5 @@
#![recursion_limit = "512"]
-#![feature(try_blocks, lint_reasons)]
+#![feature(try_blocks)]
pub(crate) mod cmds;
pub(crate) mod command;
@@ -173,6 +173,8 @@
setup_logging();
if let Err(e) = main_real().await {
// If I remove this line, the next error!() line gets eaten.
+ // This is a bug in indicatif, it needs to be fixed
+ #[cfg(feature = "indicatif")]
info!("fixme: this line gets eaten by tracing-indicatif on levels info+");
error!("{e:#}");
return ExitCode::FAILURE;
@@ -181,7 +183,7 @@
}
async fn main_real() -> Result<()> {
- let _ = better_nix_eval::TOKIO_RUNTIME.set(tokio::runtime::Handle::current());
+ nix_eval::init_tokio();
let nix_args = std::env::var_os("NIX_ARGS")
.map(|a| extra_args::parse_os(&a))
cmds/generator-helper/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/cmds/generator-helper/Cargo.toml
@@ -0,0 +1,12 @@
+[package]
+name = "fleet-generator-helper"
+edition = "2021"
+version.workspace = true
+
+[dependencies]
+age.workspace = true
+anyhow.workspace = true
+clap.workspace = true
+ed25519-dalek = { version = "2.1.1", features = ["rand_core"] }
+fleet-shared.workspace = true
+rand = "0.8.5"
cmds/generator-helper/src/main.rsdiffbeforeafterboth--- /dev/null
+++ b/cmds/generator-helper/src/main.rs
@@ -0,0 +1,204 @@
+use std::{
+ fs,
+ io::{self, stdout, Cursor, Read, Write},
+ path::PathBuf,
+ str::FromStr,
+};
+
+use age::Recipient;
+use anyhow::{anyhow, bail, ensure, Context, Result};
+use clap::Parser;
+use ed25519_dalek::SigningKey;
+use fleet_shared::SecretData;
+use rand::{
+ distributions::{Alphanumeric, DistString, Distribution, Uniform},
+ rngs::OsRng,
+ thread_rng, Rng,
+};
+
+fn write_output(out: &str, data: impl AsRef<[u8]>, stdout_marker: &mut bool) -> Result<()> {
+ let data = data.as_ref();
+ if out == "-" {
+ let mut stdout = stdout();
+ if *stdout_marker {
+ stdout.write_all(&[b'\n'])?;
+ }
+ *stdout_marker = true;
+ stdout.write_all(data)?;
+ } else {
+ fs::write(out, data)?;
+ };
+ Ok(())
+}
+
+#[derive(Parser)]
+enum Generate {
+ /// Generate public, private keys without wrapping, in standard ed25519 schema
+ /// (64 bytes private (due to merge with private), 32 bytes public)
+ Ed25519 {
+ public: String,
+ private: String,
+ /// Private key should be just the private key (32 bytes), not standard private+public.
+ #[arg(long)]
+ no_embed_public: bool,
+ },
+ Password {
+ output: String,
+ size: usize,
+ #[arg(long, short = 'n')]
+ no_symbols: bool,
+ },
+}
+
+#[derive(Parser)]
+enum Opts {
+ /// Encode public part from stdin.
+ Public {
+ #[arg(long)]
+ allow_empty: bool,
+ },
+ /// Encrypt private part from stdin.
+ Private {
+ #[arg(long)]
+ allow_empty: bool,
+ #[arg(short = 'r')]
+ recipient: Vec<String>,
+ },
+ /// Generate keys in well-known schemas.
+ ///
+ /// Note that this command is only intended to be used in fleet secret generator,
+ /// otherwise you should ensure noone is able to read generated files, they don't have any mode set by default.
+ #[command(subcommand)]
+ Generate(Generate),
+ // Generate {
+ // kind: GenerateKind,
+ // /// Different generators generate different number of files, you need to specify number of outputs corresponding to the generator.
+ // #[arg(short = 'o')]
+ // outputs: Vec<String>,
+ // },
+}
+
+fn parse_stdin() -> Result<Option<Vec<u8>>> {
+ let mut input = vec![];
+ io::stdin().read_to_end(&mut input)?;
+ if input.is_empty() {
+ Ok(None)
+ } else {
+ Ok(Some(input))
+ }
+}
+pub fn encrypt_secret_data(
+ recipients: impl IntoIterator<Item = impl Recipient + Send + 'static>,
+ data: Vec<u8>,
+) -> Option<SecretData> {
+ let mut encrypted = vec![];
+ let recipients = recipients
+ .into_iter()
+ .map(|v| Box::new(v) as Box<dyn Recipient + Send>)
+ .collect::<Vec<_>>();
+ let mut encryptor = age::Encryptor::with_recipients(recipients)?
+ .wrap_output(&mut encrypted)
+ .expect("in memory write");
+ io::copy(&mut Cursor::new(data), &mut encryptor).expect("in memory copy");
+ encryptor.finish().expect("in memory flush");
+ Some(SecretData {
+ data: encrypted,
+ encrypted: true,
+ })
+}
+
+fn main() -> Result<()> {
+ let opts = Opts::parse();
+ // Assumed to be secure, seeded from secure OsRng+reseeded.
+ let mut rng = thread_rng();
+
+ match opts {
+ Opts::Public { allow_empty } => {
+ let stdin = parse_stdin()?;
+ if stdin.is_none() && !allow_empty {
+ bail!("empty stdin input is not allowed unless --allow-empty is set");
+ }
+ let stdin = stdin.unwrap_or_default();
+ io::stdout().write_all(
+ SecretData {
+ data: stdin,
+ encrypted: false,
+ }
+ .to_string()
+ .as_bytes(),
+ )?;
+ }
+ Opts::Private {
+ allow_empty,
+ recipient,
+ } => {
+ let stdin = parse_stdin()?;
+ if stdin.is_none() && !allow_empty {
+ bail!("empty stdin input is not allowed unless --allow-empty is set");
+ }
+ let stdin = stdin.unwrap_or_default();
+ if recipient.is_empty() {
+ bail!("recipient list is empty");
+ }
+ let out = encrypt_secret_data(
+ recipient
+ .into_iter()
+ .map(|r| age::ssh::Recipient::from_str(&r))
+ .collect::<Result<Vec<age::ssh::Recipient>, age::ssh::ParseRecipientKeyError>>()
+ .map_err(|e| anyhow!("parse recipients: {e:?}"))?,
+ stdin,
+ )
+ .expect("got recipients");
+ io::stdout().write_all(out.to_string().as_bytes())?;
+ }
+ Opts::Generate(gen) => {
+ let mut stdout_marker: bool = false;
+ match gen {
+ Generate::Ed25519 {
+ public,
+ private,
+ no_embed_public,
+ } => {
+ let key = SigningKey::generate(&mut rng).to_keypair_bytes();
+
+ write_output(&public, &key[32..], &mut stdout_marker).context("public")?;
+ write_output(
+ &private,
+ &key[..{
+ if no_embed_public {
+ 32
+ } else {
+ 64
+ }
+ }],
+ &mut stdout_marker,
+ )
+ .context("private")?;
+ }
+ Generate::Password {
+ size,
+ no_symbols,
+ output,
+ } => {
+ ensure!(
+ size >= 6,
+ "misconfiguration? password is shorter than 6 chars"
+ );
+ let out = if no_symbols {
+ Alphanumeric.sample_string(&mut rng, size)
+ } else {
+ // Alphabet of Alphanumberic + symbols
+ const GEN_ASCII_SYMBOLS: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+ let uniform = Uniform::new(0, GEN_ASCII_SYMBOLS.len());
+ (0..size)
+ .map(|_| uniform.sample(&mut rng))
+ .map(|i| GEN_ASCII_SYMBOLS[i] as char)
+ .collect::<String>()
+ };
+ write_output(&output, out, &mut stdout_marker)?;
+ }
+ }
+ }
+ }
+ Ok(())
+}
cmds/install-secrets/Cargo.tomldiffbeforeafterboth--- a/cmds/install-secrets/Cargo.toml
+++ b/cmds/install-secrets/Cargo.toml
@@ -6,18 +6,13 @@
[dependencies]
-age = { version = "0.10.0", features = ["ssh"] }
-anyhow = "1.0.79"
-tracing-subscriber = { version = "0.3", features = ["env-filter"] }
-tracing = "0.1"
-nix = {version = "0.27.1", features = ["user", "fs"]}
-serde = { version = "1.0.196", features = ["derive"] }
-serde_json = "1.0.113"
-clap = { version = ">=4.4, <4.5", features = [
- "derive",
- "env",
- "wrap_help",
- "unicode",
-] }
-tempfile = "3.10.0"
+clap.workspace = true
fleet-shared.workspace = true
+age.workspace = true
+anyhow.workspace = true
+tracing.workspace = true
+tracing-subscriber.workspace = true
+serde.workspace = true
+serde_json.workspace = true
+tempfile.workspace = true
+nix.workspace = true
cmds/remowt-agent/Cargo.tomldiffbeforeafterboth--- a/cmds/remowt-agent/Cargo.toml
+++ b/cmds/remowt-agent/Cargo.toml
@@ -6,3 +6,5 @@
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+iroh-net = "0.17.0"
+tracing.workspace = true
crates/nix-eval/Cargo.tomldiffbeforeafterboth--- /dev/null
+++ b/crates/nix-eval/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "nix-eval"
+edition = "2021"
+version.workspace = true
+
+[dependencies]
+better-command.workspace = true
+futures = "0.3.30"
+itertools = "0.13.0"
+nixlike.workspace = true
+r2d2 = "0.8.10"
+serde = { workspace = true, features = ["derive"] }
+serde_json.workspace = true
+thiserror = "1.0.61"
+tokio = { workspace = true, features = ["process", "io-util"] }
+tokio-util = { version = "0.7.11", features = ["codec"] }
+tracing.workspace = true
+unindent = "0.2.3"
crates/nix-eval/src/lib.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/nix-eval/src/lib.rs
@@ -0,0 +1,32 @@
+//! This whole library should be replaced with either binding to nix libexpr,
+//! or with tvix (once it is able to build NixOS).
+//!
+//! Current api is awful, little effort was put into this implementation.
+
+use std::sync::Arc;
+
+pub use pool::NixSessionPool;
+use pool::NixSessionPoolInner;
+use r2d2::PooledConnection;
+pub use session::{Error, Result};
+pub use value::{Index, Value};
+
+mod pool;
+mod session;
+mod value;
+// Contains macros helpers
+#[doc(hidden)]
+pub mod macros;
+
+#[derive(Clone)]
+pub struct NixSession(pub(crate) Arc<tokio::sync::Mutex<PooledConnection<NixSessionPoolInner>>>);
+
+impl NixSession {
+ fn ptr_eq(a: &Self, b: &Self) -> bool {
+ Arc::ptr_eq(&a.0, &b.0)
+ }
+}
+
+pub fn init_tokio() {
+ let _ = pool::TOKIO_RUNTIME.set(tokio::runtime::Handle::current());
+}
crates/nix-eval/src/macros.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/nix-eval/src/macros.rs
@@ -0,0 +1,183 @@
+use serde::Serialize;
+
+use crate::{NixSession, Value};
+
+#[derive(Clone)]
+pub struct NixExprBuilder {
+ pub(crate) out: String,
+ used_fields: Vec<Value>,
+}
+impl NixExprBuilder {
+ pub fn object() -> Self {
+ NixExprBuilder {
+ out: "{ ".to_owned(),
+ used_fields: Vec::new(),
+ }
+ }
+ pub fn string(s: &str) -> Self {
+ NixExprBuilder {
+ out: nixlike::serialize(s)
+ .expect("no problems with serializing_string")
+ .trim_end()
+ .to_owned(),
+ used_fields: Vec::new(),
+ }
+ }
+ pub fn serialized(v: impl Serialize) -> Self {
+ let serialized = nixlike::serialize(v).expect("invalid value for apply");
+ Self {
+ out: serialized.trim_end().to_owned(),
+ used_fields: Vec::new(),
+ }
+ }
+ pub fn value(f: Value) -> Self {
+ Self {
+ out: format!("sess_field_{}", f.session_field_id()),
+ used_fields: vec![f],
+ }
+ }
+ pub fn end_obj(&mut self) {
+ self.out.push('}');
+ }
+ pub fn obj_key(&mut self, name: Self, value: Self) {
+ self.out.push_str(r#""${"#);
+ self.extend(name);
+ self.out.push_str(r#"}" = "#);
+ self.extend(value);
+ self.out.push_str("; ");
+ }
+
+ pub fn extend(&mut self, e: Self) {
+ self.out.push_str(&e.out);
+ self.used_fields.extend(e.used_fields);
+ }
+
+ #[allow(dead_code)]
+ pub fn session(&self) -> NixSession {
+ let mut session = None;
+ for ele in &self.used_fields {
+ if session.is_none() {
+ session = Some(ele.session());
+ continue;
+ }
+ let session = session.as_ref().expect("checked");
+ let ele_sess = ele.session();
+ assert!(
+ NixSession::ptr_eq(session, &ele_sess),
+ "can't mix fields from different session"
+ );
+ }
+ session.expect("expr without fields used")
+ }
+ #[allow(dead_code)]
+ pub fn index_attr(&mut self, s: &str) {
+ let escaped = nixlike::serialize(s).expect("string");
+ self.out.push('.');
+ self.out.push_str(escaped.trim_end());
+ }
+}
+
+#[macro_export]
+macro_rules! nix_expr_inner {
+ //(@munch_object FIXME: value should be arbitrary nix_expr_inner input... Time to write proc-macro?
+ (@obj($o:ident) $field:ident, $($tt:tt)*) => {{
+ $o.obj_key(
+ NixExprBuilder::string(stringify!($field)),
+ NixExprBuilder::value($field),
+ );
+ nix_expr_inner!(@obj($o) $($tt)*);
+ }};
+ (@obj($o:ident) $field:ident: $v:block, $($tt:tt)*) => {{
+ $o.obj_key(
+ NixExprBuilder::string(stringify!($field)),
+ NixExprBuilder::serialized(&$v),
+ );
+ nix_expr_inner!(@obj($o) $($tt)*);
+ }};
+ (@obj($o:ident)) => {{}};
+ (Obj { $($tt:tt)* }) => {{
+ use $crate::{macros::NixExprBuilder, nix_expr_inner};
+ let mut out = NixExprBuilder::object();
+ nix_expr_inner!(@obj(out) $($tt)*);
+ out.end_obj();
+ out
+ }};
+ (@field($o:ident) . $var:ident $($tt:tt)*) => {{
+ $o.index_attr(stringify!($var));
+ nix_expr_inner!(@field($o) $($tt)*);
+ }};
+ (@field($o:ident) [{ $v:expr }] $($tt:tt)*) => {{
+ $o.push(Index::attr(&$v));
+ nix_expr_inner!(@o($o) $($tt)*);
+ }};
+ (@field($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{
+ $o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));
+ nix_expr_inner!(@o($o) $($tt)*);
+ }};
+ (@field($o:ident) ($($var:tt)*) $($tt:tt)*) => {
+ $o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));
+ nix_expr_inner!(@o($o) $($tt)*);
+ };
+ (@field($o:ident)) => {};
+ ($field:ident $($tt:tt)*) => {{
+ use $crate::{macros::NixExprBuilder, nix_expr_inner};
+ // might be used if indexed
+ #[allow(unused_mut)]
+ let mut out = NixExprBuilder::value($field.clone());
+ nix_expr_inner!(@field(out) $($tt)*);
+ out
+ }};
+ ($v:literal) => {{
+ use $crate::macros::NixExprBuilder;
+ NixExprBuilder::string($v)
+ }};
+ ({$v:expr}) => {{
+ use $crate::macros::NixExprBuilder;
+ NixExprBuilder::serialized(&$v)
+ }}
+}
+#[macro_export]
+macro_rules! nix_expr {
+ ($($tt:tt)+) => {{
+ use $crate::{macros::{NixExprBuilder}, Value, nix_expr_inner};
+ let expr = nix_expr_inner!($($tt)+);
+ Field::new(expr.session(), expr.out)
+ }};
+}
+
+#[macro_export]
+macro_rules! nix_go {
+ (@o($o:ident) . $var:ident $($tt:tt)*) => {{
+ $o.push(Index::attr(stringify!($var)));
+ nix_go!(@o($o) $($tt)*);
+ }};
+ (@o($o:ident) [{ $v:expr }] $($tt:tt)*) => {{
+ $o.push(Index::attr(&$v));
+ nix_go!(@o($o) $($tt)*);
+ }};
+ (@o($o:ident) [ $($var:tt)+ ] $($tt:tt)*) => {{
+ $o.push(Index::Expr($crate::nix_expr_inner!($($var)+)));
+ nix_go!(@o($o) $($tt)*);
+ }};
+ (@o($o:ident) ($($var:tt)*) $($tt:tt)*) => {
+ $o.push(Index::ExprApply($crate::nix_expr_inner!($($var)+)));
+ nix_go!(@o($o) $($tt)*);
+ };
+ (@o($o:ident) | $($var:tt)*) => {
+ $o.push(Index::Pipe($crate::nix_expr_inner!($($var)+)));
+ };
+ (@o($o:ident)) => {};
+ ($field:ident $($tt:tt)+) => {{
+ use $crate::{nix_go, Index};
+ let field = $field.clone();
+ let mut out = vec![];
+ nix_go!(@o(out) $($tt)*);
+ field.select(out).await?
+ }}
+}
+#[macro_export]
+macro_rules! nix_go_json {
+ ($($tt:tt)*) => {{
+ $crate::nix_go!($($tt)*).as_json().await?
+ }};
+}
crates/nix-eval/src/pool.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/nix-eval/src/pool.rs
@@ -0,0 +1,61 @@
+use std::ffi::OsString;
+use std::sync::{Arc, OnceLock};
+
+use r2d2::Pool;
+
+use crate::session::NixSessionInner;
+use crate::{Error, NixSession, Result};
+
+pub struct NixSessionPool(Pool<NixSessionPoolInner>);
+impl NixSessionPool {
+ pub async fn new(flake: OsString, nix_args: Vec<OsString>) -> Result<Self> {
+ let inner = tokio::task::block_in_place(|| {
+ r2d2::Builder::<NixSessionPoolInner>::new()
+ .min_idle(Some(0))
+ .build(NixSessionPoolInner { flake, nix_args })
+ })?;
+ Ok(Self(inner))
+ }
+ pub async fn get(&self) -> Result<NixSession> {
+ let v = tokio::task::block_in_place(|| self.0.get())?;
+ Ok(NixSession(Arc::new(tokio::sync::Mutex::new(v))))
+ }
+}
+
+pub(crate) struct NixSessionPoolInner {
+ flake: OsString,
+ nix_args: Vec<OsString>,
+}
+
+impl r2d2::ManageConnection for NixSessionPoolInner {
+ type Connection = NixSessionInner;
+ type Error = Error;
+ fn connect(&self) -> std::result::Result<Self::Connection, Self::Error> {
+ let _v = TOKIO_RUNTIME
+ .get()
+ .expect("missed tokio runtime init!")
+ .enter();
+ Ok(futures::executor::block_on(NixSessionInner::new(
+ self.flake.as_os_str(),
+ self.nix_args.iter().map(OsString::as_os_str),
+ ))?)
+ }
+
+ fn is_valid(&self, conn: &mut Self::Connection) -> std::result::Result<(), Self::Error> {
+ let _v = TOKIO_RUNTIME
+ .get()
+ .expect("missed tokio runtime init!")
+ .enter();
+ let res = futures::executor::block_on(conn.execute_expression_number("2 + 2"))?;
+ if res != 4 {
+ // just in case, should fail much earlier
+ return Err(Error::SessionInit("misbehaving session"));
+ };
+ Ok(())
+ }
+
+ fn has_broken(&self, _conn: &mut Self::Connection) -> bool {
+ false
+ }
+}
+pub static TOKIO_RUNTIME: OnceLock<tokio::runtime::Handle> = OnceLock::new();
crates/nix-eval/src/session.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/nix-eval/src/session.rs
@@ -0,0 +1,415 @@
+use std::{ffi::OsStr, num::ParseIntError, process::Stdio, sync::Arc};
+
+use better_command::{ClonableHandler, Handler, NixHandler, NoopHandler};
+use futures::StreamExt;
+use itertools::Itertools as _;
+use serde::{de::DeserializeOwned, Deserialize};
+use thiserror::Error;
+use tokio::{
+ io::AsyncWriteExt,
+ process::{ChildStderr, ChildStdin, ChildStdout, Command},
+ select,
+ sync::{mpsc, oneshot, Mutex},
+};
+use tokio_util::codec::{FramedRead, LinesCodec};
+use tracing::{debug, error, warn, Level};
+
+#[derive(Error, Debug)]
+pub enum Error {
+ #[error("failed to create nix repl session: {0}")]
+ SessionInit(&'static str),
+ #[error("unexpected end of output, nix crashed?")]
+ MissingDelimiter,
+
+ #[error("expression did'nt produce any output")]
+ ExpectedOutput,
+ #[error("expression produced output, which is unexpected")]
+ UnexpectedOutput,
+
+ #[error("unexpected expression output type")]
+ InvalidType,
+
+ #[error("failed to build attr {attribute}:\n{error}")]
+ BuildFailed { attribute: String, error: String },
+
+ #[error("output: {0}")]
+ Json(#[from] serde_json::Error),
+ // int outputs are too specific, and should not be used,
+ // thus error is ok to be not informative.
+ #[error("int output: {0}")]
+ Int(ParseIntError),
+ #[error("pool: {0}")]
+ Pool(#[from] r2d2::Error),
+ #[error("io: {0}")]
+ Io(#[from] std::io::Error),
+
+ // TODO: Should be done by wrapper/in different type.
+ #[error("at {0}: {1}")]
+ InContext(String, Box<Self>),
+
+ #[error("error: {0}")]
+ NixError(String),
+}
+impl Error {
+ pub(crate) fn context(self, context: String) -> Self {
+ Self::InContext(context, Box::new(self))
+ }
+}
+pub type Result<T, E = Error> = std::result::Result<T, E>;
+
+enum OutputLine {
+ Out(String),
+ Err(String),
+}
+struct OutputHandler {
+ rx: mpsc::Receiver<OutputLine>,
+ _cancel_handle: oneshot::Receiver<()>,
+}
+impl OutputHandler {
+ fn new(out: ChildStdout, err: ChildStderr) -> Self {
+ let mut out = FramedRead::new(out, LinesCodec::new());
+ let mut err = FramedRead::new(err, LinesCodec::new());
+ let (tx, rx) = mpsc::channel(20);
+ let (mut cancelled, _cancel_handle) = oneshot::channel();
+ tokio::spawn(async move {
+ loop {
+ select! {
+ // We should receive errors earlier than synchronization
+ biased;
+ e = err.next() => {
+ let Some(Ok(e)) = e else {
+ if e.is_some() {
+ error!("bad repl stderr: {e:?}");
+ }
+ continue;
+ };
+ let _ = tx.send(OutputLine::Err(e)).await;
+ }
+ o = out.next() => {
+ let Some(Ok(o)) = o else {
+ if o.is_some() {
+ error!("bad repl stdout: {o:?}");
+ }
+ continue;
+ };
+ let _ = tx.send(OutputLine::Out(o)).await;
+ }
+ // Reader doesn't care about stdout, as this is cancelled.
+ // Error still might be useful, to process leftover span closures?
+ _ = cancelled.closed() => {
+ break;
+ }
+ }
+ }
+ });
+ Self { rx, _cancel_handle }
+ }
+ async fn next(&mut self) -> Option<OutputLine> {
+ self.rx.recv().await
+ }
+}
+
+#[must_use]
+struct ErrorCollector<'i, H> {
+ collected: Vec<String>,
+ inner: &'i mut H,
+}
+impl<'i, H> ErrorCollector<'i, H> {
+ fn new(inner: &'i mut H) -> Self {
+ Self {
+ collected: vec![],
+ inner,
+ }
+ }
+}
+impl<H> ErrorCollector<'_, H> {
+ fn handle_line_inner(&mut self, msg: &str) -> bool {
+ let Some(msg) = msg.strip_prefix("@nix ") else {
+ return false;
+ };
+ #[derive(Deserialize)]
+ struct ErrorAction {
+ action: String,
+ level: u32,
+ msg: String,
+ }
+ let Ok(act) = serde_json::from_str::<ErrorAction>(msg) else {
+ return false;
+ };
+ if act.action != "msg" || act.level != 0 {
+ return false;
+ }
+ self.collected.push(act.msg);
+ true
+ }
+ fn finish(self) -> Result<()> {
+ // fn dedent(s: String) -> String {
+ // s.split('\n').filter(|s| !s.trim().is_empty()).map(|v| v.)
+ // }
+ if !self.collected.is_empty() {
+ return Err(Error::NixError(format!(
+ "{}",
+ self.collected
+ .iter()
+ .map(|v| {
+ if let Some(f) = v.strip_prefix("\u{1b}[31;1merror:\u{1b}[0m ") {
+ let v = unindent::unindent(f.trim_start());
+ v.trim().to_owned()
+ } else {
+ v.to_owned()
+ }
+ })
+ .join("\n"),
+ )));
+ }
+ Ok(())
+ }
+ fn flush(self) {
+ for line in self.collected {
+ warn!("{line}");
+ }
+ }
+}
+impl<H: Handler> Handler for ErrorCollector<'_, H> {
+ fn handle_line(&mut self, e: &str) {
+ if self.handle_line_inner(e) {
+ return;
+ }
+ self.inner.handle_line(e)
+ }
+}
+
+pub struct NixSessionInner {
+ full_delimiter: String,
+ nix_handler: ClonableHandler<NixHandler>,
+ out: OutputHandler,
+ stdin: ChildStdin,
+ string_wrapping: (String, String),
+ number_wrapping: (String, String),
+
+ executing_command: Arc<Mutex<()>>,
+
+ next_id: u32,
+ pub(crate) free_list: Vec<u32>,
+}
+
+/// Discover inter-message repl delimiter
+const REPL_DELIMITER: &str = "\"FLEET_MAGIC_REPL_DELIMITER\"";
+/// Discover formatting around strings
+const TRAIN_STRING: &str = "\"TRAIN_STRING\"";
+/// Discover formatting around numbers
+const TRAIN_NUMBER: &str = "13141516";
+// Other types of formatting are not discovered, because they are not used, JSON serialization is used instead
+// Techically, number training is also not required, because numbers can be converted to string too...
+// Eh, I'll remove it later.
+
+impl NixSessionInner {
+ pub(crate) async fn new(
+ flake: &OsStr,
+ extra_args: impl IntoIterator<Item = &OsStr>,
+ ) -> Result<Self> {
+ let mut cmd = Command::new("nix");
+ cmd.arg("repl")
+ .arg(flake)
+ .arg("--log-format")
+ .arg("internal-json");
+ for arg in extra_args {
+ cmd.arg(arg);
+ }
+ cmd.stdin(Stdio::piped());
+ cmd.stdout(Stdio::piped());
+ cmd.stderr(Stdio::piped());
+ let cmd = cmd.spawn()?;
+ let stdout = cmd.stdout.unwrap();
+ let stderr = cmd.stderr.unwrap();
+ let mut out = OutputHandler::new(stdout, stderr);
+ let mut stdin = cmd.stdin.unwrap();
+ // Standard repl hello doesn't work with internal-json logger
+ stdin.write_all(REPL_DELIMITER.as_bytes()).await?;
+ stdin.write_all(b"\n").await?;
+ stdin.flush().await?;
+ let nix_handler = NixHandler::default();
+ let mut full_delimiter = None;
+ let mut errors = vec![];
+ while let Some(line) = out.next().await {
+ let line = match line {
+ OutputLine::Out(o) => o,
+ OutputLine::Err(_e) => {
+ // Handle startup errors, but skip repl hello?
+ errors.push(_e);
+ continue;
+ }
+ };
+ if line.contains(REPL_DELIMITER) {
+ debug!("discovered repl delimiter with added colors: {line}");
+ full_delimiter = Some(line.to_owned());
+ break;
+ }
+ }
+ let Some(full_delimiter) = full_delimiter else {
+ for e in errors {
+ error!("{e}");
+ }
+ return Err(Error::SessionInit("failed to discover delimiter"));
+ };
+ let mut res = Self {
+ full_delimiter,
+ nix_handler: ClonableHandler::new(nix_handler),
+ out,
+ stdin,
+ string_wrapping: Default::default(),
+ number_wrapping: Default::default(),
+
+ executing_command: Arc::new(Mutex::new(())),
+
+ next_id: 0,
+ free_list: vec![],
+ };
+ res.train().await?;
+ Ok(res)
+ }
+ async fn train(&mut self) -> Result<()> {
+ {
+ let full_string = self
+ .execute_expression_raw(TRAIN_STRING, &mut NoopHandler)
+ .await?;
+ let string_offset = full_string.find(TRAIN_STRING).expect("contained");
+ let string_prefix = &full_string[..string_offset];
+ let string_suffix = &full_string[string_offset + TRAIN_STRING.len()..];
+ self.string_wrapping = (string_prefix.to_owned(), string_suffix.to_owned());
+ }
+ {
+ let full_number = self
+ .execute_expression_raw(TRAIN_NUMBER, &mut NoopHandler)
+ .await?;
+ let number_offset = full_number.find(TRAIN_NUMBER).expect("contained");
+ let number_prefix = &full_number[..number_offset];
+ let number_suffix = &full_number[number_offset + TRAIN_NUMBER.len()..];
+ self.number_wrapping = (number_prefix.to_owned(), number_suffix.to_owned());
+ }
+ Ok(())
+ }
+ async fn send_command(&mut self, cmd: impl AsRef<[u8]>) -> Result<()> {
+ if tracing::enabled!(Level::DEBUG) && cmd.as_ref() != REPL_DELIMITER.as_bytes() {
+ let cmd_str = String::from_utf8_lossy(cmd.as_ref());
+ tracing::debug!("{cmd_str}");
+ };
+ self.stdin.write_all(cmd.as_ref()).await?;
+ self.stdin.write_all(b"\n").await?;
+ Ok(())
+ }
+ async fn read_until_delimiter(&mut self, err_handler: &mut dyn Handler) -> Result<String> {
+ let mut out = String::new();
+ while let Some(line) = self.out.next().await {
+ let line = match line {
+ OutputLine::Out(out) => out,
+ OutputLine::Err(err) => {
+ err_handler.handle_line(&err);
+ continue;
+ }
+ };
+ if line == self.full_delimiter {
+ return Ok(out);
+ }
+ if !out.is_empty() {
+ out.push('\n');
+ }
+ out.push_str(&line);
+ }
+ return Err(Error::MissingDelimiter);
+ }
+ pub(crate) async fn execute_expression_number(
+ &mut self,
+ expr: impl AsRef<[u8]>,
+ ) -> Result<u64> {
+ let num = self.number_wrapping.clone();
+ let n = self.execute_expression_wrapping(expr, &num).await?;
+ n.parse::<u64>().map_err(Error::Int)
+ }
+ async fn execute_expression_string(&mut self, expr: impl AsRef<[u8]>) -> Result<String> {
+ let num = self.string_wrapping.clone();
+ let n = self.execute_expression_wrapping(expr, &num).await?;
+ let str: String = serde_json::from_str(&n)?;
+ Ok(str)
+ }
+ pub(crate) async fn execute_expression_to_json<V: DeserializeOwned>(
+ &mut self,
+ expr: impl AsRef<[u8]>,
+ ) -> Result<V> {
+ let mut fexpr = b"builtins.toJSON (".to_vec();
+ fexpr.extend_from_slice(expr.as_ref());
+ fexpr.push(b')');
+ let v = self.execute_expression_string(fexpr).await?;
+ Ok(serde_json::from_str(&v)?)
+ }
+ async fn execute_expression_wrapping(
+ &mut self,
+ expr: impl AsRef<[u8]>,
+ wrapping: &(String, String),
+ ) -> Result<String> {
+ let mut nix_handler = self.nix_handler.clone();
+ let mut collected = ErrorCollector::new(&mut nix_handler);
+ let res = self.execute_expression_raw(expr, &mut collected).await?;
+ if res.is_empty() {
+ collected.finish()?;
+ return Err(Error::ExpectedOutput);
+ } else {
+ collected.flush()
+ };
+ let Some(res) = res.strip_prefix(&wrapping.0) else {
+ return Err(Error::InvalidType);
+ };
+ let Some(res) = res.strip_suffix(&wrapping.1) else {
+ return Err(Error::InvalidType);
+ };
+ Ok(res.to_owned())
+ }
+ async fn execute_expression_empty(&mut self, expr: impl AsRef<[u8]>) -> Result<()> {
+ let mut nix_handler = self.nix_handler.clone();
+ let mut collected = ErrorCollector::new(&mut nix_handler);
+ let v = self.execute_expression_raw(expr, &mut collected).await?;
+ collected.finish()?;
+ if !v.is_empty() {
+ return Err(Error::UnexpectedOutput);
+ }
+ Ok(())
+ }
+ pub(crate) async fn execute_expression_raw(
+ &mut self,
+ expr: impl AsRef<[u8]>,
+ err_handler: &mut dyn Handler,
+ ) -> Result<String> {
+ // Prevent two commands from being executed in parallel, messing with each other.
+ let _lock = self.executing_command.clone();
+ let _guard = _lock.lock().await;
+
+ self.send_command(expr).await?;
+ // It will be echoed
+ self.send_command(REPL_DELIMITER).await?;
+ self.read_until_delimiter(err_handler).await
+ }
+ pub(crate) async fn execute_assign(&mut self, expr: impl AsRef<str>) -> Result<u32> {
+ let id = self.allocate_id();
+ self.execute_expression_empty(format!("sess_field_{id} = {}", expr.as_ref()))
+ .await?;
+ Ok(id)
+ }
+
+ /// Id should be immediately used
+ fn allocate_id(&mut self) -> u32 {
+ if let Some(free) = self.free_list.pop() {
+ free
+ } else {
+ let v = self.next_id;
+ self.next_id += 1;
+ v
+ }
+ }
+ // Nix has no way to deallocate variable, yet GC will correct everything not reachable.
+ // async fn free_id(&mut self, id: u32) -> Result<()> {
+ // self.execute_expression_empty(format!("sess_field_{id} = null"))
+ // .await?;
+ // self.free_list.push(id);
+ // Ok(())
+ // }
+}
crates/nix-eval/src/value.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/nix-eval/src/value.rs
@@ -0,0 +1,291 @@
+use std::{collections::HashMap, fmt, path::PathBuf, sync::Arc};
+
+use better_command::NixHandler;
+use serde::{de::DeserializeOwned, Serialize};
+
+use crate::{macros::NixExprBuilder, nix_go, Error, NixSession, Result};
+
+#[derive(Clone)]
+pub enum Index {
+ Var(String),
+ String(String),
+ #[allow(dead_code)]
+ Apply(String),
+ #[allow(dead_code)]
+ Expr(NixExprBuilder),
+ ExprApply(NixExprBuilder),
+ Pipe(NixExprBuilder),
+}
+impl Index {
+ pub fn var(v: impl AsRef<str>) -> Self {
+ let v = v.as_ref();
+ assert!(
+ !(v.contains('.') | v.contains(' ')),
+ "bad variable name: {v}"
+ );
+ Self::Var(v.to_owned())
+ }
+ pub fn attr(v: impl AsRef<str>) -> Self {
+ Self::String(v.as_ref().to_owned())
+ }
+ #[allow(dead_code)]
+ pub fn apply(v: impl Serialize) -> Self {
+ let serialized = nixlike::serialize(v).expect("invalid value for apply");
+ Self::Apply(serialized.trim_end().to_owned())
+ }
+}
+impl fmt::Display for Index {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Index::Var(v) => {
+ write!(f, "{v}")
+ }
+ Index::String(k) => {
+ let v = nixlike::format_identifier(k.as_str());
+ write!(f, ".{v}")
+ }
+ Index::Apply(o) => {
+ write!(f, "<apply>({o})")
+ }
+ Index::Expr(e) => {
+ write!(f, "[{}]", e.out)
+ }
+ Index::ExprApply(e) => {
+ write!(f, "<apply>({})", e.out)
+ }
+ Index::Pipe(e) => {
+ write!(f, "<map>({})", e.out)
+ }
+ }
+ }
+}
+impl fmt::Debug for Index {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{self}")
+ }
+}
+struct PathDisplay<'i>(&'i [Index]);
+impl fmt::Display for PathDisplay<'_> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ for i in self.0 {
+ write!(f, "{i}")?;
+ }
+ Ok(())
+ }
+}
+struct ValueInner {
+ full_path: Option<Vec<Index>>,
+ session: NixSession,
+ value: Option<u32>,
+}
+#[derive(Clone)]
+pub struct Value(Arc<ValueInner>);
+impl Value {
+ fn root(session: NixSession) -> Self {
+ Self(Arc::new(ValueInner {
+ full_path: Some(vec![]),
+ session,
+ value: None,
+ }))
+ }
+ async fn new(session: NixSession, query: &str) -> Result<Self> {
+ let vid = session.0.lock().await.execute_assign(query).await?;
+ Ok(Self(Arc::new(ValueInner {
+ full_path: None,
+ session,
+ value: Some(vid),
+ })))
+ }
+ /// Get a top-level binding.
+ ///
+ /// In flake repl session, every output is exposed as top-level binding.
+ pub async fn binding(session: NixSession, field: &str) -> Result<Self> {
+ Self::root(session).select([Index::var(field)]).await
+ }
+ pub async fn select<'a>(&self, name: impl IntoIterator<Item = Index>) -> Result<Self> {
+ let mut used_fields = Vec::new();
+ let mut name = name.into_iter();
+
+ let mut full_path = self.0.full_path.clone();
+ let mut query = if let Some(id) = self.0.value {
+ format!("sess_field_{id}")
+ } else {
+ let first = name.next();
+ if let Some(Index::Var(i)) = first {
+ if let Some(full_path) = &mut full_path {
+ full_path.push(Index::Var(i.clone()));
+ }
+ i.clone()
+ } else {
+ panic!("first path item should be variable, got {first:?}")
+ }
+ };
+ for v in name {
+ if let Some(full_path) = &mut full_path {
+ full_path.push(v.clone());
+ }
+ match v {
+ Index::Var(_) => panic!("var item may only be first"),
+ Index::String(s) => {
+ let escaped =
+ nixlike::serialize(s).expect("strings are always serialized successfully");
+ query.push('.');
+ query.push_str(escaped.trim());
+ }
+ Index::Apply(a) => {
+ // In cases like `a {}.b` first `{}.b` will be evaluated, so `a {}` should be encased in `()`
+ query = format!("({query} {a})");
+ }
+ Index::Expr(e) => {
+ let index = Value::new(self.0.session.clone(), &e.out).await?;
+ used_fields.push(index.clone());
+ query.push('.');
+ let index = format!("${{sess_field_{}}}", index.0.value.expect("value"));
+ query.push_str(&index);
+ }
+ Index::ExprApply(e) => {
+ let index = Value::new(self.0.session.clone(), &e.out).await?;
+ used_fields.push(index.clone());
+ query.push(' ');
+ let index = format!("sess_field_{}", index.0.value.expect("value"));
+ query.push_str(&index);
+ query = format!("({query})");
+ }
+ Index::Pipe(v) => {
+ let index = Value::new(self.0.session.clone(), &v.out).await?;
+ used_fields.push(index.clone());
+ let index = format!("sess_field_{}", index.0.value.expect("value"));
+ query = format!("({index} {query})");
+ }
+ }
+ }
+
+ let vid = self
+ .0
+ .session
+ .0
+ .lock()
+ .await
+ .execute_assign(&query)
+ .await
+ .map_err(|e| e.context(self.attribute()))?;
+ Ok(Self(Arc::new(ValueInner {
+ full_path,
+ session: self.0.session.clone(),
+ value: Some(vid),
+ })))
+ }
+ pub async fn as_json<V: DeserializeOwned>(&self) -> Result<V> {
+ let id = self.0.value.expect("can't serialize root field");
+ let query = format!("sess_field_{id}");
+ self.0
+ .session
+ .0
+ .lock()
+ .await
+ .execute_expression_to_json(&query)
+ .await
+ .map_err(|e| e.context(self.attribute()))
+ }
+ #[allow(dead_code)]
+ pub async fn has_field(&self, name: &str) -> Result<bool> {
+ let id = self.0.value.expect("can't list root fields");
+ let key = nixlike::escape_string(name);
+ let query = format!("sess_field_{id} ? {key}");
+ self.0
+ .session
+ .0
+ .lock()
+ .await
+ .execute_expression_to_json(&query)
+ .await
+ .map_err(|e| e.context(self.attribute()))
+ }
+ pub async fn list_fields(&self) -> Result<Vec<String>> {
+ let id = self.0.value.expect("can't list root fields");
+ let query = format!("builtins.attrNames sess_field_{id}");
+ self.0
+ .session
+ .0
+ .lock()
+ .await
+ .execute_expression_to_json(&query)
+ .await
+ .map_err(|e| e.context(self.attribute()))
+ }
+ pub async fn type_of(&self) -> Result<String> {
+ let id = self.0.value.expect("can't list root fields");
+ let query = format!("builtins.typeOf sess_field_{id}");
+ self.0
+ .session
+ .0
+ .lock()
+ .await
+ .execute_expression_to_json(&query)
+ .await
+ .map_err(|e| e.context(self.attribute()))
+ }
+ #[allow(dead_code)]
+ pub async fn import(&self) -> Result<Self> {
+ let import = Self::new(self.0.session.clone(), "import").await?;
+ Ok(nix_go!(self | import))
+ }
+ pub async fn build(&self) -> Result<HashMap<String, PathBuf>> {
+ let id = self.0.value.expect("can't use build on not-value");
+ let query = format!(":b sess_field_{id}");
+ let vid = self
+ .0
+ .session
+ .0
+ .lock()
+ .await
+ .execute_expression_raw(&query, &mut NixHandler::default())
+ .await?;
+ if vid.is_empty() {
+ return Err(Error::BuildFailed {
+ attribute: self.attribute(),
+ error: "build produced no output".to_owned(),
+ });
+ }
+ let Some(vid) = vid.strip_prefix("This derivation produced the following outputs:\n")
+ else {
+ return Err(Error::BuildFailed {
+ attribute: self.attribute(),
+ error: format!("failed to parse output: {vid}"),
+ });
+ };
+ let outputs = vid
+ .split('\n')
+ .filter(|v| !v.is_empty())
+ .map(|v| v.split_once(" -> ").expect("unexpected build output"))
+ .map(|(a, b)| (a.trim_start().to_owned(), PathBuf::from(b)))
+ .collect();
+ Ok(outputs)
+ }
+
+ fn attribute(&self) -> String {
+ if let Some(full_path) = &self.0.full_path {
+ PathDisplay(full_path).to_string()
+ } else {
+ "<root>".to_owned()
+ }
+ }
+
+ pub(crate) fn session(&self) -> NixSession {
+ self.0.session.clone()
+ }
+
+ pub(crate) fn session_field_id(&self) -> u32 {
+ self.0.value.expect("not root")
+ }
+}
+impl Drop for ValueInner {
+ fn drop(&mut self) {
+ if let Some(id) = self.value {
+ if let Ok(mut lock) = self.session.0.try_lock() {
+ lock.free_list.push(id)
+ }
+ // Leaked
+ }
+ }
+}
crates/nixlike/src/lib.rsdiffbeforeafterboth--- a/crates/nixlike/src/lib.rs
+++ b/crates/nixlike/src/lib.rs
@@ -1,5 +1,9 @@
//! Serialization/deserialization for nix subset usable for static configurations
-//! Serialized results from this library are readable by both this library and standard nix tools
+//!
+//! Serialized results from this library are readable by both this library and standard nix tools.
+//! Nix produced output should also be readable by this library, however, you can't write arbitrary nix
+//! expressions and expect it to work, only basic primitives are supported, and there is no
+//! variables/recursive records, interpolation, e.t.c.
use linked_hash_map::LinkedHashMap;
use peg::str::LineCol;
@@ -198,9 +202,15 @@
#[test]
fn parse_multiline() {
+ // First line is ignored, unless there is a significant characters.
assert_eq!(nixlike::multiline_string("''\n''").expect("parse"), "");
+ // Rest of the lines are processed normally.
assert_eq!(nixlike::multiline_string("''\n\n''").expect("parse"), "\n");
+ // Example with significant character on first line.
assert_eq!(nixlike::multiline_string("''t\n''").expect("parse"), "t\n");
+ // There might be nothing in multiline string block.
assert_eq!(nixlike::multiline_string("''''").expect("parse"), "");
+ // And there also might just be spaces, they are removed due to dedent, and output is empty because
+ // first line was also ignored due to missing significant characters.
assert_eq!(nixlike::multiline_string("'' ''").expect("parse"), "");
}
flake.lockdiffbeforeafterboth--- a/flake.lock
+++ b/flake.lock
@@ -7,11 +7,11 @@
]
},
"locked": {
- "lastModified": 1715274763,
- "narHash": "sha256-3Iv1PGHJn9sV3HO4FlOVaaztOxa9uGLfOmUWrH7v7+A=",
+ "lastModified": 1716569590,
+ "narHash": "sha256-5eDbq8TuXFGGO3mqJFzhUbt5zHVTf5zilQoyW5jnJwo=",
"owner": "ipetkov",
"repo": "crane",
- "rev": "27025ab71bdca30e7ed0a16c88fd74c5970fc7f5",
+ "rev": "109987da061a1bf452f435f1653c47511587d919",
"type": "github"
},
"original": {
@@ -40,11 +40,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1715619775,
- "narHash": "sha256-c1XVqTH9IeUukc4LcWLzHCSpMfo4Dj4K8t/kLV3c80c=",
+ "lastModified": 1716658583,
+ "narHash": "sha256-A93mYmlLvCz0YjQiQ5Tc3DpLrP6Brs+gAlK9nlnSOVg=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "0cb78770f66945bb3130f762aef05373e283f2b9",
+ "rev": "3e280884c0b0e8222ec6b05a99db01505964e1c3",
"type": "github"
},
"original": {
@@ -54,11 +54,28 @@
"type": "github"
}
},
+ "nixpkgs-stable-for-tests": {
+ "locked": {
+ "lastModified": 1716361217,
+ "narHash": "sha256-mzZDr00WUiUXVm1ujBVv6A0qRd8okaITyUp4ezYRgc4=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "46397778ef1f73414b03ed553a3368f0e7e33c2f",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-23.11",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
"root": {
"inputs": {
"crane": "crane",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
+ "nixpkgs-stable-for-tests": "nixpkgs-stable-for-tests",
"rust-overlay": "rust-overlay"
}
},
@@ -72,11 +89,11 @@
]
},
"locked": {
- "lastModified": 1715566659,
- "narHash": "sha256-OpI0TnN+uE0vvxjPStlTzf5RTohIXVSMwrP9NEgMtaY=",
+ "lastModified": 1716603336,
+ "narHash": "sha256-81u/zd7V+XRTq88zwRLxw5GnwZyEiAvGA2BvAXUe864=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "6c465248316cd31502c82f81f1a3acf2d621b01c",
+ "rev": "4d0f1e4d5d65c23cdbb77e4b0d91940be7309bd4",
"type": "github"
},
"original": {
flake.nixdiffbeforeafterboth--- a/flake.nix
+++ b/flake.nix
@@ -3,6 +3,7 @@
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/master";
+ nixpkgs-stable-for-tests.url = "github:nixos/nixpkgs/nixos-23.11";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs = {
@@ -21,6 +22,7 @@
rust-overlay,
flake-utils,
nixpkgs,
+ nixpkgs-stable-for-tests,
crane,
}:
with nixpkgs.lib;
@@ -37,11 +39,37 @@
rust = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
craneLib = (crane.mkLib pkgs).overrideToolchain rust;
in {
- packages = import ./pkgs {
- inherit (pkgs) callPackage;
- inherit craneLib;
- };
- devShell = craneLib.devShell {
+ packages = let
+ packages = import ./pkgs {
+ inherit (pkgs) callPackage;
+ inherit craneLib;
+ };
+ in
+ packages // {default = packages.fleet;};
+
+ checks = let
+ packages = import ./pkgs {
+ inherit (pkgs) callPackage;
+ craneLib = crane.mkLib (import nixpkgs {inherit system;});
+ };
+ packages-with-nixpkgs-stable = import ./pkgs {
+ inherit (pkgs) callPackage;
+ craneLib = crane.mkLib (import nixpkgs-stable-for-tests {inherit system;});
+ };
+ prefixAttrs = prefix: attrs:
+ nixpkgs.lib.attrsets.mapAttrs' (name: value: {
+ name = "${prefix}${name}";
+ value = value.overrideAttrs (prev: {
+ pname = "${prefix}${prev.pname}";
+ });
+ })
+ attrs;
+ in
+ # `fleet` crate wants nightly rust, also little sense of supporting it on stable nixpkgs.
+ (prefixAttrs "nixpkgs-" (removeAttrs packages ["fleet"]))
+ // (prefixAttrs "nixpkgs-stable-" (removeAttrs packages-with-nixpkgs-stable ["fleet"]));
+
+ devShells.default = craneLib.devShell {
nativeBuildInputs = with pkgs; [
alejandra
lld
nixos/fleetPkgs.nixdiffbeforeafterboth--- a/nixos/fleetPkgs.nix
+++ /dev/null
@@ -1,24 +0,0 @@
-{...}: {
- nixpkgs.overlays = [
- # Not using craneLib here, because we don't want to have two different rust versions for some platforms.
- (final: prev: {
- fleet-install-secrets = prev.callPackage ({rustPlatform}:
- rustPlatform.buildRustPackage rec {
- pname = "fleet-install-secrets";
- name = "${pname}";
-
- src = ../.;
- strictDeps = true;
-
- buildAndTestSubdir = "cmds/install-secrets";
-
- cargoLock = {
- lockFile = ../Cargo.lock;
- outputHashes = {
- "alejandra-3.0.0" = "sha256-q2oTMen8E1YUbNyU4chPOj728/YR0RzdpN+bNjZX2QU=";
- };
- };
- }) {};
- })
- ];
-}
pkgs/default.nixdiffbeforeafterboth--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -1,9 +1,7 @@
{
callPackage,
craneLib,
-}: rec {
- default = fleet;
-
+}: {
fleet-install-secrets = callPackage ./fleet-install-secrets.nix {inherit craneLib;};
fleet = callPackage ./fleet.nix {inherit craneLib;};
}
pkgs/generator-helper.nixdiffbeforeafterboth--- /dev/null
+++ b/pkgs/generator-helper.nix
@@ -0,0 +1,14 @@
+
+{craneLib}:
+craneLib.buildPackage rec {
+ pname = "fleet-generator-helper";
+
+ src = craneLib.cleanCargoSource (craneLib.path ../.);
+ strictDeps = true;
+
+ cargoExtraArgs = "--locked -p ${pname}";
+
+ postInstall = ''
+ mv bin/${pname} bin/genhelper
+ '';
+}
rust-toolchain.tomldiffbeforeafterboth--- a/rust-toolchain.toml
+++ b/rust-toolchain.toml
@@ -1,3 +1,3 @@
[toolchain]
-channel = "nightly-2024-02-10"
+channel = "nightly-2024-05-01"
components = ["rustfmt", "clippy", "rust-analyzer", "rust-src"]