aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-sat-resolver/src/pool_builder.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart-sat-resolver/src/pool_builder.rs')
-rw-r--r--crates/mozart-sat-resolver/src/pool_builder.rs24
1 files changed, 22 insertions, 2 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());
}
}