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
- 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

View file

@ -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::<Vec<_>>();
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()

View file

@ -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));
}

View file

@ -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<PackageId, (Alias, DependencyType)>,
pub dependencies: BTreeMap<Alias, (PackageId, DependencyType)>,
/// The package reference
pub pkg_ref: PackageRefs,
}

View file

@ -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();

View file

@ -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::<VecDeque<_>>();
@ -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()];