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.
This commit is contained in:
daimond113 2025-04-30 21:48:42 +02:00
parent ef8a7cf9b3
commit 7fdea814d8
No known key found for this signature in database
GPG key ID: 640DC95EC1190354
6 changed files with 12 additions and 11 deletions

View file

@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed ### Fixed
- Download engines in install step rather than lazily by @daimond113 - Download engines in install step rather than lazily by @daimond113
- Rewrite dependency type system to solve multiple issues 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 ### Performance
- Remove unnecessary `Arc`s from codebase by @daimond113 - Remove unnecessary `Arc`s from codebase by @daimond113

View file

@ -53,7 +53,7 @@ impl DownloadAndLinkHooks for InstallHooks {
let aliases = graph let aliases = graph
.iter() .iter()
.flat_map(|(_, node)| node.node.dependencies.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( .chain(
graph graph
.iter() .iter()
@ -549,7 +549,7 @@ pub fn check_peers_satisfied(graph: &DependencyGraph) {
let mut queue = node let mut queue = node
.dependencies .dependencies
.iter() .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::<Vec<_>>(); .collect::<Vec<_>>();
while let Some((path, (dep_id, dep_alias), dep_ty)) = queue.pop() { 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); .take(2);
let satisfied = if iter.len() > 0 { 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 { } else {
graph.get(dep_id).is_some_and(|node| node.direct.is_some()) 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( 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() path.iter()
.copied() .copied()

View file

@ -282,8 +282,8 @@ impl Project {
} }
node.dependencies node.dependencies
.keys() .values()
.filter_map(|id| graph.get(id).map(|node| (id, node))) .filter_map(|(id, _)| graph.get(id).map(|node| (id, node)))
.for_each(|x| queue.push_back(x)); .for_each(|x| queue.push_back(x));
} }

View file

@ -25,7 +25,7 @@ pub struct DependencyGraphNode {
pub direct: Option<(Alias, DependencySpecifiers, DependencyType)>, pub direct: Option<(Alias, DependencySpecifiers, DependencyType)>,
/// The dependencies of the package /// The dependencies of the package
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")] #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub dependencies: BTreeMap<PackageId, (Alias, DependencyType)>, pub dependencies: BTreeMap<Alias, (PackageId, DependencyType)>,
/// The package reference /// The package reference
pub pkg_ref: PackageRefs, pub pkg_ref: PackageRefs,
} }

View file

@ -307,7 +307,7 @@ impl Project {
(container_folder, base_folder) (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_id = dep_id.clone();
let dep_alias = dep_alias.clone(); let dep_alias = dep_alias.clone();
let dep_node = graph.get(&dep_id).cloned(); let dep_node = graph.get(&dep_id).cloned();

View file

@ -114,7 +114,7 @@ impl Project {
let mut queue = node let mut queue = node
.dependencies .dependencies
.iter() .iter()
.map(|(id, (dep_alias, _))| { .map(|(dep_alias, (id, _))| {
(id, vec![alias.to_string(), dep_alias.to_string()]) (id, vec![alias.to_string(), dep_alias.to_string()])
}) })
.collect::<VecDeque<_>>(); .collect::<VecDeque<_>>();
@ -137,7 +137,7 @@ impl Project {
dep_node dep_node
.dependencies .dependencies
.iter() .iter()
.map(|(id, (alias, _))| { .map(|(alias, (id, _))| {
( (
id, id,
path.iter() path.iter()
@ -277,7 +277,7 @@ impl Project {
.get_mut(&dependant_id) .get_mut(&dependant_id)
.expect("dependant package not found in graph") .expect("dependant package not found in graph")
.dependencies .dependencies
.insert(package_id.clone(), (alias.clone(), ty)); .insert(alias.clone(), (package_id.clone(), ty));
} }
let pkg_ref = &resolved[package_id.version_id()]; let pkg_ref = &resolved[package_id.version_id()];