From cc5d73c05a0abca2eebcc8a6afa0b1543ee49850 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 27 May 2026 00:49:33 +0900 Subject: refactor(package): pass package handles by value throughout Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/shirabe/src/repository/array_repository.rs | 5 ++- .../shirabe/src/repository/composer_repository.rs | 10 ++---- .../shirabe/src/repository/composite_repository.rs | 7 ++--- .../src/repository/filesystem_repository.rs | 36 ++++++++++------------ crates/shirabe/src/repository/filter_repository.rs | 3 +- .../src/repository/installed_array_repository.rs | 5 ++- .../repository/installed_filesystem_repository.rs | 5 ++- .../shirabe/src/repository/installed_repository.rs | 3 +- .../src/repository/lock_array_repository.rs | 3 +- .../shirabe/src/repository/platform_repository.rs | 4 +-- .../shirabe/src/repository/repository_interface.rs | 3 +- crates/shirabe/src/repository/repository_utils.rs | 3 +- .../src/repository/root_package_repository.rs | 3 +- .../src/repository/writable_array_repository.rs | 5 ++- .../repository/writable_repository_interface.rs | 3 +- 15 files changed, 42 insertions(+), 56 deletions(-) (limited to 'crates/shirabe/src/repository') diff --git a/crates/shirabe/src/repository/array_repository.rs b/crates/shirabe/src/repository/array_repository.rs index 16f5f30..6467c14 100644 --- a/crates/shirabe/src/repository/array_repository.rs +++ b/crates/shirabe/src/repository/array_repository.rs @@ -12,7 +12,6 @@ use shirabe_semver::constraint::SimpleConstraint; use crate::package::BasePackageHandle; use crate::package::PackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::package::version::StabilityFilter; use crate::package::version::VersionParser; @@ -96,7 +95,7 @@ impl ArrayRepository { } /// Removes package from repository. - pub fn remove_package(&self, package: &dyn PackageInterface) { + pub fn remove_package(&self, package: PackageInterfaceHandle) { let package_id = package.get_unique_name(); let mut packages_borrow = self.packages.borrow_mut(); @@ -367,7 +366,7 @@ impl RepositoryInterface for ArrayRepository { matches.into_values().collect() } - fn has_package(&self, package: &dyn PackageInterface) -> bool { + fn has_package(&self, package: PackageInterfaceHandle) -> bool { if self.package_map.borrow().is_none() { let mut map: IndexMap = IndexMap::new(); for repo_package in self.get_packages() { diff --git a/crates/shirabe/src/repository/composer_repository.rs b/crates/shirabe/src/repository/composer_repository.rs index d055e59..ddf8e31 100644 --- a/crates/shirabe/src/repository/composer_repository.rs +++ b/crates/shirabe/src/repository/composer_repository.rs @@ -1387,7 +1387,7 @@ impl ComposerRepository { Ok(vec![]) } - fn configure_package_transport_options(&self, package: &mut dyn PackageInterface) { + fn configure_package_transport_options(&self, package: PackageInterfaceHandle) { for url in package.get_dist_urls() { if url.starts_with(&self.base_url) { package.set_transport_options(self.options.clone()); @@ -1780,9 +1780,7 @@ impl ComposerRepository { /// Adds a new package to the repository pub fn add_package(&mut self, package: BasePackageHandle) { - self.configure_package_transport_options( - package.as_rc().borrow_mut().as_package_interface_mut(), - ); + self.configure_package_transport_options(package.clone()); self.inner.add_package(package.into()); } @@ -2762,9 +2760,7 @@ impl ComposerRepository { .collect(); package.set_dist_mirrors(Some(converted)); } - self.configure_package_transport_options( - package.as_rc().borrow_mut().as_package_interface_mut(), - ); + self.configure_package_transport_options(package.clone()); results.push(package.into()); } Ok(results) diff --git a/crates/shirabe/src/repository/composite_repository.rs b/crates/shirabe/src/repository/composite_repository.rs index 024f89a..12f1837 100644 --- a/crates/shirabe/src/repository/composite_repository.rs +++ b/crates/shirabe/src/repository/composite_repository.rs @@ -6,7 +6,6 @@ use indexmap::IndexMap; use shirabe_semver::constraint::AnyConstraint; use crate::package::BasePackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::repository::{ FindPackageConstraint, LoadPackagesResult, ProviderInfo, RepositoryInterface, SearchResult, @@ -32,7 +31,7 @@ impl CompositeRepository { &self.repositories } - pub fn remove_package(&mut self, _package: &dyn PackageInterface) { + pub fn remove_package(&mut self, _package: PackageInterfaceHandle) { // TODO(phase-b): only call remove_package on WritableRepositoryInterface implementors; // requires a downcast helper such as `as_writable() -> Option<&mut dyn WritableRepositoryInterface>` on RepositoryInterface. for _repository in &mut self.repositories { @@ -67,9 +66,9 @@ impl RepositoryInterface for CompositeRepository { format!("composite repo ({})", names.join(", ")) } - fn has_package(&self, package: &dyn PackageInterface) -> bool { + fn has_package(&self, package: PackageInterfaceHandle) -> bool { for repository in &self.repositories { - if repository.has_package(package) { + if repository.has_package(package.clone()) { return true; } } diff --git a/crates/shirabe/src/repository/filesystem_repository.rs b/crates/shirabe/src/repository/filesystem_repository.rs index c8ffb7c..8232ecf 100644 --- a/crates/shirabe/src/repository/filesystem_repository.rs +++ b/crates/shirabe/src/repository/filesystem_repository.rs @@ -16,9 +16,7 @@ use shirabe_php_shim::{ use crate::installed_versions::InstalledVersions; use crate::installer::InstallationManager; use crate::json::JsonFile; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; -use crate::package::RootPackageInterface; use crate::package::RootPackageInterfaceHandle; use crate::package::dumper::ArrayDumper; use crate::package::loader::ArrayLoader; @@ -219,9 +217,8 @@ impl FilesystemRepository { let mut install_paths: IndexMap> = IndexMap::new(); for package in self.inner.get_canonical_packages() { - let mut pkg_array = dumper.dump(package.as_rc().borrow().as_package_interface()); - let path = installation_manager - .get_install_path(package.as_rc().borrow().as_package_interface()); + let mut pkg_array = dumper.dump(package.clone()); + let path = installation_manager.get_install_path(package.clone()); let mut install_path: Option = None; if let Some(path_str) = &path { if !path_str.is_empty() { @@ -508,11 +505,7 @@ impl FilesystemRepository { "root".to_string(), PhpMixed::Array( self.dump_root_package( - current_root - .as_rc() - .borrow() - .as_root_package_interface() - .expect("current_root is a RootPackageInterface"), + current_root.clone(), install_paths, dev_mode, repo_dir, @@ -532,7 +525,7 @@ impl FilesystemRepository { } let dumped = self.dump_installed_package( - package.as_rc().borrow().as_package_interface(), + package.clone(), install_paths, repo_dir, &dev_packages, @@ -633,7 +626,7 @@ impl FilesystemRepository { /// @return array{pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev_requirement: bool} fn dump_installed_package( &self, - package: &dyn PackageInterface, + package: PackageInterfaceHandle, install_paths: &IndexMap>, repo_dir: &str, dev_packages: &PhpMixed, @@ -648,8 +641,8 @@ impl FilesystemRepository { } if reference.is_none() { // PHP: ($package->getSourceReference() ?: $package->getDistReference()) ?: null; - let source = package.get_source_reference().unwrap_or(""); - let dist = package.get_dist_reference().unwrap_or(""); + let source = package.get_source_reference().unwrap_or_default(); + let dist = package.get_dist_reference().unwrap_or_default(); let combined = if !source.is_empty() { source.to_string() } else { @@ -662,7 +655,7 @@ impl FilesystemRepository { }; } - let install_path = if package.as_root_package_interface().is_some() { + let install_path = if package.as_root().is_some() { let to = self.filesystem.borrow_mut().normalize_path( &realpath(&Platform::get_cwd(false).unwrap_or_default()).unwrap_or_default(), ); @@ -672,7 +665,7 @@ impl FilesystemRepository { .find_shortest_path(repo_dir, &to, true, false), ) } else { - install_paths.get(package.get_name()).cloned().flatten() + install_paths.get(&package.get_name()).cloned().flatten() }; let mut data: IndexMap = IndexMap::new(); @@ -708,7 +701,7 @@ impl FilesystemRepository { PhpMixed::Bool( dev_packages .as_array() - .map(|m| m.contains_key(package.get_name())) + .map(|m| m.contains_key(&package.get_name())) .unwrap_or(false), ), ); @@ -721,13 +714,18 @@ impl FilesystemRepository { /// @return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} fn dump_root_package( &self, - package: &dyn RootPackageInterface, + package: RootPackageInterfaceHandle, install_paths: &IndexMap>, dev_mode: bool, repo_dir: &str, dev_packages: &PhpMixed, ) -> IndexMap { - let data = self.dump_installed_package(package, install_paths, repo_dir, dev_packages); + let data = self.dump_installed_package( + package.clone().into(), + install_paths, + repo_dir, + dev_packages, + ); let mut result: IndexMap = IndexMap::new(); result.insert( diff --git a/crates/shirabe/src/repository/filter_repository.rs b/crates/shirabe/src/repository/filter_repository.rs index c67e4ff..2a339f5 100644 --- a/crates/shirabe/src/repository/filter_repository.rs +++ b/crates/shirabe/src/repository/filter_repository.rs @@ -1,7 +1,6 @@ //! ref: composer/src/Composer/Repository/FilterRepository.php use crate::package::BasePackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::package::base_package::{self}; use crate::repository::{AdvisoryProviderInterface, SecurityAdvisoryResult}; @@ -159,7 +158,7 @@ impl shirabe_php_shim::Countable for FilterRepository { } impl RepositoryInterface for FilterRepository { - fn has_package(&self, package: &dyn PackageInterface) -> bool { + fn has_package(&self, package: PackageInterfaceHandle) -> bool { self.repo.has_package(package) } diff --git a/crates/shirabe/src/repository/installed_array_repository.rs b/crates/shirabe/src/repository/installed_array_repository.rs index f0244b6..ca2d8c7 100644 --- a/crates/shirabe/src/repository/installed_array_repository.rs +++ b/crates/shirabe/src/repository/installed_array_repository.rs @@ -5,7 +5,6 @@ use shirabe_php_shim::Countable; use shirabe_semver::constraint::AnyConstraint; use crate::package::BasePackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::repository::AdvisoryProviderInterface; use crate::repository::InstalledRepositoryInterface; @@ -64,7 +63,7 @@ impl WritableRepositoryInterface for InstalledArrayRepository { fn remove_package( &mut self, - package: &dyn crate::package::PackageInterface, + package: crate::package::PackageInterfaceHandle, ) -> anyhow::Result<()> { todo!() } @@ -93,7 +92,7 @@ impl Countable for InstalledArrayRepository { } impl RepositoryInterface for InstalledArrayRepository { - fn has_package(&self, _package: &dyn PackageInterface) -> bool { + fn has_package(&self, _package: PackageInterfaceHandle) -> bool { todo!() } fn find_package( diff --git a/crates/shirabe/src/repository/installed_filesystem_repository.rs b/crates/shirabe/src/repository/installed_filesystem_repository.rs index 8a6359a..352d86f 100644 --- a/crates/shirabe/src/repository/installed_filesystem_repository.rs +++ b/crates/shirabe/src/repository/installed_filesystem_repository.rs @@ -7,7 +7,6 @@ use shirabe_semver::constraint::AnyConstraint; use crate::json::JsonFile; use crate::package::BasePackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::package::RootPackageInterfaceHandle; use crate::repository::AdvisoryProviderInterface; @@ -74,7 +73,7 @@ impl WritableRepositoryInterface for InstalledFilesystemRepository { fn remove_package( &mut self, - package: &dyn crate::package::PackageInterface, + package: crate::package::PackageInterfaceHandle, ) -> anyhow::Result<()> { todo!() } @@ -103,7 +102,7 @@ impl Countable for InstalledFilesystemRepository { } impl RepositoryInterface for InstalledFilesystemRepository { - fn has_package(&self, _package: &dyn PackageInterface) -> bool { + fn has_package(&self, _package: PackageInterfaceHandle) -> bool { todo!() } fn find_package( diff --git a/crates/shirabe/src/repository/installed_repository.rs b/crates/shirabe/src/repository/installed_repository.rs index 33356e3..486d4bd 100644 --- a/crates/shirabe/src/repository/installed_repository.rs +++ b/crates/shirabe/src/repository/installed_repository.rs @@ -8,7 +8,6 @@ use shirabe_semver::constraint::SimpleConstraint; use crate::package::BasePackageHandle; use crate::package::Link; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::package::version::VersionParser; use crate::repository::CompositeRepository; @@ -424,7 +423,7 @@ impl RepositoryInterface for InstalledRepository { format!("installed repo ({})", names.join(", ")) } - fn has_package(&self, package: &dyn PackageInterface) -> bool { + fn has_package(&self, package: PackageInterfaceHandle) -> bool { self.inner.has_package(package) } diff --git a/crates/shirabe/src/repository/lock_array_repository.rs b/crates/shirabe/src/repository/lock_array_repository.rs index 3d00ecf..cbc8564 100644 --- a/crates/shirabe/src/repository/lock_array_repository.rs +++ b/crates/shirabe/src/repository/lock_array_repository.rs @@ -1,7 +1,6 @@ //! ref: composer/src/Composer/Repository/LockArrayRepository.php use crate::package::BasePackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::repository::ArrayRepository; use crate::repository::CanonicalPackagesTrait; @@ -36,7 +35,7 @@ impl Countable for LockArrayRepository { } impl RepositoryInterface for LockArrayRepository { - fn has_package(&self, package: &dyn PackageInterface) -> bool { + fn has_package(&self, package: PackageInterfaceHandle) -> bool { self.inner.has_package(package) } diff --git a/crates/shirabe/src/repository/platform_repository.rs b/crates/shirabe/src/repository/platform_repository.rs index 31760bb..1b95ff7 100644 --- a/crates/shirabe/src/repository/platform_repository.rs +++ b/crates/shirabe/src/repository/platform_repository.rs @@ -1903,7 +1903,7 @@ impl PlatformRepository { // ---- helpers ---- - fn is_complete_package(_package: &dyn PackageInterface) -> bool { + fn is_complete_package(_package: PackageInterfaceHandle) -> bool { // TODO(phase-b): use Any-style downcasting once the trait carries it. true } @@ -1950,7 +1950,7 @@ impl shirabe_php_shim::Countable for PlatformRepository { } impl crate::repository::RepositoryInterface for PlatformRepository { - fn has_package(&self, package: &dyn PackageInterface) -> bool { + fn has_package(&self, package: PackageInterfaceHandle) -> bool { self.inner.has_package(package) } diff --git a/crates/shirabe/src/repository/repository_interface.rs b/crates/shirabe/src/repository/repository_interface.rs index 9cadc48..316f509 100644 --- a/crates/shirabe/src/repository/repository_interface.rs +++ b/crates/shirabe/src/repository/repository_interface.rs @@ -1,7 +1,6 @@ //! ref: composer/src/Composer/Repository/RepositoryInterface.php use crate::package::BasePackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::repository::AdvisoryProviderInterface; use indexmap::IndexMap; @@ -54,7 +53,7 @@ pub const SEARCH_NAME: i64 = 1; pub const SEARCH_VENDOR: i64 = 2; pub trait RepositoryInterface: Countable + std::fmt::Debug { - fn has_package(&self, package: &dyn PackageInterface) -> bool; + fn has_package(&self, package: PackageInterfaceHandle) -> bool; fn find_package( &self, diff --git a/crates/shirabe/src/repository/repository_utils.rs b/crates/shirabe/src/repository/repository_utils.rs index 51b8673..667cea2 100644 --- a/crates/shirabe/src/repository/repository_utils.rs +++ b/crates/shirabe/src/repository/repository_utils.rs @@ -1,7 +1,6 @@ //! ref: composer/src/Composer/Repository/RepositoryUtils.php use crate::package::Link; -use crate::package::PackageInterface; use crate::repository::CompositeRepository; use crate::repository::FilterRepository; use crate::repository::RepositoryInterface; @@ -13,7 +12,7 @@ pub struct RepositoryUtils; impl RepositoryUtils { pub fn filter_required_packages( packages: &[crate::package::BasePackageHandle], - requirer: &dyn PackageInterface, + requirer: crate::package::PackageInterfaceHandle, include_require_dev: bool, mut bucket: Vec, ) -> Vec { diff --git a/crates/shirabe/src/repository/root_package_repository.rs b/crates/shirabe/src/repository/root_package_repository.rs index 71cd270..cb01a7c 100644 --- a/crates/shirabe/src/repository/root_package_repository.rs +++ b/crates/shirabe/src/repository/root_package_repository.rs @@ -1,7 +1,6 @@ //! ref: composer/src/Composer/Repository/RootPackageRepository.php use crate::package::BasePackageHandle; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::package::RootPackageInterfaceHandle; use crate::repository::ArrayRepository; @@ -32,7 +31,7 @@ impl shirabe_php_shim::Countable for RootPackageRepository { } impl RepositoryInterface for RootPackageRepository { - fn has_package(&self, package: &dyn PackageInterface) -> bool { + fn has_package(&self, package: PackageInterfaceHandle) -> bool { self.inner.has_package(package) } diff --git a/crates/shirabe/src/repository/writable_array_repository.rs b/crates/shirabe/src/repository/writable_array_repository.rs index ebe70c3..282f3c0 100644 --- a/crates/shirabe/src/repository/writable_array_repository.rs +++ b/crates/shirabe/src/repository/writable_array_repository.rs @@ -52,7 +52,10 @@ impl WritableArrayRepository { self.inner.add_package(package) } - pub fn remove_package(&mut self, package: &dyn crate::package::PackageInterface) -> Result<()> { + pub fn remove_package( + &mut self, + package: crate::package::PackageInterfaceHandle, + ) -> Result<()> { let _ = package; // TODO(phase-b): delegate to ArrayRepository once it implements remove_package Ok(()) diff --git a/crates/shirabe/src/repository/writable_repository_interface.rs b/crates/shirabe/src/repository/writable_repository_interface.rs index b5b1e35..abbcbe7 100644 --- a/crates/shirabe/src/repository/writable_repository_interface.rs +++ b/crates/shirabe/src/repository/writable_repository_interface.rs @@ -1,7 +1,6 @@ //! ref: composer/src/Composer/Repository/WritableRepositoryInterface.php use crate::installer::InstallationManager; -use crate::package::PackageInterface; use crate::package::PackageInterfaceHandle; use crate::repository::RepositoryInterface; use anyhow::Result; @@ -11,7 +10,7 @@ pub trait WritableRepositoryInterface: RepositoryInterface { fn add_package(&mut self, package: PackageInterfaceHandle) -> Result<()>; - fn remove_package(&mut self, package: &dyn PackageInterface) -> Result<()>; + fn remove_package(&mut self, package: PackageInterfaceHandle) -> Result<()>; fn get_canonical_packages(&self) -> Vec; -- cgit v1.3.1