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/composer.rs | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) (limited to 'crates/mozart/src/composer.rs') diff --git a/crates/mozart/src/composer.rs b/crates/mozart/src/composer.rs index 9fd8b77..c73902e 100644 --- a/crates/mozart/src/composer.rs +++ b/crates/mozart/src/composer.rs @@ -11,13 +11,14 @@ //! `Composer\Command\BaseCommand::tryComposer()` for the upstream contract //! that [`Composer::require`] and [`Composer::try_load`] are modelled on. -use std::path::{Path, PathBuf}; - use crate::factory::create_composer; use mozart_core::composer::{AutoloadGenerator, InstallationManager, Locker, RepositoryManager}; use mozart_core::config::Config; +use mozart_core::console::IoInterface; use mozart_core::downloader::DownloadManager; use mozart_core::package::RootPackageData; +use mozart_core::package::archiver::ArchiveManager; +use std::path::{Path, PathBuf}; /// Project-level Composer state. Mirrors `Composer\PartialComposer` / /// `Composer\Composer` in PHP, exposing the subset of getters command @@ -30,9 +31,10 @@ pub struct Composer { package: RootPackageData, repository_manager: RepositoryManager, installation_manager: InstallationManager, - download_manager: DownloadManager, + download_manager: std::sync::Arc>, autoload_generator: AutoloadGenerator, locker: Locker, + archive_manager: std::sync::Arc>, } impl Composer { @@ -48,9 +50,10 @@ impl Composer { package: RootPackageData, repository_manager: RepositoryManager, installation_manager: InstallationManager, - download_manager: DownloadManager, + download_manager: std::sync::Arc>, autoload_generator: AutoloadGenerator, locker: Locker, + archive_manager: std::sync::Arc>, ) -> Self { Self { project_dir, @@ -61,13 +64,17 @@ impl Composer { download_manager, autoload_generator, locker, + archive_manager, } } /// Load Composer state for `project_dir`, requiring a composer.json. /// Mirrors `BaseCommand::requireComposer()`, which delegates to /// `Factory::createComposer` after asserting the file exists. - pub fn require(project_dir: impl Into) -> anyhow::Result { + pub fn require( + io: std::sync::Arc>>, + project_dir: impl Into, + ) -> anyhow::Result { let project_dir = project_dir.into(); let composer_json = project_dir.join("composer.json"); if !composer_json.exists() { @@ -76,31 +83,37 @@ impl Composer { project_dir.display() ); } - create_composer(project_dir, &composer_json) + create_composer(io, project_dir, &composer_json) } /// Load Composer state for `project_dir`, returning `None` if no /// composer.json exists. Other I/O or parse errors still propagate. /// Mirrors `BaseCommand::tryComposer()`. - pub fn try_load(project_dir: impl Into) -> anyhow::Result> { + pub fn try_load( + io: std::sync::Arc>>, + project_dir: impl Into, + ) -> anyhow::Result> { let project_dir = project_dir.into(); let composer_json = project_dir.join("composer.json"); if !composer_json.exists() { return Ok(None); } - create_composer(project_dir, &composer_json).map(Some) + create_composer(io, project_dir, &composer_json).map(Some) } /// Load Composer state keyed on a specific `composer.json` file, deriving /// the project directory from `file.parent()`. Mirrors /// `ValidateCommand::createComposerInstance($file)` — Composer keys /// instances on a file rather than a directory for non-default paths. - pub fn try_load_from_file(file: &Path) -> anyhow::Result> { + pub fn try_load_from_file( + io: std::sync::Arc>>, + file: &Path, + ) -> anyhow::Result> { let project_dir = file .parent() .map(Path::to_path_buf) .unwrap_or_else(|| PathBuf::from(".")); - Self::try_load(project_dir) + Self::try_load(io, project_dir) } pub fn project_dir(&self) -> &Path { @@ -130,7 +143,7 @@ impl Composer { &self.installation_manager } - pub fn download_manager(&self) -> &DownloadManager { + pub fn download_manager(&self) -> &std::sync::Arc> { &self.download_manager } @@ -149,4 +162,8 @@ impl Composer { pub fn locker(&self) -> &Locker { &self.locker } + + pub fn archive_manager(&self) -> &std::sync::Arc> { + &self.archive_manager + } } -- cgit v1.3.1