From 8871b923fa3df1935c263db155cb8bc3d59705cd Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 10 May 2026 23:58:26 +0900 Subject: refactor(downloader): turn DownloadManager into downloader registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- crates/mozart/src/commands/exec.rs | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'crates/mozart/src/commands/exec.rs') 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>> { + Arc::new(Mutex::new( + Box::new(Console::new(0, true, false, true, true)) as Box, + )) + } #[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 -- cgit v1.3.1