aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-03 11:23:03 +0900
committernsfisis <nsfisis@gmail.com>2026-05-03 11:23:03 +0900
commit30ae6c869adc7f3cb87a4d63edd6d0cda89d571d (patch)
tree44914e0d8d6afc01f3344c1b4d21209477ba592f
parent489d00ca3f096f69f3b05f9564b23bb70a2475c7 (diff)
downloadphp-mozart-30ae6c869adc7f3cb87a4d63edd6d0cda89d571d.tar.gz
php-mozart-30ae6c869adc7f3cb87a4d63edd6d0cda89d571d.tar.zst
php-mozart-30ae6c869adc7f3cb87a4d63edd6d0cda89d571d.zip
feat(resolver): apply config.platform overrides on top of detected platform
Mirrors `Composer\Repository\PlatformRepository`'s `$overrides` handling: each override either replaces a detected platform package version or adds a virtual one (e.g. ext-dummy), and `false` disables the package. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
-rw-r--r--crates/mozart-registry/src/resolver.rs22
-rw-r--r--crates/mozart/src/commands/update.rs11
-rw-r--r--crates/mozart/tests/installer.rs2
3 files changed, 33 insertions, 2 deletions
diff --git a/crates/mozart-registry/src/resolver.rs b/crates/mozart-registry/src/resolver.rs
index da2f444..6499130 100644
--- a/crates/mozart-registry/src/resolver.rs
+++ b/crates/mozart-registry/src/resolver.rs
@@ -295,6 +295,28 @@ impl PlatformConfig {
Self { packages }
}
+ /// Apply `config.platform` overrides on top of the detected packages.
+ ///
+ /// Mirrors `Composer\Repository\PlatformRepository::__construct`'s
+ /// `$overrides` handling: each override either replaces a detected
+ /// package version or adds a virtual one (e.g. `ext-dummy`). A `false`
+ /// value disables the package, removing it from the platform.
+ pub fn apply_overrides(&mut self, overrides: &serde_json::Value) {
+ let Some(obj) = overrides.as_object() else {
+ return;
+ };
+ for (name, value) in obj {
+ let key = name.to_lowercase();
+ if value.as_bool() == Some(false) {
+ self.packages.remove(&key);
+ continue;
+ }
+ if let Some(s) = value.as_str() {
+ self.packages.insert(key, s.to_string());
+ }
+ }
+ }
+
/// Parse platform packages into `Version` values.
pub fn to_versions(&self) -> HashMap<String, Version> {
self.packages
diff --git a/crates/mozart/src/commands/update.rs b/crates/mozart/src/commands/update.rs
index 33b305a..17b7c97 100644
--- a/crates/mozart/src/commands/update.rs
+++ b/crates/mozart/src/commands/update.rs
@@ -872,6 +872,15 @@ pub async fn run(
.unwrap_or(false);
let prefer_stable = args.prefer_stable || composer_prefer_stable;
+ let mut platform = PlatformConfig::new();
+ if let Some(overrides) = composer_json
+ .extra_fields
+ .get("config")
+ .and_then(|c| c.get("platform"))
+ {
+ platform.apply_overrides(overrides);
+ }
+
let request = ResolveRequest {
root_name: composer_json.name.clone(),
require,
@@ -881,7 +890,7 @@ pub async fn run(
stability_flags: HashMap::new(),
prefer_stable,
prefer_lowest: args.prefer_lowest,
- platform: PlatformConfig::new(),
+ platform,
ignore_platform_reqs: args.ignore_platform_reqs,
ignore_platform_req_list: args.ignore_platform_req.clone(),
repositories: repositories.clone(),
diff --git a/crates/mozart/tests/installer.rs b/crates/mozart/tests/installer.rs
index a13e8e6..3daaf1e 100644
--- a/crates/mozart/tests/installer.rs
+++ b/crates/mozart/tests/installer.rs
@@ -273,7 +273,7 @@ installer_fixture!(install_ignore_platform_package_requirement_list);
installer_fixture!(install_ignore_platform_package_requirement_wildcard);
installer_fixture!(install_ignore_platform_package_requirements);
installer_fixture!(install_missing_alias_from_lock, ignore);
-installer_fixture!(install_overridden_platform_packages, ignore);
+installer_fixture!(install_overridden_platform_packages);
installer_fixture!(install_package_and_its_provider_skips_original);
installer_fixture!(install_prefers_repos_over_package_versions);
installer_fixture!(install_reference);