From 4e6d29572f88e975bbb3ef3afb4cb29056e34835 Mon Sep 17 00:00:00 2001 From: Chris Greenaway Date: Thu, 25 Jul 2019 14:51:09 +0100 Subject: [PATCH] Fixes issue #131 - handle renamed dependencies --- src/main.rs | 39 ++++++++++++++++++++------------ tests/all.rs | 64 +++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 77 insertions(+), 26 deletions(-) diff --git a/src/main.rs b/src/main.rs index 51eeef8..2463881 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,6 +46,7 @@ struct RegistryDependency { default_features: bool, target: Option, kind: Option, + package: Option } fn main() { @@ -295,21 +296,29 @@ fn registry_pkg(pkg: &Package, resolve: &Resolve) -> RegistryPackage { let mut deps = pkg .dependencies() .iter() - .map(|dep| RegistryDependency { - name: dep.package_name().to_string(), - req: dep.version_req().to_string(), - features: dep.features().iter().map(|s| s.to_string()).collect(), - optional: dep.is_optional(), - default_features: dep.uses_default_features(), - target: dep.platform().map(|platform| match *platform { - Platform::Name(ref s) => s.to_string(), - Platform::Cfg(ref s) => format!("cfg({})", s), - }), - kind: match dep.kind() { - Kind::Normal => None, - Kind::Development => Some("dev".to_string()), - Kind::Build => Some("build".to_string()), - }, + .map(|dep| { + let (name, package) = match &dep.explicit_name_in_toml() { + Some(explicit) => (explicit.to_string(), Some(dep.package_name().to_string())), + None => (dep.package_name().to_string(), None), + }; + + RegistryDependency { + name, + req: dep.version_req().to_string(), + features: dep.features().iter().map(|s| s.to_string()).collect(), + optional: dep.is_optional(), + default_features: dep.uses_default_features(), + target: dep.platform().map(|platform| match *platform { + Platform::Name(ref s) => s.to_string(), + Platform::Cfg(ref s) => format!("cfg({})", s), + }), + kind: match dep.kind() { + Kind::Normal => None, + Kind::Development => Some("dev".to_string()), + Kind::Build => Some("build".to_string()), + }, + package, + } }) .collect::>(); deps.sort(); diff --git a/tests/all.rs b/tests/all.rs index 244f501..231d58e 100644 --- a/tests/all.rs +++ b/tests/all.rs @@ -240,7 +240,7 @@ dependencies = [ contents.clear(); File::open(registry.join("index/fi/le/filetime")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"filetime","vers":"0.1.10","deps":[{"name":"libc","req":"^0.2","features":[],"optional":false,"default_features":true,"target":null,"kind":null},{"name":"tempdir","req":"^0.3","features":[],"optional":false,"default_features":true,"target":null,"kind":"dev"}],"cksum":"5363ab8e4139b8568a6237db5248646e5a8a2f89bd5ccb02092182b11fd3e922","features":{},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"filetime","vers":"0.1.10","deps":[{"name":"libc","req":"^0.2","features":[],"optional":false,"default_features":true,"target":null,"kind":null,"package":null},{"name":"tempdir","req":"^0.3","features":[],"optional":false,"default_features":true,"target":null,"kind":"dev","package":null}],"cksum":"5363ab8e4139b8568a6237db5248646e5a8a2f89bd5ccb02092182b11fd3e922","features":{},"yanked":false}"#); File::create(&lock).unwrap().write_all(br#" [[package]] @@ -312,12 +312,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" let mut contents = String::new(); let path = registry.join("index/in/fl/inflector"); let path = fs::canonicalize(path).unwrap(); - + assert_eq!(path.file_name().unwrap(), "inflector"); File::open(registry.join("index/in/fl/inflector")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"Inflector","vers":"0.11.3","deps":[{"name":"lazy_static","req":"^1.0.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null},{"name":"regex","req":"^1.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null}],"cksum":"4467f98bb61f615f8273359bf1c989453dfc1ea4a45ae9298f1dcd0672febe5d","features":{"default":["heavyweight"],"heavyweight":["lazy_static","regex"],"unstable":[]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"Inflector","vers":"0.11.3","deps":[{"name":"lazy_static","req":"^1.0.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null},{"name":"regex","req":"^1.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null}],"cksum":"4467f98bb61f615f8273359bf1c989453dfc1ea4a45ae9298f1dcd0672febe5d","features":{"default":["heavyweight"],"heavyweight":["lazy_static","regex"],"unstable":[]},"yanked":false}"#); +} + +#[test] +fn renamed() { + let td = TempDir::new().unwrap(); + let lock = td.path().join("Cargo.lock"); + let registry = td.path().join("registry"); + fs::create_dir(td.path().join("src")).unwrap(); + File::create(&td.path().join("Cargo.toml")).unwrap().write_all(br#" + [package] + name = "foo" + version = "0.1.0" + authors = [] + + [dependencies] + rustc-demangle = "0.1.14" + "#).unwrap(); + File::create(&td.path().join("src/lib.rs")).unwrap().write_all(b"").unwrap(); + File::create(&lock).unwrap().write_all(br#" +[[package]] +name = "foo" +version = "0.1.0" +dependencies = [ + "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +"#).unwrap(); + run(cmd().arg(®istry).arg("--sync").arg(&lock)); + + let mut contents = String::new(); + let path = registry.join("index/ru/st/rustc-demangle"); + let path = fs::canonicalize(path).unwrap(); + + assert_eq!(path.file_name().unwrap(), "rustc-demangle"); + + File::open(registry.join("index/ru/st/rustc-demangle")).unwrap() + .read_to_string(&mut contents).unwrap(); + assert_eq!(contents, r#"{"name":"rustc-demangle","vers":"0.1.14","deps":[{"name":"compiler_builtins","req":"^0.1.2","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null},{"name":"core","req":"^1.0.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":"rustc-std-workspace-core"}],"cksum":"ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288","features":{"rustc-dep-of-std":["compiler_builtins","core"]},"yanked":false}"#); } #[test] @@ -368,12 +410,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" let mut contents = String::new(); File::open(registry.join("index/la/zy/lazy_static")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"lazy_static","vers":"0.2.11","deps":[{"name":"compiletest_rs","req":"^0.3","features":[],"optional":true,"default_features":true,"target":null,"kind":null},{"name":"spin","req":"^0.4.6","features":[],"optional":true,"default_features":true,"target":null,"kind":null}],"cksum":"76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73","features":{"compiletest":["compiletest_rs"],"nightly":[],"spin_no_std":["nightly","spin"]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"lazy_static","vers":"0.2.11","deps":[{"name":"compiletest_rs","req":"^0.3","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null},{"name":"spin","req":"^0.4.6","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null}],"cksum":"76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73","features":{"compiletest":["compiletest_rs"],"nightly":[],"spin_no_std":["nightly","spin"]},"yanked":false}"#); contents.clear(); File::open(registry.join("index/la/ng/language-tags")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"language-tags","vers":"0.2.2","deps":[{"name":"heapsize","req":">= 0.2.2, < 0.4","features":[],"optional":true,"default_features":true,"target":null,"kind":null},{"name":"heapsize_plugin","req":"^0.1.2","features":[],"optional":true,"default_features":true,"target":null,"kind":null}],"cksum":"a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a","features":{"heap_size":["heapsize","heapsize_plugin"]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"language-tags","vers":"0.2.2","deps":[{"name":"heapsize","req":">= 0.2.2, < 0.4","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null},{"name":"heapsize_plugin","req":"^0.1.2","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null}],"cksum":"a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a","features":{"heap_size":["heapsize","heapsize_plugin"]},"yanked":false}"#); // Modify the Cargo.toml to swap an existing library, add a new one and delete another File::create(&td.path().join("Cargo.toml")).unwrap().write_all(br#" @@ -422,18 +464,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" contents.clear(); File::open(registry.join("index/la/zy/lazy_static")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"lazy_static","vers":"0.2.11","deps":[{"name":"compiletest_rs","req":"^0.3","features":[],"optional":true,"default_features":true,"target":null,"kind":null},{"name":"spin","req":"^0.4.6","features":[],"optional":true,"default_features":true,"target":null,"kind":null}],"cksum":"76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73","features":{"compiletest":["compiletest_rs"],"nightly":[],"spin_no_std":["nightly","spin"]},"yanked":false} -{"name":"lazy_static","vers":"1.2.0","deps":[{"name":"spin","req":"^0.4.10","features":["once"],"optional":true,"default_features":false,"target":null,"kind":null}],"cksum":"a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1","features":{"nightly":[],"spin_no_std":["spin"]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"lazy_static","vers":"0.2.11","deps":[{"name":"compiletest_rs","req":"^0.3","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null},{"name":"spin","req":"^0.4.6","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null}],"cksum":"76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73","features":{"compiletest":["compiletest_rs"],"nightly":[],"spin_no_std":["nightly","spin"]},"yanked":false} +{"name":"lazy_static","vers":"1.2.0","deps":[{"name":"spin","req":"^0.4.10","features":["once"],"optional":true,"default_features":false,"target":null,"kind":null,"package":null}],"cksum":"a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1","features":{"nightly":[],"spin_no_std":["spin"]},"yanked":false}"#); contents.clear(); File::open(registry.join("index/la/zy/lazycell")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"lazycell","vers":"1.2.1","deps":[{"name":"clippy","req":"^0.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null}],"cksum":"b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f","features":{"nightly":[],"nightly-testing":["clippy","nightly"]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"lazycell","vers":"1.2.1","deps":[{"name":"clippy","req":"^0.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null}],"cksum":"b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f","features":{"nightly":[],"nightly-testing":["clippy","nightly"]},"yanked":false}"#); contents.clear(); File::open(registry.join("index/la/ng/language-tags")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"language-tags","vers":"0.2.2","deps":[{"name":"heapsize","req":">= 0.2.2, < 0.4","features":[],"optional":true,"default_features":true,"target":null,"kind":null},{"name":"heapsize_plugin","req":"^0.1.2","features":[],"optional":true,"default_features":true,"target":null,"kind":null}],"cksum":"a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a","features":{"heap_size":["heapsize","heapsize_plugin"]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"language-tags","vers":"0.2.2","deps":[{"name":"heapsize","req":">= 0.2.2, < 0.4","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null},{"name":"heapsize_plugin","req":"^0.1.2","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null}],"cksum":"a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a","features":{"heap_size":["heapsize","heapsize_plugin"]},"yanked":false}"#); // Run for the third time -- delete unused (default) run(cmd().arg(®istry).arg("--sync").arg(&lock)); @@ -451,12 +493,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" contents.clear(); File::open(registry.join("index/la/zy/lazy_static")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"lazy_static","vers":"1.2.0","deps":[{"name":"spin","req":"^0.4.10","features":["once"],"optional":true,"default_features":false,"target":null,"kind":null}],"cksum":"a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1","features":{"nightly":[],"spin_no_std":["spin"]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"lazy_static","vers":"1.2.0","deps":[{"name":"spin","req":"^0.4.10","features":["once"],"optional":true,"default_features":false,"target":null,"kind":null,"package":null}],"cksum":"a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1","features":{"nightly":[],"spin_no_std":["spin"]},"yanked":false}"#); contents.clear(); File::open(registry.join("index/la/zy/lazycell")).unwrap() .read_to_string(&mut contents).unwrap(); - assert_eq!(contents, r#"{"name":"lazycell","vers":"1.2.1","deps":[{"name":"clippy","req":"^0.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null}],"cksum":"b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f","features":{"nightly":[],"nightly-testing":["clippy","nightly"]},"yanked":false}"#); + assert_eq!(contents, r#"{"name":"lazycell","vers":"1.2.1","deps":[{"name":"clippy","req":"^0.0","features":[],"optional":true,"default_features":true,"target":null,"kind":null,"package":null}],"cksum":"b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f","features":{"nightly":[],"nightly-testing":["clippy","nightly"]},"yanked":false}"#); } fn run(cmd: &mut Command) -> String {