aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/canonical_packages_trait.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/repository/canonical_packages_trait.rs')
-rw-r--r--crates/shirabe/src/repository/canonical_packages_trait.rs17
1 files changed, 10 insertions, 7 deletions
diff --git a/crates/shirabe/src/repository/canonical_packages_trait.rs b/crates/shirabe/src/repository/canonical_packages_trait.rs
index 8fae936..3c9c75c 100644
--- a/crates/shirabe/src/repository/canonical_packages_trait.rs
+++ b/crates/shirabe/src/repository/canonical_packages_trait.rs
@@ -14,8 +14,12 @@ pub trait CanonicalPackagesTrait {
// get at most one package of each name, preferring non-aliased ones
let mut packages_by_name: IndexMap<String, Box<dyn PackageInterface>> = IndexMap::new();
for package in packages {
- let name = package.get_name();
- if !packages_by_name.contains_key(&name) || packages_by_name[&name].is_alias_package() {
+ let name = package.get_name().to_string();
+ let prefer_replace = packages_by_name
+ .get(&name)
+ .map(|existing| existing.as_alias_package().is_some())
+ .unwrap_or(true);
+ if prefer_replace {
packages_by_name.insert(name, package);
}
}
@@ -23,11 +27,10 @@ pub trait CanonicalPackagesTrait {
let mut canonical_packages = Vec::new();
// unfold aliased packages
- for mut package in packages_by_name.into_values() {
- while package.is_alias_package() {
- package = package.get_alias_of();
- }
-
+ for package in packages_by_name.into_values() {
+ // TODO(phase-b): unfolding requires `Box<dyn PackageInterface>` traversal of
+ // `AliasPackage::get_alias_of()` (currently returns `&BasePackage`, not an
+ // ownable trait object). Push the alias as-is for now.
canonical_packages.push(package);
}