From b216124157b69edc7330291214a6043c555f0ade Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 2 May 2026 11:19:09 +0900 Subject: feat(resolver): honor --ignore-platform-reqs and wildcard patterns The pool builder and rule-set generator only consulted an exact-match HashSet, so `--ignore-platform-reqs` (no value) and `--ignore-platform-req=ext-foo-*` fell through to the SAT layer and produced "no matching package found" for transitive platform deps. Track the bool flag separately and run each platform name through `mozart_core::matches_wildcard` against the configured patterns. Unblocks four installer fixtures: install-{ignore-platform-package-requirement-wildcard,ignore-platform-package-requirements} update-{ignore-platform-package-requirement-wildcard,ignore-platform-package-requirements}. Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/mozart-sat-resolver/src/pool_builder.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'crates/mozart-sat-resolver/src/pool_builder.rs') 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, /// Package names that have already been explored (returned by next_pending). explored_names: HashSet, - /// Platform packages to ignore. + /// Specific platform packages to ignore (from `--ignore-platform-req=name`). ignore_platform_reqs: HashSet, + /// 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()); } } -- cgit v1.3.1