diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-10 23:58:26 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-10 23:58:26 +0900 |
| commit | 8871b923fa3df1935c263db155cb8bc3d59705cd (patch) | |
| tree | 4c080d383c30a0d92229f9b411f1d94976a6e707 /crates/mozart/src/commands | |
| parent | 59bab6efee41a196b0d9d392167c536abbe068ba (diff) | |
| download | php-mozart-8871b923fa3df1935c263db155cb8bc3d59705cd.tar.gz php-mozart-8871b923fa3df1935c263db155cb8bc3d59705cd.tar.zst php-mozart-8871b923fa3df1935c263db155cb8bc3d59705cd.zip | |
refactor(downloader): turn DownloadManager into downloader registry
Reshape DownloadManager from a hard-coded VCS match into a registry of
DownloaderInterface instances keyed by source type, mirroring
Composer's DownloadManager — with prefer-source/dist preferences, an
IO handle, and a files cache. ArchiveManager now resolves dist
sources through a shared DownloadManager instead of calling
download_dist directly, and Composer::require / try_load take an IO
so it flows through the factory wiring.
Diffstat (limited to 'crates/mozart/src/commands')
| -rw-r--r-- | crates/mozart/src/commands/archive.rs | 39 | ||||
| -rw-r--r-- | crates/mozart/src/commands/audit.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/browse.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/bump.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/clear_cache.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/create_project.rs | 24 | ||||
| -rw-r--r-- | crates/mozart/src/commands/diagnose.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/dump_autoload.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/exec.rs | 30 | ||||
| -rw-r--r-- | crates/mozart/src/commands/fund.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/licenses.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/reinstall.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/run_script.rs | 4 | ||||
| -rw-r--r-- | crates/mozart/src/commands/status.rs | 4 | ||||
| -rw-r--r-- | crates/mozart/src/commands/update.rs | 2 | ||||
| -rw-r--r-- | crates/mozart/src/commands/validate.rs | 4 |
16 files changed, 72 insertions, 53 deletions
diff --git a/crates/mozart/src/commands/archive.rs b/crates/mozart/src/commands/archive.rs index e1c0fa3..ed7de0e 100644 --- a/crates/mozart/src/commands/archive.rs +++ b/crates/mozart/src/commands/archive.rs @@ -1,9 +1,11 @@ use crate::composer::Composer; +use crate::factory::{create_archive_manager, create_download_manager}; use clap::Args; +use mozart_core::config::Config; use mozart_core::console::IoInterface; use mozart_core::console_writeln; use mozart_core::factory::create_config; -use mozart_core::package::archiver::{ArchiveManager, ArchivePackage}; +use mozart_core::package::archiver::ArchivePackage; use std::borrow::Cow; use std::path::{Path, PathBuf}; @@ -39,7 +41,7 @@ pub async fn execute( ) -> anyhow::Result<()> { let working_dir = cli.working_dir()?; - let composer = Composer::try_load(&working_dir)?; + let composer = Composer::try_load(io.clone(), &working_dir)?; let config = if let Some(composer) = &composer { Cow::Borrowed(composer.config()) } else { @@ -50,7 +52,8 @@ pub async fn execute( let dir = args.dir.as_deref().unwrap_or(&config.archive_dir); archive( - &io, + io, + &config, args.package.as_deref(), args.version.as_deref(), format, @@ -59,13 +62,15 @@ pub async fn execute( args.ignore_filters, &working_dir, cli.no_cache, + composer.as_ref(), ) .await } #[allow(clippy::too_many_arguments)] async fn archive( - io: &std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, + io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, + config: &Config, package_name: Option<&str>, version: Option<&str>, format: &str, @@ -74,15 +79,24 @@ async fn archive( ignore_filters: bool, working_dir: &Path, no_cache: bool, + composer: Option<&Composer>, ) -> anyhow::Result<()> { let cache_config = mozart_core::repository::cache::build_cache_config(no_cache); let repo_cache = mozart_core::repository::cache::Cache::repo(&cache_config); - let files_cache = mozart_core::repository::cache::Cache::files(&cache_config); - let archive_manager = ArchiveManager::new(); + let archive_manager = if let Some(composer) = composer { + Cow::Borrowed(composer.archive_manager()) + } else { + let download_manager = std::sync::Arc::new(tokio::sync::Mutex::new( + create_download_manager(io.clone(), config), + )); + Cow::Owned(std::sync::Arc::new(tokio::sync::Mutex::new( + create_archive_manager(download_manager), + ))) + }; let package = if let Some(package_name) = package_name { - select_package(io, package_name, version, &repo_cache).await? + select_package(&io, package_name, version, &repo_cache).await? } else { load_root_package(working_dir)? }; @@ -97,14 +111,9 @@ async fn archive( .unwrap() .info(&format!("Creating the archive into \"{}\".", dest)); let package_path = archive_manager - .archive( - &package, - format, - &dest_dir, - file_name, - ignore_filters, - &files_cache, - ) + .lock() + .await + .archive(&package, format, &dest_dir, file_name, ignore_filters) .await?; let absolute = package_path.display().to_string(); diff --git a/crates/mozart/src/commands/audit.rs b/crates/mozart/src/commands/audit.rs index 9672d57..0b84ccf 100644 --- a/crates/mozart/src/commands/audit.rs +++ b/crates/mozart/src/commands/audit.rs @@ -44,7 +44,7 @@ pub async fn execute( let working_dir = cli.working_dir()?; // Load Composer state (reads composer.json + config) - let composer = Composer::require(&working_dir)?; + let composer = Composer::require(io.clone(), &working_dir)?; // Parse audit config from composer.json's config.audit section let audit_config = AuditConfig::from_config(composer.config(), true, AuditFormat::Table)?; diff --git a/crates/mozart/src/commands/browse.rs b/crates/mozart/src/commands/browse.rs index ada3b8b..e3eae22 100644 --- a/crates/mozart/src/commands/browse.rs +++ b/crates/mozart/src/commands/browse.rs @@ -32,7 +32,7 @@ pub async fn execute( let working_dir = cli.working_dir()?; let cache = Cache::repo(&build_cache_config(cli.no_cache)); - let composer = Composer::try_load(&working_dir)?; + let composer = Composer::try_load(io.clone(), &working_dir)?; let repos = build_repos(composer.as_ref(), cache); let packages: Vec<String> = if args.packages.is_empty() { diff --git a/crates/mozart/src/commands/bump.rs b/crates/mozart/src/commands/bump.rs index dc7a5e7..351be01 100644 --- a/crates/mozart/src/commands/bump.rs +++ b/crates/mozart/src/commands/bump.rs @@ -35,7 +35,7 @@ pub async fn execute( io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, ) -> anyhow::Result<()> { let working_dir = cli.working_dir()?; - let composer = Composer::require(&working_dir)?; + let composer = Composer::require(io.clone(), &working_dir)?; let exit = do_bump( io, diff --git a/crates/mozart/src/commands/clear_cache.rs b/crates/mozart/src/commands/clear_cache.rs index dbca5c8..c0f2957 100644 --- a/crates/mozart/src/commands/clear_cache.rs +++ b/crates/mozart/src/commands/clear_cache.rs @@ -18,7 +18,7 @@ pub async fn execute( cli: &super::Cli, io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, ) -> anyhow::Result<()> { - let composer = Composer::try_load(cli.working_dir()?)?; + let composer = Composer::try_load(io.clone(), cli.working_dir()?)?; let config = if let Some(composer) = &composer { Cow::Borrowed(composer.config()) } else { diff --git a/crates/mozart/src/commands/create_project.rs b/crates/mozart/src/commands/create_project.rs index 276bd3a..08e146e 100644 --- a/crates/mozart/src/commands/create_project.rs +++ b/crates/mozart/src/commands/create_project.rs @@ -2,6 +2,7 @@ use clap::Args; use indexmap::IndexMap; use mozart_core::console::IoInterface; use mozart_core::console_format; +use mozart_core::factory::create_config; use mozart_core::package::{self, Stability}; use mozart_core::repository::downloader; use mozart_core::repository::lockfile; @@ -11,6 +12,8 @@ use mozart_core::repository::version; use mozart_core::validation; use std::path::{Path, PathBuf}; +use crate::factory::create_download_manager; + #[derive(Args)] pub struct CreateProjectArgs { /// Package name to install @@ -337,7 +340,7 @@ pub async fn execute( let secure_http = !args.no_secure_http; install_project( - &io, + io, cli, args, args.package.as_deref(), @@ -362,7 +365,7 @@ pub async fn execute( #[allow(clippy::too_many_arguments)] async fn install_project( - io: &std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, + io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, cli: &super::Cli, args: &CreateProjectArgs, package_name: Option<&str>, @@ -395,7 +398,7 @@ async fn install_project( let root_result = if let Some(name) = package_name { Some( install_root_package( - io, + io.clone(), cli, args, name, @@ -647,7 +650,7 @@ async fn install_project( #[allow(clippy::too_many_arguments)] async fn install_root_package( - io: &std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, + io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, cli: &super::Cli, _args: &CreateProjectArgs, package_name: &str, @@ -733,7 +736,6 @@ async fn install_root_package( // --- Find the best candidate matching constraint + stability --- let cache_config = mozart_core::repository::cache::build_cache_config(cli.no_cache); let repo_cache = mozart_core::repository::cache::Cache::repo(&cache_config); - let files_cache = mozart_core::repository::cache::Cache::files(&cache_config); let versions = packagist::fetch_package_versions(&name, &repo_cache).await?; @@ -786,13 +788,11 @@ async fn install_root_package( let mut progress = downloader::DownloadProgress::new(!no_progress, format!("{name} ({concrete_version})")); - let bytes = downloader::download_dist( - &dist.url, - dist.shasum.as_deref(), - Some(&mut progress), - &files_cache, - ) - .await?; + let config = create_config()?; + let download_manager = create_download_manager(io.clone(), &config); + let bytes = download_manager + .download_legacy(&dist.url, dist.shasum.as_deref(), Some(&mut progress)) + .await?; progress.finish(); diff --git a/crates/mozart/src/commands/diagnose.rs b/crates/mozart/src/commands/diagnose.rs index d139467..a1d655f 100644 --- a/crates/mozart/src/commands/diagnose.rs +++ b/crates/mozart/src/commands/diagnose.rs @@ -362,7 +362,7 @@ pub async fn execute( let mut exit_code: i32 = 0; - let composer = Composer::try_load(&working_dir)?; + let composer = Composer::try_load(io.clone(), &working_dir)?; let config: Cow<'_, Config> = if let Some(c) = &composer { Cow::Borrowed(c.config()) } else { diff --git a/crates/mozart/src/commands/dump_autoload.rs b/crates/mozart/src/commands/dump_autoload.rs index b66b7fc..211b46e 100644 --- a/crates/mozart/src/commands/dump_autoload.rs +++ b/crates/mozart/src/commands/dump_autoload.rs @@ -57,7 +57,7 @@ pub async fn execute( cli: &super::Cli, io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, ) -> anyhow::Result<()> { - let composer = Composer::require(cli.working_dir()?)?; + let composer = Composer::require(io.clone(), cli.working_dir()?)?; let installation_manager = composer.installation_manager(); let local_repo = composer.repository_manager().local_repository(); diff --git a/crates/mozart/src/commands/exec.rs b/crates/mozart/src/commands/exec.rs index e1a9e2b..f2a9c55 100644 --- a/crates/mozart/src/commands/exec.rs +++ b/crates/mozart/src/commands/exec.rs @@ -25,7 +25,7 @@ pub async fn execute( ) -> anyhow::Result<()> { let working_dir = cli.working_dir()?; - let composer = Composer::require(&working_dir)?; + let composer = Composer::require(io.clone(), &working_dir)?; let bin_dir = resolve_bin_dir(&working_dir, &composer); if args.list || args.binary.is_none() { @@ -150,7 +150,15 @@ fn get_binaries(composer: &Composer, bin_dir: &Path) -> Vec<(String, bool)> { #[cfg(test)] mod tests { use super::*; + use mozart_core::console::Console; use std::fs; + use std::sync::{Arc, Mutex}; + + fn io() -> Arc<Mutex<Box<dyn IoInterface>>> { + Arc::new(Mutex::new( + Box::new(Console::new(0, true, false, true, true)) as Box<dyn IoInterface>, + )) + } #[test] fn test_resolve_bin_dir_default() { @@ -158,7 +166,7 @@ mod tests { let composer_json = dir.path().join("composer.json"); fs::write(&composer_json, r#"{"name": "test/pkg", "require": {}}"#).unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let result = resolve_bin_dir(dir.path(), &composer); assert_eq!(result, dir.path().join("vendor/bin")); } @@ -173,7 +181,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let result = resolve_bin_dir(dir.path(), &composer); assert_eq!(result, dir.path().join("libs/bin")); } @@ -188,7 +196,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let result = resolve_bin_dir(dir.path(), &composer); assert_eq!(result, dir.path().join("scripts")); } @@ -203,7 +211,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let result = resolve_bin_dir(dir.path(), &composer); assert_eq!(result, dir.path().join("packages/commands")); } @@ -223,7 +231,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let binaries = get_binaries(&composer, &bin_dir); let names: Vec<&str> = binaries.iter().map(|(n, _)| n.as_str()).collect(); assert!(names.contains(&"phpunit")); @@ -249,7 +257,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let binaries = get_binaries(&composer, &bin_dir); let names: Vec<&str> = binaries.iter().map(|(n, _)| n.as_str()).collect(); assert!(names.contains(&"phpunit")); @@ -268,7 +276,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let binaries = get_binaries(&composer, &bin_dir); let names: Vec<&str> = binaries.iter().map(|(n, _)| n.as_str()).collect(); assert!(names.contains(&"my-tool")); @@ -291,7 +299,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let binaries = get_binaries(&composer, &bin_dir); assert!(binaries.is_empty()); } @@ -306,7 +314,7 @@ mod tests { .unwrap(); let bin_dir = dir.path().join("vendor/bin"); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let binaries = get_binaries(&composer, &bin_dir); assert!( binaries.is_empty(), @@ -323,7 +331,7 @@ mod tests { ) .unwrap(); - let composer = Composer::require(dir.path()).unwrap(); + let composer = Composer::require(io(), dir.path()).unwrap(); let bin_dir = resolve_bin_dir(dir.path(), &composer); // No binaries exist — looking up a name should find nothing diff --git a/crates/mozart/src/commands/fund.rs b/crates/mozart/src/commands/fund.rs index 6b0cd67..677137c 100644 --- a/crates/mozart/src/commands/fund.rs +++ b/crates/mozart/src/commands/fund.rs @@ -31,7 +31,7 @@ pub async fn execute( } let working_dir = cli.working_dir()?; - let composer = Composer::require(&working_dir)?; + let composer = Composer::require(io.clone(), &working_dir)?; let installed = InstalledPackages::read(composer.installation_manager().vendor_dir())?; // Configured remote repositories from `composer.json` are not yet wired diff --git a/crates/mozart/src/commands/licenses.rs b/crates/mozart/src/commands/licenses.rs index aecfe86..73f2018 100644 --- a/crates/mozart/src/commands/licenses.rs +++ b/crates/mozart/src/commands/licenses.rs @@ -79,7 +79,7 @@ pub async fn execute( ); } - let composer = Composer::require(&working_dir)?; + let composer = Composer::require(io.clone(), &working_dir)?; // TODO(plugins): dispatch CommandEvent for `licenses`. diff --git a/crates/mozart/src/commands/reinstall.rs b/crates/mozart/src/commands/reinstall.rs index d9156bc..ca23a64 100644 --- a/crates/mozart/src/commands/reinstall.rs +++ b/crates/mozart/src/commands/reinstall.rs @@ -66,7 +66,7 @@ pub async fn execute( io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, ) -> anyhow::Result<()> { let working_dir = cli.working_dir()?; - let composer = Composer::require(&working_dir)?; + let composer = Composer::require(io.clone(), &working_dir)?; let local_repo = composer.repository_manager().local_repository(); // Selection: mirrors `ReinstallCommand::execute` lines 79-110. diff --git a/crates/mozart/src/commands/run_script.rs b/crates/mozart/src/commands/run_script.rs index c2e52a6..ab3700d 100644 --- a/crates/mozart/src/commands/run_script.rs +++ b/crates/mozart/src/commands/run_script.rs @@ -42,7 +42,7 @@ pub async fn execute( let working_dir = cli.working_dir()?; if args.list { - Composer::require(&working_dir)?; + Composer::require(io.clone(), &working_dir)?; let (scripts, descriptions) = load_scripts(&working_dir)?; return list_scripts(&scripts, &descriptions, io.clone()); } @@ -58,7 +58,7 @@ pub async fn execute( anyhow::bail!("Script \"{}\" cannot be run with this command", script); } - let composer = Composer::require(&working_dir)?; + let composer = Composer::require(io.clone(), &working_dir)?; let dev_mode = args.dev || !args.no_dev; let (scripts, _descriptions) = load_scripts(&working_dir)?; diff --git a/crates/mozart/src/commands/status.rs b/crates/mozart/src/commands/status.rs index d538138..cb33223 100644 --- a/crates/mozart/src/commands/status.rs +++ b/crates/mozart/src/commands/status.rs @@ -17,11 +17,11 @@ pub async fn execute( io: std::sync::Arc<std::sync::Mutex<Box<dyn IoInterface>>>, ) -> anyhow::Result<()> { // init repos - let composer = Composer::require(cli.working_dir()?)?; + let composer = Composer::require(io.clone(), cli.working_dir()?)?; let installed_repo = composer.repository_manager().local_repository(); - let dm = composer.download_manager(); + let dm = composer.download_manager().lock().await; let im = composer.installation_manager(); let mut errors = Vec::new(); diff --git a/crates/mozart/src/commands/update.rs b/crates/mozart/src/commands/update.rs index 362fad5..f482272 100644 --- a/crates/mozart/src/commands/update.rs +++ b/crates/mozart/src/commands/update.rs @@ -1747,7 +1747,7 @@ pub async fn run( let mode = bump_mode.as_deref().unwrap_or("all"); let dev_only = mode == "dev"; let no_dev_only = mode == "no-dev"; - let bump_composer = Composer::require(working_dir)?; + let bump_composer = Composer::require(io.clone(), working_dir)?; let bump_exit = super::bump::do_bump( io.clone(), &bump_composer, diff --git a/crates/mozart/src/commands/validate.rs b/crates/mozart/src/commands/validate.rs index a6dbf91..23925c5 100644 --- a/crates/mozart/src/commands/validate.rs +++ b/crates/mozart/src/commands/validate.rs @@ -104,7 +104,9 @@ pub async fn execute( // Load the Composer project state (optional — used for typed config, // locker, and the repository/installation managers). Mirrors // `ValidateCommand::createComposerInstance($file)`. - let composer = Composer::try_load_from_file(&file).ok().flatten(); + let composer = Composer::try_load_from_file(io.clone(), &file) + .ok() + .flatten(); // Determine whether to check the lock file using the typed config when // available, falling back to a raw JSON read for paths where the Composer |
