From 30ae6c869adc7f3cb87a4d63edd6d0cda89d571d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 3 May 2026 11:23:03 +0900 Subject: 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) --- crates/mozart-registry/src/resolver.rs | 22 ++++++++++++++++++++++ crates/mozart/src/commands/update.rs | 11 ++++++++++- crates/mozart/tests/installer.rs | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) (limited to 'crates') 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 { 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); -- cgit v1.3.1