From f801672cf9a86d1098fa38b4d6eca66960b71100 Mon Sep 17 00:00:00 2001 From: Dimitri Wegner Date: Tue, 29 May 2018 10:46:10 +0200 Subject: [PATCH] Compare pkg ids based on their encoding. This comparison is needed, since we want to figure out which packages are duplicate in the lockfile. Package coming from different registries will be different in the lockfile, but not local packages with the same name and version but different path. --- src/cargo/core/resolver/encode.rs | 2 +- src/cargo/core/resolver/mod.rs | 2 +- src/cargo/ops/lockfile.rs | 11 ++++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/cargo/core/resolver/encode.rs b/src/cargo/core/resolver/encode.rs index 36880c1b8..6f9e3d397 100644 --- a/src/cargo/core/resolver/encode.rs +++ b/src/cargo/core/resolver/encode.rs @@ -414,7 +414,7 @@ fn encodable_resolve_node(id: &PackageId, resolve: &Resolve) -> EncodableDepende } } -fn encodable_package_id(id: &PackageId) -> EncodablePackageId { +pub fn encodable_package_id(id: &PackageId) -> EncodablePackageId { EncodablePackageId { name: id.name().to_string(), version: id.version().to_string(), diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index e153daf08..f60560240 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -65,7 +65,7 @@ use self::context::{Activations, Context}; use self::types::{ActivateError, ActivateResult, Candidate, ConflictReason, DepsFrame, GraphNode}; use self::types::{RcVecIter, RegistryQueryer}; -pub use self::encode::{EncodableDependency, EncodablePackageId, EncodableResolve}; +pub use self::encode::{EncodableDependency, EncodablePackageId, EncodableResolve, encodable_package_id}; pub use self::encode::{Metadata, WorkspaceResolve}; pub use self::resolve::{Deps, DepsNotReplaced, Resolve}; pub use self::types::Method; diff --git a/src/cargo/ops/lockfile.rs b/src/cargo/ops/lockfile.rs index c3b648c2e..83bd90695 100644 --- a/src/cargo/ops/lockfile.rs +++ b/src/cargo/ops/lockfile.rs @@ -30,19 +30,20 @@ pub fn load_pkg_lockfile(ws: &Workspace) -> CargoResult> { Ok(resolve) } -fn duplicate_pkg_names(resolve: &Resolve) -> Vec<&'static str> { +fn duplicate_pkgs(resolve: &Resolve) -> Vec<&'static str> { let mut unique_names = HashSet::new(); let mut result = HashSet::new(); for pkg_id in resolve.iter() { - if !unique_names.insert(pkg_id.name()) { + let mut encodable_pkd_id = resolver::encodable_package_id(pkg_id); + if !unique_names.insert(encodable_pkd_id) { result.insert(pkg_id.name().as_str()); } } result.into_iter().collect() } -fn check_duplicate_pkg_names(resolve: &Resolve) -> Result<(), Internal> { - let names = duplicate_pkg_names(resolve); +fn check_duplicate_pkgs(resolve: &Resolve) -> Result<(), Internal> { + let names = duplicate_pkgs(resolve); if names.is_empty() { Ok(()) } else { @@ -63,7 +64,7 @@ pub fn write_pkg_lockfile(ws: &Workspace, resolve: &Resolve) -> CargoResult<()> Ok(s) }); - check_duplicate_pkg_names(resolve).chain_err(|| format!("failed to generate lock file"))?; + check_duplicate_pkgs(resolve).chain_err(|| format!("failed to generate lock file"))?; let toml = toml::Value::try_from(WorkspaceResolve { ws, resolve }).unwrap(); -- 2.30.2