aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-26 00:38:27 +0900
committernsfisis <nsfisis@gmail.com>2026-06-26 00:38:27 +0900
commit90c7acbd8e6eb1ddaf8680de6a1ef9f2417d50ce (patch)
treedac10f7452ab58e36c2795e18c23edffe3045c50 /crates/shirabe/src/dependency_resolver
parente0ba36807619780ff645efe0117281d32d5ace2a (diff)
downloadphp-shirabe-90c7acbd8e6eb1ddaf8680de6a1ef9f2417d50ce.tar.gz
php-shirabe-90c7acbd8e6eb1ddaf8680de6a1ef9f2417d50ce.tar.zst
php-shirabe-90c7acbd8e6eb1ddaf8680de6a1ef9f2417d50ce.zip
feat(dependency-resolver): wire operation get_package and unblock solver tests
Override OperationInterface::get_package for Install/Uninstall/MarkAlias* operations so trait-object dispatch no longer hits the default todo!(), and implement Rule::is_caused_by_lock's locked-repository lookup via Request::get_locked_repository (LockArrayRepository::get_packages is infallible). Change PackageInterface::get_type to return String (matching PHP getType(): string) so AliasPackage can delegate live to its aliasOf handle across the RefCell instead of an impossible &str borrow. Un-ignores 25 SolverTest cases; 2 alias cases stay ignored pending a real solver alias-resolution discrepancy. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/dependency_resolver')
-rw-r--r--crates/shirabe/src/dependency_resolver/operation/install_operation.rs4
-rw-r--r--crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs4
-rw-r--r--crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs4
-rw-r--r--crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs4
-rw-r--r--crates/shirabe/src/dependency_resolver/rule.rs23
5 files changed, 27 insertions, 12 deletions
diff --git a/crates/shirabe/src/dependency_resolver/operation/install_operation.rs b/crates/shirabe/src/dependency_resolver/operation/install_operation.rs
index ca3286c..ef49239 100644
--- a/crates/shirabe/src/dependency_resolver/operation/install_operation.rs
+++ b/crates/shirabe/src/dependency_resolver/operation/install_operation.rs
@@ -48,6 +48,10 @@ impl OperationInterface for InstallOperation {
fn as_install_operation(&self) -> Option<&InstallOperation> {
Some(self)
}
+
+ fn get_package(&self) -> PackageInterfaceHandle {
+ self.package.clone()
+ }
}
impl std::fmt::Display for InstallOperation {
diff --git a/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs b/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs
index ab07b6a..28bf511 100644
--- a/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs
+++ b/crates/shirabe/src/dependency_resolver/operation/mark_alias_installed_operation.rs
@@ -44,6 +44,10 @@ impl OperationInterface for MarkAliasInstalledOperation {
.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev),
)
}
+
+ fn get_package(&self) -> crate::package::PackageInterfaceHandle {
+ self.package.clone().into()
+ }
}
impl std::fmt::Display for MarkAliasInstalledOperation {
diff --git a/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs b/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs
index 1b107f0..3c0de33 100644
--- a/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs
+++ b/crates/shirabe/src/dependency_resolver/operation/mark_alias_uninstalled_operation.rs
@@ -44,6 +44,10 @@ impl OperationInterface for MarkAliasUninstalledOperation {
.get_full_pretty_version(true, crate::package::DisplayMode::SourceRefIfDev),
)
}
+
+ fn get_package(&self) -> crate::package::PackageInterfaceHandle {
+ self.package.clone().into()
+ }
}
impl std::fmt::Display for MarkAliasUninstalledOperation {
diff --git a/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs b/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs
index efb3610..d2dd665 100644
--- a/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs
+++ b/crates/shirabe/src/dependency_resolver/operation/uninstall_operation.rs
@@ -47,6 +47,10 @@ impl OperationInterface for UninstallOperation {
fn as_uninstall_operation(&self) -> Option<&UninstallOperation> {
Some(self)
}
+
+ fn get_package(&self) -> PackageInterfaceHandle {
+ self.package.clone()
+ }
}
impl std::fmt::Display for UninstallOperation {
diff --git a/crates/shirabe/src/dependency_resolver/rule.rs b/crates/shirabe/src/dependency_resolver/rule.rs
index 7686a3e..ef39513 100644
--- a/crates/shirabe/src/dependency_resolver/rule.rs
+++ b/crates/shirabe/src/dependency_resolver/rule.rs
@@ -23,6 +23,7 @@ use crate::dependency_resolver::RuleSet;
use crate::package::AliasPackage;
use crate::package::BasePackage;
use crate::package::BasePackageHandle;
+use crate::repository::RepositoryInterface;
use crate::package::Link;
use crate::package::PackageInterface;
use crate::package::version::VersionParser;
@@ -214,12 +215,11 @@ impl Rule {
if PlatformRepository::is_platform_package(link.get_target()) {
return false;
}
- // TODO(phase-c): request.get_locked_repository() exists, but its get_packages()
- // returns Result while is_caused_by_lock returns bool; resolving needs the bool
- // chain (also via Problem/SolverProblemsException, itself phase-c) to carry Result.
- let locked_repo: Option<()> = todo!("request.get_locked_repository()");
- if let Some(_locked_repo) = locked_repo {
- let packages: Vec<BasePackageHandle> = todo!("locked_repo.get_packages()");
+ if let Some(locked_repo) = request.get_locked_repository() {
+ let packages = locked_repo
+ .borrow_mut()
+ .get_packages()
+ .expect("LockArrayRepository::get_packages() never fails");
for package in packages {
let p = package.clone();
if p.get_name() == link.get_target() {
@@ -255,12 +255,11 @@ impl Rule {
if PlatformRepository::is_platform_package(package_name) {
return false;
}
- // TODO(phase-c): request.get_locked_repository() exists, but its get_packages()
- // returns Result while is_caused_by_lock returns bool; resolving needs the bool
- // chain (also via Problem/SolverProblemsException, itself phase-c) to carry Result.
- let locked_repo: Option<()> = todo!("request.get_locked_repository()");
- if let Some(_locked_repo) = locked_repo {
- let packages: Vec<BasePackageHandle> = todo!("locked_repo.get_packages()");
+ if let Some(locked_repo) = request.get_locked_repository() {
+ let packages = locked_repo
+ .borrow_mut()
+ .get_packages()
+ .expect("LockArrayRepository::get_packages() never fails");
for package in packages {
let p = package.clone();
if p.get_name() == *package_name {