From cf51e59e2744d6c8dab70b80fad3fb16c932d81b Mon Sep 17 00:00:00 2001 From: Mara Schulke Date: Wed, 10 Jun 2026 13:14:39 +0200 Subject: [PATCH 1/2] Use btreesets to compare dependencies --- src/lock.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/lock.rs b/src/lock.rs index b9ac10f9..04676bc5 100644 --- a/src/lock.rs +++ b/src/lock.rs @@ -12,7 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{collections::BTreeMap, path::Path}; +use std::{ + collections::{BTreeMap, BTreeSet}, + path::Path, +}; use miette::{Context, IntoDiagnostic, ensure}; use semver::Version; @@ -654,8 +657,11 @@ impl TryFrom> for WorkspaceLockfile { locked.digest ); } - // Dependencies should be identical for same (name, version) - if existing.dependencies != locked.dependencies { + // Dependencies are conceptually an unordered set for a + // given (name, version) — compare without regard to order. + let existing_deps: BTreeSet<_> = existing.dependencies.iter().collect(); + let locked_deps: BTreeSet<_> = locked.dependencies.iter().collect(); + if existing_deps != locked_deps { tracing::warn!( "dependencies mismatch for {}@{}: {:?} vs {:?}. Using first seen.", locked.name, From b82ff084013912b256e9102e1bb563cb73d63087 Mon Sep 17 00:00:00 2001 From: Mara Schulke Date: Wed, 10 Jun 2026 13:21:51 +0200 Subject: [PATCH 2/2] Use hash sets --- src/lock.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lock.rs b/src/lock.rs index 04676bc5..a6b23195 100644 --- a/src/lock.rs +++ b/src/lock.rs @@ -13,7 +13,7 @@ // limitations under the License. use std::{ - collections::{BTreeMap, BTreeSet}, + collections::{BTreeMap, HashSet}, path::Path, }; @@ -42,7 +42,7 @@ pub const LOCKFILE: &str = "Proto.lock"; /// A locked dependency with exact name and version /// /// Serializes as "name version" string (Cargo format) -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum LockedDependency { /// A dependency identified only by name Named { @@ -659,8 +659,8 @@ impl TryFrom> for WorkspaceLockfile { } // Dependencies are conceptually an unordered set for a // given (name, version) — compare without regard to order. - let existing_deps: BTreeSet<_> = existing.dependencies.iter().collect(); - let locked_deps: BTreeSet<_> = locked.dependencies.iter().collect(); + let existing_deps: HashSet<_> = existing.dependencies.iter().collect(); + let locked_deps: HashSet<_> = locked.dependencies.iter().collect(); if existing_deps != locked_deps { tracing::warn!( "dependencies mismatch for {}@{}: {:?} vs {:?}. Using first seen.",