From dd19bda86582e9f6a4ba1879112d9ab3ba8432f6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 3 Jun 2026 23:24:52 +0900 Subject: feat(downloader): implement ChangeReport/VcsCapable for VCS downloaders Git/Svn/Hg/Fossil/Perforce now implement ChangeReportInterface and VcsCapableDownloaderInterface and override the as_* downcasts, so PHP-style instanceof checks on a DownloaderInterface resolve to these sub-interfaces. get_local_changes lives directly in the ChangeReportInterface impl (returning anyhow::Result; GitDownloader now surfaces a RuntimeException instead of panicking on a failed git status). get_vcs_reference is shared via a new VcsDownloaderBase helper that each downloader delegates to. Co-Authored-By: Claude Opus 4.8 --- crates/shirabe/src/downloader/vcs_downloader.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'crates/shirabe/src/downloader/vcs_downloader.rs') diff --git a/crates/shirabe/src/downloader/vcs_downloader.rs b/crates/shirabe/src/downloader/vcs_downloader.rs index fadfa98..493440c 100644 --- a/crates/shirabe/src/downloader/vcs_downloader.rs +++ b/crates/shirabe/src/downloader/vcs_downloader.rs @@ -69,6 +69,24 @@ impl VcsDownloaderBase { // Callers in subclasses must do that check themselves (they already have). Ok(None) } + + pub fn get_vcs_reference(&self, package: PackageInterfaceHandle, path: &str) -> Option { + let parser = VersionParser::new(); + let mut guesser = VersionGuesser::new( + self.config.clone(), + self.process.clone(), + parser.clone(), + Some(self.io.clone()), + ); + let dumper = ArrayDumper::new(); + + let package_config = dumper.dump(package.clone()); + if let Ok(Some(package_version)) = guesser.guess_version(&package_config, path) { + return package_version.commit.clone(); + } + + None + } } pub trait VcsDownloader: -- cgit v1.3.1