From c028a9d5c737de5d2b259638a0a76b999364a262 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 6 Jun 2026 22:40:30 +0900 Subject: 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> and return Result, 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) --- .../shirabe/src/repository/vcs/perforce_driver.rs | 100 ++++++++++++++++++++- 1 file changed, 96 insertions(+), 4 deletions(-) (limited to 'crates/shirabe/src/repository/vcs/perforce_driver.rs') diff --git a/crates/shirabe/src/repository/vcs/perforce_driver.rs b/crates/shirabe/src/repository/vcs/perforce_driver.rs index 03948b3..d653869 100644 --- a/crates/shirabe/src/repository/vcs/perforce_driver.rs +++ b/crates/shirabe/src/repository/vcs/perforce_driver.rs @@ -169,14 +169,34 @@ impl PerforceDriver { pub fn supports( io: std::rc::Rc>, - _config: &Config, + _config: std::rc::Rc>, url: &str, deep: bool, - ) -> bool { + ) -> anyhow::Result { if deep || Preg::is_match(r"#\b(perforce|p4)\b#i", url).unwrap_or(false) { - return Perforce::check_server_exists(url, &mut ProcessExecutor::new(Some(io))); + return Ok(Perforce::check_server_exists( + url, + &mut ProcessExecutor::new(Some(io)), + )); } - false + Ok(false) + } + + pub fn get_composer_information( + &mut self, + identifier: &str, + ) -> anyhow::Result>> { + 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) } pub fn cleanup(&mut self) -> anyhow::Result<()> { @@ -193,3 +213,75 @@ impl PerforceDriver { &self.branch } } + +impl crate::repository::vcs::VcsDriverInterface for PerforceDriver { + fn initialize(&mut self) -> anyhow::Result<()> { + PerforceDriver::initialize(self) + } + + fn get_composer_information( + &mut self, + identifier: &str, + ) -> anyhow::Result>> { + PerforceDriver::get_composer_information(self, identifier) + } + + fn get_file_content(&mut self, file: &str, identifier: &str) -> anyhow::Result> { + PerforceDriver::get_file_content(self, file, identifier) + } + + fn get_change_date( + &mut self, + identifier: &str, + ) -> anyhow::Result>> { + PerforceDriver::get_change_date(self, identifier) + } + + fn get_root_identifier(&mut self) -> anyhow::Result { + Ok(PerforceDriver::get_root_identifier(self).to_string()) + } + + fn get_branches(&mut self) -> anyhow::Result> { + PerforceDriver::get_branches(self) + } + + fn get_tags(&mut self) -> anyhow::Result> { + PerforceDriver::get_tags(self) + } + + fn get_dist(&self, identifier: &str) -> anyhow::Result>> { + Ok(PerforceDriver::get_dist(self, identifier).map(|m| { + m.into_iter() + .map(|(k, v)| (k, v.as_string().unwrap_or("").to_string())) + .collect() + })) + } + + fn get_source(&self, identifier: &str) -> anyhow::Result> { + Ok(PerforceDriver::get_source(self, identifier) + .into_iter() + .map(|(k, v)| (k, v.as_string().unwrap_or("").to_string())) + .collect()) + } + + fn get_url(&self) -> String { + PerforceDriver::get_url(self).to_string() + } + + fn has_composer_file(&mut self, identifier: &str) -> anyhow::Result { + Ok(PerforceDriver::has_composer_file(self, identifier)) + } + + fn cleanup(&mut self) -> anyhow::Result<()> { + PerforceDriver::cleanup(self) + } + + fn supports( + io: std::rc::Rc>, + config: std::rc::Rc>, + url: &str, + deep: bool, + ) -> anyhow::Result { + PerforceDriver::supports(io, config, url, deep) + } +} -- cgit v1.3.1