diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-22 15:45:33 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-22 15:45:33 +0900 |
| commit | d34f2ba41cb1d0111a4682f9d65628e06f46ff31 (patch) | |
| tree | eecb925ec7a33d5782eb08491db2aab6c4235fdc /crates/mozart-registry/src/resolver.rs | |
| parent | 3bddf91f8fe386cc9d908ed498ea0b3235790904 (diff) | |
| download | php-mozart-d34f2ba41cb1d0111a4682f9d65628e06f46ff31.tar.gz php-mozart-d34f2ba41cb1d0111a4682f9d65628e06f46ff31.tar.zst php-mozart-d34f2ba41cb1d0111a4682f9d65628e06f46ff31.zip | |
fix(resolver): replace __root__ with actual package name in error messages
Composer never shows the internal __root__ identifier to users. Add
root_name field to ResolveRequest so the resolver can substitute the
real package name (e.g. "laravel/laravel") in pubgrub error reports.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart-registry/src/resolver.rs')
| -rw-r--r-- | crates/mozart-registry/src/resolver.rs | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/crates/mozart-registry/src/resolver.rs b/crates/mozart-registry/src/resolver.rs index 74acc52..61895eb 100644 --- a/crates/mozart-registry/src/resolver.rs +++ b/crates/mozart-registry/src/resolver.rs @@ -933,6 +933,9 @@ impl DependencyProvider for MozartProvider { /// Input to the resolver. pub struct ResolveRequest { + /// Root package name from composer.json "name" field (e.g. "laravel/laravel"). + /// Used in error messages. Falls back to `__root__` if empty. + pub root_name: String, /// Dependencies from composer.json "require" section. pub require: Vec<(String, String)>, /// Dependencies from composer.json "require-dev" section. @@ -1026,6 +1029,7 @@ pub async fn resolve(request: &ResolveRequest) -> Result<Vec<ResolvedPackage>, R let prefer_lowest = request.prefer_lowest; let ignore_platform_reqs = request.ignore_platform_reqs; let ignore_platform_req_list = request.ignore_platform_req_list.clone(); + let root_name = request.root_name.clone(); // 2. Run pubgrub on a blocking thread (it is CPU-bound + uses block_on for I/O) tokio::task::spawn_blocking(move || { @@ -1078,6 +1082,14 @@ pub async fn resolve(request: &ResolveRequest) -> Result<Vec<ResolvedPackage>, R Err(PubGrubError::NoSolution(mut derivation_tree)) => { derivation_tree.collapse_no_versions(); let report = DefaultStringReporter::report(&derivation_tree); + // Replace the internal __root__ identifier with the actual + // package name so that error messages are user-friendly + // (matching Composer behaviour). + let report = if !root_name.is_empty() { + report.replace(PackageName::ROOT, &root_name) + } else { + report + }; Err(ResolveError::NoSolution(report)) } Err(PubGrubError::ErrorRetrievingDependencies { @@ -1920,6 +1932,7 @@ mod tests { #[ignore] async fn test_resolve_monolog_e2e() { let request = ResolveRequest { + root_name: String::new(), require: vec![("monolog/monolog".to_string(), "^3.0".to_string())], require_dev: vec![], include_dev: false, |
