From 86fcc80b348a3f00ab81e5447924aa10202d95e8 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 29 May 2026 03:42:14 +0900 Subject: refactor(repository): introduce typed LockArrayRepositoryHandle Share LockArrayRepository via Rc> while preserving the PHP ?LockArrayRepository type strength: Request.locked_repository, Locker ::get_locked_repository, and the installer create_* helpers now thread the typed handle instead of an owned LockArrayRepository, and pool builder identity check becomes a strict ptr_eq via widening into RepositoryInterfaceHandle. Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/shirabe/src/command/audit_command.rs | 6 +++--- .../shirabe/src/command/base_dependency_command.rs | 4 +--- crates/shirabe/src/command/bump_command.rs | 22 ++++++++++------------ .../src/command/check_platform_reqs_command.rs | 22 ++++++++++------------ crates/shirabe/src/command/licenses_command.rs | 2 +- crates/shirabe/src/command/remove_command.rs | 1 + crates/shirabe/src/command/require_command.rs | 17 ++++++++--------- crates/shirabe/src/command/show_command.rs | 5 +++-- crates/shirabe/src/command/suggests_command.rs | 2 +- crates/shirabe/src/command/update_command.rs | 6 ++++-- 10 files changed, 42 insertions(+), 45 deletions(-) (limited to 'crates/shirabe/src/command') diff --git a/crates/shirabe/src/command/audit_command.rs b/crates/shirabe/src/command/audit_command.rs index 270bacb..786843e 100644 --- a/crates/shirabe/src/command/audit_command.rs +++ b/crates/shirabe/src/command/audit_command.rs @@ -157,9 +157,9 @@ impl AuditCommand { }.into()); } return Ok(CanonicalPackagesTrait::get_packages( - &locker.get_locked_repository( - !input.get_option("no-dev").as_bool().unwrap_or(false), - )?, + &*locker + .get_locked_repository(!input.get_option("no-dev").as_bool().unwrap_or(false))? + .borrow(), )); } diff --git a/crates/shirabe/src/command/base_dependency_command.rs b/crates/shirabe/src/command/base_dependency_command.rs index ad84953..0b89387 100644 --- a/crates/shirabe/src/command/base_dependency_command.rs +++ b/crates/shirabe/src/command/base_dependency_command.rs @@ -71,9 +71,7 @@ pub trait BaseDependencyCommand: BaseCommand { })); } - repos.push(crate::repository::RepositoryInterfaceHandle::new( - locker.get_locked_repository(true)?, - )); + repos.push(locker.get_locked_repository(true)?.into()); let platform_overrides: IndexMap = locker .get_platform_overrides()? .into_iter() diff --git a/crates/shirabe/src/command/bump_command.rs b/crates/shirabe/src/command/bump_command.rs index 64ec54b..b91a32a 100644 --- a/crates/shirabe/src/command/bump_command.rs +++ b/crates/shirabe/src/command/bump_command.rs @@ -143,12 +143,11 @@ impl BumpCommand { .as_bool() .unwrap_or(true); let repo: crate::repository::RepositoryInterfaceHandle = if !has_lock_file_disabled { - crate::repository::RepositoryInterfaceHandle::new( - composer - .get_locker() - .borrow_mut() - .get_locked_repository(true)?, - ) + composer + .get_locker() + .borrow_mut() + .get_locked_repository(true)? + .into() } else if composer.get_locker().borrow_mut().is_locked() { if !composer.get_locker().borrow_mut().is_fresh()? { io.write_error3( @@ -158,12 +157,11 @@ impl BumpCommand { ); return Ok(Self::ERROR_LOCK_OUTDATED); } - crate::repository::RepositoryInterfaceHandle::new( - composer - .get_locker() - .borrow_mut() - .get_locked_repository(true)?, - ) + composer + .get_locker() + .borrow_mut() + .get_locked_repository(true)? + .into() } else { composer .get_repository_manager() diff --git a/crates/shirabe/src/command/check_platform_reqs_command.rs b/crates/shirabe/src/command/check_platform_reqs_command.rs index 15e4225..e53727d 100644 --- a/crates/shirabe/src/command/check_platform_reqs_command.rs +++ b/crates/shirabe/src/command/check_platform_reqs_command.rs @@ -72,12 +72,11 @@ impl CheckPlatformReqsCommand { "Checking {}platform requirements using the lock file", if no_dev { "non-dev " } else { "" } )); - crate::repository::RepositoryInterfaceHandle::new( - composer - .get_locker() - .borrow_mut() - .get_locked_repository(!no_dev)?, - ) + composer + .get_locker() + .borrow_mut() + .get_locked_repository(!no_dev)? + .into() } else { let repository_manager = composer.get_repository_manager().clone(); let repository_manager = repository_manager.borrow(); @@ -87,12 +86,11 @@ impl CheckPlatformReqsCommand { "No vendor dir present, checking {}platform requirements from the lock file", if no_dev { "non-dev " } else { "" } )); - crate::repository::RepositoryInterfaceHandle::new( - composer - .get_locker() - .borrow_mut() - .get_locked_repository(!no_dev)?, - ) + composer + .get_locker() + .borrow_mut() + .get_locked_repository(!no_dev)? + .into() } else { if no_dev { remove_packages = local_repo.get_dev_package_names(); diff --git a/crates/shirabe/src/command/licenses_command.rs b/crates/shirabe/src/command/licenses_command.rs index add5b0b..681ac7a 100644 --- a/crates/shirabe/src/command/licenses_command.rs +++ b/crates/shirabe/src/command/licenses_command.rs @@ -106,7 +106,7 @@ impl LicensesCommand { } let no_dev = input.get_option("no-dev").as_bool().unwrap_or(false); let repo = locker.get_locked_repository(!no_dev)?; - ::get_packages(&repo) + ::get_packages(&*repo.borrow()) } else { let repository_manager = composer.get_repository_manager().clone(); let repository_manager = repository_manager.borrow(); diff --git a/crates/shirabe/src/command/remove_command.rs b/crates/shirabe/src/command/remove_command.rs index a393f0f..faab5fe 100644 --- a/crates/shirabe/src/command/remove_command.rs +++ b/crates/shirabe/src/command/remove_command.rs @@ -202,6 +202,7 @@ impl RemoveCommand { .get_locker() .borrow_mut() .get_locked_repository(true)? + .borrow() .get_packages(); let mut required: IndexMap = IndexMap::new(); diff --git a/crates/shirabe/src/command/require_command.rs b/crates/shirabe/src/command/require_command.rs index f59d60f..bb90361 100644 --- a/crates/shirabe/src/command/require_command.rs +++ b/crates/shirabe/src/command/require_command.rs @@ -933,18 +933,17 @@ impl RequireCommand { ), None, )?; - // TODO(phase-b): get_locked_repository returns LockArrayRepository (owned) and - // get_local_repository returns &dyn InstalledRepositoryInterface; need a common - // interface for find_package. - let locked_repo; - let repo: &dyn RepositoryInterface = if locker_is_locked { - locked_repo = composer + let repo: crate::repository::RepositoryInterfaceHandle = if locker_is_locked { + composer .get_locker() .borrow_mut() - .get_locked_repository(true)?; - &locked_repo + .get_locked_repository(true)? + .into() } else { - todo!("convert &dyn InstalledRepositoryInterface to &dyn RepositoryInterface") + composer + .get_repository_manager() + .borrow() + .get_local_repository() }; for package_name in requirements_to_update { let mut package = repo.find_package( diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index 19e7712..781ee20 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -284,7 +284,8 @@ impl ShowCommand { let locker_rc = composer_ref.get_locker().clone(); let mut locker = locker_rc.borrow_mut(); if locker.is_locked() { - let lr_handle = RepositoryInterfaceHandle::new(locker.get_locked_repository(true)?); + let lr_handle: RepositoryInterfaceHandle = + locker.get_locked_repository(true)?.into(); installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ lr_handle.clone(), local_repo, @@ -348,7 +349,7 @@ impl ShowCommand { let mut locker = locker_rc.borrow_mut(); let lr = locker.get_locked_repository(input.get_option("no-dev").as_bool() != Some(true))?; - let lr_handle = RepositoryInterfaceHandle::new(lr); + let lr_handle: RepositoryInterfaceHandle = lr.into(); if input.get_option("self").as_bool() == Some(true) { // TODO(phase-b): LockArrayRepository needs add_package via WritableRepositoryInterface; // skipping the insertion here keeps compile clean. diff --git a/crates/shirabe/src/command/suggests_command.rs b/crates/shirabe/src/command/suggests_command.rs index 5006790..0aead77 100644 --- a/crates/shirabe/src/command/suggests_command.rs +++ b/crates/shirabe/src/command/suggests_command.rs @@ -71,7 +71,7 @@ impl SuggestsCommand { .get_locker() .borrow_mut() .get_locked_repository(!input.get_option("no-dev").as_bool().unwrap_or(false))?; - installed_repos.push(RepositoryInterfaceHandle::new(locked_repo)); + installed_repos.push(locked_repo.into()); } else { // TODO(phase-b): Config::get returns PhpMixed; need to coerce to IndexMap let _platform_cfg = composer.get_config().borrow().get("platform"); diff --git a/crates/shirabe/src/command/update_command.rs b/crates/shirabe/src/command/update_command.rs index 22ce506..82f98a1 100644 --- a/crates/shirabe/src/command/update_command.rs +++ b/crates/shirabe/src/command/update_command.rs @@ -212,6 +212,7 @@ impl UpdateCommand { .get_locker() .borrow_mut() .get_locked_repository(true)? + .borrow() .get_canonical_packages() { if package.is_dev() { @@ -500,10 +501,11 @@ impl UpdateCommand { let installed_packages: Vec = if composer_ref.get_locker().borrow_mut().is_locked() { CanonicalPackagesTrait::get_packages( - &composer_ref + &*composer_ref .get_locker() .borrow_mut() - .get_locked_repository(true)?, + .get_locked_repository(true)? + .borrow(), ) } else { let _ = composer_ref -- cgit v1.3.1