From 59bab6efee41a196b0d9d392167c536abbe068ba Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 10 May 2026 20:31:00 +0900 Subject: refactor(downloader): introduce top-level downloader module Move VCS downloaders and DownloadManager out of vcs/repository into a new top-level downloader module mirroring Composer\Downloader, and add stub types for the remaining Composer downloader hierarchy (file, archive variants, path, perforce, fossil, exceptions, interfaces) so future ports have a home. --- .../mozart-core/src/downloader/vcs_downloader.rs | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 crates/mozart-core/src/downloader/vcs_downloader.rs (limited to 'crates/mozart-core/src/downloader/vcs_downloader.rs') diff --git a/crates/mozart-core/src/downloader/vcs_downloader.rs b/crates/mozart-core/src/downloader/vcs_downloader.rs new file mode 100644 index 0000000..ce56d41 --- /dev/null +++ b/crates/mozart-core/src/downloader/vcs_downloader.rs @@ -0,0 +1,55 @@ +/// The VCS downloader interface. +/// +/// Corresponds to Composer's `VcsDownloader` hierarchy. +pub trait VcsDownloader { + /// Prepare for installation (e.g., sync mirror cache). + fn download(&self, url: &str, reference: &str, target: &std::path::Path) -> anyhow::Result<()>; + + /// Install (clone/checkout) the source to the target directory. + fn install(&self, url: &str, reference: &str, target: &std::path::Path) -> anyhow::Result<()>; + + /// Update the source at target to a new reference. + fn update( + &self, + url: &str, + old_ref: &str, + new_ref: &str, + target: &std::path::Path, + ) -> anyhow::Result<()>; + + /// Remove the source from the target directory. + fn remove(&self, target: &std::path::Path) -> anyhow::Result<()>; + + /// Detect local changes in the working copy. + /// Returns `None` if clean, `Some(diff)` if modified. + /// Mirrors `Composer\Downloader\ChangeReportInterface::getLocalChanges`. + fn get_local_changes(&self, target: &std::path::Path) -> anyhow::Result>; + + /// Detect commits present locally but not on the tracking remote. + /// Returns `None` if there are no unpushed commits or the concept does + /// not apply (only `GitDownloader` implements this in Composer's + /// `DvcsDownloaderInterface`). + fn unpushed_changes(&self, _target: &std::path::Path) -> anyhow::Result> { + Ok(None) + } + + /// Resolve the working copy's current VCS reference (e.g. commit hash). + /// Returns `None` if no reference can be determined. Mirrors + /// `Composer\Downloader\VcsCapableDownloaderInterface::getVcsReference`. + fn vcs_reference(&self, _target: &std::path::Path) -> anyhow::Result> { + Ok(None) + } + + /// Get commit log between two references. + fn commit_logs(&self, from: &str, to: &str, target: &std::path::Path) + -> anyhow::Result; + + /// instanceof ChangeReportInterface + fn is_change_report(&self) -> bool; + + /// instanceof VcsCapableDownloaderInterface + fn is_vcs_capable_downloader(&self) -> bool; + + /// instanceof DvcsDownloaderInterface + fn is_dvcs_downloader(&self) -> bool; +} -- cgit v1.3.1