From 43efd895d24b7ccd2853fa5bcf08ad0e621f33ce Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 2 May 2026 17:21:29 +0900 Subject: refactor(registry): plumb RepositorySet and executor through callers ResolveRequest and LockFileGenerationRequest now take Arc instead of a raw Cache. install_from_lock now accepts &mut dyn InstallerExecutor instead of constructing FilesystemExecutor internally. Both changes expose the DI injection points needed by the upcoming in-process test harness, where Packagist must be replaced with an empty RepositorySet (Composer's `'packagist' => false` test config) and filesystem install execution must be replaced with a tracing recorder (Composer's InstallationManagerMock). The eager VCS scan and inline-package preload still happen inside resolve(), so the RawRepository array is kept on ResolveRequest as raw_repositories - migrating those through RepositorySet remains a follow-up. RepositorySet gains with_packagist and empty constructors so production callers and future tests have a uniform construction shape. All 136 enabled installer fixtures + 114 mozart-registry tests + 541 mozart lib tests still green; clippy clean. Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/mozart-registry/src/lockfile.rs | 41 ++++++++++++++++------------------ 1 file changed, 19 insertions(+), 22 deletions(-) (limited to 'crates/mozart-registry/src/lockfile.rs') diff --git a/crates/mozart-registry/src/lockfile.rs b/crates/mozart-registry/src/lockfile.rs index edda3e9..8022f8b 100644 --- a/crates/mozart-registry/src/lockfile.rs +++ b/crates/mozart-registry/src/lockfile.rs @@ -1,7 +1,5 @@ -use crate::cache::Cache; use crate::packagist::{PackagistDist, PackagistSource, PackagistVersion}; -use crate::repository::packagist_repo::PackagistRepository; -use crate::repository::{Repository, RepositorySet}; +use crate::repository::RepositorySet; use crate::resolver::ResolvedPackage; use mozart_core::package::{RawPackageData, to_json_pretty}; use serde::{Deserialize, Serialize}; @@ -9,18 +7,6 @@ use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::fs; use std::path::Path; -/// Build a [`RepositorySet`] containing only [`PackagistRepository`]. -/// -/// Used by `generate_lock_file` to fetch full metadata for resolved packages -/// not already covered by inline `type: package` repositories. Step B routes -/// only Packagist queries through the trait; VCS/inline migration is a -/// follow-up. -fn build_packagist_repo_set(repo_cache: &Cache) -> RepositorySet { - let repos: Vec> = - vec![Box::new(PackagistRepository::new(repo_cache.clone()))]; - RepositorySet::new(repos) -} - fn default_stability() -> String { "stable".to_string() } @@ -364,8 +350,9 @@ pub struct LockFileGenerationRequest { pub composer_json: RawPackageData, /// Whether require-dev was included in resolution. pub include_dev: bool, - /// Repo cache for Packagist API calls made during generation. - pub repo_cache: Cache, + /// Repository set used to fetch full metadata for resolved packages + /// that aren't already covered by inline `type: package` repositories. + pub repositories: std::sync::Arc, } impl LockFileGenerationRequest { @@ -535,7 +522,7 @@ pub async fn generate_lock_file(request: &LockFileGenerationRequest) -> anyhow:: // through `RepositorySet`, which today contains only Packagist; future // steps will move VCS / inline through the same set. let mut package_metadata: HashMap = HashMap::new(); - let repo_set = build_packagist_repo_set(&request.repo_cache); + let repo_set = &request.repositories; for pkg in &request.resolved_packages { if let Some(inline) = request.inline_lookup(&pkg.name, &pkg.version_normalized) { package_metadata.insert(pkg.name.clone(), inline); @@ -1092,7 +1079,9 @@ mod tests { composer_json_content: composer_json_content.clone(), composer_json, include_dev: true, - repo_cache: Cache::new(std::env::temp_dir().join("mozart-test-cache"), false), + repositories: std::sync::Arc::new(RepositorySet::with_packagist( + crate::cache::Cache::new(std::env::temp_dir().join("mozart-test-cache"), false), + )), }; let lock = generate_lock_file(&request).await.unwrap(); @@ -1180,9 +1169,11 @@ mod tests { #[tokio::test] #[ignore] async fn test_generate_lock_file_monolog() { + use crate::cache::Cache; use crate::resolver::PlatformConfig; use crate::resolver::{ResolveRequest, resolve}; use mozart_core::package::Stability; + use std::sync::Arc; // Resolve monolog/monolog ^3.0 let resolve_request = ResolveRequest { @@ -1197,9 +1188,12 @@ mod tests { platform: PlatformConfig::new(), ignore_platform_reqs: false, ignore_platform_req_list: vec![], - repo_cache: Cache::new(std::env::temp_dir().join("mozart-test-cache"), false), + repositories: Arc::new(RepositorySet::with_packagist(Cache::new( + std::env::temp_dir().join("mozart-test-cache"), + false, + ))), temporary_constraints: HashMap::new(), - repositories: vec![], + raw_repositories: vec![], }; let resolved = resolve(&resolve_request) @@ -1216,7 +1210,10 @@ mod tests { composer_json_content: composer_json_content.clone(), composer_json, include_dev: false, - repo_cache: Cache::new(std::env::temp_dir().join("mozart-test-cache"), false), + repositories: Arc::new(RepositorySet::with_packagist(Cache::new( + std::env::temp_dir().join("mozart-test-cache"), + false, + ))), }; let lock = generate_lock_file(&gen_request) -- cgit v1.3.1