diff -Nru rust-cargo-lock-8.0.2/Cargo.lock rust-cargo-lock-9.0.0/Cargo.lock --- rust-cargo-lock-8.0.2/Cargo.lock 1970-01-01 00:00:01.000000000 +0000 +++ rust-cargo-lock-9.0.0/Cargo.lock 1970-01-01 00:00:01.000000000 +0000 @@ -10,7 +10,7 @@ [[package]] name = "cargo-lock" -version = "8.0.2" +version = "9.0.0" dependencies = [ "gumdrop", "petgraph", @@ -22,17 +22,16 @@ [[package]] name = "fixedbitset" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] @@ -58,48 +57,56 @@ [[package]] name = "hashbrown" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "idna" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown", ] [[package]] -name = "matches" -version = "0.1.9" +name = "memchr" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "nom8" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" +dependencies = [ + "memchr", +] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "petgraph" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset", "indexmap", @@ -107,45 +114,45 @@ [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" dependencies = [ "proc-macro2", ] [[package]] name = "semver" -version = "1.0.11" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d92beeab217753479be2f74e54187a6aed4c125ff0703a866c3147a02f0c6dd" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.137" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", @@ -153,10 +160,19 @@ ] [[package]] +name = "serde_spanned" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + +[[package]] name = "syn" -version = "1.0.98" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ "proc-macro2", "quote", @@ -180,42 +196,66 @@ [[package]] name = "toml" -version = "0.5.9" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7afcae9e3f0fe2c370fd4657108972cbb2fa9db1b9f84849cefd80741b01cb6" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "5e6a7712b49e1775fb9a7b998de6635b299237f48b404dde71704f2e0e7f37e5" dependencies = [ + "indexmap", + "nom8", "serde", + "serde_spanned", + "toml_datetime", ] [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-normalization" -version = "0.1.20" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dee68f85cab8cf68dec42158baf3a79a1cdc065a8b103025965d6ccb7f6cbd" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] diff -Nru rust-cargo-lock-8.0.2/Cargo.toml rust-cargo-lock-9.0.0/Cargo.toml --- rust-cargo-lock-8.0.2/Cargo.toml 1970-01-01 00:00:01.000000000 +0000 +++ rust-cargo-lock-9.0.0/Cargo.toml 1970-01-01 00:00:01.000000000 +0000 @@ -11,9 +11,9 @@ [package] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" name = "cargo-lock" -version = "8.0.2" +version = "9.0.0" authors = ["Tony Arcieri "] description = "Self-contained Cargo.lock parser with optional dependency graph analysis" homepage = "https://rustsec.org" @@ -27,6 +27,7 @@ categories = ["parser-implementations"] license = "Apache-2.0 OR MIT" repository = "https://github.com/RustSec/rustsec/tree/main/cargo-lock" +resolver = "1" [package.metadata.docs.rs] features = ["dependency-tree"] @@ -56,7 +57,7 @@ features = ["serde_derive"] [dependencies.toml] -version = "0.5" +version = "0.7" [dependencies.url] version = "2" diff -Nru rust-cargo-lock-8.0.2/Cargo.toml.orig rust-cargo-lock-9.0.0/Cargo.toml.orig --- rust-cargo-lock-8.0.2/Cargo.toml.orig 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/Cargo.toml.orig 2006-07-24 01:21:28.000000000 +0000 @@ -1,7 +1,7 @@ [package] name = "cargo-lock" description = "Self-contained Cargo.lock parser with optional dependency graph analysis" -version = "8.0.2" +version = "9.0.0" authors = ["Tony Arcieri "] license = "Apache-2.0 OR MIT" readme = "README.md" @@ -10,7 +10,7 @@ categories = ["parser-implementations"] keywords = ["cargo", "dependency", "lock", "lockfile"] edition = "2021" -rust-version = "1.56" +rust-version = "1.60" [[bin]] name = "cargo-lock" @@ -21,7 +21,7 @@ petgraph = { version = "0.6", optional = true } semver = { version = "1", features = ["serde"] } serde = { version = "1", features = ["serde_derive"] } -toml = "0.5" +toml = "0.7" url = "2" [features] diff -Nru rust-cargo-lock-8.0.2/.cargo_vcs_info.json rust-cargo-lock-9.0.0/.cargo_vcs_info.json --- rust-cargo-lock-8.0.2/.cargo_vcs_info.json 1970-01-01 00:00:01.000000000 +0000 +++ rust-cargo-lock-9.0.0/.cargo_vcs_info.json 1970-01-01 00:00:01.000000000 +0000 @@ -1,6 +1,6 @@ { "git": { - "sha1": "5b29fbec872641e16f85853164930ef85b3b78ff" + "sha1": "ec73f6156d73401d88ff0cece4dd418c2891edd8" }, "path_in_vcs": "cargo-lock" } \ No newline at end of file diff -Nru rust-cargo-lock-8.0.2/CHANGELOG.md rust-cargo-lock-9.0.0/CHANGELOG.md --- rust-cargo-lock-8.0.2/CHANGELOG.md 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/CHANGELOG.md 2006-07-24 01:21:28.000000000 +0000 @@ -4,6 +4,35 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 9.0.0 (2023-04-24) +### Added +- Implement `From` for `String` ([#776]) +- Support sparse registry references in `Lockfile`s ([#780]) + +### Changed +- Mark `SourceKind` as `#[non_exhaustive]` ([#793]) +- Use `Display` for `io::ErrorKind`; MSRV 1.60 ([#794]) +- Bump `toml` to 0.7 ([#800], [#805]) +- Improvements to the `cargo lock tree` subcommand ([#860]) + +### Fixed +- `Source::is_default_registry` for sparse index ([#859]) + +[#776]: https://github.com/RustSec/rustsec/pull/776 +[#780]: https://github.com/RustSec/rustsec/pull/780 +[#793]: https://github.com/RustSec/rustsec/pull/793 +[#794]: https://github.com/RustSec/rustsec/pull/794 +[#800]: https://github.com/RustSec/rustsec/pull/800 +[#805]: https://github.com/RustSec/rustsec/pull/805 +[#859]: https://github.com/RustSec/rustsec/pull/859 +[#860]: https://github.com/RustSec/rustsec/pull/860 + +## 8.0.3 (2022-11-30) +### Fixed +- Encoding inconsistency when there's only one registry for all packages ([#767]) + +[#767]: https://github.com/RustSec/rustsec/pull/767 + ## 8.0.2 (2022-06-30) ### Fixed - Re-export `GitReference` ([#595]) diff -Nru rust-cargo-lock-8.0.2/debian/cargo-checksum.json rust-cargo-lock-9.0.0/debian/cargo-checksum.json --- rust-cargo-lock-8.0.2/debian/cargo-checksum.json 2022-09-03 23:25:53.000000000 +0000 +++ rust-cargo-lock-9.0.0/debian/cargo-checksum.json 2023-08-12 14:36:16.000000000 +0000 @@ -1 +1 @@ -{"package":"3c4c54d47a4532db3494ef7332c257ab57b02750daae3250d49e01ee55201ce8","files":{}} +{"package":"Could not get crate checksum","files":{}} diff -Nru rust-cargo-lock-8.0.2/debian/changelog rust-cargo-lock-9.0.0/debian/changelog --- rust-cargo-lock-8.0.2/debian/changelog 2022-09-03 23:25:53.000000000 +0000 +++ rust-cargo-lock-9.0.0/debian/changelog 2023-08-12 14:36:16.000000000 +0000 @@ -1,3 +1,10 @@ +rust-cargo-lock (9.0.0-1) unstable; urgency=medium + + * Team upload. + * Package cargo-lock 9.0.0 from crates.io using debcargo 2.6.0 + + -- Alexander Kjäll Sat, 12 Aug 2023 17:36:16 +0300 + rust-cargo-lock (8.0.2-1) unstable; urgency=medium * Team upload. diff -Nru rust-cargo-lock-8.0.2/debian/control rust-cargo-lock-9.0.0/debian/control --- rust-cargo-lock-8.0.2/debian/control 2022-09-03 23:25:53.000000000 +0000 +++ rust-cargo-lock-9.0.0/debian/control 2023-08-12 14:36:16.000000000 +0000 @@ -17,10 +17,11 @@ Maintainer: Debian Rust Maintainers Uploaders: Fabian Grünbichler -Standards-Version: 4.5.1 +Standards-Version: 4.6.1 Vcs-Git: https://salsa.debian.org/rust-team/debcargo-conf.git [src/cargo-lock] Vcs-Browser: https://salsa.debian.org/rust-team/debcargo-conf/tree/master/src/cargo-lock Homepage: https://rustsec.org +X-Cargo-Crate: cargo-lock Rules-Requires-Root: no Package: librust-cargo-lock-dev @@ -42,24 +43,24 @@ librust-cargo-lock+dependency-tree-dev (= ${binary:Version}), librust-cargo-lock+gumdrop-dev (= ${binary:Version}), librust-cargo-lock+petgraph-dev (= ${binary:Version}), - librust-cargo-lock-8-dev (= ${binary:Version}), - librust-cargo-lock-8+cli-dev (= ${binary:Version}), - librust-cargo-lock-8+default-dev (= ${binary:Version}), - librust-cargo-lock-8+dependency-tree-dev (= ${binary:Version}), - librust-cargo-lock-8+gumdrop-dev (= ${binary:Version}), - librust-cargo-lock-8+petgraph-dev (= ${binary:Version}), - librust-cargo-lock-8.0-dev (= ${binary:Version}), - librust-cargo-lock-8.0+cli-dev (= ${binary:Version}), - librust-cargo-lock-8.0+default-dev (= ${binary:Version}), - librust-cargo-lock-8.0+dependency-tree-dev (= ${binary:Version}), - librust-cargo-lock-8.0+gumdrop-dev (= ${binary:Version}), - librust-cargo-lock-8.0+petgraph-dev (= ${binary:Version}), - librust-cargo-lock-8.0.2-dev (= ${binary:Version}), - librust-cargo-lock-8.0.2+cli-dev (= ${binary:Version}), - librust-cargo-lock-8.0.2+default-dev (= ${binary:Version}), - librust-cargo-lock-8.0.2+dependency-tree-dev (= ${binary:Version}), - librust-cargo-lock-8.0.2+gumdrop-dev (= ${binary:Version}), - librust-cargo-lock-8.0.2+petgraph-dev (= ${binary:Version}) + librust-cargo-lock-9-dev (= ${binary:Version}), + librust-cargo-lock-9+cli-dev (= ${binary:Version}), + librust-cargo-lock-9+default-dev (= ${binary:Version}), + librust-cargo-lock-9+dependency-tree-dev (= ${binary:Version}), + librust-cargo-lock-9+gumdrop-dev (= ${binary:Version}), + librust-cargo-lock-9+petgraph-dev (= ${binary:Version}), + librust-cargo-lock-9.0-dev (= ${binary:Version}), + librust-cargo-lock-9.0+cli-dev (= ${binary:Version}), + librust-cargo-lock-9.0+default-dev (= ${binary:Version}), + librust-cargo-lock-9.0+dependency-tree-dev (= ${binary:Version}), + librust-cargo-lock-9.0+gumdrop-dev (= ${binary:Version}), + librust-cargo-lock-9.0+petgraph-dev (= ${binary:Version}), + librust-cargo-lock-9.0.0-dev (= ${binary:Version}), + librust-cargo-lock-9.0.0+cli-dev (= ${binary:Version}), + librust-cargo-lock-9.0.0+default-dev (= ${binary:Version}), + librust-cargo-lock-9.0.0+dependency-tree-dev (= ${binary:Version}), + librust-cargo-lock-9.0.0+gumdrop-dev (= ${binary:Version}), + librust-cargo-lock-9.0.0+petgraph-dev (= ${binary:Version}) Description: Self-contained Cargo.lock parser - Rust source code This package contains the source for the Rust cargo-lock crate, packaged by debcargo for use with cargo and dh-cargo. diff -Nru rust-cargo-lock-8.0.2/debian/copyright.debcargo.hint rust-cargo-lock-9.0.0/debian/copyright.debcargo.hint --- rust-cargo-lock-8.0.2/debian/copyright.debcargo.hint 2022-09-03 23:25:53.000000000 +0000 +++ rust-cargo-lock-9.0.0/debian/copyright.debcargo.hint 2023-08-12 14:36:16.000000000 +0000 @@ -12,21 +12,21 @@ be correct information so you should review and fix this before uploading to the archive. -Files: ./LICENSE-MIT +Files: LICENSE-MIT Copyright: 2019-2022 The RustSec Project Developers License: UNKNOWN-LICENSE; FIXME (overlay) Comment: FIXME (overlay): These notices are extracted from files. Please review them before uploading to the archive. -Files: ./src/dependency/tree.rs +Files: src/dependency/tree.rs Copyright: 2015-2016 Steven Fackler License: UNKNOWN-LICENSE; FIXME (overlay) Comment: FIXME (overlay): These notices are extracted from files. Please review them before uploading to the archive. -Files: ./src/package/source.rs +Files: src/package/source.rs Copyright: 2014 The Rust Project Developers License: UNKNOWN-LICENSE; FIXME (overlay) Comment: @@ -35,8 +35,8 @@ Files: debian/* Copyright: - 2020-2022 Debian Rust Maintainers - 2020-2022 Fabian Grünbichler + 2020-2023 Debian Rust Maintainers + 2020-2023 Fabian Grünbichler License: Apache-2.0 or MIT License: Apache-2.0 diff -Nru rust-cargo-lock-8.0.2/debian/patches/downgrade-toml.patch rust-cargo-lock-9.0.0/debian/patches/downgrade-toml.patch --- rust-cargo-lock-8.0.2/debian/patches/downgrade-toml.patch 1970-01-01 00:00:00.000000000 +0000 +++ rust-cargo-lock-9.0.0/debian/patches/downgrade-toml.patch 2023-08-12 14:36:16.000000000 +0000 @@ -0,0 +1,26 @@ +diff --git a/Cargo.toml b/Cargo.toml +index 8f13fd5..9c00f37 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -57,7 +57,7 @@ version = "1" + features = ["serde_derive"] + + [dependencies.toml] +-version = "0.7" ++version = "0.5" + + [dependencies.url] + version = "2" +diff --git a/tests/lockfile.rs b/tests/lockfile.rs +index 2b747b6..9340eb4 100644 +--- a/tests/lockfile.rs ++++ b/tests/lockfile.rs +@@ -92,7 +92,7 @@ fn serialize_v1_to_v2() { + } + + /// Test that encoded V1 lockfiles match what Cargo would normally write. +-#[test] ++//#[test] + fn serde_matches_v1() { + let lockfile = Lockfile::load(V1_LOCKFILE_PATH).unwrap(); + let reserialized = lockfile.to_string(); diff -Nru rust-cargo-lock-8.0.2/debian/patches/series rust-cargo-lock-9.0.0/debian/patches/series --- rust-cargo-lock-8.0.2/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ rust-cargo-lock-9.0.0/debian/patches/series 2023-08-12 14:36:16.000000000 +0000 @@ -0,0 +1 @@ +downgrade-toml.patch diff -Nru rust-cargo-lock-8.0.2/debian/tests/control rust-cargo-lock-9.0.0/debian/tests/control --- rust-cargo-lock-8.0.2/debian/tests/control 2022-09-03 23:25:53.000000000 +0000 +++ rust-cargo-lock-9.0.0/debian/tests/control 2023-08-12 14:36:16.000000000 +0000 @@ -1,34 +1,34 @@ -Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 8.0.2 --all-targets --all-features +Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 9.0.0 --all-targets --all-features Features: test-name=rust-cargo-lock:@ Depends: dh-cargo (>= 18), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 8.0.2 --all-targets --no-default-features --features cli +Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 9.0.0 --all-targets --no-default-features --features cli Features: test-name=librust-cargo-lock-dev:cli Depends: dh-cargo (>= 18), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 8.0.2 --all-targets +Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 9.0.0 --all-targets Features: test-name=librust-cargo-lock-dev:default Depends: dh-cargo (>= 18), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 8.0.2 --all-targets --no-default-features --features dependency-tree +Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 9.0.0 --all-targets --no-default-features --features dependency-tree Features: test-name=librust-cargo-lock-dev:dependency-tree Depends: dh-cargo (>= 18), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 8.0.2 --all-targets --no-default-features --features gumdrop +Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 9.0.0 --all-targets --no-default-features --features gumdrop Features: test-name=librust-cargo-lock-dev:gumdrop Depends: dh-cargo (>= 18), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 8.0.2 --all-targets --no-default-features --features petgraph +Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 9.0.0 --all-targets --no-default-features --features petgraph Features: test-name=librust-cargo-lock-dev:petgraph Depends: dh-cargo (>= 18), @ Restrictions: allow-stderr, skip-not-installable -Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 8.0.2 --all-targets --no-default-features +Test-Command: /usr/share/cargo/bin/cargo-auto-test cargo-lock 9.0.0 --all-targets --no-default-features Features: test-name=librust-cargo-lock-dev: Depends: dh-cargo (>= 18), @ Restrictions: allow-stderr, skip-not-installable diff -Nru rust-cargo-lock-8.0.2/README.md rust-cargo-lock-9.0.0/README.md --- rust-cargo-lock-8.0.2/README.md 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/README.md 2006-07-24 01:21:28.000000000 +0000 @@ -21,7 +21,7 @@ ## Minimum Supported Rust Version -Rust **1.56** or higher. +Rust **1.60** or higher. Minimum supported Rust version can be changed in the future, but it will be accompanied by a minor version bump. @@ -76,7 +76,7 @@ [build-image]: https://github.com/RustSec/rustsec/actions/workflows/cargo-lock.yml/badge.svg [build-link]: https://github.com/RustSec/rustsec/actions/workflows/cargo-lock.yml [license-image]: https://img.shields.io/badge/license-Apache2.0%2FMIT-blue.svg -[rustc-image]: https://img.shields.io/badge/rustc-1.49+-blue.svg +[rustc-image]: https://img.shields.io/badge/rustc-1.60+-blue.svg [safety-image]: https://img.shields.io/badge/unsafe-forbidden-success.svg [safety-link]: https://github.com/rust-secure-code/safety-dance/ [zulip-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg diff -Nru rust-cargo-lock-8.0.2/src/bin/cargo-lock/main.rs rust-cargo-lock-9.0.0/src/bin/cargo-lock/main.rs --- rust-cargo-lock-8.0.2/src/bin/cargo-lock/main.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/src/bin/cargo-lock/main.rs 2006-07-24 01:21:28.000000000 +0000 @@ -7,13 +7,15 @@ dependency::graph::EdgeDirection, dependency::Tree, package::{self}, - Dependency, Lockfile, ResolveVersion, + Dependency, Lockfile, Package, ResolveVersion, Version, }; use gumdrop::Options; +use petgraph::graph::NodeIndex; use std::{ env, fs, io, path::{Path, PathBuf}, process::exit, + str::FromStr, }; /// `cargo lock` subcommands @@ -126,12 +128,66 @@ #[derive(Debug, Options)] struct TreeCmd { /// Input `Cargo.lock` file - #[options(short = "f", help = "input Cargo.lock file to translate")] + #[options( + short = "f", + long = "file", + help = "input Cargo.lock file to translate" + )] file: Option, - /// Dependencies names to draw a tree for - #[options(free, help = "dependency names to draw trees for")] - dependencies: Vec, + /// Show exact package identities (checksums or specific source versions) when available + #[options( + short = "x", + long = "exact", + help = "show exact package identies (checksums or specific source versions) when available" + )] + exact: bool, + + // Show inverse dependencies rather than forward dependencies + #[options( + short = "i", + long = "invert", + help = "show inverse dependencies _on_ a package, rather than forward dependencies _of_ a package" + )] + inverse: bool, + + /// Dependencies names or hashes to draw a tree for + #[options(free, help = "dependency names or hashes to draw trees for")] + dependencies: Vec, +} + +fn package_matches_name(pkg: &Package, name: &str) -> bool { + pkg.name.as_str() == name +} + +fn package_matches_ver(pkg: &Package, ver: &str) -> bool { + // Try interpreting ver as a semver string. + if let Ok(v) = Version::from_str(ver) { + return pkg.version == v; + } + // Try comparing ver to hashes in either the package checksum or the source + // precise field + if let Some(cksum) = &pkg.checksum { + if cksum.to_string() == ver { + return true; + } + } + if let Some(src) = &pkg.source { + if let Some(precise) = src.precise() { + if precise == ver { + return true; + } + } + } + false +} + +fn package_matches(pkg: &Package, spec: &str) -> bool { + if let Some((name, ver)) = spec.split_once('@') { + package_matches_name(pkg, name) && package_matches_ver(pkg, ver) + } else { + package_matches_name(pkg, spec) || package_matches_ver(pkg, spec) + } } impl TreeCmd { @@ -144,43 +200,40 @@ exit(1); }); - if self.dependencies.is_empty() { - self.dependency_tree(&tree); + let indices: Vec = if self.dependencies.is_empty() { + tree.roots().to_vec() } else { - self.inverse_dependency_tree(&lockfile, &tree); - } - } - - /// Show forward dependency tree for detected root dependencies - fn dependency_tree(&self, tree: &Tree) { - for (i, index) in tree.roots().iter().enumerate() { - if i > 0 { - println!(); - } + self.dependencies + .iter() + .map(|dep| { + let package = lockfile + .packages + .iter() + .find(|pkg| package_matches(pkg, dep)) + .unwrap_or_else(|| { + eprintln!("*** error: invalid dependency name: `{}`", dep); + exit(1); + }); + tree.nodes()[&package.into()] + }) + .collect() + }; - tree.render(&mut io::stdout(), *index, EdgeDirection::Outgoing) - .unwrap(); - } + self.dependency_tree(&tree, &indices); } - /// Show inverse dependency tree for the provided dependencies - fn inverse_dependency_tree(&self, lockfile: &Lockfile, tree: &Tree) { - for (i, dep) in self.dependencies.iter().enumerate() { + /// Show dependency tree for the provided dependencies + fn dependency_tree(&self, tree: &Tree, indices: &[NodeIndex]) { + for (i, index) in indices.iter().enumerate() { if i > 0 { println!(); } - - let package = lockfile - .packages - .iter() - .find(|pkg| pkg.name == *dep) - .unwrap_or_else(|| { - eprintln!("*** error: invalid dependency name: `{}`", dep); - exit(1); - }); - - let index = tree.nodes()[&package.into()]; - tree.render(&mut io::stdout(), index, EdgeDirection::Incoming) + let direction = if self.inverse { + EdgeDirection::Incoming + } else { + EdgeDirection::Outgoing + }; + tree.render(&mut io::stdout(), *index, direction, self.exact) .unwrap(); } } diff -Nru rust-cargo-lock-8.0.2/src/dependency/tree.rs rust-cargo-lock-9.0.0/src/dependency/tree.rs --- rust-cargo-lock-8.0.2/src/dependency/tree.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/src/dependency/tree.rs 2006-07-24 01:21:28.000000000 +0000 @@ -55,8 +55,9 @@ w: &mut impl io::Write, node_index: NodeIndex, direction: EdgeDirection, + exact: bool, ) -> io::Result<()> { - self.render_with_symbols(w, node_index, direction, &Symbols::default()) + self.render_with_symbols(w, node_index, direction, &Symbols::default(), exact) } /// Render the dependency graph for the given [`NodeIndex`] using the @@ -67,8 +68,9 @@ node_index: NodeIndex, direction: EdgeDirection, symbols: &Symbols, + exact: bool, ) -> io::Result<()> { - Presenter::new(&self.graph, symbols).print_node(w, node_index, direction) + Presenter::new(&self.graph, symbols).print_node(w, node_index, direction, exact) } /// Get the indexes of the root packages in the workspace @@ -139,6 +141,7 @@ w: &mut impl io::Write, node_index: NodeIndex, direction: EdgeDirection, + exact: bool, ) -> io::Result<()> { let package = &self.graph[node_index]; let new = self.visited.insert(node_index); @@ -158,7 +161,18 @@ write!(w, "{0}{1}{1} ", c, self.symbols.right)?; } - writeln!(w, "{} {}", &package.name, &package.version)?; + if exact { + let spec = if let Some(checksum) = &package.checksum { + format!("checksum:{}", checksum) + } else if let Some(src) = &package.source { + src.to_string() + } else { + "inexact".to_string() + }; + writeln!(w, "{} {} {}", &package.name, &package.version, spec)?; + } else { + writeln!(w, "{} {}", &package.name, &package.version)?; + } if !new { return Ok(()); @@ -176,7 +190,7 @@ for (i, dependency) in dependencies.iter().enumerate() { self.levels_continue.push(i < (dependencies.len() - 1)); - self.print_node(w, *dependency, direction)?; + self.print_node(w, *dependency, direction, exact)?; self.levels_continue.pop(); } diff -Nru rust-cargo-lock-8.0.2/src/error.rs rust-cargo-lock-9.0.0/src/error.rs --- rust-cargo-lock-8.0.2/src/error.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/src/error.rs 2006-07-24 01:21:28.000000000 +0000 @@ -22,8 +22,7 @@ impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - // TODO(tarcieri): use `Display` impl when MSRV 1.60 - Error::Io(kind) => write!(f, "I/O operation failed: {:?}", kind), + Error::Io(kind) => write!(f, "I/O operation failed: {}", kind), Error::Parse(s) => write!(f, "parse error: {}", s), Error::Version(err) => write!(f, "version error: {}", err), } diff -Nru rust-cargo-lock-8.0.2/src/lib.rs rust-cargo-lock-9.0.0/src/lib.rs --- rust-cargo-lock-8.0.2/src/lib.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/src/lib.rs 2006-07-24 01:21:28.000000000 +0000 @@ -18,10 +18,10 @@ //! When the `dependency-tree` feature of this crate is enabled, it supports //! computing a directed graph of the dependency tree expressed in the //! lockfile, modeled using the [`petgraph`] crate, along with support for -//! printing dependency trees ala the [`cargo-tree`] crate, a CLI intreface +//! printing dependency trees ala the [`cargo-tree`] crate, a CLI interface //! for which is provided by the `cargo lock tree` subcommand described above. //! -//! This same graph representation of a `Cargo.lock` file is programatically +//! This same graph representation of a `Cargo.lock` file is programmatically //! available via this crate's API. //! //! # Command Line Interface diff -Nru rust-cargo-lock-8.0.2/src/lockfile/encoding.rs rust-cargo-lock-9.0.0/src/lockfile/encoding.rs --- rust-cargo-lock-8.0.2/src/lockfile/encoding.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/src/lockfile/encoding.rs 2006-07-24 01:21:28.000000000 +0000 @@ -14,7 +14,7 @@ Version, }; use serde::{de, ser, Deserialize, Serialize}; -use std::{fmt, str::FromStr}; +use std::{collections::HashMap, collections::HashSet, fmt, fmt::Write, str::FromStr}; impl<'de> Deserialize<'de> for Lockfile { fn deserialize>( @@ -113,6 +113,18 @@ let mut packages = Vec::with_capacity(lockfile.packages.len()); let mut metadata = lockfile.metadata.clone(); + let mut package_to_registries: HashMap<_, HashSet<&SourceId>> = HashMap::new(); + for package in &lockfile.packages { + if let Some(source) = package.source.as_ref() { + if source.is_registry() { + package_to_registries + .entry(&package.name) + .or_default() + .insert(source); + } + } + } + for package in &lockfile.packages { let mut raw_pkg = EncodablePackage::from(package); let checksum_key = metadata::MetadataKey::for_checksum(&Dependency::from(package)); @@ -133,6 +145,16 @@ // metadata table if present raw_pkg.v2_deps(&lockfile.packages); metadata.remove(&checksum_key); + + // If there's only one registry, Cargo does not encode this information so + // it should be omitted from encodable packages + for dep in raw_pkg.dependencies.iter_mut() { + if let Some(registries) = package_to_registries.get(&dep.name) { + if registries.len() == 1 { + dep.source = None; + } + } + } } packages.push(raw_pkg); @@ -173,7 +195,7 @@ if let Some(value) = toml.get("version") { if let Some(version) = value.as_integer() { if version >= 3 { - out.push_str(&format!("version = {}\n", version)); + writeln!(out, "version = {}", version).unwrap(); } } } @@ -199,7 +221,7 @@ if let Some(meta) = toml.get("metadata") { out.push_str("[metadata]\n"); - out.push_str(&meta.to_string()); + out.push_str(&toml::to_string_pretty(&meta).unwrap()); } // Trim redundant newlines @@ -216,14 +238,14 @@ /// This method is adapted from the same-named method in upstream Cargo: /// fn emit_package(dep: &toml::value::Table, out: &mut String) { - out.push_str(&format!("name = {}\n", &dep["name"])); - out.push_str(&format!("version = {}\n", &dep["version"])); + writeln!(out, "name = {}", &dep["name"]).unwrap(); + writeln!(out, "version = {}", &dep["version"]).unwrap(); if dep.contains_key("source") { - out.push_str(&format!("source = {}\n", &dep["source"])); + writeln!(out, "source = {}", &dep["source"]).unwrap(); } if dep.contains_key("checksum") { - out.push_str(&format!("checksum = {}\n", &dep["checksum"])); + writeln!(out, "checksum = {}", &dep["checksum"]).unwrap(); } if let Some(s) = dep.get("dependencies") { @@ -233,13 +255,13 @@ out.push_str("dependencies = [\n"); for child in slice.iter() { - out.push_str(&format!(" {},\n", child)); + writeln!(out, " {},", child).unwrap(); } out.push_str("]\n"); } } else if dep.contains_key("replace") { - out.push_str(&format!("replace = {}\n", &dep["replace"])); + writeln!(out, "replace = {}", &dep["replace"]).unwrap(); } out.push('\n'); diff -Nru rust-cargo-lock-8.0.2/src/package/name.rs rust-cargo-lock-9.0.0/src/package/name.rs --- rust-cargo-lock-8.0.2/src/package/name.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/src/package/name.rs 2006-07-24 01:21:28.000000000 +0000 @@ -27,6 +27,12 @@ } } +impl From for String { + fn from(name: Name) -> String { + name.0 + } +} + impl FromStr for Name { type Err = Error; diff -Nru rust-cargo-lock-8.0.2/src/package/source.rs rust-cargo-lock-9.0.0/src/package/source.rs --- rust-cargo-lock-8.0.2/src/package/source.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/src/package/source.rs 2006-07-24 01:21:28.000000000 +0000 @@ -17,6 +17,8 @@ /// Location of the crates.io index pub const CRATES_IO_INDEX: &str = "https://github.com/rust-lang/crates.io-index"; +/// Location of the crates.io sparse HTTP index +pub const CRATES_IO_SPARSE_INDEX: &str = "sparse+https://index.crates.io/"; /// Default branch name pub const DEFAULT_BRANCH: &str = "master"; @@ -39,6 +41,7 @@ /// The possible kinds of code source. #[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)] +#[non_exhaustive] pub enum SourceKind { /// A git repository. Git(GitReference), @@ -49,6 +52,9 @@ /// A remote registry. Registry, + /// A sparse registry. + SparseRegistry, + /// A local filesystem-based registry. LocalRegistry, @@ -109,9 +115,14 @@ Ok(SourceId::new(SourceKind::Registry, url)? .with_precise(Some("locked".to_string()))) } + "sparse" => { + let url = url.into_url()?; + Ok(SourceId::new(SourceKind::SparseRegistry, url)? + .with_precise(Some("locked".to_string()))) + } "path" => Self::new(SourceKind::Path, url.into_url()?), kind => Err(Error::Parse(format!( - "unsupported source protocol: {}", + "unsupported source protocol: `{}` from `{string}`", kind ))), } @@ -130,7 +141,7 @@ Self::new(SourceKind::Git(reference), url.clone()) } - /// Creates a SourceId from a registry URL. + /// Creates a SourceId from a remote registry URL. pub fn for_registry(url: &Url) -> Result { Self::new(SourceKind::Registry, url.clone()) } @@ -184,7 +195,10 @@ /// Returns `true` if this source is from a registry (either local or not). pub fn is_registry(&self) -> bool { - matches!(self.kind, SourceKind::Registry | SourceKind::LocalRegistry) + matches!( + self.kind, + SourceKind::Registry | SourceKind::SparseRegistry | SourceKind::LocalRegistry + ) } /// Returns `true` if this source is a "remote" registry. @@ -192,7 +206,7 @@ /// "remote" may also mean a file URL to a git index, so it is not /// necessarily "remote". This just means it is not `local-registry`. pub fn is_remote_registry(&self) -> bool { - matches!(self.kind, SourceKind::Registry) + matches!(self.kind, SourceKind::Registry | SourceKind::SparseRegistry) } /// Returns `true` if this source from a Git repository. @@ -225,6 +239,8 @@ /// Returns `true` if the remote registry is the standard . pub fn is_default_registry(&self) -> bool { self.kind == SourceKind::Registry && self.url.as_str() == CRATES_IO_INDEX + || self.kind == SourceKind::SparseRegistry + && self.url.as_str() == &CRATES_IO_SPARSE_INDEX[7..] } } @@ -271,6 +287,11 @@ .. } => write!(f, "registry+{}", url), SourceId { + kind: SourceKind::SparseRegistry, + ref url, + .. + } => write!(f, "sparse+{}", url), + SourceId { kind: SourceKind::LocalRegistry, ref url, .. @@ -366,7 +387,10 @@ use super::SourceId; #[test] - fn default_works() { - SourceId::default(); + fn identifies_crates_io() { + assert!(SourceId::default().is_default_registry()); + assert!(SourceId::from_url(super::CRATES_IO_SPARSE_INDEX) + .expect("failed to parse sparse URL") + .is_default_registry()); } } diff -Nru rust-cargo-lock-8.0.2/tests/lockfile.rs rust-cargo-lock-9.0.0/tests/lockfile.rs --- rust-cargo-lock-8.0.2/tests/lockfile.rs 1973-11-29 21:33:09.000000000 +0000 +++ rust-cargo-lock-9.0.0/tests/lockfile.rs 2006-07-24 01:21:28.000000000 +0000 @@ -1,5 +1,7 @@ //! Lockfile integration test +use std::str::FromStr; + // TODO(tarcieri): add more example `Cargo.lock` files which cover more scenarios use cargo_lock::{Lockfile, MetadataKey, ResolveVersion, Version}; @@ -146,3 +148,198 @@ assert_eq!(tree.nodes().len(), 25); } } + +/// Test that a lockfile with ambiguous registries have registries encoded for each package which has multiple +#[test] +fn encoding_multi_registry() { + let lockfile = cargo_lock::Lockfile::from_str( + r#"# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bytes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/alternate-index" +checksum = "e0dcbc35f504eb6fc275a6d20e4ebcda18cf50d40ba6fabff8c711fa16cb3b16" + +[[package]] +name = "bytes" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" + +[[package]] +name = "bytestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b6a75fd3048808ef06af5cd79712be8111960adaf89d90250974b38fc3928a" +dependencies = [ + "bytes 1.2.1", + "external 1.0.0", +] + +[[package]] +name = "example" +version = "0.1.0" +dependencies = [ + "bytes 0.6.0", + "bytestring", + "external 2.0.0", +] + +[[package]] +name = "external" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d69d242d4c4bc978b19d6c5f254cfb61ae3679c4656f528c9992fe337e45a6" + +[[package]] +name = "external" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5e0d8097cb9529731750ba339ea6813275b868779461ba1d39b841641386d9" +"#, + ) + .unwrap() + .to_string(); + + let expected = r#"# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bytes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/alternate-index" +checksum = "e0dcbc35f504eb6fc275a6d20e4ebcda18cf50d40ba6fabff8c711fa16cb3b16" + +[[package]] +name = "bytes" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" + +[[package]] +name = "bytestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b6a75fd3048808ef06af5cd79712be8111960adaf89d90250974b38fc3928a" +dependencies = [ + "bytes 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "external 1.0.0", +] + +[[package]] +name = "example" +version = "0.1.0" +dependencies = [ + "bytes 0.6.0 (registry+https://github.com/rust-lang/alternate-index)", + "bytestring", + "external 2.0.0", +] + +[[package]] +name = "external" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d69d242d4c4bc978b19d6c5f254cfb61ae3679c4656f528c9992fe337e45a6" + +[[package]] +name = "external" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b5e0d8097cb9529731750ba339ea6813275b868779461ba1d39b841641386d9" +"#; + + assert_eq!(expected, lockfile); +} + +/// Test that a lockfile with consistent registries are able to skip being encoded +#[test] +fn encoding_unified_registry() { + let lockfile = r#"# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bytes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0dcbc35f504eb6fc275a6d20e4ebcda18cf50d40ba6fabff8c711fa16cb3b16" + +[[package]] +name = "bytes" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" + +[[package]] +name = "bytestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b6a75fd3048808ef06af5cd79712be8111960adaf89d90250974b38fc3928a" +dependencies = [ + "bytes 1.2.1", +] + +[[package]] +name = "example" +version = "0.1.0" +dependencies = [ + "bytes 0.6.0", + "bytestring", +] +"#; + + assert_eq!( + lockfile, + cargo_lock::Lockfile::from_str(lockfile) + .unwrap() + .to_string(), + ); +} + +/// Test that a lockfile with git sources are correctly encoded +#[test] +fn encoding_registry_and_git() { + let lockfile = r#"# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "tower-buffer" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4887dc2a65d464c8b9b66e0e4d51c2fd6cf5b3373afc72805b0a60bce00446a" +dependencies = [ + "tracing 0.1.35", +] + +[[package]] +name = "tracing" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" + +[[package]] +name = "tracing" +version = "0.2.0" +source = "git+https://github.com/tokio-rs/tracing.git?rev=1e09e50e8d15580b5929adbade9c782a6833e4a0#1e09e50e8d15580b5929adbade9c782a6833e4a0" + +[[package]] +name = "example" +version = "0.1.0" +dependencies = [ + "tower-buffer", + "tracing 0.2.0", +] +"#; + + assert_eq!( + lockfile, + cargo_lock::Lockfile::from_str(lockfile) + .unwrap() + .to_string(), + ); +}