diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-03 12:25:45 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-03 12:25:45 +0900 |
| commit | ab2772b8c85139df7d5e625ac5262d385e5ab4c0 (patch) | |
| tree | ca2bbabecdb6068cbf646153d959c72edddec933 /crates/mozart/src/commands/remove.rs | |
| parent | 7badb54195131da9c3561c351138c0ba083e38e4 (diff) | |
| download | php-mozart-ab2772b8c85139df7d5e625ac5262d385e5ab4c0.tar.gz php-mozart-ab2772b8c85139df7d5e625ac5262d385e5ab4c0.tar.zst php-mozart-ab2772b8c85139df7d5e625ac5262d385e5ab4c0.zip | |
fix(resolver): seed root package into pool as fixed entry
Composer's RootPackageRepository puts a clone of the root package into
the pool as a fixed entry — its `require` / `require-dev` cleared, but
its name, version, provides, and replaces preserved. That way a
transitive `require` pointing back at the root resolves through the
pool the same way any other reference would, and legal circular
dependencies (root requires A, A requires root) work.
Mozart had no such seed: the rule generator only knew about the root
through the explicit root-require / root-provide / root-replace tables,
so a transitive consumer requiring the root by name failed with no
provider.
Plumb root_version through ResolveRequest (RawPackageData gains a
matching `Option<String>` field), build a fixed PoolPackageInput for
the root with provides/replaces lifted from request.root_provide /
root_replace, and skip the root by name when collecting the resolver's
output so it doesn't leak into the lock file. Falls back to
`1.0.0+no-version-set` (Composer's RootPackage::DEFAULT_PRETTY_VERSION)
when the root composer.json omits `version`.
Unblocks circular_dependency2, conflict_against_replaced_package_problem,
and provider_conflicts installer fixtures.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/commands/remove.rs')
| -rw-r--r-- | crates/mozart/src/commands/remove.rs | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/crates/mozart/src/commands/remove.rs b/crates/mozart/src/commands/remove.rs index df8bf2b..f11e9c3 100644 --- a/crates/mozart/src/commands/remove.rs +++ b/crates/mozart/src/commands/remove.rs @@ -243,6 +243,7 @@ pub async fn execute( let request = ResolveRequest { root_name: raw.name.clone(), + root_version: raw.version.clone(), require, require_dev, include_dev: dev_mode, @@ -513,6 +514,7 @@ async fn remove_unused( let request = ResolveRequest { root_name: raw.name.clone(), + root_version: raw.version.clone(), require, require_dev, include_dev: dev_mode, @@ -866,6 +868,7 @@ mod tests { // Simulate initial install let request = ResolveRequest { root_name: String::new(), + root_version: None, require: vec![("psr/log".to_string(), "^3.0".to_string())], require_dev: vec![], include_dev: false, @@ -919,6 +922,7 @@ mod tests { // Re-resolve with empty require let request2 = ResolveRequest { root_name: String::new(), + root_version: None, require: vec![], require_dev: vec![], include_dev: false, |
