aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver/pool_optimizer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/dependency_resolver/pool_optimizer.rs')
-rw-r--r--crates/shirabe/src/dependency_resolver/pool_optimizer.rs56
1 files changed, 31 insertions, 25 deletions
diff --git a/crates/shirabe/src/dependency_resolver/pool_optimizer.rs b/crates/shirabe/src/dependency_resolver/pool_optimizer.rs
index 094bd8d..5307a1c 100644
--- a/crates/shirabe/src/dependency_resolver/pool_optimizer.rs
+++ b/crates/shirabe/src/dependency_resolver/pool_optimizer.rs
@@ -16,6 +16,7 @@ use crate::dependency_resolver::pool::Pool;
use crate::dependency_resolver::request::Request;
use crate::package::alias_package::AliasPackage;
use crate::package::base_package::BasePackage;
+use crate::package::package_interface::PackageInterface;
use crate::package::version::version_parser::VersionParser;
/// Optimizes a given pool
@@ -97,7 +98,7 @@ impl PoolOptimizer {
// Mark fixed or locked packages as irremovable
for (_, package) in request.get_fixed_or_locked_packages() {
irremovable_package_constraint_groups
- .entry(package.get_name().to_string())
+ .entry(PackageInterface::get_name(package.as_ref()).to_string())
.or_insert_with(Vec::new)
.push(Box::new(Constraint::new("==", package.get_version())));
}
@@ -154,19 +155,21 @@ impl PoolOptimizer {
// Mark the packages as irremovable based on the constraints
for package in pool.get_packages() {
- if !irremovable_package_constraints.contains_key(package.get_name()) {
+ if !irremovable_package_constraints
+ .contains_key(PackageInterface::get_name(package.as_ref()))
+ {
continue;
}
let constraint = irremovable_package_constraints
- .get(package.get_name())
+ .get(PackageInterface::get_name(package.as_ref()))
.unwrap();
if CompilingMatcher::r#match(
constraint.as_ref(),
Constraint::OP_EQ,
package.get_version(),
) {
- self.mark_package_irremovable(package);
+ self.mark_package_irremovable(package.as_ref());
}
}
}
@@ -179,13 +182,13 @@ impl PoolOptimizer {
self.mark_package_irremovable(alias_pkg.get_alias_of());
}
// PHP: foreach ($this->aliasesPerPackage[$package->id] as $aliasPackage)
- let aliases = self
+ let alias_ids: Vec<i64> = self
.aliases_per_package
.get(&package.id)
- .cloned()
+ .map(|aliases| aliases.iter().map(|a| a.id).collect())
.unwrap_or_default();
- for alias_package in aliases {
- self.irremovable_packages.insert(alias_package.id, true);
+ for alias_id in alias_ids {
+ self.irremovable_packages.insert(alias_id, true);
}
}
@@ -198,7 +201,7 @@ impl PoolOptimizer {
packages.push(package.clone_box());
} else {
removed_versions
- .entry(package.get_name().to_string())
+ .entry(PackageInterface::get_name(package.as_ref()).to_string())
.or_insert_with(IndexMap::new)
.insert(
package.get_version().to_string(),
@@ -241,7 +244,7 @@ impl PoolOptimizer {
self.mark_package_for_removal(package.id)?;
- let dependency_hash = self.calculate_dependency_hash(package);
+ let dependency_hash = self.calculate_dependency_hash(package.as_ref());
for package_name in package.get_names(false) {
if !self
@@ -344,9 +347,9 @@ impl PoolOptimizer {
literals.push(package.id);
}
- for preferred_literal in self
- .policy
- .select_preferred_packages(pool, literals.clone())
+ for preferred_literal in
+ self.policy
+ .select_preferred_packages(pool, literals.clone(), None)
{
self.keep_package(
&pool.literal_to_package(preferred_literal),
@@ -488,17 +491,17 @@ impl PoolOptimizer {
}
}
- let aliases = self
+ let alias_info: Vec<(i64, Vec<String>)> = self
.aliases_per_package
.get(&package.id)
- .cloned()
+ .map(|aliases| aliases.iter().map(|a| (a.id, a.get_names(false))).collect())
.unwrap_or_default();
- for alias_package in aliases {
- self.packages_to_remove.shift_remove(&alias_package.id);
+ for (alias_id, alias_names) in alias_info {
+ self.packages_to_remove.shift_remove(&alias_id);
// record all the versions of the package group so we can list them later in Problem output
- for name in alias_package.get_names(false) {
- if let Some(per_name) = package_identical_definition_lookup.get(&alias_package.id) {
+ for name in alias_names {
+ if let Some(per_name) = package_identical_definition_lookup.get(&alias_id) {
if let Some(package_group_pointers) = per_name.get(&name) {
let package_group = identical_definitions_per_package
.get(&name)
@@ -520,7 +523,7 @@ impl PoolOptimizer {
pkg.clone_box()
};
self.removed_versions_by_package
- .entry(spl_object_hash(alias_package.as_ref()))
+ .entry(format!("alias-{}", alias_id))
.or_insert_with(IndexMap::new)
.insert(
pkg.get_version().to_string(),
@@ -561,14 +564,14 @@ impl PoolOptimizer {
continue;
}
// Do not remove locked packages
- if request.is_fixed_package(package)
+ if request.is_fixed_package(package.as_ref())
|| request.is_locked_package(todo!("package as &dyn PackageInterface"))
{
continue;
}
package_index
- .entry(package.get_name().to_string())
+ .entry(PackageInterface::get_name(package.as_ref()).to_string())
.or_insert_with(IndexMap::new)
.insert(package.id, package.clone_box());
}
@@ -603,13 +606,16 @@ impl PoolOptimizer {
.map(|m| m.keys().copied().collect())
.unwrap_or_default();
for id in ids {
- let required_pkg = package_index.get(require).unwrap().get(&id).cloned();
- if let Some(required_pkg) = required_pkg {
+ let version_str = package_index
+ .get(require)
+ .and_then(|m| m.get(&id))
+ .map(|p| p.get_version().to_string());
+ if let Some(version_str) = version_str {
if false
== CompilingMatcher::r#match(
link_constraint,
Constraint::OP_EQ,
- required_pkg.get_version(),
+ &version_str,
)
{
// TODO(phase-b): mark_package_for_removal returns Result; ignoring here