diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-22 01:29:48 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-22 01:43:48 +0900 |
| commit | 0b06f54103490e3ce5658e82bbc0119633e26cd8 (patch) | |
| tree | 687b075131d3679725e77e0931ff7c503a6c3034 /crates/shirabe/src/command/package_discovery_trait.rs | |
| parent | 2914770fba6b3cc03a68fae493f60470a41962ec (diff) | |
| download | php-shirabe-0b06f54103490e3ce5658e82bbc0119633e26cd8.tar.gz php-shirabe-0b06f54103490e3ce5658e82bbc0119633e26cd8.tar.zst php-shirabe-0b06f54103490e3ce5658e82bbc0119633e26cd8.zip | |
refactor(composer): unify Composer/PartialComposer via Rc handles
Model PHP's `Composer extends PartialComposer` as a PartialOrFullComposer
enum and merge partial_composer.rs into composer.rs. Introduce
ComposerHandle / PartialComposerHandle (plus their Weak variants) so the
graph can be shared, and build it at once with Rc::new_cyclic in the
factory to resolve the back-reference cycles.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command/package_discovery_trait.rs')
| -rw-r--r-- | crates/shirabe/src/command/package_discovery_trait.rs | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs index f273811..43d6ee8 100644 --- a/crates/shirabe/src/command/package_discovery_trait.rs +++ b/crates/shirabe/src/command/package_discovery_trait.rs @@ -15,7 +15,7 @@ use shirabe_php_shim::{ trim, }; -use crate::composer::Composer; +use crate::composer::PartialComposerHandle; use crate::factory::Factory; use crate::filter::platform_requirement_filter::IgnoreAllPlatformRequirementFilter; use crate::filter::platform_requirement_filter::PlatformRequirementFilterFactory; @@ -41,12 +41,12 @@ pub trait PackageDiscoveryTrait { // PHP: trait dependencies (provided by BaseCommand) fn get_io(&self) -> &dyn IOInterface; - fn try_composer(&self) -> Option<Composer>; + fn try_composer(&self) -> Option<PartialComposerHandle>; fn require_composer( &self, disable_plugins: Option<bool>, disable_scripts: Option<bool>, - ) -> Composer; + ) -> PartialComposerHandle; fn get_platform_requirement_filter( &self, input: &dyn InputInterface, @@ -219,10 +219,14 @@ pub trait PackageDiscoveryTrait { // Collect existing packages let composer = self.try_composer(); - let mut installed_repo: Option<_> = None; - if let Some(c) = &composer { - installed_repo = Some(c.get_repository_manager().get_local_repository()); - } + let composer_ref = composer.as_ref().map(|c| c.borrow_partial()); + let repository_manager = composer_ref + .as_ref() + .map(|c| c.get_repository_manager().clone()); + let repository_manager_ref = repository_manager.as_ref().map(|rm| rm.borrow()); + let installed_repo = repository_manager_ref + .as_ref() + .map(|rm| rm.get_local_repository()); let mut existing_packages: Vec<String> = vec![]; if let Some(repo) = &installed_repo { for package in repo.get_packages() { @@ -231,6 +235,9 @@ pub trait PackageDiscoveryTrait { } // PHP: unset($composer, $installedRepo); drop(installed_repo); + drop(repository_manager_ref); + drop(repository_manager); + drop(composer_ref); drop(composer); let io = self.get_io(); @@ -804,9 +811,10 @@ pub trait PackageDiscoveryTrait { let mut similar_packages: IndexMap<String, i64> = IndexMap::new(); let composer_for_installed = self.require_composer(None, None); - let installed_repo = composer_for_installed - .get_repository_manager() - .get_local_repository(); + let composer_for_installed = composer_for_installed.borrow_partial(); + let repository_manager = composer_for_installed.get_repository_manager().clone(); + let repository_manager = repository_manager.borrow(); + let installed_repo = repository_manager.get_local_repository(); for result in &results { // TODO(phase-b): installed_repo.find_package signature mismatch with FindPackageConstraint |
