aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/vcs/fossil_driver.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-06 22:40:30 +0900
committernsfisis <nsfisis@gmail.com>2026-06-06 22:54:44 +0900
commitc028a9d5c737de5d2b259638a0a76b999364a262 (patch)
tree36c7678a335d284e6d2139346660c77f1e124ddc /crates/shirabe/src/repository/vcs/fossil_driver.rs
parent33550b03c1724fbc8c1c8630c3b03fca1f0c0dc7 (diff)
downloadphp-shirabe-c028a9d5c737de5d2b259638a0a76b999364a262.tar.gz
php-shirabe-c028a9d5c737de5d2b259638a0a76b999364a262.tar.zst
php-shirabe-c028a9d5c737de5d2b259638a0a76b999364a262.zip
feat(vcs): implement VcsDriverInterface for all VCS drivers
Reconcile the VcsDriverInterface trait with the concrete drivers so every driver implements it as in PHP, where each driver extends VcsDriver. - Make cache-mutating getters take &mut self in the trait, matching the inherent methods' lazy-cache semantics; update vcs_repository consumers. - Change supports() to take Rc<RefCell<Config>> and return Result<bool>, completing GitDriver::supports deep ls-remote and its config wiring. - Add base get_composer_information to Git/Hg/Fossil/Perforce and an impl VcsDriverInterface block to every driver, delegating to inherent methods and absorbing type differences in the impl. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/vcs/fossil_driver.rs')
-rw-r--r--crates/shirabe/src/repository/vcs/fossil_driver.rs103
1 files changed, 96 insertions, 7 deletions
diff --git a/crates/shirabe/src/repository/vcs/fossil_driver.rs b/crates/shirabe/src/repository/vcs/fossil_driver.rs
index 1e34f21..5b7ccc1 100644
--- a/crates/shirabe/src/repository/vcs/fossil_driver.rs
+++ b/crates/shirabe/src/repository/vcs/fossil_driver.rs
@@ -8,6 +8,7 @@ use shirabe_php_shim::{PhpMixed, RuntimeException, dirname, is_dir, is_file, is_
use crate::cache::Cache;
use crate::config::Config;
+use crate::downloader::TransportException;
use crate::io::IOInterface;
use crate::io::IOInterfaceImmutable;
use crate::repository::vcs::VcsDriverBase;
@@ -292,28 +293,28 @@ impl FossilDriver {
pub fn supports(
io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
- config: &Config,
+ _config: std::rc::Rc<std::cell::RefCell<Config>>,
url: &str,
deep: bool,
- ) -> bool {
+ ) -> anyhow::Result<bool> {
if Preg::is_match(
r"#(^(?:https?|ssh)://(?:[^@]@)?(?:chiselapp\.com|fossil\.))#i",
url,
)
.unwrap_or(false)
{
- return true;
+ return Ok(true);
}
if Preg::is_match(r"!/fossil/|\.fossil!", url).unwrap_or(false) {
- return true;
+ return Ok(true);
}
// local filesystem
if Filesystem::is_local_path(url) {
let url = Filesystem::get_platform_path(url);
if !is_dir(&url) {
- return false;
+ return Ok(false);
}
let mut process = ProcessExecutor::new(Some(io));
@@ -324,10 +325,98 @@ impl FossilDriver {
Some(url),
) == 0
{
- return true;
+ return Ok(true);
}
}
- false
+ Ok(false)
+ }
+
+ pub fn get_composer_information(
+ &mut self,
+ identifier: &str,
+ ) -> anyhow::Result<Option<IndexMap<String, PhpMixed>>> {
+ if let Some(cached) = self.inner.read_cached_composer(identifier)? {
+ return Ok(cached);
+ }
+
+ let file_content = self.get_file_content("composer.json", identifier)?;
+ let composer =
+ VcsDriverBase::finish_base_composer_information(identifier, file_content, || {
+ self.get_change_date(identifier)
+ })?;
+
+ self.inner.write_cached_composer(identifier, composer)
+ }
+}
+
+impl crate::repository::vcs::VcsDriverInterface for FossilDriver {
+ fn initialize(&mut self) -> anyhow::Result<()> {
+ FossilDriver::initialize(self)
+ }
+
+ fn get_composer_information(
+ &mut self,
+ identifier: &str,
+ ) -> anyhow::Result<Option<IndexMap<String, PhpMixed>>> {
+ FossilDriver::get_composer_information(self, identifier)
+ }
+
+ fn get_file_content(&mut self, file: &str, identifier: &str) -> anyhow::Result<Option<String>> {
+ FossilDriver::get_file_content(self, file, identifier)
+ }
+
+ fn get_change_date(&mut self, identifier: &str) -> anyhow::Result<Option<DateTime<Utc>>> {
+ FossilDriver::get_change_date(self, identifier)
+ }
+
+ fn get_root_identifier(&mut self) -> anyhow::Result<String> {
+ Ok(FossilDriver::get_root_identifier(self))
+ }
+
+ fn get_branches(&mut self) -> anyhow::Result<IndexMap<String, String>> {
+ FossilDriver::get_branches(self)
+ }
+
+ fn get_tags(&mut self) -> anyhow::Result<IndexMap<String, String>> {
+ FossilDriver::get_tags(self)
+ }
+
+ fn get_dist(&self, identifier: &str) -> anyhow::Result<Option<IndexMap<String, String>>> {
+ Ok(FossilDriver::get_dist(self, identifier))
+ }
+
+ fn get_source(&self, identifier: &str) -> anyhow::Result<IndexMap<String, String>> {
+ Ok(FossilDriver::get_source(self, identifier))
+ }
+
+ fn get_url(&self) -> String {
+ FossilDriver::get_url(self)
+ }
+
+ fn has_composer_file(&mut self, identifier: &str) -> anyhow::Result<bool> {
+ match self.get_composer_information(identifier) {
+ Ok(info) => Ok(info.is_some()),
+ Err(e) => {
+ if e.downcast_ref::<TransportException>().is_some() {
+ Ok(false)
+ } else {
+ Err(e)
+ }
+ }
+ }
+ }
+
+ fn cleanup(&mut self) -> anyhow::Result<()> {
+ Ok(())
+ }
+
+ fn supports(
+ io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>,
+ config: std::rc::Rc<std::cell::RefCell<Config>>,
+ url: &str,
+ deep: bool,
+ ) -> anyhow::Result<bool> {
+ FossilDriver::supports(io, config, url, deep)
}
}