aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/vcs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-26 20:04:02 +0900
committernsfisis <nsfisis@gmail.com>2026-05-26 20:04:02 +0900
commitf411daceacad66e0bd774fda7d3c5ef8533cc55c (patch)
treeeefb065e4d676a3f7031ca49bab21c773b00b134 /crates/shirabe/src/repository/vcs
parent1921f173ea219cb4b25847294d2d3fa465550fbb (diff)
downloadphp-shirabe-f411daceacad66e0bd774fda7d3c5ef8533cc55c.tar.gz
php-shirabe-f411daceacad66e0bd774fda7d3c5ef8533cc55c.tar.zst
php-shirabe-f411daceacad66e0bd774fda7d3c5ef8533cc55c.zip
refactor(io): share IOInterface via Rc<RefCell<dyn _>> handle
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/vcs')
-rw-r--r--crates/shirabe/src/repository/vcs/forgejo_driver.rs3
-rw-r--r--crates/shirabe/src/repository/vcs/fossil_driver.rs12
-rw-r--r--crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs5
-rw-r--r--crates/shirabe/src/repository/vcs/git_driver.rs23
-rw-r--r--crates/shirabe/src/repository/vcs/github_driver.rs7
-rw-r--r--crates/shirabe/src/repository/vcs/gitlab_driver.rs7
-rw-r--r--crates/shirabe/src/repository/vcs/hg_driver.rs16
-rw-r--r--crates/shirabe/src/repository/vcs/perforce_driver.rs11
-rw-r--r--crates/shirabe/src/repository/vcs/svn_driver.rs9
-rw-r--r--crates/shirabe/src/repository/vcs/vcs_driver.rs4
10 files changed, 64 insertions, 33 deletions
diff --git a/crates/shirabe/src/repository/vcs/forgejo_driver.rs b/crates/shirabe/src/repository/vcs/forgejo_driver.rs
index 72fd6af..ccd0c16 100644
--- a/crates/shirabe/src/repository/vcs/forgejo_driver.rs
+++ b/crates/shirabe/src/repository/vcs/forgejo_driver.rs
@@ -12,6 +12,7 @@ use crate::cache::Cache;
use crate::config::Config;
use crate::downloader::TransportException;
use crate::io::IOInterface;
+use crate::io::IOInterfaceImmutable;
use crate::json::JsonFile;
use crate::repository::vcs::GitDriver;
use crate::repository::vcs::VcsDriverBase;
@@ -51,7 +52,7 @@ impl ForgejoDriver {
self.forgejo_url = Some(forgejo_url);
self.inner.cache = Some(Cache::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
&cache_dir,
None,
None,
diff --git a/crates/shirabe/src/repository/vcs/fossil_driver.rs b/crates/shirabe/src/repository/vcs/fossil_driver.rs
index 4982d17..207a138 100644
--- a/crates/shirabe/src/repository/vcs/fossil_driver.rs
+++ b/crates/shirabe/src/repository/vcs/fossil_driver.rs
@@ -9,6 +9,7 @@ use shirabe_php_shim::{PhpMixed, RuntimeException, dirname, is_dir, is_file, is_
use crate::cache::Cache;
use crate::config::Config;
use crate::io::IOInterface;
+use crate::io::IOInterfaceImmutable;
use crate::repository::vcs::VcsDriverBase;
use crate::util::Filesystem;
use crate::util::ProcessExecutor;
@@ -31,7 +32,7 @@ impl FossilDriver {
// Ensure we are allowed to use this URL by config.
self.inner.config.borrow_mut().prohibit_url_by_config(
&self.inner.url,
- Some(&*self.inner.io),
+ Some(&*self.inner.io.borrow()),
&indexmap::IndexMap::new(),
)?;
@@ -289,7 +290,12 @@ impl FossilDriver {
Ok(self.branches.clone().unwrap_or_default())
}
- pub fn supports(io: &dyn IOInterface, config: &Config, url: &str, deep: bool) -> bool {
+ pub fn supports(
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
+ config: &Config,
+ url: &str,
+ deep: bool,
+ ) -> bool {
if Preg::is_match(
r"#(^(?:https?|ssh)://(?:[^@]@)?(?:chiselapp\.com|fossil\.))#i",
url,
@@ -310,7 +316,7 @@ impl FossilDriver {
return false;
}
- let mut process = ProcessExecutor::new(io);
+ let mut process = ProcessExecutor::new(Some(io));
let mut output = String::new();
if process.execute_args(
&["fossil", "info"].map(|s| s.to_string()).to_vec(),
diff --git a/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs b/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs
index 19f0246..53e49fc 100644
--- a/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs
+++ b/crates/shirabe/src/repository/vcs/git_bitbucket_driver.rs
@@ -15,6 +15,7 @@ use crate::cache::Cache;
use crate::config::Config;
use crate::downloader::TransportException;
use crate::io::IOInterface;
+use crate::io::IOInterfaceImmutable;
use crate::json::JsonFile;
use crate::repository::vcs::GitDriver;
use crate::repository::vcs::VcsDriverBase;
@@ -80,7 +81,7 @@ impl GitBitbucketDriver {
self.repository = m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default();
self.inner.origin_url = "bitbucket.org".to_string();
self.inner.cache = Some(Cache::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
&implode(
"/",
&[
@@ -693,7 +694,7 @@ impl GitBitbucketDriver {
Err(e) => {
// TODO(phase-b): only handle TransportException
let mut bitbucket_util = Bitbucket::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
self.inner.config.clone(),
Some(self.inner.process.clone()),
Some(self.inner.http_downloader.clone()),
diff --git a/crates/shirabe/src/repository/vcs/git_driver.rs b/crates/shirabe/src/repository/vcs/git_driver.rs
index 69b16b6..665e2fb 100644
--- a/crates/shirabe/src/repository/vcs/git_driver.rs
+++ b/crates/shirabe/src/repository/vcs/git_driver.rs
@@ -13,6 +13,7 @@ use shirabe_php_shim::{
use crate::cache::Cache;
use crate::config::Config;
use crate::io::IOInterface;
+use crate::io::IOInterfaceImmutable;
use crate::repository::vcs::VcsDriverBase;
use crate::util::Filesystem;
use crate::util::Git as GitUtil;
@@ -31,7 +32,7 @@ pub struct GitDriver {
impl GitDriver {
pub fn new(
repo_config: IndexMap<String, shirabe_php_shim::PhpMixed>,
- io: Box<dyn IOInterface>,
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
config: std::rc::Rc<std::cell::RefCell<Config>>,
http_downloader: std::rc::Rc<std::cell::RefCell<crate::util::HttpDownloader>>,
process: std::rc::Rc<std::cell::RefCell<ProcessExecutor>>,
@@ -117,7 +118,7 @@ impl GitDriver {
}
let mut git_util = GitUtil::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
self.inner.config.clone(),
self.inner.process.clone(),
std::rc::Rc::new(std::cell::RefCell::new(Filesystem::new(None))),
@@ -154,7 +155,7 @@ impl GitDriver {
.unwrap_or("")
.to_string();
self.inner.cache = Some(Cache::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
&format!(
"{}/{}",
cache_repo_dir,
@@ -183,7 +184,7 @@ impl GitDriver {
self.root_identifier = Some("master".to_string());
let mut git_util = GitUtil::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
self.inner.config.clone(),
self.inner.process.clone(),
std::rc::Rc::new(std::cell::RefCell::new(Filesystem::new(None))),
@@ -399,7 +400,7 @@ impl GitDriver {
}
pub fn supports(
- io: &dyn IOInterface,
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
_config: &Config,
url: &str,
deep: bool,
@@ -419,7 +420,9 @@ impl GitDriver {
return Ok(false);
}
- let process = std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(io)));
+ let process = std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(Some(
+ io.clone(),
+ ))));
let mut output = String::new();
if process.borrow_mut().execute_args(
&["git".to_string(), "tag".to_string()],
@@ -432,7 +435,7 @@ impl GitDriver {
GitUtil::check_for_repo_ownership_error(
&process.borrow().get_error_output(),
&url,
- Some(io),
+ Some(io.clone()),
)?;
}
@@ -440,7 +443,9 @@ impl GitDriver {
return Ok(false);
}
- let process = std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(io)));
+ let process = std::rc::Rc::new(std::cell::RefCell::new(ProcessExecutor::new(Some(
+ io.clone(),
+ ))));
// TODO(phase-b): supports() takes &Config; GitUtil now needs Rc<RefCell<Config>>.
// Skipping clean Rc construction since we cannot reconstruct one from a borrowed &Config.
let _ = _config;
@@ -449,7 +454,7 @@ impl GitDriver {
));
#[allow(unreachable_code)]
let mut git_util = GitUtil::new(
- io.clone_box(),
+ io.clone(),
todo!(),
process.clone(),
std::rc::Rc::new(std::cell::RefCell::new(Filesystem::new(None))),
diff --git a/crates/shirabe/src/repository/vcs/github_driver.rs b/crates/shirabe/src/repository/vcs/github_driver.rs
index 6c8d495..5f8266c 100644
--- a/crates/shirabe/src/repository/vcs/github_driver.rs
+++ b/crates/shirabe/src/repository/vcs/github_driver.rs
@@ -15,6 +15,7 @@ use crate::cache::Cache;
use crate::config::Config;
use crate::downloader::TransportException;
use crate::io::IOInterface;
+use crate::io::IOInterfaceImmutable;
use crate::json::JsonFile;
use crate::repository::vcs::GitDriver;
use crate::repository::vcs::VcsDriverBase;
@@ -88,7 +89,7 @@ impl GitHubDriver {
self.inner.origin_url = "github.com".to_string();
}
self.inner.cache = Some(Cache::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
&format!(
"{}/{}/{}/{}",
self.inner
@@ -1015,7 +1016,7 @@ impl GitHubDriver {
Ok(r) => Ok(r),
Err(e) => {
let mut git_hub_util = GitHub::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
self.inner.config.clone(),
Some(self.inner.process.clone()),
Some(self.inner.http_downloader.clone()),
@@ -1294,7 +1295,7 @@ impl GitHubDriver {
repo_config.insert("url".to_string(), PhpMixed::String(url.to_string()));
let mut git_driver = GitDriver::new(
repo_config,
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
self.inner.config.clone(),
self.inner.http_downloader.clone(),
self.inner.process.clone(),
diff --git a/crates/shirabe/src/repository/vcs/gitlab_driver.rs b/crates/shirabe/src/repository/vcs/gitlab_driver.rs
index 8a24b7d..e31eb67 100644
--- a/crates/shirabe/src/repository/vcs/gitlab_driver.rs
+++ b/crates/shirabe/src/repository/vcs/gitlab_driver.rs
@@ -15,6 +15,7 @@ use crate::cache::Cache;
use crate::config::Config;
use crate::downloader::TransportException;
use crate::io::IOInterface;
+use crate::io::IOInterfaceImmutable;
use crate::json::JsonFile;
use crate::repository::vcs::GitDriver;
use crate::repository::vcs::VcsDriverBase;
@@ -183,7 +184,7 @@ impl GitLabDriver {
.unwrap_or_default();
self.inner.cache = Some(Cache::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
&format!(
"{}/{}/{}/{}",
self.inner
@@ -768,7 +769,7 @@ impl GitLabDriver {
repo_config.insert("url".to_string(), PhpMixed::String(url.to_string()));
let mut git_driver = GitDriver::new(
repo_config,
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
self.inner.config.clone(),
self.inner.http_downloader.clone(),
self.inner.process.clone(),
@@ -885,7 +886,7 @@ impl GitLabDriver {
}
Err(e) => {
let mut git_lab_util = GitLab::new(
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
self.inner.config.clone(),
Some(self.inner.process.clone()),
Some(self.inner.http_downloader.clone()),
diff --git a/crates/shirabe/src/repository/vcs/hg_driver.rs b/crates/shirabe/src/repository/vcs/hg_driver.rs
index 8f40d2a..ab3bd0c 100644
--- a/crates/shirabe/src/repository/vcs/hg_driver.rs
+++ b/crates/shirabe/src/repository/vcs/hg_driver.rs
@@ -3,6 +3,7 @@
use crate::cache::Cache;
use crate::config::Config;
use crate::io::IOInterface;
+use crate::io::IOInterfaceImmutable;
use crate::io::io_interface;
use crate::repository::vcs::VcsDriverBase;
use crate::util::Filesystem;
@@ -61,12 +62,12 @@ impl HgDriver {
self.inner.config.borrow_mut().prohibit_url_by_config(
&self.inner.url,
- Some(&*self.inner.io),
+ Some(&*self.inner.io.borrow()),
&indexmap::IndexMap::new(),
)?;
let hg_utils = HgUtils::new(
- &*self.inner.io,
+ self.inner.io.clone(),
&*self.inner.config.borrow(),
&self.inner.process,
);
@@ -308,7 +309,12 @@ impl HgDriver {
Ok(self.branches.clone().unwrap_or_default())
}
- pub fn supports(io: &dyn IOInterface, config: &Config, url: &str, deep: bool) -> bool {
+ pub fn supports(
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
+ config: &Config,
+ url: &str,
+ deep: bool,
+ ) -> bool {
if Preg::is_match(
r"#(^(?:https?|ssh)://(?:[^@]+@)?bitbucket.org|https://(?:.*?)\.kilnhg.com)#i",
url,
@@ -324,7 +330,7 @@ impl HgDriver {
return false;
}
- let mut process = crate::util::ProcessExecutor::new(io);
+ let mut process = crate::util::ProcessExecutor::new(Some(io.clone()));
let mut output = String::new();
if process.execute_args(
&["hg", "summary"].map(|s| s.to_string()).to_vec(),
@@ -340,7 +346,7 @@ impl HgDriver {
return false;
}
- let mut process = crate::util::ProcessExecutor::new(io);
+ let mut process = crate::util::ProcessExecutor::new(Some(io));
let mut ignored = String::new();
let exit = process.execute_args(
&["hg", "identify", "--", url]
diff --git a/crates/shirabe/src/repository/vcs/perforce_driver.rs b/crates/shirabe/src/repository/vcs/perforce_driver.rs
index 35da517..03948b3 100644
--- a/crates/shirabe/src/repository/vcs/perforce_driver.rs
+++ b/crates/shirabe/src/repository/vcs/perforce_driver.rs
@@ -77,7 +77,7 @@ impl PerforceDriver {
self.inner.url.clone(),
repo_dir,
self.inner.process.clone(),
- self.inner.io.clone_box(),
+ self.inner.io.clone(),
));
Ok(())
@@ -167,9 +167,14 @@ impl PerforceDriver {
.into())
}
- pub fn supports(io: &dyn IOInterface, _config: &Config, url: &str, deep: bool) -> bool {
+ pub fn supports(
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
+ _config: &Config,
+ url: &str,
+ deep: bool,
+ ) -> bool {
if deep || Preg::is_match(r"#\b(perforce|p4)\b#i", url).unwrap_or(false) {
- return Perforce::check_server_exists(url, &mut ProcessExecutor::new(io));
+ return Perforce::check_server_exists(url, &mut ProcessExecutor::new(Some(io)));
}
false
}
diff --git a/crates/shirabe/src/repository/vcs/svn_driver.rs b/crates/shirabe/src/repository/vcs/svn_driver.rs
index a6ca9c1..a793340 100644
--- a/crates/shirabe/src/repository/vcs/svn_driver.rs
+++ b/crates/shirabe/src/repository/vcs/svn_driver.rs
@@ -468,7 +468,12 @@ impl SvnDriver {
self.branches.as_ref().unwrap()
}
- pub fn supports(io: &dyn IOInterface, _config: &Config, url: &str, deep: bool) -> bool {
+ pub fn supports(
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
+ _config: &Config,
+ url: &str,
+ deep: bool,
+ ) -> bool {
let url = Self::normalize_url(url);
if Preg::is_match(r"#(^svn://|^svn\+ssh://|svn\.)#i", &url).unwrap_or(false) {
return true;
@@ -479,7 +484,7 @@ impl SvnDriver {
return false;
}
- let mut process = ProcessExecutor::new(io);
+ let mut process = ProcessExecutor::new(Some(io));
let mut ignored_output = String::new();
let exit = process.execute_args(
&[
diff --git a/crates/shirabe/src/repository/vcs/vcs_driver.rs b/crates/shirabe/src/repository/vcs/vcs_driver.rs
index 71476b9..15dd722 100644
--- a/crates/shirabe/src/repository/vcs/vcs_driver.rs
+++ b/crates/shirabe/src/repository/vcs/vcs_driver.rs
@@ -23,7 +23,7 @@ pub struct VcsDriverBase {
pub url: String,
pub origin_url: String,
pub repo_config: IndexMap<String, PhpMixed>,
- pub io: Box<dyn IOInterface>,
+ pub io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
pub config: std::rc::Rc<std::cell::RefCell<Config>>,
pub process: std::rc::Rc<std::cell::RefCell<ProcessExecutor>>,
pub http_downloader: std::rc::Rc<std::cell::RefCell<HttpDownloader>>,
@@ -34,7 +34,7 @@ pub struct VcsDriverBase {
impl VcsDriverBase {
pub fn new(
repo_config: IndexMap<String, PhpMixed>,
- io: Box<dyn IOInterface>,
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
config: std::rc::Rc<std::cell::RefCell<Config>>,
http_downloader: std::rc::Rc<std::cell::RefCell<HttpDownloader>>,
process: std::rc::Rc<std::cell::RefCell<ProcessExecutor>>,