From 5d3232a80be4b989e89cc7ae4e3642cc5acae030 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 10 Jun 2026 02:49:06 +0900 Subject: feat(repository): resolve repository phase-b TODOs Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/repository/writable_array_repository.rs | 111 +++++++++++++++++++-- 1 file changed, 105 insertions(+), 6 deletions(-) (limited to 'crates/shirabe/src/repository/writable_array_repository.rs') diff --git a/crates/shirabe/src/repository/writable_array_repository.rs b/crates/shirabe/src/repository/writable_array_repository.rs index 0615ef6..c4b31aa 100644 --- a/crates/shirabe/src/repository/writable_array_repository.rs +++ b/crates/shirabe/src/repository/writable_array_repository.rs @@ -1,10 +1,15 @@ //! ref: composer/src/Composer/Repository/WritableArrayRepository.php use crate::installer::InstallationManager; +use crate::package::BasePackageHandle; +use crate::package::PackageInterfaceHandle; use crate::repository::ArrayRepository; use crate::repository::RepositoryInterface; use crate::repository::RepositoryInterfaceWeakHandle; +use crate::repository::{FindPackageConstraint, LoadPackagesResult, ProviderInfo, SearchResult}; use anyhow::Result; +use indexmap::IndexMap; +use shirabe_semver::constraint::AnyConstraint; #[derive(Debug)] pub struct WritableArrayRepository { @@ -52,6 +57,10 @@ impl WritableArrayRepository { self.inner.reset_packages(); } + pub(crate) fn is_initialized(&self) -> bool { + self.inner.is_initialized() + } + pub fn add_package(&mut self, package: crate::package::PackageInterfaceHandle) -> Result<()> { self.inner.add_package(package) } @@ -64,19 +73,43 @@ impl WritableArrayRepository { &mut self, package: crate::package::PackageInterfaceHandle, ) -> Result<()> { - let _ = package; - // TODO(phase-b): delegate to ArrayRepository once it implements remove_package + self.inner.remove_package(package); Ok(()) } pub fn initialize(&mut self) -> Result<()> { - // TODO(phase-b): inner ArrayRepository::initialize signature + self.inner.initialize(); Ok(()) } + /// Get unique packages (at most one package of each name), with aliases resolved and removed. pub fn get_canonical_packages(&self) -> Vec { - // TODO(phase-b): delegate to inner once it exposes get_canonical_packages - Vec::new() + let packages = self.inner.get_packages_internal(); + + // get at most one package of each name, preferring non-aliased ones + let mut packages_by_name: IndexMap = + IndexMap::new(); + for package in packages { + let name = package.get_name(); + let prefer_replace = packages_by_name + .get(&name) + .map(|existing| existing.as_alias().is_some()) + .unwrap_or(true); + if prefer_replace { + packages_by_name.insert(name, package); + } + } + + // unfold aliased packages + let mut canonical_packages = Vec::new(); + for mut package in packages_by_name.into_values() { + while let Some(alias) = package.as_alias() { + package = alias.get_alias_of().into(); + } + canonical_packages.push(package); + } + + canonical_packages } pub fn get_packages(&mut self) -> anyhow::Result> { @@ -86,8 +119,74 @@ impl WritableArrayRepository { pub fn get_repo_name(&self) -> String { self.inner.get_repo_name() } +} - pub fn count(&self) -> anyhow::Result { +impl RepositoryInterface for WritableArrayRepository { + fn count(&self) -> anyhow::Result { self.inner.count() } + + fn has_package(&self, package: PackageInterfaceHandle) -> bool { + self.inner.has_package(package) + } + + fn find_package( + &mut self, + name: &str, + constraint: FindPackageConstraint, + ) -> Result> { + self.inner.find_package(name, constraint) + } + + fn find_packages( + &mut self, + name: &str, + constraint: Option, + ) -> Result> { + self.inner.find_packages(name, constraint) + } + + fn get_packages(&mut self) -> Result> { + self.inner.get_packages() + } + + fn load_packages( + &mut self, + package_name_map: IndexMap>, + acceptable_stabilities: IndexMap, + stability_flags: IndexMap, + already_loaded: IndexMap>, + ) -> Result { + self.inner.load_packages( + package_name_map, + acceptable_stabilities, + stability_flags, + already_loaded, + ) + } + + fn search( + &mut self, + query: String, + mode: i64, + r#type: Option, + ) -> Result> { + self.inner.search(query, mode, r#type) + } + + fn get_providers(&mut self, package_name: String) -> Result> { + self.inner.get_providers(package_name) + } + + fn get_repo_name(&self) -> String { + self.inner.get_repo_name() + } + + fn as_any(&self) -> &dyn std::any::Any { + self + } + + fn set_self_handle(&self, weak: RepositoryInterfaceWeakHandle) { + self.inner.set_self_handle(weak); + } } -- cgit v1.3.1