aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-sat-resolver
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart-sat-resolver')
-rw-r--r--crates/mozart-sat-resolver/src/pool_builder.rs24
-rw-r--r--crates/mozart-sat-resolver/src/rule_set_generator.rs28
2 files changed, 46 insertions, 6 deletions
diff --git a/crates/mozart-sat-resolver/src/pool_builder.rs b/crates/mozart-sat-resolver/src/pool_builder.rs
index a642fc3..544cac3 100644
--- a/crates/mozart-sat-resolver/src/pool_builder.rs
+++ b/crates/mozart-sat-resolver/src/pool_builder.rs
@@ -15,8 +15,11 @@ pub struct PoolBuilder {
pending_names: VecDeque<String>,
/// Package names that have already been explored (returned by next_pending).
explored_names: HashSet<String>,
- /// Platform packages to ignore.
+ /// Specific platform packages to ignore (from `--ignore-platform-req=name`).
ignore_platform_reqs: HashSet<String>,
+ /// When true, ignore every platform package (php, ext-*, lib-*, composer-*).
+ /// Mirrors `--ignore-platform-reqs` (no value).
+ ignore_all_platform_reqs: bool,
}
impl PoolBuilder {
@@ -27,6 +30,7 @@ impl PoolBuilder {
pending_names: VecDeque::new(),
explored_names: HashSet::new(),
ignore_platform_reqs: HashSet::new(),
+ ignore_all_platform_reqs: false,
}
}
@@ -35,6 +39,22 @@ impl PoolBuilder {
self.ignore_platform_reqs = names;
}
+ /// When set, every platform package is skipped during exploration.
+ pub fn set_ignore_all_platform_reqs(&mut self, ignore_all: bool) {
+ self.ignore_all_platform_reqs = ignore_all;
+ }
+
+ fn is_ignored_platform_dep(&self, name: &str) -> bool {
+ if self
+ .ignore_platform_reqs
+ .iter()
+ .any(|p| mozart_core::matches_wildcard(name, p))
+ {
+ return true;
+ }
+ self.ignore_all_platform_reqs && mozart_core::platform::is_platform_package(name)
+ }
+
/// Add a package version to the builder. Returns true if it's new.
pub fn add_package(&mut self, input: PoolPackageInput) -> bool {
let key = format!("{}@{}", input.name, input.version);
@@ -45,7 +65,7 @@ impl PoolBuilder {
// Queue dependency names for exploration
for link in &input.requires {
- if !self.ignore_platform_reqs.contains(&link.target) {
+ if !self.is_ignored_platform_dep(&link.target) {
self.pending_names.push_back(link.target.clone());
}
}
diff --git a/crates/mozart-sat-resolver/src/rule_set_generator.rs b/crates/mozart-sat-resolver/src/rule_set_generator.rs
index 39d28fd..bc56dff 100644
--- a/crates/mozart-sat-resolver/src/rule_set_generator.rs
+++ b/crates/mozart-sat-resolver/src/rule_set_generator.rs
@@ -13,8 +13,11 @@ pub struct RuleSetGenerator<'a> {
added_map: HashSet<PackageId>,
/// Package names → list of package IDs with that name (non-alias).
added_packages_by_name: HashMap<String, Vec<PackageId>>,
- /// Platform packages to ignore.
+ /// Specific platform packages to ignore (from `--ignore-platform-req=name`).
ignore_platform_reqs: HashSet<String>,
+ /// When true, every platform package is treated as ignored.
+ /// Mirrors `--ignore-platform-reqs` (no value).
+ ignore_all_platform_reqs: bool,
}
impl<'a> RuleSetGenerator<'a> {
@@ -25,6 +28,7 @@ impl<'a> RuleSetGenerator<'a> {
added_map: HashSet::new(),
added_packages_by_name: HashMap::new(),
ignore_platform_reqs: HashSet::new(),
+ ignore_all_platform_reqs: false,
}
}
@@ -33,6 +37,22 @@ impl<'a> RuleSetGenerator<'a> {
self.ignore_platform_reqs = names;
}
+ /// When set, every platform package is treated as ignored.
+ pub fn set_ignore_all_platform_reqs(&mut self, ignore_all: bool) {
+ self.ignore_all_platform_reqs = ignore_all;
+ }
+
+ fn is_ignored_platform_dep(&self, name: &str) -> bool {
+ if self
+ .ignore_platform_reqs
+ .iter()
+ .any(|p| mozart_core::matches_wildcard(name, p))
+ {
+ return true;
+ }
+ self.ignore_all_platform_reqs && mozart_core::platform::is_platform_package(name)
+ }
+
/// Generate rules for a set of requirements and fixed packages.
///
/// Port of Composer's RuleSetGenerator::getRulesFor.
@@ -60,7 +80,7 @@ impl<'a> RuleSetGenerator<'a> {
// Process root requirements
for (name, constraint) in requires {
- if self.ignore_platform_reqs.contains(name.as_str()) {
+ if self.is_ignored_platform_dep(name.as_str()) {
continue;
}
@@ -116,7 +136,7 @@ impl<'a> RuleSetGenerator<'a> {
// Process each requirement
for link in requires {
- if self.ignore_platform_reqs.contains(&link.target) {
+ if self.is_ignored_platform_dep(&link.target) {
continue;
}
@@ -168,7 +188,7 @@ impl<'a> RuleSetGenerator<'a> {
let conflicts = pkg.conflicts.clone();
for link in conflicts {
- if self.ignore_platform_reqs.contains(&link.target) {
+ if self.is_ignored_platform_dep(&link.target) {
continue;
}