From 7fdea814d8ae6937d6961498b0e4ccc35c6f91c3 Mon Sep 17 00:00:00 2001 From: daimond113 Date: Wed, 30 Apr 2025 21:48:42 +0200 Subject: [PATCH] fix: support multiple aliases for one package Previously, if 2 or more aliases resolved to the same package only one would get picked. With this commit, the aliases will now all correctly point to the package. --- CHANGELOG.md | 1 + src/cli/install.rs | 8 ++++---- src/download_and_link.rs | 4 ++-- src/graph.rs | 2 +- src/linking/mod.rs | 2 +- src/resolver.rs | 6 +++--- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71418aa..1252037 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Download engines in install step rather than lazily by @daimond113 - Rewrite dependency type system to solve multiple issues by @daimond113 +- Fix support for different aliases resolving to the same package by @daimond113 ### Performance - Remove unnecessary `Arc`s from codebase by @daimond113 diff --git a/src/cli/install.rs b/src/cli/install.rs index 49a2507..d544ee2 100644 --- a/src/cli/install.rs +++ b/src/cli/install.rs @@ -53,7 +53,7 @@ impl DownloadAndLinkHooks for InstallHooks { let aliases = graph .iter() .flat_map(|(_, node)| node.node.dependencies.iter()) - .filter_map(|(id, (alias, _))| binary_packages.contains(id).then_some(alias.as_str())) + .filter_map(|(alias, (id, _))| binary_packages.contains(id).then_some(alias.as_str())) .chain( graph .iter() @@ -549,7 +549,7 @@ pub fn check_peers_satisfied(graph: &DependencyGraph) { let mut queue = node .dependencies .iter() - .map(|(dep_id, (dep_alias, dep_ty))| (vec![(id, alias)], (dep_id, dep_alias), *dep_ty)) + .map(|(dep_alias, (dep_id, dep_ty))| (vec![(id, alias)], (dep_id, dep_alias), *dep_ty)) .collect::>(); while let Some((path, (dep_id, dep_alias), dep_ty)) = queue.pop() { @@ -563,7 +563,7 @@ pub fn check_peers_satisfied(graph: &DependencyGraph) { .take(2); let satisfied = if iter.len() > 0 { - iter.any(|id| graph[id].dependencies.contains_key(dep_id)) + iter.any(|id| graph[id].dependencies.values().any(|(id, _)| id == dep_id)) } else { graph.get(dep_id).is_some_and(|node| node.direct.is_some()) }; @@ -580,7 +580,7 @@ pub fn check_peers_satisfied(graph: &DependencyGraph) { } queue.extend(graph[dep_id].dependencies.iter().map( - |(inner_dep_id, (inner_dep_alias, inner_dep_ty))| { + |(inner_dep_alias, (inner_dep_id, inner_dep_ty))| { ( path.iter() .copied() diff --git a/src/download_and_link.rs b/src/download_and_link.rs index 6d2f85a..efe3ac1 100644 --- a/src/download_and_link.rs +++ b/src/download_and_link.rs @@ -282,8 +282,8 @@ impl Project { } node.dependencies - .keys() - .filter_map(|id| graph.get(id).map(|node| (id, node))) + .values() + .filter_map(|(id, _)| graph.get(id).map(|node| (id, node))) .for_each(|x| queue.push_back(x)); } diff --git a/src/graph.rs b/src/graph.rs index d5807bd..b2b0418 100644 --- a/src/graph.rs +++ b/src/graph.rs @@ -25,7 +25,7 @@ pub struct DependencyGraphNode { pub direct: Option<(Alias, DependencySpecifiers, DependencyType)>, /// The dependencies of the package #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] - pub dependencies: BTreeMap, + pub dependencies: BTreeMap, /// The package reference pub pkg_ref: PackageRefs, } diff --git a/src/linking/mod.rs b/src/linking/mod.rs index 5d1ac44..45b3a73 100644 --- a/src/linking/mod.rs +++ b/src/linking/mod.rs @@ -307,7 +307,7 @@ impl Project { (container_folder, base_folder) }; - for (dep_id, (dep_alias, _)) in &node.node.dependencies { + for (dep_alias, (dep_id, _)) in &node.node.dependencies { let dep_id = dep_id.clone(); let dep_alias = dep_alias.clone(); let dep_node = graph.get(&dep_id).cloned(); diff --git a/src/resolver.rs b/src/resolver.rs index 2051600..0265554 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -114,7 +114,7 @@ impl Project { let mut queue = node .dependencies .iter() - .map(|(id, (dep_alias, _))| { + .map(|(dep_alias, (id, _))| { (id, vec![alias.to_string(), dep_alias.to_string()]) }) .collect::>(); @@ -137,7 +137,7 @@ impl Project { dep_node .dependencies .iter() - .map(|(id, (alias, _))| { + .map(|(alias, (id, _))| { ( id, path.iter() @@ -277,7 +277,7 @@ impl Project { .get_mut(&dependant_id) .expect("dependant package not found in graph") .dependencies - .insert(package_id.clone(), (alias.clone(), ty)); + .insert(alias.clone(), (package_id.clone(), ty)); } let pkg_ref = &resolved[package_id.version_id()];