├── .gitignore ├── src ├── lib.rs ├── dotcrate │ └── deser.rs ├── dotcrate.rs ├── publish.rs └── index.rs ├── tests ├── via-cargo.rs ├── util │ └── mod.rs └── proptest.rs ├── .github ├── codecov.yml ├── dependabot.yml └── workflows │ ├── scheduled.yml │ ├── check.yml │ └── test.yml ├── LICENSE-MIT ├── README.md ├── Cargo.toml ├── LICENSE-APACHE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /.cargo/ 2 | /target 3 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod dotcrate; 2 | pub mod index; 3 | pub mod publish; 4 | -------------------------------------------------------------------------------- /tests/via-cargo.rs: -------------------------------------------------------------------------------- 1 | mod util; 2 | use util::roundtrip; 3 | 4 | #[test] 5 | fn roundtrip_simplest() { 6 | roundtrip(|_| {}, |_, _, _| {}); 7 | } 8 | -------------------------------------------------------------------------------- /.github/codecov.yml: -------------------------------------------------------------------------------- 1 | # ref: https://docs.codecov.com/docs/codecovyml-reference 2 | coverage: 3 | # Hold ourselves to a high bar 4 | range: 85..100 5 | round: down 6 | precision: 1 7 | status: 8 | # ref: https://docs.codecov.com/docs/commit-status 9 | project: 10 | default: 11 | # Avoid false negatives 12 | threshold: 1% 13 | 14 | # Test files aren't important for coverage 15 | ignore: 16 | - "tests" 17 | 18 | # Make comments less noisy 19 | comment: 20 | layout: "files" 21 | require_changes: yes 22 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: / 5 | schedule: 6 | interval: daily 7 | - package-ecosystem: cargo 8 | directory: / 9 | schedule: 10 | interval: daily 11 | ignore: 12 | - dependency-name: "*" 13 | # patch and minor updates don't matter for libraries 14 | # remove this ignore rule if your package has binaries 15 | update-types: 16 | - "version-update:semver-patch" 17 | - "version-update:semver-minor" 18 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Jon Gjengset 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Crates.io](https://img.shields.io/crates/v/cargo-index-transit.svg)](https://crates.io/crates/cargo-index-transit) 2 | [![Documentation](https://docs.rs/cargo-index-transit/badge.svg)](https://docs.rs/cargo-index-transit/) 3 | [![Codecov](https://codecov.io/github/jonhoo/cargo-index-transit/coverage.svg?branch=main)](https://codecov.io/gh/jonhoo/cargo-index-transit) 4 | [![Dependency status](https://deps.rs/repo/github/jonhoo/cargo-index-transit/status.svg)](https://deps.rs/repo/github/jonhoo/cargo-index-transit) 5 | 6 | Development stream: https://youtu.be/zGS-HqcAvA4 7 | 8 | ## License 9 | 10 | Licensed under either of 11 | 12 | * Apache License, Version 2.0 13 | ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) 14 | * MIT license 15 | ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) 16 | 17 | at your option. 18 | 19 | ## Contribution 20 | 21 | Unless you explicitly state otherwise, any contribution intentionally submitted 22 | for inclusion in the work by you, as defined in the Apache-2.0 license, shall be 23 | dual licensed as above, without any additional terms or conditions. 24 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cargo-index-transit" 3 | version = "0.1.1" 4 | edition = "2021" 5 | license = "MIT OR Apache-2.0" 6 | description = "A package for common types for Cargo index interactions, and conversion between them." 7 | repository = "https://github.com/jonhoo/cargo-index-transit.git" 8 | 9 | [dependencies] 10 | hex = { version = "0.4.3", features = ["serde"] } 11 | semver = { version = "1.0.16", features = ["serde"] } 12 | serde = { version = "1.0.152", features = ["derive", "rc"] } 13 | 14 | [dev-dependencies] 15 | # for rust 1.x, cargo version is 0.(x+1) 16 | cargo = "0.70" 17 | crates-io = "0.35" 18 | crates-index = "3.0" 19 | tempfile = "3.3.0" 20 | flate2 = "1.0.25" 21 | tar = "0.4.38" 22 | toml_edit = { version = "0.19", features = ["serde"] } 23 | serde_json = "1" 24 | proptest = "1.1.0" 25 | 26 | # for -Zminimal-versions 27 | openssl = "0.10.38" 28 | crossbeam-channel = "0.3.9" 29 | pkg-config = "0.3.16" 30 | hkdf = "0.12.3" 31 | p384 = "0.11.2" 32 | 33 | [patch.crates-io] 34 | # https://github.com/rust-lang/cargo/pull/11700 35 | # Remove once `cargo` for Rust 1.69 is released (2023-04-20) 36 | cargo = { git = "https://github.com/rust-lang/cargo.git", rev = "b008a8dccaf5e79b31c666f6313fb27d1ea874ff" } 37 | -------------------------------------------------------------------------------- /src/dotcrate/deser.rs: -------------------------------------------------------------------------------- 1 | use serde::{de, Deserialize, Serialize}; 2 | use std::fmt; 3 | 4 | #[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)] 5 | #[serde(untagged, expecting = "expected a boolean or a string")] 6 | pub enum StringOrBool { 7 | String(String), 8 | Bool(bool), 9 | } 10 | 11 | pub(super) fn version_trim_whitespace<'de, D>(deserializer: D) -> Result 12 | where 13 | D: de::Deserializer<'de>, 14 | { 15 | struct Visitor; 16 | 17 | impl<'de> de::Visitor<'de> for Visitor { 18 | type Value = semver::Version; 19 | 20 | fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { 21 | formatter.write_str("SemVer version") 22 | } 23 | 24 | fn visit_str(self, string: &str) -> Result 25 | where 26 | E: de::Error, 27 | { 28 | match string.trim().parse().map_err(de::Error::custom) { 29 | Ok(parsed) => Ok(parsed), 30 | Err(e) => Err(e), 31 | } 32 | } 33 | fn visit_borrowed_str(self, string: &str) -> Result 34 | where 35 | E: de::Error, 36 | { 37 | match string.trim().parse().map_err(de::Error::custom) { 38 | Ok(parsed) => Ok(parsed), 39 | Err(e) => Err(e), 40 | } 41 | } 42 | } 43 | 44 | deserializer.deserialize_any(Visitor) 45 | } 46 | -------------------------------------------------------------------------------- /.github/workflows/scheduled.yml: -------------------------------------------------------------------------------- 1 | permissions: 2 | contents: read 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | schedule: 8 | - cron: '7 7 * * *' 9 | # Spend CI time only on latest ref: https://github.com/jonhoo/rust-ci-conf/pull/5 10 | concurrency: 11 | group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} 12 | cancel-in-progress: true 13 | name: rolling 14 | jobs: 15 | # https://twitter.com/mycoliza/status/1571295690063753218 16 | nightly: 17 | runs-on: ubuntu-latest 18 | name: ubuntu / nightly 19 | steps: 20 | - uses: actions/checkout@v4 21 | with: 22 | submodules: true 23 | - name: Install nightly 24 | uses: dtolnay/rust-toolchain@nightly 25 | - name: cargo generate-lockfile 26 | if: hashFiles('Cargo.lock') == '' 27 | run: cargo generate-lockfile 28 | - name: cargo test --locked 29 | run: cargo test --locked --all-features --all-targets 30 | # https://twitter.com/alcuadrado/status/1571291687837732873 31 | update: 32 | runs-on: ubuntu-latest 33 | name: ubuntu / beta / updated 34 | # There's no point running this if no Cargo.lock was checked in in the 35 | # first place, since we'd just redo what happened in the regular test job. 36 | # Unfortunately, hashFiles only works in if on steps, so we reepeat it. 37 | # if: hashFiles('Cargo.lock') != '' 38 | steps: 39 | - uses: actions/checkout@v4 40 | with: 41 | submodules: true 42 | - name: Install beta 43 | if: hashFiles('Cargo.lock') != '' 44 | uses: dtolnay/rust-toolchain@beta 45 | - name: cargo update 46 | if: hashFiles('Cargo.lock') != '' 47 | run: cargo update 48 | - name: cargo test 49 | if: hashFiles('Cargo.lock') != '' 50 | run: cargo test --locked --all-features --all-targets 51 | env: 52 | RUSTFLAGS: -D deprecated 53 | -------------------------------------------------------------------------------- /.github/workflows/check.yml: -------------------------------------------------------------------------------- 1 | permissions: 2 | contents: read 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | # Spend CI time only on latest ref: https://github.com/jonhoo/rust-ci-conf/pull/5 8 | concurrency: 9 | group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} 10 | cancel-in-progress: true 11 | name: check 12 | jobs: 13 | fmt: 14 | runs-on: ubuntu-latest 15 | name: stable / fmt 16 | steps: 17 | - uses: actions/checkout@v4 18 | with: 19 | submodules: true 20 | - name: Install stable 21 | uses: dtolnay/rust-toolchain@stable 22 | with: 23 | components: rustfmt 24 | - name: cargo fmt --check 25 | run: cargo fmt --check 26 | clippy: 27 | runs-on: ubuntu-latest 28 | name: ${{ matrix.toolchain }} / clippy 29 | permissions: 30 | contents: read 31 | checks: write 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | toolchain: [stable, beta] 36 | steps: 37 | - uses: actions/checkout@v4 38 | with: 39 | submodules: true 40 | - name: Install ${{ matrix.toolchain }} 41 | uses: dtolnay/rust-toolchain@master 42 | with: 43 | toolchain: ${{ matrix.toolchain }} 44 | components: clippy 45 | - name: cargo clippy 46 | uses: actions-rs/clippy-check@v1 47 | with: 48 | token: ${{ secrets.GITHUB_TOKEN }} 49 | doc: 50 | runs-on: ubuntu-latest 51 | name: nightly / doc 52 | steps: 53 | - uses: actions/checkout@v4 54 | with: 55 | submodules: true 56 | - name: Install nightly 57 | uses: dtolnay/rust-toolchain@nightly 58 | - name: cargo doc 59 | run: cargo doc --no-deps --all-features 60 | env: 61 | RUSTDOCFLAGS: --cfg docsrs 62 | hack: 63 | runs-on: ubuntu-latest 64 | name: ubuntu / stable / features 65 | steps: 66 | - uses: actions/checkout@v4 67 | with: 68 | submodules: true 69 | - name: Install stable 70 | uses: dtolnay/rust-toolchain@stable 71 | - name: cargo install cargo-hack 72 | uses: taiki-e/install-action@cargo-hack 73 | # intentionally no target specifier; see https://github.com/jonhoo/rust-ci-conf/pull/4 74 | - name: cargo hack 75 | run: cargo hack --feature-powerset check 76 | msrv: 77 | runs-on: ubuntu-latest 78 | # we use a matrix here just because env can't be used in job names 79 | # https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability 80 | strategy: 81 | matrix: 82 | msrv: ["1.60.0"] # crates-index 83 | name: ubuntu / ${{ matrix.msrv }} 84 | steps: 85 | - uses: actions/checkout@v4 86 | with: 87 | submodules: true 88 | - name: Install ${{ matrix.msrv }} 89 | uses: dtolnay/rust-toolchain@master 90 | with: 91 | toolchain: ${{ matrix.msrv }} 92 | - name: cargo +${{ matrix.msrv }} check 93 | run: cargo check 94 | -------------------------------------------------------------------------------- /src/dotcrate.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use std::collections::BTreeMap; 3 | 4 | mod deser; 5 | pub use deser::StringOrBool; 6 | use deser::*; 7 | 8 | /// A `Cargo.toml` manifest from or for a `.crate` file. 9 | // NOTE: This doesn't use borrowing deserialization because toml_edit doesn't support it. 10 | #[derive(Debug, Clone, Deserialize, Serialize)] 11 | #[serde(rename_all = "kebab-case")] 12 | pub struct NormalizedManifest 13 | where 14 | Feature: Ord, 15 | { 16 | pub package: Package, 17 | #[serde(skip_serializing_if = "Option::is_none")] 18 | pub dependencies: Option>>, 19 | #[serde(alias = "dev_dependencies")] 20 | #[serde(skip_serializing_if = "Option::is_none")] 21 | pub dev_dependencies: Option>>, 22 | #[serde(alias = "build_dependencies")] 23 | #[serde(skip_serializing_if = "Option::is_none")] 24 | pub build_dependencies: Option>>, 25 | #[serde(skip_serializing_if = "Option::is_none")] 26 | pub features: Option>>, 27 | } 28 | 29 | impl NormalizedManifest 30 | where 31 | Feature: Ord, 32 | { 33 | pub(crate) fn take_dependencies( 34 | &mut self, 35 | ) -> impl Iterator, super::publish::DependencyKind)> { 36 | self.dependencies 37 | .take() 38 | .unwrap_or_default() 39 | .into_iter() 40 | .map(|d| (d, super::publish::DependencyKind::Normal)) 41 | .chain( 42 | self.dev_dependencies 43 | .take() 44 | .unwrap_or_default() 45 | .into_iter() 46 | .map(|d| (d, super::publish::DependencyKind::Dev)), 47 | ) 48 | .chain( 49 | self.build_dependencies 50 | .take() 51 | .unwrap_or_default() 52 | .into_iter() 53 | .map(|d| (d, super::publish::DependencyKind::Build)), 54 | ) 55 | .map(|((name_in_toml, d), kind)| (name_in_toml, d, kind)) 56 | } 57 | } 58 | 59 | #[derive(Deserialize, Serialize, Clone, Debug)] 60 | #[serde(rename_all = "kebab-case")] 61 | pub struct Dependency { 62 | pub version: semver::VersionReq, 63 | #[serde(skip_serializing_if = "Option::is_none")] 64 | pub registry_index: Option, 65 | #[serde(skip_serializing_if = "Option::is_none")] 66 | pub features: Option>, 67 | #[serde(skip_serializing_if = "Option::is_none")] 68 | pub optional: Option, 69 | #[serde(skip_serializing_if = "Option::is_none")] 70 | pub public: Option, 71 | #[serde(alias = "default_features")] 72 | #[serde(skip_serializing_if = "Option::is_none")] 73 | pub default_features: Option, 74 | #[serde(skip_serializing_if = "Option::is_none")] 75 | pub package: Option, 76 | 77 | /// A platform name, like `x86_64-apple-darwin` 78 | #[serde(skip_serializing_if = "Option::is_none")] 79 | pub target: Option, 80 | } 81 | 82 | /// Represents the `package`/`project` sections of a `Cargo.toml`. 83 | /// 84 | /// Note that the order of the fields matters, since this is the order they 85 | /// are serialized to a TOML file. For example, you cannot have values after 86 | /// the field `metadata`, since it is a table and values cannot appear after 87 | /// tables. 88 | #[derive(Deserialize, Serialize, Clone, Debug)] 89 | #[serde(rename_all = "kebab-case")] 90 | pub struct Package { 91 | pub rust_version: Option, 92 | pub name: Name, 93 | #[serde(deserialize_with = "version_trim_whitespace")] 94 | pub version: semver::Version, 95 | pub links: Option, 96 | 97 | // Package metadata. 98 | pub authors: Option>, 99 | pub description: Option, 100 | pub homepage: Option, 101 | pub documentation: Option, 102 | pub readme: Option, 103 | pub keywords: Option>, 104 | pub categories: Option>, 105 | pub license: Option, 106 | pub license_file: Option, 107 | pub repository: Option, 108 | } 109 | -------------------------------------------------------------------------------- /tests/util/mod.rs: -------------------------------------------------------------------------------- 1 | use cargo::core::Shell; 2 | use cargo::ops::NewProjectKind; 3 | use cargo_index_transit as cit; 4 | use flate2::read::GzDecoder; 5 | use std::borrow::Cow; 6 | use std::io::Read; 7 | use std::path::Path; 8 | 9 | #[allow(dead_code)] 10 | pub fn roundtrip( 11 | setup: impl FnOnce(&Path), 12 | check: impl FnOnce( 13 | &cit::dotcrate::NormalizedManifest, 14 | &cit::publish::CrateVersion<'_>, 15 | &cit::index::Entry< 16 | Cow<'_, str>, 17 | semver::Version, 18 | semver::VersionReq, 19 | Cow<'_, str>, 20 | Cow<'_, str>, 21 | Cow<'_, str>, 22 | >, 23 | ), 24 | ) { 25 | let d = tempfile::tempdir().unwrap(); 26 | let mut config = cargo::Config::new( 27 | Shell::from_write(Box::new(Vec::new())), 28 | d.path().to_path_buf(), 29 | d.path().join("cargo-home"), 30 | ); 31 | config 32 | .configure(0, false, None, false, false, false, &None, &[], &[]) 33 | .unwrap(); 34 | 35 | let package = d.path().join("roundtrip"); 36 | 37 | cargo::ops::new( 38 | &cargo::ops::NewOptions { 39 | version_control: None, 40 | kind: NewProjectKind::Lib, 41 | auto_detect_kind: false, 42 | path: package.clone(), 43 | name: None, 44 | edition: None, 45 | registry: None, 46 | }, 47 | &config, 48 | ) 49 | .unwrap(); 50 | 51 | setup(&package); 52 | 53 | let ws = cargo::core::Workspace::new(&package.join("Cargo.toml"), &config).unwrap(); 54 | 55 | let tarball = cargo::ops::package_one( 56 | &ws, 57 | ws.current().unwrap(), 58 | &cargo::ops::PackageOpts { 59 | config: &config, 60 | list: false, 61 | check_metadata: false, 62 | allow_dirty: true, 63 | verify: false, 64 | jobs: None, 65 | keep_going: false, 66 | to_package: cargo::ops::Packages::Default, 67 | targets: Vec::new(), 68 | cli_features: cargo::core::resolver::CliFeatures::new_all(false), 69 | }, 70 | ) 71 | .unwrap() 72 | .unwrap(); 73 | 74 | let decoder = GzDecoder::new(tarball.file()); 75 | let mut archive = tar::Archive::new(decoder); 76 | 77 | for entry in archive.entries().unwrap() { 78 | let mut entry = entry.unwrap(); 79 | let path = entry.path().unwrap(); 80 | 81 | if path.ends_with("Cargo.toml") { 82 | let mut manifest = String::new(); 83 | entry.read_to_string(&mut manifest).unwrap(); 84 | 85 | let m: cit::dotcrate::NormalizedManifest = 86 | toml_edit::de::from_str(&manifest).unwrap(); 87 | 88 | let repo = "https://github.com/rust-lang/crates.io-index"; 89 | let p: cit::publish::CrateVersion<'_> = 90 | cit::publish::CrateVersion::new(m.clone(), (None, None), repo); 91 | let json = serde_json::to_string(&p).unwrap(); 92 | let p2: crates_io::NewCrate = serde_json::from_str(&json).unwrap(); 93 | let json = serde_json::to_string(&p2).unwrap(); 94 | let p3: cit::publish::CrateVersion<'_> = serde_json::from_str(&json).unwrap(); 95 | assert_eq!(p, p3); 96 | 97 | let i0 = cit::index::Entry::from_manifest(m.clone(), repo, [0; 32]); 98 | let i = cit::index::Entry::from_publish(p.clone(), [0; 32]); 99 | assert_eq!(i, i0); 100 | let json = serde_json::to_string(&i).unwrap(); 101 | let _: cargo::sources::registry::RegistryPackage = serde_json::from_str(&json).unwrap(); 102 | let i2: crates_index::Version = serde_json::from_str(&json).unwrap(); 103 | let json = serde_json::to_string(&i2).unwrap(); 104 | let mut i3: cit::index::Entry<_, _, _, _, _, _> = serde_json::from_str(&json).unwrap(); 105 | // crates_index::Version doesn't preserve schema version 106 | if i.schema_version.is_some() { 107 | i3.schema_version = i.schema_version; 108 | } 109 | assert_eq!(i, i3); 110 | 111 | assert_eq!(i.name, "roundtrip"); 112 | assert_eq!(i.version, semver::Version::new(0, 1, 0)); 113 | 114 | check(&m, &p, &i); 115 | 116 | break; 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | permissions: 2 | contents: read 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | # Spend CI time only on latest ref: https://github.com/jonhoo/rust-ci-conf/pull/5 8 | concurrency: 9 | group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} 10 | cancel-in-progress: true 11 | name: test 12 | jobs: 13 | required: 14 | runs-on: ubuntu-latest 15 | name: ubuntu / ${{ matrix.toolchain }} 16 | strategy: 17 | matrix: 18 | toolchain: [stable, beta] 19 | steps: 20 | - uses: actions/checkout@v4 21 | with: 22 | submodules: true 23 | - name: Install ${{ matrix.toolchain }} 24 | uses: dtolnay/rust-toolchain@master 25 | with: 26 | toolchain: ${{ matrix.toolchain }} 27 | - name: cargo generate-lockfile 28 | if: hashFiles('Cargo.lock') == '' 29 | run: cargo generate-lockfile 30 | - name: Restore cached target/ 31 | id: target-cache-restore 32 | uses: actions/cache/restore@v4 33 | with: 34 | path: | 35 | target 36 | /home/runner/.cargo 37 | key: ${{ matrix.toolchain }}-target 38 | # https://twitter.com/jonhoo/status/1571290371124260865 39 | - name: cargo test --locked 40 | run: cargo test --locked --all-features --all-targets 41 | # https://github.com/rust-lang/cargo/issues/6669 42 | - name: cargo test --doc 43 | run: cargo test --locked --all-features --doc 44 | - name: Save cached target/ 45 | id: target-cache-save 46 | uses: actions/cache/save@v4 47 | with: 48 | path: | 49 | target 50 | /home/runner/.cargo 51 | key: ${{ steps.target-cache-restore.outputs.cache-primary-key }} 52 | proptest: 53 | runs-on: ubuntu-latest 54 | name: ubuntu / stable 55 | needs: required 56 | steps: 57 | - uses: actions/checkout@v3 58 | with: 59 | submodules: true 60 | - name: Install stable 61 | uses: dtolnay/rust-toolchain@stable 62 | - name: Restore cached target/ 63 | uses: actions/cache/restore@v4 64 | with: 65 | path: | 66 | target 67 | /home/runner/.cargo 68 | key: stable-target 69 | - name: cargo test --test proptest --locked -- --ignored 70 | run: cargo test --locked --test proptest -- --ignored 71 | minimal: 72 | runs-on: ubuntu-latest 73 | name: ubuntu / stable / minimal-versions 74 | steps: 75 | - uses: actions/checkout@v4 76 | with: 77 | submodules: true 78 | - name: Install stable 79 | uses: dtolnay/rust-toolchain@stable 80 | - name: Install nightly for -Zminimal-versions 81 | uses: dtolnay/rust-toolchain@nightly 82 | - name: rustup default stable 83 | run: rustup default stable 84 | - name: cargo update -Zminimal-versions 85 | run: cargo +nightly update -Zminimal-versions 86 | - name: cargo test 87 | run: cargo test --locked --all-features --all-targets 88 | os-check: 89 | runs-on: ${{ matrix.os }} 90 | name: ${{ matrix.os }} / stable 91 | strategy: 92 | fail-fast: false 93 | matrix: 94 | os: [macos-latest, windows-latest] 95 | steps: 96 | - run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append 97 | if: runner.os == 'Windows' 98 | - run: vcpkg install openssl:x64-windows-static-md 99 | if: runner.os == 'Windows' 100 | - uses: actions/checkout@v4 101 | with: 102 | submodules: true 103 | - name: Install stable 104 | uses: dtolnay/rust-toolchain@stable 105 | - name: cargo generate-lockfile 106 | if: hashFiles('Cargo.lock') == '' 107 | run: cargo generate-lockfile 108 | - name: cargo test 109 | run: cargo test --locked --all-features --all-targets 110 | coverage: 111 | runs-on: ubuntu-latest 112 | name: ubuntu / stable / coverage 113 | steps: 114 | - uses: actions/checkout@v4 115 | with: 116 | submodules: true 117 | - name: Install stable 118 | uses: dtolnay/rust-toolchain@stable 119 | with: 120 | components: llvm-tools-preview 121 | - name: cargo install cargo-llvm-cov 122 | uses: taiki-e/install-action@cargo-llvm-cov 123 | - name: cargo generate-lockfile 124 | if: hashFiles('Cargo.lock') == '' 125 | run: cargo generate-lockfile 126 | - name: Restore cached target/ 127 | id: target-cache-restore 128 | uses: actions/cache/restore@v4 129 | with: 130 | path: | 131 | target 132 | /home/runner/.cargo 133 | key: coverage-target 134 | - name: cargo llvm-cov clean 135 | run: cargo llvm-cov clean --workspace 136 | - name: cargo llvm-cov 137 | run: cargo llvm-cov --locked --all-features --no-report --release 138 | - name: cargo llvm-cov proptest 139 | run: cargo llvm-cov --locked --all-features --no-report --release --test proptest -- --ignored 140 | - name: Save cached target/ 141 | id: target-cache-save 142 | uses: actions/cache/save@v4 143 | with: 144 | path: | 145 | target 146 | /home/runner/.cargo 147 | key: ${{ steps.target-cache-restore.outputs.cache-primary-key }} 148 | - name: cargo llvm-cov report 149 | run: cargo llvm-cov report --release --lcov --output-path lcov.info 150 | - name: Upload to codecov.io 151 | uses: codecov/codecov-action@v3 152 | with: 153 | fail_ci_if_error: true 154 | -------------------------------------------------------------------------------- /src/publish.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use std::{borrow::Cow, collections::BTreeMap}; 3 | 4 | /// Section in which this dependency was defined 5 | #[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)] 6 | #[serde(rename_all = "lowercase")] 7 | pub enum DependencyKind { 8 | /// Used at run time 9 | Normal, 10 | /// Used at build time, not available at run time 11 | Build, 12 | /// Not fetched and not used, except for when used direclty in a workspace 13 | Dev, 14 | } 15 | 16 | #[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] 17 | pub struct CrateVersion<'a> { 18 | #[serde(borrow)] 19 | pub name: Cow<'a, str>, 20 | // cargo has this as string 21 | #[serde(rename = "vers")] 22 | pub version: semver::Version, 23 | #[serde(borrow)] 24 | #[serde(rename = "deps")] 25 | pub dependencies: Vec>, 26 | #[serde(borrow)] 27 | pub features: BTreeMap, Vec>>, 28 | #[serde(borrow)] 29 | pub authors: Vec>, 30 | #[serde(borrow)] 31 | pub description: Option>, 32 | #[serde(borrow)] 33 | pub documentation: Option>, 34 | #[serde(borrow)] 35 | pub homepage: Option>, 36 | #[serde(borrow)] 37 | pub readme: Option>, 38 | #[serde(borrow)] 39 | pub readme_file: Option>, 40 | #[serde(borrow)] 41 | pub keywords: Vec>, 42 | #[serde(borrow)] 43 | pub categories: Vec>, 44 | #[serde(borrow)] 45 | pub license: Option>, 46 | #[serde(borrow)] 47 | pub license_file: Option>, 48 | #[serde(borrow)] 49 | pub repository: Option>, 50 | #[serde(borrow)] 51 | #[serde(skip_serializing_if = "Option::is_none")] 52 | pub links: Option>, 53 | 54 | #[serde(default)] 55 | badges: BTreeMap, 56 | } 57 | 58 | impl<'a> CrateVersion<'a> { 59 | pub fn new( 60 | mut m: super::dotcrate::NormalizedManifest, 61 | (readme, readme_contents): (Option>, Option>), 62 | is_for: &'_ str, 63 | ) -> Self 64 | where 65 | Name: Into>, 66 | Feature: Into>, 67 | { 68 | // let (readme, readme_contents) = match m.package.readme { 69 | // Some(StringOrBool::Bool(false)) => (None, None), 70 | // Some(StringOrBool::Bool(true)) => todo!("read README.md"), 71 | // Some(StringOrBool::String(path)) => todo!("read {path}"), 72 | // None => todo!("depends on file contents in .crate"), 73 | // }; 74 | 75 | let deps = m 76 | .take_dependencies() 77 | .map(|(name_in_toml, d, kind)| { 78 | let (explicit_name, name) = match (d.package, name_in_toml) { 79 | (Some(p), n) => { 80 | // explicit_name = { package = name } 81 | (Some(n.into()), Cow::Owned(p)) 82 | } 83 | (None, n) => { 84 | // explicit_name = { } 85 | (None, n.into()) 86 | } 87 | }; 88 | let is_from = match d.registry_index { 89 | Some(r) => { 90 | // not (necessarily) from crates.io 91 | Cow::Owned(r) 92 | } 93 | None => { 94 | // from crates.io 95 | Cow::Borrowed("https://github.com/rust-lang/crates.io-index") 96 | } 97 | }; 98 | let target_registry_dependent_src_registry = if is_from == is_for { 99 | None 100 | } else { 101 | Some(is_from) 102 | }; 103 | Dependency { 104 | optional: d.optional.unwrap_or(false), 105 | default_features: d.default_features.unwrap_or(true), 106 | name, 107 | features: d 108 | .features 109 | .unwrap_or_default() 110 | .into_iter() 111 | .map(Into::into) 112 | .collect(), 113 | requirements: d.version, 114 | target: d.target.map(Into::into), 115 | kind, 116 | registry: target_registry_dependent_src_registry, 117 | explicit_name_in_toml: explicit_name, 118 | } 119 | }) 120 | .collect(); 121 | 122 | Self { 123 | name: m.package.name.into(), 124 | version: m.package.version, 125 | dependencies: deps, 126 | features: m 127 | .features 128 | .unwrap_or_default() 129 | .into_iter() 130 | .map(|(k, vs)| (k.into(), vs.into_iter().map(Into::into).collect())) 131 | .collect(), 132 | authors: m 133 | .package 134 | .authors 135 | .unwrap_or_default() 136 | .into_iter() 137 | .map(Into::into) 138 | .collect(), 139 | description: m.package.description.map(Into::into), 140 | documentation: m.package.documentation.map(Into::into), 141 | homepage: m.package.homepage.map(Into::into), 142 | readme: readme_contents, 143 | readme_file: readme, 144 | keywords: m 145 | .package 146 | .keywords 147 | .unwrap_or_default() 148 | .into_iter() 149 | .map(Into::into) 150 | .collect(), 151 | categories: m 152 | .package 153 | .categories 154 | .unwrap_or_default() 155 | .into_iter() 156 | .map(Into::into) 157 | .collect(), 158 | license: m.package.license.map(Into::into), 159 | license_file: m.package.license_file.map(Into::into), 160 | repository: m.package.repository.map(Into::into), 161 | links: m.package.links.map(Into::into), 162 | badges: BTreeMap::new(), 163 | } 164 | } 165 | } 166 | 167 | #[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] 168 | pub struct Dependency<'a> { 169 | pub optional: bool, 170 | pub default_features: bool, 171 | #[serde(borrow)] 172 | pub name: Cow<'a, str>, 173 | #[serde(borrow)] 174 | pub features: Vec>, 175 | // cargo and crates-io have this as string 176 | #[serde(rename = "version_req")] 177 | pub requirements: semver::VersionReq, 178 | #[serde(borrow)] 179 | pub target: Option>, 180 | // crates-io has this as option 181 | pub kind: DependencyKind, 182 | #[serde(skip_serializing_if = "Option::is_none")] 183 | #[serde(borrow)] 184 | pub registry: Option>, 185 | #[serde(skip_serializing_if = "Option::is_none")] 186 | #[serde(borrow)] 187 | pub explicit_name_in_toml: Option>, 188 | } 189 | -------------------------------------------------------------------------------- /src/index.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use std::borrow::Cow; 3 | use std::collections::BTreeMap; 4 | use std::fmt::Debug; 5 | use std::sync::Arc; 6 | 7 | /// A single line in the index representing a single version of a package. 8 | #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] 9 | pub struct Entry 10 | where 11 | Feature: Ord, 12 | { 13 | pub name: Name, 14 | #[serde(rename = "vers")] 15 | pub version: Version, 16 | 17 | // These are Arc so that they can be deduplicated easily by calling code if they happen to be 18 | // reading it all of the versions of a single crate at once (as nearby versions often share 19 | // dependency and feature lists). 20 | #[serde(rename = "deps")] 21 | pub dependencies: Arc<[RegistryDependency]>, 22 | 23 | pub features: Arc>>, 24 | 25 | /// This field contains features with new, extended syntax. Specifically, 26 | /// namespaced features (`dep:`) and weak dependencies (`pkg?/feat`). 27 | /// 28 | /// This is separated from `features` because versions older than 1.19 29 | /// will fail to load due to not being able to parse the new syntax, even 30 | /// with a `Cargo.lock` file. 31 | /// 32 | /// It's wrapped in a `Box` to reduce size of the struct when the field is unused (i.e. almost 33 | /// always). 34 | /// 35 | #[serde(default, skip_serializing_if = "Option::is_none")] 36 | pub features2: Option>>>, 37 | 38 | #[serde(with = "hex")] 39 | #[serde(rename = "cksum")] 40 | pub checksum: [u8; 32], 41 | 42 | /// If `true`, Cargo will skip this version when resolving. 43 | #[serde(default)] 44 | pub yanked: bool, 45 | 46 | /// Native library name this package links to. 47 | /// 48 | /// Added early 2018 (see ), 49 | /// can be `None` if published before then. 50 | #[serde(skip_serializing_if = "Option::is_none")] 51 | pub links: Option, 52 | 53 | /// The schema version for this entry. 54 | /// 55 | /// If this is None, it defaults to version 1. Entries with unknown 56 | /// versions are ignored. 57 | /// 58 | /// Version `2` format adds the `features2` field. 59 | /// 60 | /// This provides a method to safely introduce changes to index entries 61 | /// and allow older versions of cargo to ignore newer entries it doesn't 62 | /// understand. This is honored as of 1.51, so unfortunately older 63 | /// versions will ignore it, and potentially misinterpret version 2 and 64 | /// newer entries. 65 | /// 66 | /// The intent is that versions older than 1.51 will work with a 67 | /// pre-existing `Cargo.lock`, but they may not correctly process `cargo 68 | /// update` or build a lock from scratch. In that case, cargo may 69 | /// incorrectly select a new package that uses a new index format. A 70 | /// workaround is to downgrade any packages that are incompatible with the 71 | /// `--precise` flag of `cargo update`. 72 | #[serde(skip_serializing_if = "Option::is_none")] 73 | #[serde(rename = "v")] 74 | pub schema_version: Option, 75 | } 76 | 77 | impl<'a> 78 | Entry< 79 | Cow<'a, str>, 80 | semver::Version, 81 | semver::VersionReq, 82 | Cow<'a, str>, 83 | Cow<'a, str>, 84 | Cow<'a, str>, 85 | > 86 | { 87 | pub fn from_manifest( 88 | v: super::dotcrate::NormalizedManifest, 89 | via_registry: &'_ str, 90 | checksum: [u8; 32], 91 | ) -> Self 92 | where 93 | Name: Into>, 94 | Feature: Into>, 95 | { 96 | let in_registry = super::publish::CrateVersion::new(v, (None, None), via_registry); 97 | Self::from_publish(in_registry, checksum) 98 | } 99 | 100 | pub fn from_publish(v: super::publish::CrateVersion<'a>, checksum: [u8; 32]) -> Self { 101 | let (features, features2): (BTreeMap<_, _>, BTreeMap<_, _>) = 102 | v.features.into_iter().partition(|(_k, vals)| { 103 | !vals 104 | .iter() 105 | .any(|v| v.starts_with("dep:") || v.contains("?/")) 106 | }); 107 | let (features2, schema_version) = if features2.is_empty() { 108 | (None, None) 109 | } else { 110 | (Some(features2), Some(2)) 111 | }; 112 | 113 | Self { 114 | name: v.name, 115 | version: v.version, 116 | dependencies: Arc::from( 117 | v.dependencies 118 | .into_iter() 119 | .map(|d| { 120 | let (name, package) = match (d.name, d.explicit_name_in_toml) { 121 | (p, Some(n)) => (n, Some(Box::new(p))), 122 | (n, None) => (n, None), 123 | }; 124 | RegistryDependency { 125 | name, 126 | kind: Some(d.kind), 127 | requirements: d.requirements, 128 | features: Box::new(d.features.into_boxed_slice()), 129 | optional: d.optional, 130 | default_features: d.default_features, 131 | target: d.target.map(Box::new), 132 | registry: d 133 | .registry 134 | .map(|r| r.into_owned().into_boxed_str()) 135 | .map(Box::new), 136 | package, 137 | public: None, 138 | } 139 | }) 140 | .collect::>() 141 | .into_boxed_slice(), 142 | ), 143 | features: Arc::new(features), 144 | features2: features2.map(Box::new), 145 | checksum, 146 | yanked: false, 147 | links: v.links.map(Into::into), 148 | schema_version, 149 | } 150 | } 151 | } 152 | 153 | /// A dependency as encoded in the index JSON. 154 | #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, PartialOrd, Ord)] 155 | pub struct RegistryDependency { 156 | // In old `cargo` versions the dependency order appears to matter if the same dependency exists 157 | // twice but with different `kind` fields. In those cases the `optional` field can sometimes be 158 | // ignored or misinterpreted. By placing the fields in this order, we ensure that `normal` 159 | // dependencies are always first when multiple with the same `name` exist. 160 | pub name: Name, 161 | 162 | #[serde(skip_serializing_if = "Option::is_none")] 163 | pub kind: Option, 164 | 165 | #[serde(rename = "req")] 166 | pub requirements: Req, 167 | 168 | pub features: Box>, 169 | pub optional: bool, 170 | pub default_features: bool, 171 | #[serde(skip_serializing_if = "Option::is_none")] 172 | pub target: Option>, 173 | #[serde(skip_serializing_if = "Option::is_none")] 174 | pub registry: Option>>, 175 | #[serde(skip_serializing_if = "Option::is_none")] 176 | pub package: Option>, 177 | #[serde(skip_serializing_if = "Option::is_none")] 178 | pub public: Option, 179 | } 180 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright 2023 Jon Gjengset 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /tests/proptest.rs: -------------------------------------------------------------------------------- 1 | use std::{borrow::Cow, collections::HashSet, sync::Arc}; 2 | 3 | use cargo_index_transit::{dotcrate, publish::DependencyKind}; 4 | use proptest::prelude::*; 5 | 6 | mod util; 7 | use util::roundtrip; 8 | 9 | #[derive(Debug, Clone)] 10 | struct Dependency(String, DependencyKind, dotcrate::Dependency); 11 | 12 | #[derive(Debug, Clone, Hash, Eq, PartialEq)] 13 | enum FeatureSpec { 14 | Feature(String), 15 | Dep(String), 16 | Strong(String, String), 17 | Weak(String, String), 18 | } 19 | 20 | prop_compose! { 21 | fn arb_dep_kind()(kind in 0u8..3) -> DependencyKind { 22 | match kind { 23 | 0 => DependencyKind::Normal, 24 | 1 => DependencyKind::Build, 25 | 2 => DependencyKind::Dev, 26 | _ => panic!(), 27 | } 28 | } 29 | } 30 | 31 | fn arb_package() -> impl Strategy> { 32 | prop_oneof![Just(None), "[a-z][a-z0-9_-]{0,2}".prop_map(|s| Some(s))] 33 | } 34 | 35 | fn arb_feature_name() -> impl Strategy + Copy { 36 | "[a-z][a-z0-9_-]?" 37 | } 38 | 39 | fn arb_maybe_dep_feature() -> impl Strategy> { 40 | prop_oneof![ 41 | Just(None), 42 | (arb_feature_name(), any::()).prop_map(|s| Some(s)) 43 | ] 44 | } 45 | 46 | fn arb_dep_feature(deps: Arc<[Dependency]>) -> impl Strategy { 47 | let ndeps = deps.len(); 48 | // Or it can reference a dependency or a feature of a dependency 49 | assert_ne!(ndeps, 0); 50 | (0..ndeps, arb_maybe_dep_feature()).prop_map(move |(i, ft)| match ft { 51 | None => FeatureSpec::Dep(deps[i].0.clone()), 52 | Some((ft, weak)) => { 53 | if weak { 54 | FeatureSpec::Weak(deps[i].0.clone(), ft) 55 | } else { 56 | FeatureSpec::Strong(deps[i].0.clone(), ft) 57 | } 58 | } 59 | }) 60 | } 61 | 62 | fn arb_feature_feature( 63 | base_features: Arc<[String]>, 64 | not: usize, 65 | ) -> impl Strategy { 66 | // A feature spec can reference another feature 67 | assert_ne!(base_features.len() - 1, 0); 68 | (0..(base_features.len() - 1)).prop_map(move |mut i| { 69 | if i >= not { 70 | i += 1; 71 | } 72 | FeatureSpec::Feature(base_features[i].clone()) 73 | }) 74 | } 75 | 76 | fn arb_dep_features() -> impl Strategy>> { 77 | prop_oneof![ 78 | Just(None), 79 | prop::collection::vec(arb_feature_name(), 0..3).prop_map(Some) 80 | ] 81 | } 82 | 83 | prop_compose! { 84 | fn arb_dep_listing()( 85 | package in arb_package(), 86 | version in "([=^<>])?(0|[1-9][0-9]{0,1})(\\.(0|[1-9][0-9]{0,2})){0,2}", 87 | optional in any::>(), 88 | default_features in any::>(), 89 | features in arb_dep_features() 90 | ) -> dotcrate::Dependency { 91 | let req = semver::VersionReq::parse(&version); 92 | let req = req.unwrap(); 93 | 94 | // TODO: cross-registry dependencies 95 | // NOTE: crates-index doesn't support those, so may not work w/ roundtrip. 96 | 97 | dotcrate::Dependency { 98 | version: req, 99 | registry_index: None, 100 | features, 101 | optional, 102 | public: None, 103 | default_features, 104 | package, 105 | target: None, 106 | } 107 | } 108 | } 109 | 110 | prop_compose! { 111 | fn arb_dep()( 112 | name in "[a-z][a-z0-9_-]{0,2}", 113 | kind in arb_dep_kind(), 114 | listing in arb_dep_listing() 115 | ) -> Dependency { 116 | Dependency(name, kind, listing) 117 | } 118 | } 119 | 120 | fn dep_to_toml(dep: &Dependency) -> String { 121 | use std::fmt::Write; 122 | 123 | let mut s = format!(r#""{}" = {{"#, dep.0); 124 | write!(&mut s, r#"version = "{}""#, dep.2.version).unwrap(); 125 | 126 | // optional is only permitted for normal dependencies 127 | if matches!(dep.1, DependencyKind::Normal) { 128 | if let Some(b) = &dep.2.optional { 129 | write!(&mut s, r#", optional = {b}"#).unwrap(); 130 | } 131 | } 132 | if let Some(b) = &dep.2.default_features { 133 | write!(&mut s, r#", default-features = {b}"#).unwrap(); 134 | } 135 | if let Some(p) = &dep.2.package { 136 | write!(&mut s, r#", package = "{p}""#).unwrap(); 137 | } 138 | if let Some(fs) = &dep.2.features { 139 | write!(&mut s, r#", features = ["#).unwrap(); 140 | for fi in 0..fs.len() { 141 | if fi != 0 { 142 | write!(&mut s, r#","#).unwrap(); 143 | } 144 | write!(&mut s, r#""{}""#, fs[fi]).unwrap(); 145 | } 146 | write!(&mut s, r#"]"#).unwrap(); 147 | } 148 | 149 | s.push('}'); 150 | 151 | s 152 | } 153 | 154 | fn arb_deps() -> impl Strategy> { 155 | prop::collection::vec(arb_dep(), 1..4).prop_map(|mut deps| { 156 | // Ignore duplicate entries. 157 | // Ideally we'd express this in the Strategy, but doing so is quite tricky 158 | { 159 | let mut names = HashSet::new(); 160 | deps.retain(|Dependency(name, _, _)| names.insert(name.to_string())); 161 | } 162 | deps 163 | }) 164 | } 165 | 166 | fn arb_base_features() -> impl Strategy> { 167 | prop::collection::vec(arb_feature_name(), 0..3).prop_map(|mut deps| { 168 | // Ignore duplicate features. 169 | // Ideally we'd express this in the Strategy, but doing so is quite tricky 170 | { 171 | let mut names = HashSet::new(); 172 | deps.retain(|name| names.insert(name.to_string())); 173 | } 174 | deps 175 | }) 176 | } 177 | 178 | fn arb_feature_specs( 179 | deps: Vec, 180 | base_features: Vec, 181 | ) -> impl Strategy)>> { 182 | let optional_deps: Arc<[_]> = Arc::from( 183 | deps.into_iter() 184 | .filter(|dep| matches!(dep.1, DependencyKind::Normal) && dep.2.optional == Some(true)) 185 | .collect::>(), 186 | ); 187 | let base_features: Arc<[_]> = Arc::from(base_features.into_boxed_slice()); 188 | (0..base_features.len()) 189 | .map(move |i| { 190 | let spec = match (optional_deps.len(), base_features.len()) { 191 | (0, 0 | 1) => Just(Vec::new()).boxed(), 192 | (0, n) => prop::collection::vec( 193 | arb_feature_feature(Arc::clone(&base_features), i), 194 | 0..(n - 1), 195 | ) 196 | .boxed(), 197 | (_, 0 | 1) => { 198 | prop::collection::vec(arb_dep_feature(Arc::clone(&optional_deps)), 0..2).boxed() 199 | } 200 | _ => prop::collection::vec( 201 | prop_oneof![ 202 | arb_feature_feature(Arc::clone(&base_features), i), 203 | arb_dep_feature(Arc::clone(&optional_deps)) 204 | ], 205 | 0..2, 206 | ) 207 | .boxed(), 208 | }; 209 | ( 210 | Just(base_features[i].clone()), 211 | spec.prop_map(|fs| { 212 | // Avoid duplicate feature dependencies 213 | fs.into_iter() 214 | .collect::>() 215 | .into_iter() 216 | .collect::>() 217 | }), 218 | ) 219 | }) 220 | .collect::>() 221 | } 222 | 223 | prop_compose! { 224 | fn arb_spec()( 225 | deps in arb_deps(), 226 | base_features in arb_base_features(), 227 | )( 228 | specs in arb_feature_specs(deps.clone(), base_features), 229 | deps in Just(deps) 230 | ) -> (Vec, Vec<(String, Vec)>) { 231 | (deps, specs) 232 | } 233 | } 234 | 235 | proptest! { 236 | // For the lib.rs/main.rs warning, see https://github.com/proptest-rs/proptest/issues/233 237 | // 512 here was determined based on CI time. 1024 took about 5m without coverage and 15m with. 238 | #![proptest_config(ProptestConfig::with_cases(1024))] 239 | #[test] 240 | #[ignore = "proptests are slow and should be run explicitly"] 241 | fn merry_go_round( 242 | (deps, mut features) in arb_spec(), 243 | ) { 244 | 245 | // Cargo requires that there is always a feature for every optional dep: 246 | // https://github.com/rust-lang/cargo/blob/7b2fabf785755458ca02a00140060d8ba786a3ff/src/cargo/core/summary.rs#L339-L349 247 | // Make that be the case. 248 | let unmentioned_optional = deps.iter() 249 | .filter(|dep| matches!(dep.1, DependencyKind::Normal) && dep.2.optional == Some(true)) 250 | .filter(|Dependency(dep, _, _)| !features.iter().flat_map(|(_, specs)| specs).any(|spec| { 251 | match spec { 252 | // NOTE: *technically* this may not count for cargo if the same feature uses 253 | // dep: elsewhere, since then the plain feature specifiers are considered as 254 | // being in a different namespace. But it seems to be working okay for now. 255 | FeatureSpec::Feature(f) => f == dep, 256 | FeatureSpec::Dep(d) => d == dep, 257 | FeatureSpec::Weak(d, _) => d == dep, 258 | FeatureSpec::Strong(d, _) => d == dep, 259 | } 260 | })); 261 | let add: Vec<_> = unmentioned_optional.map(|Dependency(dep, _, _)| FeatureSpec::Dep(dep.clone())).collect(); 262 | if !add.is_empty() { 263 | features.push(("fix-optional".into(), add)); 264 | } 265 | 266 | roundtrip( 267 | |p| { 268 | use std::fmt::Write; 269 | // Modify the workspace before packaging 270 | let mut ctoml = std::fs::read_to_string(p.join("Cargo.toml")).unwrap(); 271 | // There's already a [dependencies] at the bottom of a fresh Cargo.toml 272 | for dep in deps.iter().filter(|&Dependency(_, kind, _)| matches!(kind, DependencyKind::Normal)) { 273 | write!(&mut ctoml, "\n{}", dep_to_toml(dep)).unwrap(); 274 | } 275 | write!(&mut ctoml, "\n[dev-dependencies]").unwrap(); 276 | for dep in deps.iter().filter(|&Dependency(_, kind, _)| matches!(kind, DependencyKind::Dev)) { 277 | write!(&mut ctoml, "\n{}", dep_to_toml(dep)).unwrap(); 278 | } 279 | write!(&mut ctoml, "\n[build-dependencies]").unwrap(); 280 | for dep in deps.iter().filter(|&Dependency(_, kind, _)| matches!(kind, DependencyKind::Build)) { 281 | write!(&mut ctoml, "\n{}", dep_to_toml(dep)).unwrap(); 282 | } 283 | // Write out the feature list 284 | write!(&mut ctoml, "\n[features]").unwrap(); 285 | for (f, fdeps) in &features { 286 | write!(&mut ctoml, "\n{f} = [").unwrap(); 287 | for fdi in 0..fdeps.len() { 288 | if fdi != 0 { 289 | write!(&mut ctoml, ",").unwrap(); 290 | } 291 | match &fdeps[fdi] { 292 | FeatureSpec::Feature(f) => write!(&mut ctoml, r#""{f}""#).unwrap(), 293 | FeatureSpec::Dep(f) => write!(&mut ctoml, r#""dep:{f}""#).unwrap(), 294 | FeatureSpec::Strong(d, f) => write!(&mut ctoml, r#""{d}/{f}""#).unwrap(), 295 | FeatureSpec::Weak(d, f) => write!(&mut ctoml, r#""{d}?/{f}""#).unwrap(), 296 | 297 | } 298 | } 299 | write!(&mut ctoml, "]").unwrap(); 300 | } 301 | // eprintln!("{ctoml}"); 302 | std::fs::write(p.join("Cargo.toml"), ctoml).unwrap(); 303 | }, 304 | |_, _, index| { 305 | // Check the various transit structs 306 | let mut num_found = 0; 307 | 'check: for final_dep in index.dependencies.iter() { 308 | for Dependency(iname, ikind, id) in &deps { 309 | if iname == &*final_dep.name { 310 | let fd = &final_dep; 311 | assert_eq!(Some(ikind), fd.kind.as_ref()); 312 | assert_eq!(id.version, fd.requirements); 313 | if matches!(ikind, DependencyKind::Normal) { 314 | assert_eq!(id.optional.unwrap_or(false), fd.optional); 315 | } else { 316 | assert!(!fd.optional); 317 | } 318 | assert_eq!(id.default_features.unwrap_or(true), fd.default_features); 319 | assert_eq!(id.package.as_deref(), fd.package.as_ref().map(|s| &***s)); 320 | assert_eq!(id.features.as_deref().unwrap_or(&[]), &fd.features[..]); 321 | num_found += 1; 322 | continue 'check; 323 | } 324 | } 325 | panic!(); 326 | } 327 | assert_eq!(num_found, deps.len()); 328 | 329 | for (fname, inspecs) in &features { 330 | let features = if inspecs.iter().all(|spec| matches!(spec, FeatureSpec::Feature(_) | FeatureSpec::Strong(_, _))) { 331 | &*index.features 332 | } else { 333 | index.features2.as_deref().expect("feature should be there, so map shouldn't be empty") 334 | }; 335 | let outspecs = &features[&**fname]; 336 | for inspec in inspecs { 337 | match inspec { 338 | FeatureSpec::Feature(f) => { 339 | assert!(outspecs.contains(&Cow::Borrowed(f))); 340 | } 341 | FeatureSpec::Dep(d) => { 342 | assert!(outspecs.iter().any(|spec| spec.strip_prefix("dep:") == Some(d))); 343 | } 344 | FeatureSpec::Strong(d, f) => { 345 | assert!(outspecs.iter().any(|spec| { 346 | spec.split_once("/") == Some((d, f)) 347 | })); 348 | } 349 | FeatureSpec::Weak(d, f) => { 350 | assert!(outspecs.iter().any(|spec| { 351 | spec.split_once("?/") == Some((d, f)) 352 | })); 353 | } 354 | } 355 | } 356 | } 357 | }, 358 | ); 359 | } 360 | } 361 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "1.1.2" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "anstream" 22 | version = "0.6.11" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" 25 | dependencies = [ 26 | "anstyle", 27 | "anstyle-parse", 28 | "anstyle-query", 29 | "anstyle-wincon", 30 | "colorchoice", 31 | "utf8parse", 32 | ] 33 | 34 | [[package]] 35 | name = "anstyle" 36 | version = "1.0.4" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" 39 | 40 | [[package]] 41 | name = "anstyle-parse" 42 | version = "0.2.3" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" 45 | dependencies = [ 46 | "utf8parse", 47 | ] 48 | 49 | [[package]] 50 | name = "anstyle-query" 51 | version = "1.0.2" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" 54 | dependencies = [ 55 | "windows-sys 0.52.0", 56 | ] 57 | 58 | [[package]] 59 | name = "anstyle-wincon" 60 | version = "3.0.2" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" 63 | dependencies = [ 64 | "anstyle", 65 | "windows-sys 0.52.0", 66 | ] 67 | 68 | [[package]] 69 | name = "anyhow" 70 | version = "1.0.79" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" 73 | 74 | [[package]] 75 | name = "arrayvec" 76 | version = "0.5.2" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 79 | 80 | [[package]] 81 | name = "autocfg" 82 | version = "1.1.0" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 85 | 86 | [[package]] 87 | name = "base16ct" 88 | version = "0.1.1" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" 91 | 92 | [[package]] 93 | name = "base16ct" 94 | version = "0.2.0" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 97 | 98 | [[package]] 99 | name = "base64" 100 | version = "0.13.1" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 103 | 104 | [[package]] 105 | name = "base64ct" 106 | version = "1.6.0" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 109 | 110 | [[package]] 111 | name = "bit-set" 112 | version = "0.5.3" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 115 | dependencies = [ 116 | "bit-vec", 117 | ] 118 | 119 | [[package]] 120 | name = "bit-vec" 121 | version = "0.6.3" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 124 | 125 | [[package]] 126 | name = "bitflags" 127 | version = "1.3.2" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 130 | 131 | [[package]] 132 | name = "bitflags" 133 | version = "2.4.2" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" 136 | 137 | [[package]] 138 | name = "bitmaps" 139 | version = "2.1.0" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" 142 | dependencies = [ 143 | "typenum", 144 | ] 145 | 146 | [[package]] 147 | name = "block-buffer" 148 | version = "0.10.4" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 151 | dependencies = [ 152 | "generic-array", 153 | ] 154 | 155 | [[package]] 156 | name = "bstr" 157 | version = "1.9.0" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" 160 | dependencies = [ 161 | "memchr", 162 | "regex-automata", 163 | "serde", 164 | ] 165 | 166 | [[package]] 167 | name = "bumpalo" 168 | version = "3.14.0" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 171 | 172 | [[package]] 173 | name = "bytes" 174 | version = "1.5.0" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 177 | 178 | [[package]] 179 | name = "bytesize" 180 | version = "1.3.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" 183 | 184 | [[package]] 185 | name = "cargo" 186 | version = "0.70.0" 187 | source = "git+https://github.com/rust-lang/cargo.git?rev=b008a8dccaf5e79b31c666f6313fb27d1ea874ff#b008a8dccaf5e79b31c666f6313fb27d1ea874ff" 188 | dependencies = [ 189 | "anyhow", 190 | "base64", 191 | "bytesize", 192 | "cargo-platform", 193 | "cargo-util", 194 | "clap", 195 | "crates-io 0.35.1 (git+https://github.com/rust-lang/cargo.git?rev=b008a8dccaf5e79b31c666f6313fb27d1ea874ff)", 196 | "curl", 197 | "curl-sys", 198 | "env_logger", 199 | "filetime", 200 | "flate2", 201 | "fwdansi", 202 | "git2", 203 | "git2-curl", 204 | "glob", 205 | "hex 0.4.3", 206 | "hmac", 207 | "home", 208 | "http-auth", 209 | "humantime", 210 | "ignore", 211 | "im-rc", 212 | "indexmap 1.9.3", 213 | "is-terminal", 214 | "itertools", 215 | "jobserver", 216 | "lazy_static", 217 | "lazycell", 218 | "libc", 219 | "libgit2-sys", 220 | "log", 221 | "memchr", 222 | "opener", 223 | "os_info", 224 | "pasetors", 225 | "pathdiff", 226 | "percent-encoding", 227 | "rustc-workspace-hack", 228 | "rustfix", 229 | "semver", 230 | "serde", 231 | "serde-value", 232 | "serde_ignored", 233 | "serde_json", 234 | "sha1", 235 | "shell-escape", 236 | "strip-ansi-escapes", 237 | "tar", 238 | "tempfile", 239 | "termcolor", 240 | "time", 241 | "toml_edit 0.15.0", 242 | "unicode-width", 243 | "unicode-xid", 244 | "url", 245 | "walkdir", 246 | "windows-sys 0.45.0", 247 | ] 248 | 249 | [[package]] 250 | name = "cargo-index-transit" 251 | version = "0.1.1" 252 | dependencies = [ 253 | "cargo", 254 | "crates-index", 255 | "crates-io 0.35.1 (registry+https://github.com/rust-lang/crates.io-index)", 256 | "crossbeam-channel", 257 | "flate2", 258 | "hex 0.4.3", 259 | "hkdf", 260 | "openssl", 261 | "p384 0.11.2", 262 | "pkg-config", 263 | "proptest", 264 | "semver", 265 | "serde", 266 | "serde_json", 267 | "tar", 268 | "tempfile", 269 | "toml_edit 0.19.15", 270 | ] 271 | 272 | [[package]] 273 | name = "cargo-platform" 274 | version = "0.1.2" 275 | source = "git+https://github.com/rust-lang/cargo.git?rev=b008a8dccaf5e79b31c666f6313fb27d1ea874ff#b008a8dccaf5e79b31c666f6313fb27d1ea874ff" 276 | dependencies = [ 277 | "serde", 278 | ] 279 | 280 | [[package]] 281 | name = "cargo-util" 282 | version = "0.2.3" 283 | source = "git+https://github.com/rust-lang/cargo.git?rev=b008a8dccaf5e79b31c666f6313fb27d1ea874ff#b008a8dccaf5e79b31c666f6313fb27d1ea874ff" 284 | dependencies = [ 285 | "anyhow", 286 | "core-foundation", 287 | "crypto-hash", 288 | "filetime", 289 | "hex 0.4.3", 290 | "jobserver", 291 | "libc", 292 | "log", 293 | "miow", 294 | "same-file", 295 | "shell-escape", 296 | "tempfile", 297 | "walkdir", 298 | "windows-sys 0.45.0", 299 | ] 300 | 301 | [[package]] 302 | name = "cc" 303 | version = "1.0.83" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 306 | dependencies = [ 307 | "jobserver", 308 | "libc", 309 | ] 310 | 311 | [[package]] 312 | name = "cfg-if" 313 | version = "0.1.10" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 316 | 317 | [[package]] 318 | name = "cfg-if" 319 | version = "1.0.0" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 322 | 323 | [[package]] 324 | name = "clap" 325 | version = "4.4.18" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" 328 | dependencies = [ 329 | "clap_builder", 330 | ] 331 | 332 | [[package]] 333 | name = "clap_builder" 334 | version = "4.4.18" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" 337 | dependencies = [ 338 | "anstream", 339 | "anstyle", 340 | "clap_lex", 341 | "strsim", 342 | ] 343 | 344 | [[package]] 345 | name = "clap_lex" 346 | version = "0.6.0" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" 349 | 350 | [[package]] 351 | name = "colorchoice" 352 | version = "1.0.0" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 355 | 356 | [[package]] 357 | name = "combine" 358 | version = "4.6.6" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 361 | dependencies = [ 362 | "bytes", 363 | "memchr", 364 | ] 365 | 366 | [[package]] 367 | name = "commoncrypto" 368 | version = "0.2.0" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "d056a8586ba25a1e4d61cb090900e495952c7886786fc55f909ab2f819b69007" 371 | dependencies = [ 372 | "commoncrypto-sys", 373 | ] 374 | 375 | [[package]] 376 | name = "commoncrypto-sys" 377 | version = "0.2.0" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "1fed34f46747aa73dfaa578069fd8279d2818ade2b55f38f22a9401c7f4083e2" 380 | dependencies = [ 381 | "libc", 382 | ] 383 | 384 | [[package]] 385 | name = "const-oid" 386 | version = "0.9.6" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 389 | 390 | [[package]] 391 | name = "core-foundation" 392 | version = "0.9.4" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 395 | dependencies = [ 396 | "core-foundation-sys", 397 | "libc", 398 | ] 399 | 400 | [[package]] 401 | name = "core-foundation-sys" 402 | version = "0.8.6" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 405 | 406 | [[package]] 407 | name = "cpufeatures" 408 | version = "0.2.12" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 411 | dependencies = [ 412 | "libc", 413 | ] 414 | 415 | [[package]] 416 | name = "crates-index" 417 | version = "3.0.0" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "8cb2b4e2add8f7f0b01ca0a162c8dfaa42d4f9e42f787f2ab855a98bbcdbe017" 420 | dependencies = [ 421 | "hex 0.4.3", 422 | "home", 423 | "http", 424 | "memchr", 425 | "rustc-hash", 426 | "semver", 427 | "serde", 428 | "serde_derive", 429 | "serde_json", 430 | "smol_str", 431 | "thiserror", 432 | "toml", 433 | ] 434 | 435 | [[package]] 436 | name = "crates-io" 437 | version = "0.35.1" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "e2dfb6077da60207264ab2eb0e3734f02e0a0c50c347b32c728e42c6fbbf7e2e" 440 | dependencies = [ 441 | "anyhow", 442 | "curl", 443 | "percent-encoding", 444 | "serde", 445 | "serde_json", 446 | "url", 447 | ] 448 | 449 | [[package]] 450 | name = "crates-io" 451 | version = "0.35.1" 452 | source = "git+https://github.com/rust-lang/cargo.git?rev=b008a8dccaf5e79b31c666f6313fb27d1ea874ff#b008a8dccaf5e79b31c666f6313fb27d1ea874ff" 453 | dependencies = [ 454 | "anyhow", 455 | "curl", 456 | "percent-encoding", 457 | "serde", 458 | "serde_json", 459 | "url", 460 | ] 461 | 462 | [[package]] 463 | name = "crc32fast" 464 | version = "1.3.2" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 467 | dependencies = [ 468 | "cfg-if 1.0.0", 469 | ] 470 | 471 | [[package]] 472 | name = "crossbeam-channel" 473 | version = "0.3.9" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" 476 | dependencies = [ 477 | "crossbeam-utils 0.6.6", 478 | ] 479 | 480 | [[package]] 481 | name = "crossbeam-deque" 482 | version = "0.8.5" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 485 | dependencies = [ 486 | "crossbeam-epoch", 487 | "crossbeam-utils 0.8.19", 488 | ] 489 | 490 | [[package]] 491 | name = "crossbeam-epoch" 492 | version = "0.9.18" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 495 | dependencies = [ 496 | "crossbeam-utils 0.8.19", 497 | ] 498 | 499 | [[package]] 500 | name = "crossbeam-utils" 501 | version = "0.6.6" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" 504 | dependencies = [ 505 | "cfg-if 0.1.10", 506 | "lazy_static", 507 | ] 508 | 509 | [[package]] 510 | name = "crossbeam-utils" 511 | version = "0.8.19" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" 514 | 515 | [[package]] 516 | name = "crypto-bigint" 517 | version = "0.4.9" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" 520 | dependencies = [ 521 | "generic-array", 522 | "rand_core", 523 | "subtle", 524 | "zeroize", 525 | ] 526 | 527 | [[package]] 528 | name = "crypto-bigint" 529 | version = "0.5.5" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 532 | dependencies = [ 533 | "generic-array", 534 | "rand_core", 535 | "subtle", 536 | "zeroize", 537 | ] 538 | 539 | [[package]] 540 | name = "crypto-common" 541 | version = "0.1.6" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 544 | dependencies = [ 545 | "generic-array", 546 | "typenum", 547 | ] 548 | 549 | [[package]] 550 | name = "crypto-hash" 551 | version = "0.3.4" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "8a77162240fd97248d19a564a565eb563a3f592b386e4136fb300909e67dddca" 554 | dependencies = [ 555 | "commoncrypto", 556 | "hex 0.3.2", 557 | "openssl", 558 | "winapi", 559 | ] 560 | 561 | [[package]] 562 | name = "ct-codecs" 563 | version = "1.1.1" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "f3b7eb4404b8195a9abb6356f4ac07d8ba267045c8d6d220ac4dc992e6cc75df" 566 | 567 | [[package]] 568 | name = "curl" 569 | version = "0.4.44" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" 572 | dependencies = [ 573 | "curl-sys", 574 | "libc", 575 | "openssl-probe", 576 | "openssl-sys", 577 | "schannel", 578 | "socket2", 579 | "winapi", 580 | ] 581 | 582 | [[package]] 583 | name = "curl-sys" 584 | version = "0.4.70+curl-8.5.0" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "3c0333d8849afe78a4c8102a429a446bfdd055832af071945520e835ae2d841e" 587 | dependencies = [ 588 | "cc", 589 | "libc", 590 | "libnghttp2-sys", 591 | "libz-sys", 592 | "openssl-sys", 593 | "pkg-config", 594 | "vcpkg", 595 | "windows-sys 0.48.0", 596 | ] 597 | 598 | [[package]] 599 | name = "der" 600 | version = "0.6.1" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" 603 | dependencies = [ 604 | "const-oid", 605 | "pem-rfc7468 0.6.0", 606 | "zeroize", 607 | ] 608 | 609 | [[package]] 610 | name = "der" 611 | version = "0.7.8" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" 614 | dependencies = [ 615 | "const-oid", 616 | "pem-rfc7468 0.7.0", 617 | "zeroize", 618 | ] 619 | 620 | [[package]] 621 | name = "deranged" 622 | version = "0.3.11" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 625 | dependencies = [ 626 | "powerfmt", 627 | ] 628 | 629 | [[package]] 630 | name = "digest" 631 | version = "0.10.7" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 634 | dependencies = [ 635 | "block-buffer", 636 | "const-oid", 637 | "crypto-common", 638 | "subtle", 639 | ] 640 | 641 | [[package]] 642 | name = "ecdsa" 643 | version = "0.14.8" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" 646 | dependencies = [ 647 | "der 0.6.1", 648 | "elliptic-curve 0.12.3", 649 | "rfc6979 0.3.1", 650 | "signature 1.6.4", 651 | ] 652 | 653 | [[package]] 654 | name = "ecdsa" 655 | version = "0.16.9" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 658 | dependencies = [ 659 | "der 0.7.8", 660 | "digest", 661 | "elliptic-curve 0.13.8", 662 | "rfc6979 0.4.0", 663 | "signature 2.2.0", 664 | "spki 0.7.3", 665 | ] 666 | 667 | [[package]] 668 | name = "ed25519-compact" 669 | version = "2.0.6" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "a667e6426df16c2ac478efa4a439d0e674cba769c5556e8cf221739251640c8c" 672 | dependencies = [ 673 | "getrandom", 674 | ] 675 | 676 | [[package]] 677 | name = "either" 678 | version = "1.9.0" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 681 | 682 | [[package]] 683 | name = "elliptic-curve" 684 | version = "0.12.3" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" 687 | dependencies = [ 688 | "base16ct 0.1.1", 689 | "crypto-bigint 0.4.9", 690 | "der 0.6.1", 691 | "digest", 692 | "ff 0.12.1", 693 | "generic-array", 694 | "group 0.12.1", 695 | "hkdf", 696 | "pem-rfc7468 0.6.0", 697 | "pkcs8 0.9.0", 698 | "rand_core", 699 | "sec1 0.3.0", 700 | "subtle", 701 | "zeroize", 702 | ] 703 | 704 | [[package]] 705 | name = "elliptic-curve" 706 | version = "0.13.8" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 709 | dependencies = [ 710 | "base16ct 0.2.0", 711 | "crypto-bigint 0.5.5", 712 | "digest", 713 | "ff 0.13.0", 714 | "generic-array", 715 | "group 0.13.0", 716 | "hkdf", 717 | "pem-rfc7468 0.7.0", 718 | "pkcs8 0.10.2", 719 | "rand_core", 720 | "sec1 0.7.3", 721 | "subtle", 722 | "zeroize", 723 | ] 724 | 725 | [[package]] 726 | name = "env_logger" 727 | version = "0.10.2" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" 730 | dependencies = [ 731 | "humantime", 732 | "is-terminal", 733 | "log", 734 | "regex", 735 | "termcolor", 736 | ] 737 | 738 | [[package]] 739 | name = "equivalent" 740 | version = "1.0.1" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 743 | 744 | [[package]] 745 | name = "errno" 746 | version = "0.3.8" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" 749 | dependencies = [ 750 | "libc", 751 | "windows-sys 0.52.0", 752 | ] 753 | 754 | [[package]] 755 | name = "fastrand" 756 | version = "2.0.1" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 759 | 760 | [[package]] 761 | name = "ff" 762 | version = "0.12.1" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" 765 | dependencies = [ 766 | "rand_core", 767 | "subtle", 768 | ] 769 | 770 | [[package]] 771 | name = "ff" 772 | version = "0.13.0" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" 775 | dependencies = [ 776 | "rand_core", 777 | "subtle", 778 | ] 779 | 780 | [[package]] 781 | name = "fiat-crypto" 782 | version = "0.2.5" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" 785 | 786 | [[package]] 787 | name = "filetime" 788 | version = "0.2.23" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" 791 | dependencies = [ 792 | "cfg-if 1.0.0", 793 | "libc", 794 | "redox_syscall", 795 | "windows-sys 0.52.0", 796 | ] 797 | 798 | [[package]] 799 | name = "flate2" 800 | version = "1.0.28" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" 803 | dependencies = [ 804 | "crc32fast", 805 | "libz-sys", 806 | "miniz_oxide", 807 | ] 808 | 809 | [[package]] 810 | name = "fnv" 811 | version = "1.0.7" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 814 | 815 | [[package]] 816 | name = "foreign-types" 817 | version = "0.3.2" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 820 | dependencies = [ 821 | "foreign-types-shared", 822 | ] 823 | 824 | [[package]] 825 | name = "foreign-types-shared" 826 | version = "0.1.1" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 829 | 830 | [[package]] 831 | name = "form_urlencoded" 832 | version = "1.2.1" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 835 | dependencies = [ 836 | "percent-encoding", 837 | ] 838 | 839 | [[package]] 840 | name = "fwdansi" 841 | version = "1.1.0" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "08c1f5787fe85505d1f7777268db5103d80a7a374d2316a7ce262e57baf8f208" 844 | dependencies = [ 845 | "memchr", 846 | "termcolor", 847 | ] 848 | 849 | [[package]] 850 | name = "generic-array" 851 | version = "0.14.7" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 854 | dependencies = [ 855 | "typenum", 856 | "version_check", 857 | "zeroize", 858 | ] 859 | 860 | [[package]] 861 | name = "getrandom" 862 | version = "0.2.12" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 865 | dependencies = [ 866 | "cfg-if 1.0.0", 867 | "js-sys", 868 | "libc", 869 | "wasi", 870 | "wasm-bindgen", 871 | ] 872 | 873 | [[package]] 874 | name = "git2" 875 | version = "0.16.0" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "be36bc9e0546df253c0cc41fd0af34f5e92845ad8509462ec76672fac6997f5b" 878 | dependencies = [ 879 | "bitflags 1.3.2", 880 | "libc", 881 | "libgit2-sys", 882 | "log", 883 | "openssl-probe", 884 | "openssl-sys", 885 | "url", 886 | ] 887 | 888 | [[package]] 889 | name = "git2-curl" 890 | version = "0.17.0" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "7577f4e6341ba7c90d883511130a45b956c274ba5f4d205d9f9da990f654cd33" 893 | dependencies = [ 894 | "curl", 895 | "git2", 896 | "log", 897 | "url", 898 | ] 899 | 900 | [[package]] 901 | name = "glob" 902 | version = "0.3.1" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 905 | 906 | [[package]] 907 | name = "globset" 908 | version = "0.4.14" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" 911 | dependencies = [ 912 | "aho-corasick", 913 | "bstr", 914 | "log", 915 | "regex-automata", 916 | "regex-syntax", 917 | ] 918 | 919 | [[package]] 920 | name = "group" 921 | version = "0.12.1" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" 924 | dependencies = [ 925 | "ff 0.12.1", 926 | "rand_core", 927 | "subtle", 928 | ] 929 | 930 | [[package]] 931 | name = "group" 932 | version = "0.13.0" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 935 | dependencies = [ 936 | "ff 0.13.0", 937 | "rand_core", 938 | "subtle", 939 | ] 940 | 941 | [[package]] 942 | name = "hashbrown" 943 | version = "0.12.3" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 946 | 947 | [[package]] 948 | name = "hashbrown" 949 | version = "0.14.3" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 952 | 953 | [[package]] 954 | name = "hermit-abi" 955 | version = "0.3.4" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" 958 | 959 | [[package]] 960 | name = "hex" 961 | version = "0.3.2" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" 964 | 965 | [[package]] 966 | name = "hex" 967 | version = "0.4.3" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 970 | dependencies = [ 971 | "serde", 972 | ] 973 | 974 | [[package]] 975 | name = "hkdf" 976 | version = "0.12.4" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 979 | dependencies = [ 980 | "hmac", 981 | ] 982 | 983 | [[package]] 984 | name = "hmac" 985 | version = "0.12.1" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 988 | dependencies = [ 989 | "digest", 990 | ] 991 | 992 | [[package]] 993 | name = "home" 994 | version = "0.5.9" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" 997 | dependencies = [ 998 | "windows-sys 0.52.0", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "http" 1003 | version = "1.1.0" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 1006 | dependencies = [ 1007 | "bytes", 1008 | "fnv", 1009 | "itoa", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "http-auth" 1014 | version = "0.1.9" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "643c9bbf6a4ea8a656d6b4cd53d34f79e3f841ad5203c1a55fb7d761923bc255" 1017 | dependencies = [ 1018 | "memchr", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "humantime" 1023 | version = "2.1.0" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 1026 | 1027 | [[package]] 1028 | name = "idna" 1029 | version = "0.5.0" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1032 | dependencies = [ 1033 | "unicode-bidi", 1034 | "unicode-normalization", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "ignore" 1039 | version = "0.4.22" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" 1042 | dependencies = [ 1043 | "crossbeam-deque", 1044 | "globset", 1045 | "log", 1046 | "memchr", 1047 | "regex-automata", 1048 | "same-file", 1049 | "walkdir", 1050 | "winapi-util", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "im-rc" 1055 | version = "15.1.0" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" 1058 | dependencies = [ 1059 | "bitmaps", 1060 | "rand_core", 1061 | "rand_xoshiro", 1062 | "sized-chunks", 1063 | "typenum", 1064 | "version_check", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "indexmap" 1069 | version = "1.9.3" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1072 | dependencies = [ 1073 | "autocfg", 1074 | "hashbrown 0.12.3", 1075 | ] 1076 | 1077 | [[package]] 1078 | name = "indexmap" 1079 | version = "2.1.0" 1080 | source = "registry+https://github.com/rust-lang/crates.io-index" 1081 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 1082 | dependencies = [ 1083 | "equivalent", 1084 | "hashbrown 0.14.3", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "is-terminal" 1089 | version = "0.4.10" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" 1092 | dependencies = [ 1093 | "hermit-abi", 1094 | "rustix", 1095 | "windows-sys 0.52.0", 1096 | ] 1097 | 1098 | [[package]] 1099 | name = "itertools" 1100 | version = "0.10.5" 1101 | source = "registry+https://github.com/rust-lang/crates.io-index" 1102 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1103 | dependencies = [ 1104 | "either", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "itoa" 1109 | version = "1.0.10" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 1112 | 1113 | [[package]] 1114 | name = "jobserver" 1115 | version = "0.1.27" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" 1118 | dependencies = [ 1119 | "libc", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "js-sys" 1124 | version = "0.3.67" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" 1127 | dependencies = [ 1128 | "wasm-bindgen", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "kstring" 1133 | version = "2.0.0" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747" 1136 | dependencies = [ 1137 | "static_assertions", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "lazy_static" 1142 | version = "1.4.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1145 | 1146 | [[package]] 1147 | name = "lazycell" 1148 | version = "1.3.0" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 1151 | 1152 | [[package]] 1153 | name = "libc" 1154 | version = "0.2.152" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" 1157 | 1158 | [[package]] 1159 | name = "libgit2-sys" 1160 | version = "0.14.1+1.5.0" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "4a07fb2692bc3593bda59de45a502bb3071659f2c515e28c71e728306b038e17" 1163 | dependencies = [ 1164 | "cc", 1165 | "libc", 1166 | "libssh2-sys", 1167 | "libz-sys", 1168 | "openssl-sys", 1169 | "pkg-config", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "libm" 1174 | version = "0.2.8" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 1177 | 1178 | [[package]] 1179 | name = "libnghttp2-sys" 1180 | version = "0.1.9+1.58.0" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "b57e858af2798e167e709b9d969325b6d8e9d50232fcbc494d7d54f976854a64" 1183 | dependencies = [ 1184 | "cc", 1185 | "libc", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "libssh2-sys" 1190 | version = "0.2.23" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" 1193 | dependencies = [ 1194 | "cc", 1195 | "libc", 1196 | "libz-sys", 1197 | "openssl-sys", 1198 | "pkg-config", 1199 | "vcpkg", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "libz-sys" 1204 | version = "1.1.14" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050" 1207 | dependencies = [ 1208 | "cc", 1209 | "libc", 1210 | "pkg-config", 1211 | "vcpkg", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "linux-raw-sys" 1216 | version = "0.4.13" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" 1219 | 1220 | [[package]] 1221 | name = "log" 1222 | version = "0.4.20" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 1225 | 1226 | [[package]] 1227 | name = "memchr" 1228 | version = "2.7.1" 1229 | source = "registry+https://github.com/rust-lang/crates.io-index" 1230 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 1231 | 1232 | [[package]] 1233 | name = "miniz_oxide" 1234 | version = "0.7.1" 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" 1236 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1237 | dependencies = [ 1238 | "adler", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "miow" 1243 | version = "0.5.0" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "52ffbca2f655e33c08be35d87278e5b18b89550a37dbd598c20db92f6a471123" 1246 | dependencies = [ 1247 | "windows-sys 0.42.0", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "num-traits" 1252 | version = "0.2.17" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 1255 | dependencies = [ 1256 | "autocfg", 1257 | "libm", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "once_cell" 1262 | version = "1.19.0" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1265 | 1266 | [[package]] 1267 | name = "opener" 1268 | version = "0.5.2" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "293c15678e37254c15bd2f092314abb4e51d7fdde05c2021279c12631b54f005" 1271 | dependencies = [ 1272 | "bstr", 1273 | "winapi", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "openssl" 1278 | version = "0.10.63" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" 1281 | dependencies = [ 1282 | "bitflags 2.4.2", 1283 | "cfg-if 1.0.0", 1284 | "foreign-types", 1285 | "libc", 1286 | "once_cell", 1287 | "openssl-macros", 1288 | "openssl-sys", 1289 | ] 1290 | 1291 | [[package]] 1292 | name = "openssl-macros" 1293 | version = "0.1.1" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1296 | dependencies = [ 1297 | "proc-macro2", 1298 | "quote", 1299 | "syn", 1300 | ] 1301 | 1302 | [[package]] 1303 | name = "openssl-probe" 1304 | version = "0.1.5" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1307 | 1308 | [[package]] 1309 | name = "openssl-sys" 1310 | version = "0.9.99" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" 1313 | dependencies = [ 1314 | "cc", 1315 | "libc", 1316 | "pkg-config", 1317 | "vcpkg", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "ordered-float" 1322 | version = "2.10.1" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" 1325 | dependencies = [ 1326 | "num-traits", 1327 | ] 1328 | 1329 | [[package]] 1330 | name = "orion" 1331 | version = "0.17.6" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | checksum = "7abdb10181903c8c4b016ba45d6d6d5af1a1e2a461aa4763a83b87f5df4695e5" 1334 | dependencies = [ 1335 | "fiat-crypto", 1336 | "subtle", 1337 | "zeroize", 1338 | ] 1339 | 1340 | [[package]] 1341 | name = "os_info" 1342 | version = "3.7.0" 1343 | source = "registry+https://github.com/rust-lang/crates.io-index" 1344 | checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" 1345 | dependencies = [ 1346 | "log", 1347 | "serde", 1348 | "winapi", 1349 | ] 1350 | 1351 | [[package]] 1352 | name = "p384" 1353 | version = "0.11.2" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" 1356 | dependencies = [ 1357 | "ecdsa 0.14.8", 1358 | "elliptic-curve 0.12.3", 1359 | "sha2", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "p384" 1364 | version = "0.13.0" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" 1367 | dependencies = [ 1368 | "ecdsa 0.16.9", 1369 | "elliptic-curve 0.13.8", 1370 | "primeorder", 1371 | "sha2", 1372 | ] 1373 | 1374 | [[package]] 1375 | name = "pasetors" 1376 | version = "0.6.8" 1377 | source = "registry+https://github.com/rust-lang/crates.io-index" 1378 | checksum = "6b36d47c66f2230dd1b7143d9afb2b4891879020210eddf2ccb624e529b96dba" 1379 | dependencies = [ 1380 | "ct-codecs", 1381 | "ed25519-compact", 1382 | "getrandom", 1383 | "orion", 1384 | "p384 0.13.0", 1385 | "rand_core", 1386 | "regex", 1387 | "serde", 1388 | "serde_json", 1389 | "sha2", 1390 | "subtle", 1391 | "time", 1392 | "zeroize", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "pathdiff" 1397 | version = "0.2.1" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 1400 | 1401 | [[package]] 1402 | name = "pem-rfc7468" 1403 | version = "0.6.0" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" 1406 | dependencies = [ 1407 | "base64ct", 1408 | ] 1409 | 1410 | [[package]] 1411 | name = "pem-rfc7468" 1412 | version = "0.7.0" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1415 | dependencies = [ 1416 | "base64ct", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "percent-encoding" 1421 | version = "2.3.1" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1424 | 1425 | [[package]] 1426 | name = "pkcs8" 1427 | version = "0.9.0" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" 1430 | dependencies = [ 1431 | "der 0.6.1", 1432 | "spki 0.6.0", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "pkcs8" 1437 | version = "0.10.2" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1440 | dependencies = [ 1441 | "der 0.7.8", 1442 | "spki 0.7.3", 1443 | ] 1444 | 1445 | [[package]] 1446 | name = "pkg-config" 1447 | version = "0.3.29" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" 1450 | 1451 | [[package]] 1452 | name = "powerfmt" 1453 | version = "0.2.0" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1456 | 1457 | [[package]] 1458 | name = "ppv-lite86" 1459 | version = "0.2.17" 1460 | source = "registry+https://github.com/rust-lang/crates.io-index" 1461 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1462 | 1463 | [[package]] 1464 | name = "primeorder" 1465 | version = "0.13.6" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 1468 | dependencies = [ 1469 | "elliptic-curve 0.13.8", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "proc-macro2" 1474 | version = "1.0.76" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" 1477 | dependencies = [ 1478 | "unicode-ident", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "proptest" 1483 | version = "1.4.0" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" 1486 | dependencies = [ 1487 | "bit-set", 1488 | "bit-vec", 1489 | "bitflags 2.4.2", 1490 | "lazy_static", 1491 | "num-traits", 1492 | "rand", 1493 | "rand_chacha", 1494 | "rand_xorshift", 1495 | "regex-syntax", 1496 | "rusty-fork", 1497 | "tempfile", 1498 | "unarray", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "quick-error" 1503 | version = "1.2.3" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1506 | 1507 | [[package]] 1508 | name = "quote" 1509 | version = "1.0.35" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 1512 | dependencies = [ 1513 | "proc-macro2", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "rand" 1518 | version = "0.8.5" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1521 | dependencies = [ 1522 | "libc", 1523 | "rand_chacha", 1524 | "rand_core", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "rand_chacha" 1529 | version = "0.3.1" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1532 | dependencies = [ 1533 | "ppv-lite86", 1534 | "rand_core", 1535 | ] 1536 | 1537 | [[package]] 1538 | name = "rand_core" 1539 | version = "0.6.4" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1542 | dependencies = [ 1543 | "getrandom", 1544 | ] 1545 | 1546 | [[package]] 1547 | name = "rand_xorshift" 1548 | version = "0.3.0" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" 1551 | dependencies = [ 1552 | "rand_core", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "rand_xoshiro" 1557 | version = "0.6.0" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" 1560 | dependencies = [ 1561 | "rand_core", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "redox_syscall" 1566 | version = "0.4.1" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1569 | dependencies = [ 1570 | "bitflags 1.3.2", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "regex" 1575 | version = "1.10.2" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 1578 | dependencies = [ 1579 | "aho-corasick", 1580 | "memchr", 1581 | "regex-automata", 1582 | "regex-syntax", 1583 | ] 1584 | 1585 | [[package]] 1586 | name = "regex-automata" 1587 | version = "0.4.3" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 1590 | dependencies = [ 1591 | "aho-corasick", 1592 | "memchr", 1593 | "regex-syntax", 1594 | ] 1595 | 1596 | [[package]] 1597 | name = "regex-syntax" 1598 | version = "0.8.2" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 1601 | 1602 | [[package]] 1603 | name = "rfc6979" 1604 | version = "0.3.1" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" 1607 | dependencies = [ 1608 | "crypto-bigint 0.4.9", 1609 | "hmac", 1610 | "zeroize", 1611 | ] 1612 | 1613 | [[package]] 1614 | name = "rfc6979" 1615 | version = "0.4.0" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 1618 | dependencies = [ 1619 | "hmac", 1620 | "subtle", 1621 | ] 1622 | 1623 | [[package]] 1624 | name = "rustc-hash" 1625 | version = "1.1.0" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1628 | 1629 | [[package]] 1630 | name = "rustc-workspace-hack" 1631 | version = "1.0.0" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "fc71d2faa173b74b232dedc235e3ee1696581bb132fc116fa3626d6151a1a8fb" 1634 | 1635 | [[package]] 1636 | name = "rustfix" 1637 | version = "0.6.1" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "ecd2853d9e26988467753bd9912c3a126f642d05d229a4b53f5752ee36c56481" 1640 | dependencies = [ 1641 | "anyhow", 1642 | "log", 1643 | "serde", 1644 | "serde_json", 1645 | ] 1646 | 1647 | [[package]] 1648 | name = "rustix" 1649 | version = "0.38.30" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" 1652 | dependencies = [ 1653 | "bitflags 2.4.2", 1654 | "errno", 1655 | "libc", 1656 | "linux-raw-sys", 1657 | "windows-sys 0.52.0", 1658 | ] 1659 | 1660 | [[package]] 1661 | name = "rusty-fork" 1662 | version = "0.3.0" 1663 | source = "registry+https://github.com/rust-lang/crates.io-index" 1664 | checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" 1665 | dependencies = [ 1666 | "fnv", 1667 | "quick-error", 1668 | "tempfile", 1669 | "wait-timeout", 1670 | ] 1671 | 1672 | [[package]] 1673 | name = "ryu" 1674 | version = "1.0.16" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" 1677 | 1678 | [[package]] 1679 | name = "same-file" 1680 | version = "1.0.6" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1683 | dependencies = [ 1684 | "winapi-util", 1685 | ] 1686 | 1687 | [[package]] 1688 | name = "schannel" 1689 | version = "0.1.23" 1690 | source = "registry+https://github.com/rust-lang/crates.io-index" 1691 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1692 | dependencies = [ 1693 | "windows-sys 0.52.0", 1694 | ] 1695 | 1696 | [[package]] 1697 | name = "sec1" 1698 | version = "0.3.0" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" 1701 | dependencies = [ 1702 | "base16ct 0.1.1", 1703 | "der 0.6.1", 1704 | "generic-array", 1705 | "pkcs8 0.9.0", 1706 | "subtle", 1707 | "zeroize", 1708 | ] 1709 | 1710 | [[package]] 1711 | name = "sec1" 1712 | version = "0.7.3" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 1715 | dependencies = [ 1716 | "base16ct 0.2.0", 1717 | "der 0.7.8", 1718 | "generic-array", 1719 | "pkcs8 0.10.2", 1720 | "subtle", 1721 | "zeroize", 1722 | ] 1723 | 1724 | [[package]] 1725 | name = "semver" 1726 | version = "1.0.21" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" 1729 | dependencies = [ 1730 | "serde", 1731 | ] 1732 | 1733 | [[package]] 1734 | name = "serde" 1735 | version = "1.0.195" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" 1738 | dependencies = [ 1739 | "serde_derive", 1740 | ] 1741 | 1742 | [[package]] 1743 | name = "serde-value" 1744 | version = "0.7.0" 1745 | source = "registry+https://github.com/rust-lang/crates.io-index" 1746 | checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" 1747 | dependencies = [ 1748 | "ordered-float", 1749 | "serde", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "serde_derive" 1754 | version = "1.0.195" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" 1757 | dependencies = [ 1758 | "proc-macro2", 1759 | "quote", 1760 | "syn", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "serde_ignored" 1765 | version = "0.1.10" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "a8e319a36d1b52126a0d608f24e93b2d81297091818cd70625fcf50a15d84ddf" 1768 | dependencies = [ 1769 | "serde", 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "serde_json" 1774 | version = "1.0.111" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" 1777 | dependencies = [ 1778 | "itoa", 1779 | "ryu", 1780 | "serde", 1781 | ] 1782 | 1783 | [[package]] 1784 | name = "serde_spanned" 1785 | version = "0.6.5" 1786 | source = "registry+https://github.com/rust-lang/crates.io-index" 1787 | checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" 1788 | dependencies = [ 1789 | "serde", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "sha1" 1794 | version = "0.10.6" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1797 | dependencies = [ 1798 | "cfg-if 1.0.0", 1799 | "cpufeatures", 1800 | "digest", 1801 | ] 1802 | 1803 | [[package]] 1804 | name = "sha2" 1805 | version = "0.10.8" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1808 | dependencies = [ 1809 | "cfg-if 1.0.0", 1810 | "cpufeatures", 1811 | "digest", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "shell-escape" 1816 | version = "0.1.5" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" 1819 | 1820 | [[package]] 1821 | name = "signature" 1822 | version = "1.6.4" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" 1825 | dependencies = [ 1826 | "digest", 1827 | "rand_core", 1828 | ] 1829 | 1830 | [[package]] 1831 | name = "signature" 1832 | version = "2.2.0" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1835 | dependencies = [ 1836 | "digest", 1837 | "rand_core", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "sized-chunks" 1842 | version = "0.6.5" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" 1845 | dependencies = [ 1846 | "bitmaps", 1847 | "typenum", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "smol_str" 1852 | version = "0.2.1" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" 1855 | dependencies = [ 1856 | "serde", 1857 | ] 1858 | 1859 | [[package]] 1860 | name = "socket2" 1861 | version = "0.4.10" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" 1864 | dependencies = [ 1865 | "libc", 1866 | "winapi", 1867 | ] 1868 | 1869 | [[package]] 1870 | name = "spki" 1871 | version = "0.6.0" 1872 | source = "registry+https://github.com/rust-lang/crates.io-index" 1873 | checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" 1874 | dependencies = [ 1875 | "base64ct", 1876 | "der 0.6.1", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "spki" 1881 | version = "0.7.3" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1884 | dependencies = [ 1885 | "base64ct", 1886 | "der 0.7.8", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "static_assertions" 1891 | version = "1.1.0" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1894 | 1895 | [[package]] 1896 | name = "strip-ansi-escapes" 1897 | version = "0.1.1" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8" 1900 | dependencies = [ 1901 | "vte", 1902 | ] 1903 | 1904 | [[package]] 1905 | name = "strsim" 1906 | version = "0.10.0" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1909 | 1910 | [[package]] 1911 | name = "subtle" 1912 | version = "2.5.0" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 1915 | 1916 | [[package]] 1917 | name = "syn" 1918 | version = "2.0.48" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" 1921 | dependencies = [ 1922 | "proc-macro2", 1923 | "quote", 1924 | "unicode-ident", 1925 | ] 1926 | 1927 | [[package]] 1928 | name = "tar" 1929 | version = "0.4.40" 1930 | source = "registry+https://github.com/rust-lang/crates.io-index" 1931 | checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" 1932 | dependencies = [ 1933 | "filetime", 1934 | "libc", 1935 | "xattr", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "tempfile" 1940 | version = "3.9.0" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" 1943 | dependencies = [ 1944 | "cfg-if 1.0.0", 1945 | "fastrand", 1946 | "redox_syscall", 1947 | "rustix", 1948 | "windows-sys 0.52.0", 1949 | ] 1950 | 1951 | [[package]] 1952 | name = "termcolor" 1953 | version = "1.4.1" 1954 | source = "registry+https://github.com/rust-lang/crates.io-index" 1955 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 1956 | dependencies = [ 1957 | "winapi-util", 1958 | ] 1959 | 1960 | [[package]] 1961 | name = "thiserror" 1962 | version = "1.0.56" 1963 | source = "registry+https://github.com/rust-lang/crates.io-index" 1964 | checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" 1965 | dependencies = [ 1966 | "thiserror-impl", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "thiserror-impl" 1971 | version = "1.0.56" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" 1974 | dependencies = [ 1975 | "proc-macro2", 1976 | "quote", 1977 | "syn", 1978 | ] 1979 | 1980 | [[package]] 1981 | name = "time" 1982 | version = "0.3.31" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" 1985 | dependencies = [ 1986 | "deranged", 1987 | "itoa", 1988 | "powerfmt", 1989 | "serde", 1990 | "time-core", 1991 | "time-macros", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "time-core" 1996 | version = "0.1.2" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1999 | 2000 | [[package]] 2001 | name = "time-macros" 2002 | version = "0.2.16" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" 2005 | dependencies = [ 2006 | "time-core", 2007 | ] 2008 | 2009 | [[package]] 2010 | name = "tinyvec" 2011 | version = "1.6.0" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2014 | dependencies = [ 2015 | "tinyvec_macros", 2016 | ] 2017 | 2018 | [[package]] 2019 | name = "tinyvec_macros" 2020 | version = "0.1.1" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2023 | 2024 | [[package]] 2025 | name = "toml" 2026 | version = "0.8.8" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" 2029 | dependencies = [ 2030 | "serde", 2031 | "serde_spanned", 2032 | "toml_datetime 0.6.5", 2033 | "toml_edit 0.21.0", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "toml_datetime" 2038 | version = "0.5.1" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" 2041 | dependencies = [ 2042 | "serde", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "toml_datetime" 2047 | version = "0.6.5" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 2050 | dependencies = [ 2051 | "serde", 2052 | ] 2053 | 2054 | [[package]] 2055 | name = "toml_edit" 2056 | version = "0.15.0" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "b1541ba70885967e662f69d31ab3aeca7b1aaecfcd58679590b893e9239c3646" 2059 | dependencies = [ 2060 | "combine", 2061 | "indexmap 1.9.3", 2062 | "itertools", 2063 | "kstring", 2064 | "serde", 2065 | "toml_datetime 0.5.1", 2066 | ] 2067 | 2068 | [[package]] 2069 | name = "toml_edit" 2070 | version = "0.19.15" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 2073 | dependencies = [ 2074 | "indexmap 2.1.0", 2075 | "serde", 2076 | "serde_spanned", 2077 | "toml_datetime 0.6.5", 2078 | "winnow", 2079 | ] 2080 | 2081 | [[package]] 2082 | name = "toml_edit" 2083 | version = "0.21.0" 2084 | source = "registry+https://github.com/rust-lang/crates.io-index" 2085 | checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" 2086 | dependencies = [ 2087 | "indexmap 2.1.0", 2088 | "serde", 2089 | "serde_spanned", 2090 | "toml_datetime 0.6.5", 2091 | "winnow", 2092 | ] 2093 | 2094 | [[package]] 2095 | name = "typenum" 2096 | version = "1.17.0" 2097 | source = "registry+https://github.com/rust-lang/crates.io-index" 2098 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2099 | 2100 | [[package]] 2101 | name = "unarray" 2102 | version = "0.1.4" 2103 | source = "registry+https://github.com/rust-lang/crates.io-index" 2104 | checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" 2105 | 2106 | [[package]] 2107 | name = "unicode-bidi" 2108 | version = "0.3.15" 2109 | source = "registry+https://github.com/rust-lang/crates.io-index" 2110 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2111 | 2112 | [[package]] 2113 | name = "unicode-ident" 2114 | version = "1.0.12" 2115 | source = "registry+https://github.com/rust-lang/crates.io-index" 2116 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2117 | 2118 | [[package]] 2119 | name = "unicode-normalization" 2120 | version = "0.1.22" 2121 | source = "registry+https://github.com/rust-lang/crates.io-index" 2122 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2123 | dependencies = [ 2124 | "tinyvec", 2125 | ] 2126 | 2127 | [[package]] 2128 | name = "unicode-width" 2129 | version = "0.1.11" 2130 | source = "registry+https://github.com/rust-lang/crates.io-index" 2131 | checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" 2132 | 2133 | [[package]] 2134 | name = "unicode-xid" 2135 | version = "0.2.4" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 2138 | 2139 | [[package]] 2140 | name = "url" 2141 | version = "2.5.0" 2142 | source = "registry+https://github.com/rust-lang/crates.io-index" 2143 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2144 | dependencies = [ 2145 | "form_urlencoded", 2146 | "idna", 2147 | "percent-encoding", 2148 | ] 2149 | 2150 | [[package]] 2151 | name = "utf8parse" 2152 | version = "0.2.1" 2153 | source = "registry+https://github.com/rust-lang/crates.io-index" 2154 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 2155 | 2156 | [[package]] 2157 | name = "vcpkg" 2158 | version = "0.2.15" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2161 | 2162 | [[package]] 2163 | name = "version_check" 2164 | version = "0.9.4" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2167 | 2168 | [[package]] 2169 | name = "vte" 2170 | version = "0.10.1" 2171 | source = "registry+https://github.com/rust-lang/crates.io-index" 2172 | checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983" 2173 | dependencies = [ 2174 | "arrayvec", 2175 | "utf8parse", 2176 | "vte_generate_state_changes", 2177 | ] 2178 | 2179 | [[package]] 2180 | name = "vte_generate_state_changes" 2181 | version = "0.1.1" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" 2184 | dependencies = [ 2185 | "proc-macro2", 2186 | "quote", 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "wait-timeout" 2191 | version = "0.2.0" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" 2194 | dependencies = [ 2195 | "libc", 2196 | ] 2197 | 2198 | [[package]] 2199 | name = "walkdir" 2200 | version = "2.4.0" 2201 | source = "registry+https://github.com/rust-lang/crates.io-index" 2202 | checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" 2203 | dependencies = [ 2204 | "same-file", 2205 | "winapi-util", 2206 | ] 2207 | 2208 | [[package]] 2209 | name = "wasi" 2210 | version = "0.11.0+wasi-snapshot-preview1" 2211 | source = "registry+https://github.com/rust-lang/crates.io-index" 2212 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2213 | 2214 | [[package]] 2215 | name = "wasm-bindgen" 2216 | version = "0.2.90" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" 2219 | dependencies = [ 2220 | "cfg-if 1.0.0", 2221 | "wasm-bindgen-macro", 2222 | ] 2223 | 2224 | [[package]] 2225 | name = "wasm-bindgen-backend" 2226 | version = "0.2.90" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" 2229 | dependencies = [ 2230 | "bumpalo", 2231 | "log", 2232 | "once_cell", 2233 | "proc-macro2", 2234 | "quote", 2235 | "syn", 2236 | "wasm-bindgen-shared", 2237 | ] 2238 | 2239 | [[package]] 2240 | name = "wasm-bindgen-macro" 2241 | version = "0.2.90" 2242 | source = "registry+https://github.com/rust-lang/crates.io-index" 2243 | checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" 2244 | dependencies = [ 2245 | "quote", 2246 | "wasm-bindgen-macro-support", 2247 | ] 2248 | 2249 | [[package]] 2250 | name = "wasm-bindgen-macro-support" 2251 | version = "0.2.90" 2252 | source = "registry+https://github.com/rust-lang/crates.io-index" 2253 | checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" 2254 | dependencies = [ 2255 | "proc-macro2", 2256 | "quote", 2257 | "syn", 2258 | "wasm-bindgen-backend", 2259 | "wasm-bindgen-shared", 2260 | ] 2261 | 2262 | [[package]] 2263 | name = "wasm-bindgen-shared" 2264 | version = "0.2.90" 2265 | source = "registry+https://github.com/rust-lang/crates.io-index" 2266 | checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" 2267 | 2268 | [[package]] 2269 | name = "winapi" 2270 | version = "0.3.9" 2271 | source = "registry+https://github.com/rust-lang/crates.io-index" 2272 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2273 | dependencies = [ 2274 | "winapi-i686-pc-windows-gnu", 2275 | "winapi-x86_64-pc-windows-gnu", 2276 | ] 2277 | 2278 | [[package]] 2279 | name = "winapi-i686-pc-windows-gnu" 2280 | version = "0.4.0" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2283 | 2284 | [[package]] 2285 | name = "winapi-util" 2286 | version = "0.1.6" 2287 | source = "registry+https://github.com/rust-lang/crates.io-index" 2288 | checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 2289 | dependencies = [ 2290 | "winapi", 2291 | ] 2292 | 2293 | [[package]] 2294 | name = "winapi-x86_64-pc-windows-gnu" 2295 | version = "0.4.0" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2298 | 2299 | [[package]] 2300 | name = "windows-sys" 2301 | version = "0.42.0" 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" 2303 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 2304 | dependencies = [ 2305 | "windows_aarch64_gnullvm 0.42.2", 2306 | "windows_aarch64_msvc 0.42.2", 2307 | "windows_i686_gnu 0.42.2", 2308 | "windows_i686_msvc 0.42.2", 2309 | "windows_x86_64_gnu 0.42.2", 2310 | "windows_x86_64_gnullvm 0.42.2", 2311 | "windows_x86_64_msvc 0.42.2", 2312 | ] 2313 | 2314 | [[package]] 2315 | name = "windows-sys" 2316 | version = "0.45.0" 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" 2318 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 2319 | dependencies = [ 2320 | "windows-targets 0.42.2", 2321 | ] 2322 | 2323 | [[package]] 2324 | name = "windows-sys" 2325 | version = "0.48.0" 2326 | source = "registry+https://github.com/rust-lang/crates.io-index" 2327 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2328 | dependencies = [ 2329 | "windows-targets 0.48.5", 2330 | ] 2331 | 2332 | [[package]] 2333 | name = "windows-sys" 2334 | version = "0.52.0" 2335 | source = "registry+https://github.com/rust-lang/crates.io-index" 2336 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2337 | dependencies = [ 2338 | "windows-targets 0.52.0", 2339 | ] 2340 | 2341 | [[package]] 2342 | name = "windows-targets" 2343 | version = "0.42.2" 2344 | source = "registry+https://github.com/rust-lang/crates.io-index" 2345 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 2346 | dependencies = [ 2347 | "windows_aarch64_gnullvm 0.42.2", 2348 | "windows_aarch64_msvc 0.42.2", 2349 | "windows_i686_gnu 0.42.2", 2350 | "windows_i686_msvc 0.42.2", 2351 | "windows_x86_64_gnu 0.42.2", 2352 | "windows_x86_64_gnullvm 0.42.2", 2353 | "windows_x86_64_msvc 0.42.2", 2354 | ] 2355 | 2356 | [[package]] 2357 | name = "windows-targets" 2358 | version = "0.48.5" 2359 | source = "registry+https://github.com/rust-lang/crates.io-index" 2360 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2361 | dependencies = [ 2362 | "windows_aarch64_gnullvm 0.48.5", 2363 | "windows_aarch64_msvc 0.48.5", 2364 | "windows_i686_gnu 0.48.5", 2365 | "windows_i686_msvc 0.48.5", 2366 | "windows_x86_64_gnu 0.48.5", 2367 | "windows_x86_64_gnullvm 0.48.5", 2368 | "windows_x86_64_msvc 0.48.5", 2369 | ] 2370 | 2371 | [[package]] 2372 | name = "windows-targets" 2373 | version = "0.52.0" 2374 | source = "registry+https://github.com/rust-lang/crates.io-index" 2375 | checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" 2376 | dependencies = [ 2377 | "windows_aarch64_gnullvm 0.52.0", 2378 | "windows_aarch64_msvc 0.52.0", 2379 | "windows_i686_gnu 0.52.0", 2380 | "windows_i686_msvc 0.52.0", 2381 | "windows_x86_64_gnu 0.52.0", 2382 | "windows_x86_64_gnullvm 0.52.0", 2383 | "windows_x86_64_msvc 0.52.0", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "windows_aarch64_gnullvm" 2388 | version = "0.42.2" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 2391 | 2392 | [[package]] 2393 | name = "windows_aarch64_gnullvm" 2394 | version = "0.48.5" 2395 | source = "registry+https://github.com/rust-lang/crates.io-index" 2396 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2397 | 2398 | [[package]] 2399 | name = "windows_aarch64_gnullvm" 2400 | version = "0.52.0" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" 2403 | 2404 | [[package]] 2405 | name = "windows_aarch64_msvc" 2406 | version = "0.42.2" 2407 | source = "registry+https://github.com/rust-lang/crates.io-index" 2408 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 2409 | 2410 | [[package]] 2411 | name = "windows_aarch64_msvc" 2412 | version = "0.48.5" 2413 | source = "registry+https://github.com/rust-lang/crates.io-index" 2414 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2415 | 2416 | [[package]] 2417 | name = "windows_aarch64_msvc" 2418 | version = "0.52.0" 2419 | source = "registry+https://github.com/rust-lang/crates.io-index" 2420 | checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" 2421 | 2422 | [[package]] 2423 | name = "windows_i686_gnu" 2424 | version = "0.42.2" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 2427 | 2428 | [[package]] 2429 | name = "windows_i686_gnu" 2430 | version = "0.48.5" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2433 | 2434 | [[package]] 2435 | name = "windows_i686_gnu" 2436 | version = "0.52.0" 2437 | source = "registry+https://github.com/rust-lang/crates.io-index" 2438 | checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" 2439 | 2440 | [[package]] 2441 | name = "windows_i686_msvc" 2442 | version = "0.42.2" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 2445 | 2446 | [[package]] 2447 | name = "windows_i686_msvc" 2448 | version = "0.48.5" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2451 | 2452 | [[package]] 2453 | name = "windows_i686_msvc" 2454 | version = "0.52.0" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" 2457 | 2458 | [[package]] 2459 | name = "windows_x86_64_gnu" 2460 | version = "0.42.2" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 2463 | 2464 | [[package]] 2465 | name = "windows_x86_64_gnu" 2466 | version = "0.48.5" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2469 | 2470 | [[package]] 2471 | name = "windows_x86_64_gnu" 2472 | version = "0.52.0" 2473 | source = "registry+https://github.com/rust-lang/crates.io-index" 2474 | checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" 2475 | 2476 | [[package]] 2477 | name = "windows_x86_64_gnullvm" 2478 | version = "0.42.2" 2479 | source = "registry+https://github.com/rust-lang/crates.io-index" 2480 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 2481 | 2482 | [[package]] 2483 | name = "windows_x86_64_gnullvm" 2484 | version = "0.48.5" 2485 | source = "registry+https://github.com/rust-lang/crates.io-index" 2486 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2487 | 2488 | [[package]] 2489 | name = "windows_x86_64_gnullvm" 2490 | version = "0.52.0" 2491 | source = "registry+https://github.com/rust-lang/crates.io-index" 2492 | checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" 2493 | 2494 | [[package]] 2495 | name = "windows_x86_64_msvc" 2496 | version = "0.42.2" 2497 | source = "registry+https://github.com/rust-lang/crates.io-index" 2498 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 2499 | 2500 | [[package]] 2501 | name = "windows_x86_64_msvc" 2502 | version = "0.48.5" 2503 | source = "registry+https://github.com/rust-lang/crates.io-index" 2504 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2505 | 2506 | [[package]] 2507 | name = "windows_x86_64_msvc" 2508 | version = "0.52.0" 2509 | source = "registry+https://github.com/rust-lang/crates.io-index" 2510 | checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" 2511 | 2512 | [[package]] 2513 | name = "winnow" 2514 | version = "0.5.34" 2515 | source = "registry+https://github.com/rust-lang/crates.io-index" 2516 | checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" 2517 | dependencies = [ 2518 | "memchr", 2519 | ] 2520 | 2521 | [[package]] 2522 | name = "xattr" 2523 | version = "1.3.1" 2524 | source = "registry+https://github.com/rust-lang/crates.io-index" 2525 | checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" 2526 | dependencies = [ 2527 | "libc", 2528 | "linux-raw-sys", 2529 | "rustix", 2530 | ] 2531 | 2532 | [[package]] 2533 | name = "zeroize" 2534 | version = "1.7.0" 2535 | source = "registry+https://github.com/rust-lang/crates.io-index" 2536 | checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 2537 | --------------------------------------------------------------------------------