From c5bcf222f98d13b104231713bf4a0aa0833c420a Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 5 Jun 2026 00:50:47 +0900 Subject: feat(downloader): wire VcsDownloader subclasses via shared downloaders Share downloaders as Rc> in DownloadManager and make DownloaderInterface/VcsDownloader take &mut self, matching PHP's mutable-by-reference downloader objects. This lets Git/Svn/Hg/Fossil/Perforce implement VcsDownloader and route download/install/update/prepare/cleanup through the trait instead of todo!(), and wires the as_* downcast hooks end-to-end. ChangeReportInterface::get_local_changes becomes &mut self since FileDownloader downloads to a compare dir; get_commit_logs/reapply_changes gain &mut self / Result to match the concrete implementations. Co-Authored-By: Claude Opus 4.8 --- crates/shirabe/src/factory.rs | 52 +++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) (limited to 'crates/shirabe/src/factory.rs') diff --git a/crates/shirabe/src/factory.rs b/crates/shirabe/src/factory.rs index 24ac2e0..90d8593 100644 --- a/crates/shirabe/src/factory.rs +++ b/crates/shirabe/src/factory.rs @@ -1011,52 +1011,52 @@ impl Factory { dm.set_downloader( "git", - Box::new(GitDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(GitDownloader::new( io.clone(), config.clone(), Some(process.clone()), Some(fs.clone()), - )), + ))), ); dm.set_downloader( "svn", - Box::new(SvnDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(SvnDownloader::new( io.clone(), config.clone(), process.clone(), fs.clone(), - )), + ))), ); dm.set_downloader( "fossil", - Box::new(FossilDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(FossilDownloader::new( io.clone(), config.clone(), process.clone(), fs.clone(), - )), + ))), ); dm.set_downloader( "hg", - Box::new(HgDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(HgDownloader::new( io.clone(), config.clone(), process.clone(), fs.clone(), - )), + ))), ); dm.set_downloader( "perforce", - Box::new(PerforceDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(PerforceDownloader::new( io.clone(), config.clone(), process.clone(), fs.clone(), - )), + ))), ); dm.set_downloader( "zip", - Box::new(ZipDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(ZipDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1064,11 +1064,11 @@ impl Factory { cache.clone(), fs.clone(), process.clone(), - )), + ))), ); dm.set_downloader( "rar", - Box::new(RarDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(RarDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1076,11 +1076,11 @@ impl Factory { cache.clone(), fs.clone(), process.clone(), - )), + ))), ); dm.set_downloader( "tar", - Box::new(TarDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(TarDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1088,11 +1088,11 @@ impl Factory { cache.clone(), fs.clone(), process.clone(), - )), + ))), ); dm.set_downloader( "gzip", - Box::new(GzipDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(GzipDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1100,11 +1100,11 @@ impl Factory { cache.clone(), fs.clone(), process.clone(), - )), + ))), ); dm.set_downloader( "xz", - Box::new(XzDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(XzDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1112,11 +1112,11 @@ impl Factory { cache.clone(), fs.clone(), process.clone(), - )), + ))), ); dm.set_downloader( "phar", - Box::new(PharDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(PharDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1124,11 +1124,11 @@ impl Factory { cache.clone(), fs.clone(), process.clone(), - )), + ))), ); dm.set_downloader( "file", - Box::new(FileDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(FileDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1136,11 +1136,11 @@ impl Factory { cache.clone(), Some(fs.clone()), Some(process.clone()), - )), + ))), ); dm.set_downloader( "path", - Box::new(PathDownloader::new( + std::rc::Rc::new(std::cell::RefCell::new(PathDownloader::new( io.clone(), config.clone(), http_downloader.clone(), @@ -1148,7 +1148,7 @@ impl Factory { cache.clone(), fs.clone(), process.clone(), - )), + ))), ); Ok(std::rc::Rc::new(std::cell::RefCell::new(dm))) -- cgit v1.3.1