aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-10 02:49:06 +0900
committernsfisis <nsfisis@gmail.com>2026-06-10 02:49:28 +0900
commit5d3232a80be4b989e89cc7ae4e3642cc5acae030 (patch)
tree06597252809c209e69400e57494b3376158ce0f9 /crates
parent2d474e91e49c7343d28198eff2b5bbbed9afbcee (diff)
downloadphp-shirabe-5d3232a80be4b989e89cc7ae4e3642cc5acae030.tar.gz
php-shirabe-5d3232a80be4b989e89cc7ae4e3642cc5acae030.tar.zst
php-shirabe-5d3232a80be4b989e89cc7ae4e3642cc5acae030.zip
feat(repository): resolve repository phase-b TODOs
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates')
-rw-r--r--crates/shirabe/src/command/show_command.rs25
-rw-r--r--crates/shirabe/src/repository/array_repository.rs21
-rw-r--r--crates/shirabe/src/repository/filesystem_repository.rs110
-rw-r--r--crates/shirabe/src/repository/installed_array_repository.rs84
-rw-r--r--crates/shirabe/src/repository/installed_filesystem_repository.rs83
-rw-r--r--crates/shirabe/src/repository/repository_factory.rs11
-rw-r--r--crates/shirabe/src/repository/writable_array_repository.rs111
-rw-r--r--crates/shirabe/src/repository/writable_repository_interface.rs8
8 files changed, 333 insertions, 120 deletions
diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs
index 3761b09..7cf305d 100644
--- a/crates/shirabe/src/command/show_command.rs
+++ b/crates/shirabe/src/command/show_command.rs
@@ -356,17 +356,18 @@ impl ShowCommand {
let lr = locker.get_locked_repository(
input.borrow().get_option("no-dev").as_bool() != Some(true),
)?;
- let lr_handle: RepositoryInterfaceHandle = lr.into();
if input.borrow().get_option("self").as_bool() == Some(true) {
- // TODO(phase-b): LockArrayRepository needs add_package via WritableRepositoryInterface;
- // skipping the insertion here keeps compile clean.
- let _ = &lr_handle;
+ lr.add_package(
+ crate::package::RootPackageInterfaceHandle::dup(composer_ref.get_package())
+ .into(),
+ )?;
}
- installed_repo =
- RepositoryInterfaceHandle::new(InstalledRepository::new(vec![lr_handle.clone()]));
- repos =
- RepositoryInterfaceHandle::new(InstalledRepository::new(vec![lr_handle.clone()]));
- locked_repo = Some(lr_handle);
+ let lr_handle: RepositoryInterfaceHandle = lr.into();
+ locked_repo = Some(lr_handle.clone());
+ let new_repo =
+ RepositoryInterfaceHandle::new(InstalledRepository::new(vec![lr_handle]));
+ installed_repo = new_repo.clone();
+ repos = new_repo.clone();
} else {
// --installed / default case
let composer_local_owned;
@@ -1542,10 +1543,7 @@ impl ShowCommand {
_ => None, // already a ConstraintInterface
};
- // TODO(phase-b): DefaultPolicy::new() requires (bool, bool, Option<IndexMap>) — using placeholder values.
let policy = DefaultPolicy::new(false, false, None);
- let _ = &policy;
- // TODO(phase-b): RepositorySet::with_stability("dev") — using new() with placeholder args.
let mut repository_set = RepositorySet::new(
"dev",
IndexMap::new(),
@@ -2267,7 +2265,7 @@ impl ShowCommand {
for color in self.colors.iter() {
let _style = OutputFormatterStyle::new(Some(color.as_str()), None, None);
- // TODO(phase-b): OutputInterface::get_formatter returns &OutputFormatter, but
+ // TODO(phase-c): OutputInterface::get_formatter returns &OutputFormatter, but
// set_style requires &mut. Resolution requires interior-mutability refactor of
// OutputFormatter wiring across symfony shim.
let _ = (output.borrow().get_formatter(), color);
@@ -2767,7 +2765,6 @@ impl ShowCommand {
) -> anyhow::Result<std::rc::Rc<std::cell::RefCell<RepositorySet>>> {
let composer = crate::command::composer_full(composer);
if self.repository_set.is_none() {
- // TODO(phase-b): RepositorySet::with_stability_and_flags — using new() placeholder.
let mut rs = RepositorySet::new(
&composer.get_package().get_minimum_stability(),
composer.get_package().get_stability_flags().clone(),
diff --git a/crates/shirabe/src/repository/array_repository.rs b/crates/shirabe/src/repository/array_repository.rs
index 1bee17b..b7d862d 100644
--- a/crates/shirabe/src/repository/array_repository.rs
+++ b/crates/shirabe/src/repository/array_repository.rs
@@ -11,7 +11,9 @@ use shirabe_php_shim::{implode, preg_quote, strtolower};
use shirabe_semver::constraint::AnyConstraint;
use shirabe_semver::constraint::SimpleConstraint;
+use crate::package::AliasPackageHandle;
use crate::package::BasePackageHandle;
+use crate::package::CompleteAliasPackageHandle;
use crate::package::PackageHandle;
use crate::package::PackageInterfaceHandle;
use crate::package::version::StabilityFilter;
@@ -35,7 +37,7 @@ pub struct ArrayRepository {
}
impl ArrayRepository {
- fn get_packages_internal(&self) -> Vec<BasePackageHandle> {
+ pub(crate) fn get_packages_internal(&self) -> Vec<BasePackageHandle> {
if self.packages.borrow().is_none() {
self.initialize();
}
@@ -111,13 +113,14 @@ impl ArrayRepository {
package = alias_pkg.get_alias_of().into();
}
- let _ = (&package, &alias, &pretty_alias);
- if package.as_complete_package().is_some() {
- // TODO(phase-b): construct CompleteAliasPackage/AliasPackage and return as a handle
- return todo!("new CompleteAliasPackage(package, alias, pretty_alias)");
+ if let Some(complete) = package.as_complete_package() {
+ CompleteAliasPackageHandle::new(complete, alias, pretty_alias).into()
+ } else {
+ let real = package
+ .as_package()
+ .expect("non-alias package must be a real Package");
+ AliasPackageHandle::new(real, alias, pretty_alias).into()
}
-
- todo!("new AliasPackage(package, alias, pretty_alias)")
}
/// Removes package from repository.
@@ -149,6 +152,10 @@ impl ArrayRepository {
pub(crate) fn reset_packages(&self) {
*self.packages.borrow_mut() = None;
}
+
+ pub(crate) fn is_initialized(&self) -> bool {
+ self.packages.borrow().is_some()
+ }
}
impl RepositoryInterface for ArrayRepository {
diff --git a/crates/shirabe/src/repository/filesystem_repository.rs b/crates/shirabe/src/repository/filesystem_repository.rs
index 411fa13..57f3c87 100644
--- a/crates/shirabe/src/repository/filesystem_repository.rs
+++ b/crates/shirabe/src/repository/filesystem_repository.rs
@@ -17,6 +17,7 @@ use crate::config::is_php_integer_key;
use crate::installed_versions::InstalledVersions;
use crate::installer::InstallationManager;
use crate::json::JsonFile;
+use crate::package::BasePackageHandle;
use crate::package::PackageInterfaceHandle;
use crate::package::RootPackageInterfaceHandle;
use crate::package::dumper::ArrayDumper;
@@ -24,9 +25,12 @@ use crate::package::loader::ArrayLoader;
use crate::package::loader::LoaderInterface;
use crate::repository::InvalidRepositoryException;
use crate::repository::PlatformRepository;
+use crate::repository::RepositoryInterface;
use crate::repository::WritableArrayRepository;
+use crate::repository::{FindPackageConstraint, LoadPackagesResult, ProviderInfo, SearchResult};
use crate::util::Filesystem;
use crate::util::Platform;
+use shirabe_semver::constraint::AnyConstraint;
/// Filesystem repository.
#[derive(Debug)]
@@ -84,7 +88,14 @@ impl FilesystemRepository {
}
pub fn get_repo_name(&self) -> String {
- format!("file ({})", self.file.get_path())
+ self.inner.get_repo_name()
+ }
+
+ fn ensure_initialized(&mut self) -> Result<()> {
+ if !self.inner.is_initialized() {
+ self.initialize()?;
+ }
+ Ok(())
}
/// Initializes repository (reads file, or remote address).
@@ -190,6 +201,27 @@ impl FilesystemRepository {
self.initialize()
}
+ pub fn add_package(&mut self, package: PackageInterfaceHandle) -> Result<()> {
+ self.inner.add_package(package)
+ }
+
+ pub fn remove_package(&mut self, package: PackageInterfaceHandle) -> Result<()> {
+ self.inner.remove_package(package)
+ }
+
+ pub fn get_canonical_packages(&mut self) -> Result<Vec<PackageInterfaceHandle>> {
+ self.ensure_initialized()?;
+ Ok(self.inner.get_canonical_packages())
+ }
+
+ pub fn set_dev_package_names(&mut self, dev_package_names: Vec<String>) {
+ self.inner.set_dev_package_names(dev_package_names);
+ }
+
+ pub fn get_dev_package_names(&self) -> &Vec<String> {
+ self.inner.get_dev_package_names()
+ }
+
/// Writes writable repository.
pub fn write(
&mut self,
@@ -769,6 +801,82 @@ impl FilesystemRepository {
}
}
+impl RepositoryInterface for FilesystemRepository {
+ fn count(&self) -> Result<usize> {
+ 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<Option<BasePackageHandle>> {
+ self.ensure_initialized()?;
+ self.inner.find_package(name, constraint)
+ }
+
+ fn find_packages(
+ &mut self,
+ name: &str,
+ constraint: Option<FindPackageConstraint>,
+ ) -> Result<Vec<BasePackageHandle>> {
+ self.ensure_initialized()?;
+ self.inner.find_packages(name, constraint)
+ }
+
+ fn get_packages(&mut self) -> Result<Vec<BasePackageHandle>> {
+ self.ensure_initialized()?;
+ self.inner.get_packages()
+ }
+
+ fn load_packages(
+ &mut self,
+ package_name_map: IndexMap<String, Option<AnyConstraint>>,
+ acceptable_stabilities: IndexMap<String, i64>,
+ stability_flags: IndexMap<String, i64>,
+ already_loaded: IndexMap<String, IndexMap<String, PackageInterfaceHandle>>,
+ ) -> Result<LoadPackagesResult> {
+ self.ensure_initialized()?;
+ self.inner.load_packages(
+ package_name_map,
+ acceptable_stabilities,
+ stability_flags,
+ already_loaded,
+ )
+ }
+
+ fn search(
+ &mut self,
+ query: String,
+ mode: i64,
+ r#type: Option<String>,
+ ) -> Result<Vec<SearchResult>> {
+ self.ensure_initialized()?;
+ self.inner.search(query, mode, r#type)
+ }
+
+ fn get_providers(&mut self, package_name: String) -> Result<IndexMap<String, ProviderInfo>> {
+ self.ensure_initialized()?;
+ self.inner.get_providers(package_name)
+ }
+
+ fn get_repo_name(&self) -> String {
+ self.inner.get_repo_name()
+ }
+
+ fn as_any(&self) -> &dyn Any {
+ self
+ }
+
+ fn set_self_handle(&self, weak: crate::repository::RepositoryInterfaceWeakHandle) {
+ self.inner.set_self_handle(weak);
+ }
+}
+
fn versions_entry<'a>(
versions: &'a mut IndexMap<String, PhpMixed>,
target: &str,
diff --git a/crates/shirabe/src/repository/installed_array_repository.rs b/crates/shirabe/src/repository/installed_array_repository.rs
index 487a6da..6eff28f 100644
--- a/crates/shirabe/src/repository/installed_array_repository.rs
+++ b/crates/shirabe/src/repository/installed_array_repository.rs
@@ -51,94 +51,92 @@ impl WritableRepositoryInterface for InstalledArrayRepository {
fn write(
&mut self,
dev_mode: bool,
- installation_manager: &crate::installer::InstallationManager,
+ installation_manager: &mut crate::installer::InstallationManager,
) -> anyhow::Result<()> {
- todo!()
+ self.inner.write(dev_mode, installation_manager)
}
- fn add_package(
- &mut self,
- package: crate::package::PackageInterfaceHandle,
- ) -> anyhow::Result<()> {
- todo!()
+ fn add_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<()> {
+ self.inner.add_package(package)
}
- fn remove_package(
- &mut self,
- package: crate::package::PackageInterfaceHandle,
- ) -> anyhow::Result<()> {
- todo!()
+ fn remove_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<()> {
+ self.inner.remove_package(package)
}
- fn get_canonical_packages(
- &mut self,
- ) -> anyhow::Result<Vec<crate::package::PackageInterfaceHandle>> {
- todo!()
+ fn get_canonical_packages(&mut self) -> anyhow::Result<Vec<PackageInterfaceHandle>> {
+ Ok(self.inner.get_canonical_packages())
}
- fn reload(&mut self) {
- todo!()
+ fn reload(&mut self) -> anyhow::Result<()> {
+ self.inner.reload();
+ Ok(())
}
fn set_dev_package_names(&mut self, dev_package_names: Vec<String>) {
- todo!()
+ self.inner.set_dev_package_names(dev_package_names);
}
fn get_dev_package_names(&self) -> &Vec<String> {
- todo!()
+ self.inner.get_dev_package_names()
}
}
impl RepositoryInterface for InstalledArrayRepository {
fn count(&self) -> anyhow::Result<usize> {
- todo!()
+ self.inner.count()
}
- fn has_package(&self, _package: PackageInterfaceHandle) -> bool {
- todo!()
+ fn has_package(&self, package: PackageInterfaceHandle) -> bool {
+ self.inner.has_package(package)
}
fn find_package(
&mut self,
- _name: &str,
- _constraint: FindPackageConstraint,
+ name: &str,
+ constraint: FindPackageConstraint,
) -> anyhow::Result<Option<BasePackageHandle>> {
- todo!()
+ self.inner.find_package(name, constraint)
}
fn find_packages(
&mut self,
- _name: &str,
- _constraint: Option<FindPackageConstraint>,
+ name: &str,
+ constraint: Option<FindPackageConstraint>,
) -> anyhow::Result<Vec<BasePackageHandle>> {
- todo!()
+ self.inner.find_packages(name, constraint)
}
fn get_packages(&mut self) -> anyhow::Result<Vec<BasePackageHandle>> {
- todo!()
+ self.inner.get_packages()
}
fn load_packages(
&mut self,
- _package_name_map: IndexMap<String, Option<AnyConstraint>>,
- _acceptable_stabilities: IndexMap<String, i64>,
- _stability_flags: IndexMap<String, i64>,
- _already_loaded: IndexMap<String, IndexMap<String, PackageInterfaceHandle>>,
+ package_name_map: IndexMap<String, Option<AnyConstraint>>,
+ acceptable_stabilities: IndexMap<String, i64>,
+ stability_flags: IndexMap<String, i64>,
+ already_loaded: IndexMap<String, IndexMap<String, PackageInterfaceHandle>>,
) -> anyhow::Result<LoadPackagesResult> {
- todo!()
+ self.inner.load_packages(
+ package_name_map,
+ acceptable_stabilities,
+ stability_flags,
+ already_loaded,
+ )
}
fn search(
&mut self,
- _query: String,
- _mode: i64,
- _type: Option<String>,
+ query: String,
+ mode: i64,
+ r#type: Option<String>,
) -> anyhow::Result<Vec<SearchResult>> {
- todo!()
+ self.inner.search(query, mode, r#type)
}
fn get_providers(
&mut self,
- _package_name: String,
+ package_name: String,
) -> anyhow::Result<IndexMap<String, ProviderInfo>> {
- todo!()
+ self.inner.get_providers(package_name)
}
fn get_repo_name(&self) -> String {
- todo!()
+ format!("installed {}", self.inner.get_repo_name())
}
fn as_advisory_provider(&self) -> Option<&dyn AdvisoryProviderInterface> {
None
@@ -157,7 +155,7 @@ impl RepositoryInterface for InstalledArrayRepository {
Some(self)
}
fn as_any(&self) -> &dyn std::any::Any {
- todo!()
+ self
}
fn set_self_handle(&self, weak: crate::repository::RepositoryInterfaceWeakHandle) {
self.inner.set_self_handle(weak);
diff --git a/crates/shirabe/src/repository/installed_filesystem_repository.rs b/crates/shirabe/src/repository/installed_filesystem_repository.rs
index 185749e..fc92aff 100644
--- a/crates/shirabe/src/repository/installed_filesystem_repository.rs
+++ b/crates/shirabe/src/repository/installed_filesystem_repository.rs
@@ -58,94 +58,91 @@ impl WritableRepositoryInterface for InstalledFilesystemRepository {
fn write(
&mut self,
dev_mode: bool,
- installation_manager: &crate::installer::InstallationManager,
+ installation_manager: &mut crate::installer::InstallationManager,
) -> anyhow::Result<()> {
- todo!()
+ self.inner.write(dev_mode, installation_manager)
}
- fn add_package(
- &mut self,
- package: crate::package::PackageInterfaceHandle,
- ) -> anyhow::Result<()> {
- todo!()
+ fn add_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<()> {
+ self.inner.add_package(package)
}
- fn remove_package(
- &mut self,
- package: crate::package::PackageInterfaceHandle,
- ) -> anyhow::Result<()> {
- todo!()
+ fn remove_package(&mut self, package: PackageInterfaceHandle) -> anyhow::Result<()> {
+ self.inner.remove_package(package)
}
- fn get_canonical_packages(
- &mut self,
- ) -> anyhow::Result<Vec<crate::package::PackageInterfaceHandle>> {
- todo!()
+ fn get_canonical_packages(&mut self) -> anyhow::Result<Vec<PackageInterfaceHandle>> {
+ self.inner.get_canonical_packages()
}
- fn reload(&mut self) {
- todo!()
+ fn reload(&mut self) -> anyhow::Result<()> {
+ self.inner.reload()
}
fn set_dev_package_names(&mut self, dev_package_names: Vec<String>) {
- todo!()
+ self.inner.set_dev_package_names(dev_package_names);
}
fn get_dev_package_names(&self) -> &Vec<String> {
- todo!()
+ self.inner.get_dev_package_names()
}
}
impl RepositoryInterface for InstalledFilesystemRepository {
fn count(&self) -> anyhow::Result<usize> {
- todo!()
+ self.inner.count()
}
- fn has_package(&self, _package: PackageInterfaceHandle) -> bool {
- todo!()
+ fn has_package(&self, package: PackageInterfaceHandle) -> bool {
+ self.inner.has_package(package)
}
fn find_package(
&mut self,
- _name: &str,
- _constraint: FindPackageConstraint,
+ name: &str,
+ constraint: FindPackageConstraint,
) -> anyhow::Result<Option<BasePackageHandle>> {
- todo!()
+ self.inner.find_package(name, constraint)
}
fn find_packages(
&mut self,
- _name: &str,
- _constraint: Option<FindPackageConstraint>,
+ name: &str,
+ constraint: Option<FindPackageConstraint>,
) -> anyhow::Result<Vec<BasePackageHandle>> {
- todo!()
+ self.inner.find_packages(name, constraint)
}
fn get_packages(&mut self) -> anyhow::Result<Vec<BasePackageHandle>> {
- todo!()
+ self.inner.get_packages()
}
fn load_packages(
&mut self,
- _package_name_map: IndexMap<String, Option<AnyConstraint>>,
- _acceptable_stabilities: IndexMap<String, i64>,
- _stability_flags: IndexMap<String, i64>,
- _already_loaded: IndexMap<String, IndexMap<String, PackageInterfaceHandle>>,
+ package_name_map: IndexMap<String, Option<AnyConstraint>>,
+ acceptable_stabilities: IndexMap<String, i64>,
+ stability_flags: IndexMap<String, i64>,
+ already_loaded: IndexMap<String, IndexMap<String, PackageInterfaceHandle>>,
) -> anyhow::Result<LoadPackagesResult> {
- todo!()
+ self.inner.load_packages(
+ package_name_map,
+ acceptable_stabilities,
+ stability_flags,
+ already_loaded,
+ )
}
fn search(
&mut self,
- _query: String,
- _mode: i64,
- _type: Option<String>,
+ query: String,
+ mode: i64,
+ r#type: Option<String>,
) -> anyhow::Result<Vec<SearchResult>> {
- todo!()
+ self.inner.search(query, mode, r#type)
}
fn get_providers(
&mut self,
- _package_name: String,
+ package_name: String,
) -> anyhow::Result<IndexMap<String, ProviderInfo>> {
- todo!()
+ self.inner.get_providers(package_name)
}
fn get_repo_name(&self) -> String {
- todo!()
+ format!("installed {}", self.inner.get_repo_name())
}
fn as_advisory_provider(&self) -> Option<&dyn AdvisoryProviderInterface> {
None
@@ -164,7 +161,7 @@ impl RepositoryInterface for InstalledFilesystemRepository {
Some(self)
}
fn as_any(&self) -> &dyn std::any::Any {
- todo!()
+ self
}
fn set_self_handle(&self, weak: crate::repository::RepositoryInterfaceWeakHandle) {
self.inner.set_self_handle(weak);
diff --git a/crates/shirabe/src/repository/repository_factory.rs b/crates/shirabe/src/repository/repository_factory.rs
index 993699f..5543a9e 100644
--- a/crates/shirabe/src/repository/repository_factory.rs
+++ b/crates/shirabe/src/repository/repository_factory.rs
@@ -284,15 +284,18 @@ impl RepositoryFactory {
Self::generate_repository_name_indexed(index, &repo_config_map, &repo_map);
if repo_type == "filesystem" {
- let _json_path = repo_arr
+ let json_path = repo_arr
.get("json")
.and_then(|v| v.as_string())
.unwrap_or("")
.to_string();
- // TODO(phase-b): FilesystemRepository does not yet implement
- // RepositoryInterface; once it does, construct it from JsonFile here.
let created: RepositoryInterfaceHandle =
- todo!("FilesystemRepository as dyn RepositoryInterface");
+ RepositoryInterfaceHandle::new(FilesystemRepository::new(
+ JsonFile::new(json_path, None, None)?,
+ false,
+ None,
+ None,
+ )?);
repo_map.insert(name, created);
} else {
let created = rm.create_repository(
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<crate::package::PackageInterfaceHandle> {
- // 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<String, crate::package::PackageInterfaceHandle> =
+ 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<Vec<crate::package::BasePackageHandle>> {
@@ -86,8 +119,74 @@ impl WritableArrayRepository {
pub fn get_repo_name(&self) -> String {
self.inner.get_repo_name()
}
+}
- pub fn count(&self) -> anyhow::Result<usize> {
+impl RepositoryInterface for WritableArrayRepository {
+ fn count(&self) -> anyhow::Result<usize> {
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<Option<BasePackageHandle>> {
+ self.inner.find_package(name, constraint)
+ }
+
+ fn find_packages(
+ &mut self,
+ name: &str,
+ constraint: Option<FindPackageConstraint>,
+ ) -> Result<Vec<BasePackageHandle>> {
+ self.inner.find_packages(name, constraint)
+ }
+
+ fn get_packages(&mut self) -> Result<Vec<BasePackageHandle>> {
+ self.inner.get_packages()
+ }
+
+ fn load_packages(
+ &mut self,
+ package_name_map: IndexMap<String, Option<AnyConstraint>>,
+ acceptable_stabilities: IndexMap<String, i64>,
+ stability_flags: IndexMap<String, i64>,
+ already_loaded: IndexMap<String, IndexMap<String, PackageInterfaceHandle>>,
+ ) -> Result<LoadPackagesResult> {
+ self.inner.load_packages(
+ package_name_map,
+ acceptable_stabilities,
+ stability_flags,
+ already_loaded,
+ )
+ }
+
+ fn search(
+ &mut self,
+ query: String,
+ mode: i64,
+ r#type: Option<String>,
+ ) -> Result<Vec<SearchResult>> {
+ self.inner.search(query, mode, r#type)
+ }
+
+ fn get_providers(&mut self, package_name: String) -> Result<IndexMap<String, ProviderInfo>> {
+ 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);
+ }
}
diff --git a/crates/shirabe/src/repository/writable_repository_interface.rs b/crates/shirabe/src/repository/writable_repository_interface.rs
index ae62e1e..9cdecb5 100644
--- a/crates/shirabe/src/repository/writable_repository_interface.rs
+++ b/crates/shirabe/src/repository/writable_repository_interface.rs
@@ -6,7 +6,11 @@ use crate::repository::RepositoryInterface;
use anyhow::Result;
pub trait WritableRepositoryInterface: RepositoryInterface {
- fn write(&mut self, dev_mode: bool, installation_manager: &InstallationManager) -> Result<()>;
+ fn write(
+ &mut self,
+ dev_mode: bool,
+ installation_manager: &mut InstallationManager,
+ ) -> Result<()>;
fn add_package(&mut self, package: PackageInterfaceHandle) -> Result<()>;
@@ -14,7 +18,7 @@ pub trait WritableRepositoryInterface: RepositoryInterface {
fn get_canonical_packages(&mut self) -> Result<Vec<PackageInterfaceHandle>>;
- fn reload(&mut self);
+ fn reload(&mut self) -> Result<()>;
fn set_dev_package_names(&mut self, dev_package_names: Vec<String>);