aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/factory.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-05 00:50:47 +0900
committernsfisis <nsfisis@gmail.com>2026-06-05 00:51:23 +0900
commitc5bcf222f98d13b104231713bf4a0aa0833c420a (patch)
treea32a484ccb9d944d44db32b229691e5c60bb5159 /crates/shirabe/src/factory.rs
parent20d665bb1247500d514f05b160d01f5f8e223a38 (diff)
downloadphp-shirabe-c5bcf222f98d13b104231713bf4a0aa0833c420a.tar.gz
php-shirabe-c5bcf222f98d13b104231713bf4a0aa0833c420a.tar.zst
php-shirabe-c5bcf222f98d13b104231713bf4a0aa0833c420a.zip
feat(downloader): wire VcsDownloader subclasses via shared downloaders
Share downloaders as Rc<RefCell<dyn DownloaderInterface>> 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 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/factory.rs')
-rw-r--r--crates/shirabe/src/factory.rs52
1 files changed, 26 insertions, 26 deletions
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)))