diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-02 17:01:54 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-02 17:01:54 +0900 |
| commit | 5b767cdd832d39816ee4c2dbf94274c0130dd572 (patch) | |
| tree | afee502ede75fc561da807652c9f472fc1554ff5 /crates/mozart-registry/src/resolver.rs | |
| parent | c1733d88510b7afb88f7a17849de514365e42c84 (diff) | |
| download | php-mozart-5b767cdd832d39816ee4c2dbf94274c0130dd572.tar.gz php-mozart-5b767cdd832d39816ee4c2dbf94274c0130dd572.tar.zst php-mozart-5b767cdd832d39816ee4c2dbf94274c0130dd572.zip | |
refactor(registry): route Packagist queries through RepositorySet
Replace direct packagist::fetch_package_versions calls in
resolver::resolve (seed + transitive loops) and lockfile::generate_lock_file
with repo_set.load_packages calls. PackagistRepository now propagates
errors instead of swallowing them, so the seed loop's strictness and the
transitive loop's local-leniency are both preserved exactly.
VCS and inline-package repositories are still preloaded directly into
the pool builder for now, with their names tracked in skip lists so we
don't double-load them through the trait. Migrating them through
RepositorySet is a follow-up - vcs_to_pool_inputs and
packagist_to_pool_inputs differ in dev-branch handling that needs to be
unified first.
All 136 enabled installer fixtures + 114 mozart-registry tests + 541
mozart lib tests remain green; clippy clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart-registry/src/resolver.rs')
| -rw-r--r-- | crates/mozart-registry/src/resolver.rs | 90 |
1 files changed, 57 insertions, 33 deletions
diff --git a/crates/mozart-registry/src/resolver.rs b/crates/mozart-registry/src/resolver.rs index 710a9c4..878dc02 100644 --- a/crates/mozart-registry/src/resolver.rs +++ b/crates/mozart-registry/src/resolver.rs @@ -9,6 +9,8 @@ use std::fmt; use crate::cache::Cache; use crate::packagist; +use crate::repository::packagist_repo::PackagistRepository; +use crate::repository::{PackageQuery, Repository, RepositorySet}; use crate::vcs_bridge; use mozart_core::package::{RawRepository, Stability}; use mozart_sat_resolver::{ @@ -367,6 +369,19 @@ pub struct ResolvedPackage { pub is_dev: bool, } +/// Build a [`RepositorySet`] containing only [`PackagistRepository`]. +/// +/// The resolver still preloads VCS and inline packages directly into the +/// pool builder (and tracks their names in skip-lists) — Step B routes +/// only Packagist queries through the trait. Migrating VCS/inline through +/// `RepositorySet` is a follow-up. The function returns a single-repo set +/// purely so the seed and transitive loops have a uniform call shape. +fn build_packagist_repo_set(repo_cache: &Cache) -> RepositorySet { + let repos: Vec<Box<dyn Repository>> = + vec![Box::new(PackagistRepository::new(repo_cache.clone()))]; + RepositorySet::new(repos) +} + // ───────────────────────────────────────────────────────────────────────────── // Public resolve() function // ───────────────────────────────────────────────────────────────────────────── @@ -481,38 +496,44 @@ pub async fn resolve(request: &ResolveRequest) -> Result<Vec<ResolvedPackage>, R } } - // Seed the builder with packages for root requirements - for name in root_requires.keys() { - if PackageName(name.clone()).is_platform() { - continue; // platform packages already added - } + // Build the repository set used for Packagist queries (and, in future + // steps, inline + VCS too). Today only Packagist flows through the + // trait — VCS and inline packages above are still preloaded directly, + // and their names go into the skip lists so we don't double-load them + // through this set. + let repo_set: RepositorySet = build_packagist_repo_set(&request.repo_cache); - // Skip packages already provided by VCS or inline-package repositories - if vcs_package_names.contains(name) || inline_package_names.contains(name) { - continue; - } - - // Fetch available versions from Packagist - let versions = packagist::fetch_package_versions(name, &request.repo_cache) - .await - .map_err(|e| { - ResolveError::DependencyFetchError(format!("Failed to fetch {}: {}", name, e)) - })?; - - for pv in &versions { - let inputs = packagist_to_pool_inputs( - name, - pv, - request.minimum_stability, - &request.stability_flags, - ); - for input in inputs { - builder.add_package(input); - } + // Seed the builder with packages for root requirements. + let seed_names: Vec<String> = root_requires + .keys() + .filter(|name| !PackageName((*name).clone()).is_platform()) + .filter(|name| !vcs_package_names.contains(*name) && !inline_package_names.contains(*name)) + .cloned() + .collect(); + let seed_queries: Vec<PackageQuery<'_>> = seed_names + .iter() + .map(|n| PackageQuery { + name: n.as_str(), + constraint: root_requires.get(n).and_then(|c| c.as_deref()), + }) + .collect(); + let seed_results = repo_set + .load_packages(&seed_queries) + .await + .map_err(|e| ResolveError::DependencyFetchError(e.to_string()))?; + for r in &seed_results { + let inputs = packagist_to_pool_inputs( + &r.name, + &r.version, + request.minimum_stability, + &request.stability_flags, + ); + for input in inputs { + builder.add_package(input); } } - // Explore transitive dependencies + // Explore transitive dependencies. while let Some(name) = builder.next_pending() { if PackageName(name.clone()).is_platform() { continue; @@ -523,7 +544,11 @@ pub async fn resolve(request: &ResolveRequest) -> Result<Vec<ResolvedPackage>, R continue; } - let versions = match packagist::fetch_package_versions(&name, &request.repo_cache).await { + let queries = [PackageQuery { + name: name.as_str(), + constraint: None, + }]; + let results = match repo_set.load_packages(&queries).await { Ok(v) => v, Err(_) => { // Virtual/meta packages (e.g. "psr/http-client-implementation") @@ -532,11 +557,10 @@ pub async fn resolve(request: &ResolveRequest) -> Result<Vec<ResolvedPackage>, R continue; } }; - - for pv in &versions { + for r in &results { let inputs = packagist_to_pool_inputs( - &name, - pv, + &r.name, + &r.version, request.minimum_stability, &request.stability_flags, ); |
