diff options
Diffstat (limited to 'crates/shirabe/src/command')
| -rw-r--r-- | crates/shirabe/src/command/archive_command.rs | 7 | ||||
| -rw-r--r-- | crates/shirabe/src/command/audit_command.rs | 3 | ||||
| -rw-r--r-- | crates/shirabe/src/command/base_dependency_command.rs | 49 | ||||
| -rw-r--r-- | crates/shirabe/src/command/bump_command.rs | 9 | ||||
| -rw-r--r-- | crates/shirabe/src/command/check_platform_reqs_command.rs | 25 | ||||
| -rw-r--r-- | crates/shirabe/src/command/create_project_command.rs | 16 | ||||
| -rw-r--r-- | crates/shirabe/src/command/diagnose_command.rs | 2 | ||||
| -rw-r--r-- | crates/shirabe/src/command/fund_command.rs | 2 | ||||
| -rw-r--r-- | crates/shirabe/src/command/home_command.rs | 10 | ||||
| -rw-r--r-- | crates/shirabe/src/command/init_command.rs | 6 | ||||
| -rw-r--r-- | crates/shirabe/src/command/package_discovery_trait.rs | 6 | ||||
| -rw-r--r-- | crates/shirabe/src/command/reinstall_command.rs | 2 | ||||
| -rw-r--r-- | crates/shirabe/src/command/require_command.rs | 10 | ||||
| -rw-r--r-- | crates/shirabe/src/command/search_command.rs | 19 | ||||
| -rw-r--r-- | crates/shirabe/src/command/show_command.rs | 207 | ||||
| -rw-r--r-- | crates/shirabe/src/command/suggests_command.rs | 16 | ||||
| -rw-r--r-- | crates/shirabe/src/command/update_command.rs | 11 |
17 files changed, 216 insertions, 184 deletions
diff --git a/crates/shirabe/src/command/archive_command.rs b/crates/shirabe/src/command/archive_command.rs index aab7b51..18b69c3 100644 --- a/crates/shirabe/src/command/archive_command.rs +++ b/crates/shirabe/src/command/archive_command.rs @@ -247,13 +247,12 @@ impl ArchiveCommand { let repository_manager = composer.get_repository_manager().clone(); let repository_manager = repository_manager.borrow(); let local_repo = repository_manager.get_local_repository(); - let mut repos: Vec<Box<dyn crate::repository::RepositoryInterface>> = - vec![local_repo.clone_box()]; + let mut repos: Vec<crate::repository::RepositoryInterfaceHandle> = vec![local_repo]; repos.extend( repository_manager .get_repositories() .iter() - .map(|r| r.clone_box()), + .map(|r| r.clone()), ); repo = CompositeRepository::new(repos); min_stability = composer.get_package().get_minimum_stability().to_string(); @@ -299,7 +298,7 @@ impl ArchiveCommand { IndexMap::new(), IndexMap::new(), ); - repo_set.add_repository(Box::new(repo))?; + repo_set.add_repository(crate::repository::RepositoryInterfaceHandle::new(repo))?; let parser = VersionParser::new(); let constraint: Option<shirabe_semver::constraint::AnyConstraint> = match version.as_deref() { diff --git a/crates/shirabe/src/command/audit_command.rs b/crates/shirabe/src/command/audit_command.rs index ec8b495..270bacb 100644 --- a/crates/shirabe/src/command/audit_command.rs +++ b/crates/shirabe/src/command/audit_command.rs @@ -74,8 +74,7 @@ impl AuditCommand { .borrow() .get_repositories() { - // TODO(phase-b): repositories are shared (PHP class semantics); needs Rc wrapper - repo_set.add_repository(repo.clone_box())?; + repo_set.add_repository(repo.clone())?; } let audit_config = AuditConfig::from_config( diff --git a/crates/shirabe/src/command/base_dependency_command.rs b/crates/shirabe/src/command/base_dependency_command.rs index 7a5300a..ad84953 100644 --- a/crates/shirabe/src/command/base_dependency_command.rs +++ b/crates/shirabe/src/command/base_dependency_command.rs @@ -53,10 +53,10 @@ pub trait BaseDependencyCommand: BaseCommand { let mut composer = crate::command::composer_full_mut(&composer); // TODO(plugin): dispatch CommandEvent(PluginEvents::COMMAND, self.get_name(), input, output) via composer.get_event_dispatcher() - let mut repos: Vec<Box<dyn RepositoryInterface>> = vec![]; - repos.push(Box::new(RootPackageRepository::new( - composer.get_package().clone(), - ))); + let mut repos: Vec<crate::repository::RepositoryInterfaceHandle> = + vec![crate::repository::RepositoryInterfaceHandle::new( + RootPackageRepository::new(composer.get_package().clone()), + )]; if input.get_option("locked").as_bool().unwrap_or(false) { let locker = composer.get_locker().clone(); @@ -71,16 +71,17 @@ pub trait BaseDependencyCommand: BaseCommand { })); } - repos.push(Box::new(locker.get_locked_repository(true)?)); + repos.push(crate::repository::RepositoryInterfaceHandle::new( + locker.get_locked_repository(true)?, + )); let platform_overrides: IndexMap<String, PhpMixed> = locker .get_platform_overrides()? .into_iter() .map(|(k, v)| (k, PhpMixed::String(v))) .collect(); - repos.push(Box::new(PlatformRepository::new( - vec![], - platform_overrides, - )?)); + repos.push(crate::repository::RepositoryInterfaceHandle::new( + PlatformRepository::new(vec![], platform_overrides)?, + )); } else { let repository_manager = composer.get_repository_manager().clone(); let repository_manager = repository_manager.borrow(); @@ -98,10 +99,7 @@ pub trait BaseDependencyCommand: BaseCommand { return Ok(1); } - // TODO(phase-b): InstalledRepositoryInterface is shared by reference (PHP class - // semantics); Box<dyn RepositoryInterface> requires owned upcast. Skipping local - // repo push until clone_box is exposed on InstalledRepositoryInterface. - let _ = local_repo; + repos.push(local_repo); let platform_overrides = composer .get_config() @@ -112,7 +110,9 @@ pub trait BaseDependencyCommand: BaseCommand { .unwrap_or_default(); // TODO(phase-b): platform_overrides type adjustment; using empty for now let _ = platform_overrides; - repos.push(Box::new(PlatformRepository::new(vec![], IndexMap::new())?)); + repos.push(crate::repository::RepositoryInterfaceHandle::new( + PlatformRepository::new(vec![], IndexMap::new())?, + )); } let mut installed_repo = InstalledRepository::new(repos); @@ -159,9 +159,11 @@ pub trait BaseDependencyCommand: BaseCommand { &needle, FindPackageConstraint::String(text_constraint.clone()), ) { - installed_repo.add_repository(Box::new( - InstalledArrayRepository::new_with_packages(vec![r#match.into()])?, - ))?; + installed_repo.add_repository( + crate::repository::RepositoryInterfaceHandle::new( + InstalledArrayRepository::new_with_packages(vec![r#match.into()])?, + ), + )?; } else if PlatformRepository::is_platform_package(&needle) { let parser = VersionParser::new(); let platform_constraint = parser.parse_constraints(&text_constraint)?; @@ -171,11 +173,14 @@ pub trait BaseDependencyCommand: BaseCommand { .get_version() .to_string(); let temp_platform_pkg = Package::new(needle.clone(), version.clone(), version); - installed_repo.add_repository(Box::new( - InstalledArrayRepository::new_with_packages(vec![ - crate::package::PackageHandle::from_package(temp_platform_pkg).into(), - ])?, - ))?; + installed_repo.add_repository( + crate::repository::RepositoryInterfaceHandle::new( + InstalledArrayRepository::new_with_packages(vec![ + crate::package::PackageHandle::from_package(temp_platform_pkg) + .into(), + ])?, + ), + )?; } } else { self.get_io().write_error(&format!( diff --git a/crates/shirabe/src/command/bump_command.rs b/crates/shirabe/src/command/bump_command.rs index a1e5f35..0f62bb8 100644 --- a/crates/shirabe/src/command/bump_command.rs +++ b/crates/shirabe/src/command/bump_command.rs @@ -142,8 +142,8 @@ impl BumpCommand { .get("lock") .as_bool() .unwrap_or(true); - let repo: Box<dyn crate::repository::RepositoryInterface> = if !has_lock_file_disabled { - Box::new( + let repo: crate::repository::RepositoryInterfaceHandle = if !has_lock_file_disabled { + crate::repository::RepositoryInterfaceHandle::new( composer .get_locker() .borrow_mut() @@ -158,20 +158,17 @@ impl BumpCommand { ); return Ok(Self::ERROR_LOCK_OUTDATED); } - Box::new( + crate::repository::RepositoryInterfaceHandle::new( composer .get_locker() .borrow_mut() .get_locked_repository(true)?, ) } else { - // TODO(phase-b): get_local_repository returns &dyn InstalledRepositoryInterface; - // cloning into an owned Box requires clone_box on that trait. composer .get_repository_manager() .borrow() .get_local_repository() - .clone_box() }; if composer.get_package().get_type() != "project" && !dev_only { diff --git a/crates/shirabe/src/command/check_platform_reqs_command.rs b/crates/shirabe/src/command/check_platform_reqs_command.rs index fd5edd9..15e4225 100644 --- a/crates/shirabe/src/command/check_platform_reqs_command.rs +++ b/crates/shirabe/src/command/check_platform_reqs_command.rs @@ -63,7 +63,7 @@ impl CheckPlatformReqsCommand { let mut requires: IndexMap<String, Vec<Link>> = IndexMap::new(); let mut remove_packages: Vec<String> = vec![]; - let installed_repo_base: Box<dyn crate::repository::RepositoryInterface> = if input + let installed_repo_base: crate::repository::RepositoryInterfaceHandle = if input .get_option("lock") .as_bool() .unwrap_or(false) @@ -72,7 +72,7 @@ impl CheckPlatformReqsCommand { "<info>Checking {}platform requirements using the lock file</info>", if no_dev { "non-dev " } else { "" } )); - Box::new( + crate::repository::RepositoryInterfaceHandle::new( composer .get_locker() .borrow_mut() @@ -87,21 +87,21 @@ impl CheckPlatformReqsCommand { "<warning>No vendor dir present, checking {}platform requirements from the lock file</warning>", if no_dev { "non-dev " } else { "" } )); - Box::new( + crate::repository::RepositoryInterfaceHandle::new( composer .get_locker() .borrow_mut() .get_locked_repository(!no_dev)?, - ) as Box<dyn crate::repository::RepositoryInterface> + ) } else { if no_dev { - remove_packages = local_repo.get_dev_package_names().clone(); + remove_packages = local_repo.get_dev_package_names(); } io.write_error(&format!( "<info>Checking {}platform requirements for packages in the vendor dir</info>", if no_dev { "non-dev " } else { "" } )); - local_repo.clone_box() + local_repo.clone() } }; @@ -115,8 +115,10 @@ impl CheckPlatformReqsCommand { } let root_pkg_repo = RootPackageRepository::new(composer.get_package().clone()); - let installed_repo = - InstalledRepository::new(vec![installed_repo_base, Box::new(root_pkg_repo)]); + let installed_repo = InstalledRepository::new(vec![ + installed_repo_base, + crate::repository::RepositoryInterfaceHandle::new(root_pkg_repo), + ]); for package in installed_repo.get_packages() { if remove_packages.contains(&package.get_name().to_string()) { @@ -134,8 +136,11 @@ impl CheckPlatformReqsCommand { requires_sorted.sort_by(|a, b| a.0.cmp(&b.0)); let installed_repo_with_platform = InstalledRepository::new(vec![ - Box::new(installed_repo), - Box::new(PlatformRepository::new(vec![], indexmap::IndexMap::new())?), + crate::repository::RepositoryInterfaceHandle::new(installed_repo), + crate::repository::RepositoryInterfaceHandle::new(PlatformRepository::new( + vec![], + indexmap::IndexMap::new(), + )?), ]); let mut results: Vec<CheckResult> = vec![]; diff --git a/crates/shirabe/src/command/create_project_command.rs b/crates/shirabe/src/command/create_project_command.rs index d5a8a0c..c669aa5 100644 --- a/crates/shirabe/src/command/create_project_command.rs +++ b/crates/shirabe/src/command/create_project_command.rs @@ -304,7 +304,7 @@ impl CreateProjectCommand { let _ = &composer_json_repositories_config; let placeholder_existing: IndexMap< String, - Box<dyn crate::repository::RepositoryInterface>, + crate::repository::RepositoryInterfaceHandle, > = IndexMap::new(); let name = RepositoryFactory::generate_repository_name( &PhpMixed::Int(index as i64), @@ -737,12 +737,14 @@ impl CreateProjectCommand { if repositories.is_none() { // TODO(phase-b): default_repos needs &mut RepositoryManager but we hold &RepositoryManager. let _ = rm; - repository_set.add_repository(Box::new(CompositeRepository::new( - RepositoryFactory::default_repos(Some(io.clone()), Some(config.clone()), None)? - .into_iter() - .map(|(_, v)| v) - .collect(), - ))); + repository_set.add_repository(crate::repository::RepositoryInterfaceHandle::new( + CompositeRepository::new( + RepositoryFactory::default_repos(Some(io.clone()), Some(config.clone()), None)? + .into_iter() + .map(|(_, v)| v) + .collect(), + ), + ))?; } else { for repo in repositories.unwrap() { let mut repo_config = diff --git a/crates/shirabe/src/command/diagnose_command.rs b/crates/shirabe/src/command/diagnose_command.rs index c64fc39..945d1e9 100644 --- a/crates/shirabe/src/command/diagnose_command.rs +++ b/crates/shirabe/src/command/diagnose_command.rs @@ -946,7 +946,7 @@ impl DiagnoseCommand { self.http_downloader.clone().unwrap(), None, )?; - let composer_repo_as_repo: Box<dyn crate::repository::RepositoryInterface> = + let composer_repo_as_repo: crate::repository::RepositoryInterfaceHandle = todo!("ComposerRepository as RepositoryInterface"); repo_set.add_repository(composer_repo_as_repo)?; diff --git a/crates/shirabe/src/command/fund_command.rs b/crates/shirabe/src/command/fund_command.rs index 340424f..9d5720e 100644 --- a/crates/shirabe/src/command/fund_command.rs +++ b/crates/shirabe/src/command/fund_command.rs @@ -60,7 +60,7 @@ impl FundCommand { repository_manager .get_repositories() .iter() - .map(|r| r.clone_box()) + .map(|r| r.clone()) .collect(), ); let mut fundings: IndexMap<String, IndexMap<String, Vec<String>>> = IndexMap::new(); diff --git a/crates/shirabe/src/command/home_command.rs b/crates/shirabe/src/command/home_command.rs index c048bfd..0038add 100644 --- a/crates/shirabe/src/command/home_command.rs +++ b/crates/shirabe/src/command/home_command.rs @@ -203,15 +203,15 @@ impl HomeCommand { } } - fn initialize_repos(&mut self) -> Result<Vec<Box<dyn RepositoryInterface>>> { + fn initialize_repos(&mut self) -> Result<Vec<crate::repository::RepositoryInterfaceHandle>> { let composer = self.try_composer(None, None); if let Some(composer) = composer { let composer = crate::command::composer_full(&composer); - let mut repos: Vec<Box<dyn RepositoryInterface>> = vec![]; - repos.push(Box::new(RootPackageRepository::new( - composer.get_package().clone(), - ))); + let mut repos: Vec<crate::repository::RepositoryInterfaceHandle> = vec![]; + repos.push(crate::repository::RepositoryInterfaceHandle::new( + RootPackageRepository::new(composer.get_package().clone()), + )); // TODO(phase-b): get_local_repository / get_repositories return shared refs; needs Rc<dyn ...> migration return Ok(repos); } diff --git a/crates/shirabe/src/command/init_command.rs b/crates/shirabe/src/command/init_command.rs index 730658c..38e620b 100644 --- a/crates/shirabe/src/command/init_command.rs +++ b/crates/shirabe/src/command/init_command.rs @@ -455,8 +455,10 @@ impl InitCommand { let mut repo_manager = RepositoryFactory::manager(io.clone(), &config, None, None, None)?; - let mut repos: Vec<Box<dyn crate::repository::RepositoryInterface>> = - vec![Box::new(PlatformRepository::new(vec![], IndexMap::new())?)]; + let mut repos: Vec<crate::repository::RepositoryInterfaceHandle> = + vec![crate::repository::RepositoryInterfaceHandle::new( + PlatformRepository::new(vec![], IndexMap::new())?, + )]; let mut create_default_packagist_repo = true; for repo in &repositories { let repo_config = diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs index d0574c6..d656d83 100644 --- a/crates/shirabe/src/command/package_discovery_trait.rs +++ b/crates/shirabe/src/command/package_discovery_trait.rs @@ -56,9 +56,11 @@ pub trait PackageDiscoveryTrait { fn get_repos(&mut self) -> &CompositeRepository { if self.get_repos_mut().is_none() { // PHP: array_merge([new PlatformRepository], RepositoryFactory::defaultReposWithDefaultManager($this->getIO())) - let mut repos: Vec<Box<dyn crate::repository::RepositoryInterface>> = vec![ + let mut repos: Vec<crate::repository::RepositoryInterfaceHandle> = vec![ // TODO(phase-b): PlatformRepository::new() signature - Box::new(todo!("PlatformRepository::new()") as PlatformRepository), + crate::repository::RepositoryInterfaceHandle::new::<PlatformRepository>(todo!( + "PlatformRepository::new()" + )), ]; let io_owned: std::rc::Rc<std::cell::RefCell<dyn IOInterface>> = self.get_io(); for (_, repo) in RepositoryFactory::default_repos_with_default_manager(io_owned) diff --git a/crates/shirabe/src/command/reinstall_command.rs b/crates/shirabe/src/command/reinstall_command.rs index ad4739b..29e8129 100644 --- a/crates/shirabe/src/command/reinstall_command.rs +++ b/crates/shirabe/src/command/reinstall_command.rs @@ -219,7 +219,7 @@ impl ReinstallCommand { uninstall_operations, install_operations, dev_mode, - local_repo, + local_repo.clone(), &installation_manager, ); // installation_manager.execute(local_repo_mut, uninstall_ops_boxed, dev_mode, true, false); diff --git a/crates/shirabe/src/command/require_command.rs b/crates/shirabe/src/command/require_command.rs index bf5f159..93ec469 100644 --- a/crates/shirabe/src/command/require_command.rs +++ b/crates/shirabe/src/command/require_command.rs @@ -261,10 +261,12 @@ impl RequireCommand { .unwrap_or_default(); // initialize self.repos as it is used by the PackageDiscoveryTrait let platform_repo = PlatformRepository::new(vec![], platform_overrides_map)?; - let mut combined: Vec<Box<dyn crate::repository::RepositoryInterface>> = vec![ - // TODO(phase-b): PlatformRepository should be shared via Rc; use placeholder until - // CompositeRepository accepts shared references - Box::new(todo!("share platform_repo with PlatformRepository") as PlatformRepository), + let mut combined: Vec<crate::repository::RepositoryInterfaceHandle> = vec![ + // TODO(phase-c): share this platform_repo as a handle instead of constructing a + // separate one; PlatformRepository is held by value here for the requirement below. + crate::repository::RepositoryInterfaceHandle::new::<PlatformRepository>(todo!( + "share platform_repo with PlatformRepository" + )), ]; for _repo in repos { // TODO(phase-b): repos are borrowed from RepositoryManager; need to take ownership diff --git a/crates/shirabe/src/command/search_command.rs b/crates/shirabe/src/command/search_command.rs index 2033cfc..5d6a31b 100644 --- a/crates/shirabe/src/command/search_command.rs +++ b/crates/shirabe/src/command/search_command.rs @@ -10,6 +10,7 @@ use crate::plugin::CommandEvent; use crate::plugin::PluginEvents; use crate::repository::CompositeRepository; use crate::repository::PlatformRepository; +use crate::repository::RepositoryInterfaceHandle; use crate::repository::repository_interface::{self, RepositoryInterface}; use anyhow::Result; use indexmap::IndexMap; @@ -78,18 +79,22 @@ impl SearchCommand { self.create_composer_instance(input, io_box, None, false, None)? }; let composer_ref = crate::command::composer_full(&composer); - // TODO(phase-b): get_local_repository returns &dyn InstalledRepositoryInterface but we need Box<dyn RepositoryInterface> - let local_repo: Box<dyn RepositoryInterface> = - todo!("share local_repo as RepositoryInterface"); - let installed_repo = CompositeRepository::new(vec![local_repo, Box::new(platform_repo)]); - let mut all_repos: Vec<Box<dyn RepositoryInterface>> = vec![Box::new(installed_repo)]; - // TODO(phase-b): get_repositories returns &Vec<Box<...>>; needs ownership reshape + let local_repo = composer_ref + .get_repository_manager() + .borrow() + .get_local_repository(); + let installed_repo = CompositeRepository::new(vec![ + local_repo, + RepositoryInterfaceHandle::new(platform_repo), + ]); + let mut all_repos: Vec<RepositoryInterfaceHandle> = + vec![RepositoryInterfaceHandle::new(installed_repo)]; for r in composer_ref .get_repository_manager() .borrow() .get_repositories() { - all_repos.push(r.clone_box()); + all_repos.push(r.clone()); } let repos = CompositeRepository::new(all_repos); diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index b72a986..2b2dd94 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -40,6 +40,7 @@ use crate::repository::InstalledRepository; use crate::repository::PlatformRepository; use crate::repository::RepositoryFactory; use crate::repository::RepositoryInterface; +use crate::repository::RepositoryInterfaceHandle; use crate::repository::RepositorySet; use crate::repository::RepositoryUtils; use crate::repository::RootPackageRepository; @@ -198,13 +199,13 @@ impl ShowCommand { let make_platform_repo = || -> anyhow::Result<PlatformRepository> { PlatformRepository::new(vec![], platform_overrides.clone()) }; - let mut locked_repo: Option<Box<dyn RepositoryInterface>> = None; + let mut locked_repo: Option<RepositoryInterfaceHandle> = None; // The single-package $package binding from PHP gets surfaced here. let mut single_package: Option<crate::package::CompletePackageInterfaceHandle> = None; let mut versions_map: IndexMap<String, String> = IndexMap::new(); - let installed_repo: Box<InstalledRepository>; - let repos: Box<dyn RepositoryInterface>; + let installed_repo: RepositoryInterfaceHandle; + let repos: RepositoryInterfaceHandle; if input.get_option("self").as_bool() == Some(true) && input.get_option("installed").as_bool() != Some(true) @@ -227,95 +228,95 @@ impl ShowCommand { } .into()); } - installed_repo = Box::new(InstalledRepository::new(vec![Box::new( - RootPackageRepository::new(package.clone()), - )])); - repos = Box::new(InstalledRepository::new(vec![Box::new( - RootPackageRepository::new(package.clone()), - )])); + installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + RepositoryInterfaceHandle::new(RootPackageRepository::new(package.clone())), + ])); + repos = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + RepositoryInterfaceHandle::new(RootPackageRepository::new(package.clone())), + ])); // TODO(phase-c): need to convert the root package handle to a CompletePackageInterfaceHandle single_package = todo!("convert package to CompletePackageInterfaceHandle"); } else if input.get_option("platform").as_bool() == Some(true) { - installed_repo = Box::new(InstalledRepository::new(vec![Box::new( - make_platform_repo()?, - )])); - repos = Box::new(InstalledRepository::new(vec![Box::new( - make_platform_repo()?, - )])); + installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + RepositoryInterfaceHandle::new(make_platform_repo()?), + ])); + repos = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + RepositoryInterfaceHandle::new(make_platform_repo()?), + ])); } else if input.get_option("available").as_bool() == Some(true) { - let mut ir = InstalledRepository::new(vec![Box::new(make_platform_repo()?)]); + let mut ir = InstalledRepository::new(vec![RepositoryInterfaceHandle::new( + make_platform_repo()?, + )]); if let Some(ref composer) = composer { let composer = crate::command::composer_full(composer); - repos = Box::new(CompositeRepository::new( + repos = RepositoryInterfaceHandle::new(CompositeRepository::new( composer .get_repository_manager() .borrow() .get_repositories() .iter() - .map(|r| r.clone_box()) + .map(|r| r.clone()) .collect(), )); ir.add_repository( composer .get_repository_manager() .borrow() - .get_local_repository() - .clone_box(), - ); - installed_repo = Box::new(ir); + .get_local_repository(), + )?; + installed_repo = RepositoryInterfaceHandle::new(ir); } else { let default_repos = RepositoryFactory::default_repos_with_default_manager(self.get_io())?; let names: Vec<String> = default_repos.keys().cloned().collect(); - repos = Box::new(CompositeRepository::new( + repos = RepositoryInterfaceHandle::new(CompositeRepository::new( default_repos.into_values().collect(), )); self.get_io().write_error(&format!( "No composer.json found in the current directory, showing available packages from {}", names.join(", ") )); - installed_repo = Box::new(ir); + installed_repo = RepositoryInterfaceHandle::new(ir); } } else if input.get_option("all").as_bool() == Some(true) && composer.is_some() { let mut composer_ref = crate::command::composer_full_mut(composer.as_ref().unwrap()); - let local_repo_cloned = composer_ref + let local_repo = composer_ref .get_repository_manager() .borrow() - .get_local_repository() - .clone_box(); + .get_local_repository(); let locker_rc = composer_ref.get_locker().clone(); let mut locker = locker_rc.borrow_mut(); if locker.is_locked() { - let lr = locker.get_locked_repository(true)?; - installed_repo = Box::new(InstalledRepository::new(vec![ - lr.clone_box(), - local_repo_cloned, - Box::new(make_platform_repo()?), + let lr_handle = RepositoryInterfaceHandle::new(locker.get_locked_repository(true)?); + installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + lr_handle.clone(), + local_repo, + RepositoryInterfaceHandle::new(make_platform_repo()?), ])); - // TODO(phase-b): wrap lr (LockArrayRepository) as Box<dyn RepositoryInterface> - locked_repo = Some(todo!("share lr as Box<dyn RepositoryInterface>")); - let _ = lr; + locked_repo = Some(lr_handle); } else { - installed_repo = Box::new(InstalledRepository::new(vec![ - local_repo_cloned, - Box::new(make_platform_repo()?), + installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + local_repo, + RepositoryInterfaceHandle::new(make_platform_repo()?), ])); } - let mut composite_input: Vec<Box<dyn RepositoryInterface>> = vec![Box::new( - FilterRepository::new(installed_repo.clone_box(), { - let mut m = IndexMap::new(); - m.insert("canonical".to_string(), PhpMixed::Bool(false)); - m - })?, - )]; + let mut composite_input: Vec<RepositoryInterfaceHandle> = + vec![RepositoryInterfaceHandle::new(FilterRepository::new( + installed_repo.clone(), + { + let mut m = IndexMap::new(); + m.insert("canonical".to_string(), PhpMixed::Bool(false)); + m + }, + )?)]; for r in composer_ref .get_repository_manager() .borrow() .get_repositories() { - composite_input.push(r.clone_box()); + composite_input.push(r.clone()); } - repos = Box::new(CompositeRepository::new(composite_input)); + repos = RepositoryInterfaceHandle::new(CompositeRepository::new(composite_input)); } else if input.get_option("all").as_bool() == Some(true) { let default_repos = RepositoryFactory::default_repos_with_default_manager(self.get_io())?; @@ -324,15 +325,14 @@ impl ShowCommand { "No composer.json found in the current directory, showing available packages from {}", names.join(", ") )); - installed_repo = Box::new(InstalledRepository::new(vec![Box::new( - make_platform_repo()?, - )])); - let mut composite_input: Vec<Box<dyn RepositoryInterface>> = - vec![installed_repo.clone_box()]; + installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + RepositoryInterfaceHandle::new(make_platform_repo()?), + ])); + let mut composite_input: Vec<RepositoryInterfaceHandle> = vec![installed_repo.clone()]; for (_k, v) in default_repos.into_iter() { composite_input.push(v); } - repos = Box::new(CompositeRepository::new(composite_input)); + repos = RepositoryInterfaceHandle::new(CompositeRepository::new(composite_input)); } else if input.get_option("locked").as_bool() == Some(true) { if composer.is_none() || !crate::command::composer_full_mut(composer.as_ref().unwrap()) @@ -349,18 +349,19 @@ impl ShowCommand { let mut composer_ref = crate::command::composer_full_mut(composer.as_ref().unwrap()); let locker_rc = composer_ref.get_locker().clone(); let mut locker = locker_rc.borrow_mut(); - let mut lr = + let lr = locker.get_locked_repository(input.get_option("no-dev").as_bool() != Some(true))?; + let lr_handle = RepositoryInterfaceHandle::new(lr); 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. - let _ = &mut lr; + let _ = &lr_handle; } - installed_repo = Box::new(InstalledRepository::new(vec![lr.clone_box()])); - repos = Box::new(InstalledRepository::new(vec![lr.clone_box()])); - // TODO(phase-b): wrap lr (LockArrayRepository) as Box<dyn RepositoryInterface> - locked_repo = Some(todo!("share lr as Box<dyn RepositoryInterface>")); - let _ = lr; + installed_repo = + RepositoryInterfaceHandle::new(InstalledRepository::new(vec![lr_handle.clone()])); + repos = + RepositoryInterfaceHandle::new(InstalledRepository::new(vec![lr_handle.clone()])); + locked_repo = Some(lr_handle); } else { // --installed / default case // TODO(phase-b): PHP shares the Composer object by reference. Phase B @@ -382,13 +383,13 @@ impl ShowCommand { }; let root_pkg = composer_local.get_package(); - let root_repo: Box<dyn RepositoryInterface> = + let root_repo: RepositoryInterfaceHandle = if input.get_option("self").as_bool() == Some(true) { - Box::new(RootPackageRepository::new( + RepositoryInterfaceHandle::new(RootPackageRepository::new( composer_local.get_package().clone(), )) } else { - Box::new(InstalledArrayRepository::new()?) + RepositoryInterfaceHandle::new(InstalledArrayRepository::new()?) }; if input.get_option("no-dev").as_bool() == Some(true) { let local_packages = composer_local @@ -404,23 +405,28 @@ impl ShowCommand { ); let cloned: Vec<crate::package::PackageInterfaceHandle> = packages.into_iter().map(|p| p.into()).collect(); - installed_repo = Box::new(InstalledRepository::new(vec![ - root_repo.clone_box(), - Box::new(InstalledArrayRepository::new_with_packages(cloned)?), + installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + root_repo.clone(), + RepositoryInterfaceHandle::new(InstalledArrayRepository::new_with_packages( + cloned, + )?), ])); - repos = Box::new(InstalledRepository::new(vec![ + repos = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ root_repo, - Box::new(InstalledArrayRepository::new_with_packages(Vec::new())?), + RepositoryInterfaceHandle::new(InstalledArrayRepository::new_with_packages( + Vec::new(), + )?), ])); } else { let repository_manager = composer_local.get_repository_manager().clone(); let repository_manager = repository_manager.borrow(); let lr = repository_manager.get_local_repository(); - installed_repo = Box::new(InstalledRepository::new(vec![ - root_repo.clone_box(), - lr.clone_box(), + installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + root_repo.clone(), + lr.clone(), ])); - repos = Box::new(InstalledRepository::new(vec![root_repo, lr.clone_box()])); + repos = + RepositoryInterfaceHandle::new(InstalledRepository::new(vec![root_repo, lr])); } if installed_repo.get_packages().is_empty() { @@ -475,8 +481,12 @@ impl ShowCommand { versions_map.insert(pkg.get_pretty_version(), pkg.get_version()); } else if let Some(ref pf) = package_filter { if !pf.contains('*') { - let (matched_package, vers) = - self.get_package(&*installed_repo, &*repos, pf, input.get_argument("version"))?; + let (matched_package, vers) = self.get_package( + &*installed_repo.borrow(), + &repos, + pf, + input.get_argument("version"), + )?; if let Some(ref pkg) = matched_package { if input.get_option("direct").as_bool() == Some(true) { @@ -546,8 +556,11 @@ impl ShowCommand { let mut exit_code: i64 = 0; if input.get_option("tree").as_bool() == Some(true) { - let array_tree = - self.generate_package_tree(package.clone().into(), &*installed_repo, &*repos); + let array_tree = self.generate_package_tree( + package.clone().into(), + &*installed_repo.borrow(), + &repos, + ); if format == "json" { let mut wrapper: IndexMap<String, PhpMixed> = IndexMap::new(); @@ -625,14 +638,14 @@ impl ShowCommand { self.print_package_info_as_json( package.clone(), &versions_map, - &*installed_repo, + &*installed_repo.borrow(), latest_package, )?; } else { self.print_package_info( package.clone(), &versions_map, - &*installed_repo, + &*installed_repo.borrow(), latest_package, )?; } @@ -663,8 +676,8 @@ impl ShowCommand { ) { array_tree.push(self.generate_package_tree( package.clone(), - &*installed_repo, - &*repos, + &*installed_repo.borrow(), + &repos, )); } } @@ -715,13 +728,13 @@ impl ShowCommand { input.set_option("path", PhpMixed::Bool(false)); } - for repo in RepositoryUtils::flatten_repositories(repos.clone_box(), false) { + for repo in RepositoryUtils::flatten_repositories(repos.clone(), false) { // TODO(phase-b): InstalledRepository needs as_repository_interface / get_repositories // wired through; placeholder classification until then. - let r#type = if Self::same_repository(&*repo, &platform_repo) { + let r#type = if Self::same_repository(&*repo.borrow(), &platform_repo) { "platform" } else if let Some(ref lr) = locked_repo { - if Self::same_repository_dyn(&*repo, &**lr) { + if Self::same_repository_dyn(&*repo.borrow(), &*lr.borrow()) { "locked" } else { "available" @@ -776,7 +789,7 @@ impl ShowCommand { } } } - if Self::same_repository(&*repo, &platform_repo) { + if Self::same_repository(&*repo.borrow(), &platform_repo) { for (name, p) in platform_repo.get_disabled_packages() { packages .entry(type_owned.clone()) @@ -1470,8 +1483,8 @@ impl ShowCommand { /// finds a package by name and version if provided pub(crate) fn get_package( &mut self, - installed_repo: &InstalledRepository, - repos: &dyn RepositoryInterface, + installed_repo: &dyn RepositoryInterface, + repos: &RepositoryInterfaceHandle, name: &str, version: PhpMixed, ) -> anyhow::Result<( @@ -1498,7 +1511,7 @@ impl ShowCommand { IndexMap::new(), ); repository_set.allow_installed_repositories(true); - repository_set.add_repository(repos.clone_box())?; + repository_set.add_repository(repos.clone())?; let mut matched_package: Option<crate::package::PackageInterfaceHandle> = None; let mut versions: IndexMap<String, String> = IndexMap::new(); @@ -1555,7 +1568,7 @@ impl ShowCommand { &mut self, package: CompletePackageInterfaceHandle, versions: &IndexMap<String, String>, - installed_repo: &InstalledRepository, + installed_repo: &dyn RepositoryInterface, latest_package: Option<PackageInterfaceHandle>, ) -> anyhow::Result<()> { self.print_meta(package.clone(), versions, installed_repo, latest_package); @@ -1585,7 +1598,7 @@ impl ShowCommand { &mut self, package: CompletePackageInterfaceHandle, versions: &IndexMap<String, String>, - installed_repo: &InstalledRepository, + installed_repo: &dyn RepositoryInterface, latest_package: Option<PackageInterfaceHandle>, ) { let is_installed_package = !PlatformRepository::is_platform_package(&package.get_name()) @@ -1743,7 +1756,7 @@ impl ShowCommand { &mut self, package: CompletePackageInterfaceHandle, versions: &IndexMap<String, String>, - installed_repo: &InstalledRepository, + installed_repo: &dyn RepositoryInterface, ) { let mut versions_keys: Vec<String> = versions.keys().cloned().collect(); versions_keys = Semver::rsort(versions_keys); @@ -1830,7 +1843,7 @@ impl ShowCommand { &mut self, package: CompletePackageInterfaceHandle, versions: &IndexMap<String, String>, - installed_repo: &InstalledRepository, + installed_repo: &dyn RepositoryInterface, latest_package: Option<PackageInterfaceHandle>, ) -> anyhow::Result<()> { let mut json: IndexMap<String, PhpMixed> = IndexMap::new(); @@ -2268,8 +2281,8 @@ impl ShowCommand { pub(crate) fn generate_package_tree( &mut self, package: PackageInterfaceHandle, - installed_repo: &InstalledRepository, - remote_repos: &dyn RepositoryInterface, + installed_repo: &dyn RepositoryInterface, + remote_repos: &RepositoryInterfaceHandle, ) -> IndexMap<String, PhpMixed> { let requires = { let mut r: IndexMap<String, Link> = package.get_requires().clone(); @@ -2425,8 +2438,8 @@ impl ShowCommand { &mut self, name: &str, link: &Link, - installed_repo: &InstalledRepository, - remote_repos: &dyn RepositoryInterface, + installed_repo: &dyn RepositoryInterface, + remote_repos: &RepositoryInterfaceHandle, packages_in_tree: &[PhpMixed], ) -> anyhow::Result<Vec<IndexMap<String, PhpMixed>>> { let mut children: Vec<IndexMap<String, PhpMixed>> = Vec::new(); @@ -2693,13 +2706,13 @@ impl ShowCommand { IndexMap::new(), IndexMap::new(), ); - rs.add_repository(Box::new(CompositeRepository::new( + rs.add_repository(RepositoryInterfaceHandle::new(CompositeRepository::new( composer .get_repository_manager() .borrow() .get_repositories() .iter() - .map(|r| r.clone_box()) + .map(|r| r.clone()) .collect(), )))?; self.repository_set = Some(rs); diff --git a/crates/shirabe/src/command/suggests_command.rs b/crates/shirabe/src/command/suggests_command.rs index aa1ae15..9105474 100644 --- a/crates/shirabe/src/command/suggests_command.rs +++ b/crates/shirabe/src/command/suggests_command.rs @@ -8,6 +8,7 @@ use crate::io::IOInterface; use crate::repository::InstalledRepository; use crate::repository::PlatformRepository; use crate::repository::RepositoryInterface; +use crate::repository::RepositoryInterfaceHandle; use crate::repository::RootPackageRepository; use anyhow::Result; use indexmap::IndexMap; @@ -49,8 +50,10 @@ impl SuggestsCommand { let root_package_handle: crate::package::RootPackageInterfaceHandle = composer.get_package().clone(); - let mut installed_repos: Vec<Box<dyn RepositoryInterface>> = - vec![Box::new(RootPackageRepository::new(root_package_handle))]; + let mut installed_repos: Vec<RepositoryInterfaceHandle> = + vec![RepositoryInterfaceHandle::new(RootPackageRepository::new( + root_package_handle, + ))]; if composer.get_locker().borrow_mut().is_locked() { // TODO(phase-b): get_platform_overrides returns IndexMap<String, String>; PlatformRepository::new expects IndexMap<String, PhpMixed> @@ -60,7 +63,7 @@ impl SuggestsCommand { .get_platform_overrides()?; let platform_overrides: IndexMap<String, PhpMixed> = todo!("convert IndexMap<String, String> to IndexMap<String, PhpMixed>"); - installed_repos.push(Box::new(PlatformRepository::new( + installed_repos.push(RepositoryInterfaceHandle::new(PlatformRepository::new( vec![], platform_overrides, )?)); @@ -68,13 +71,13 @@ impl SuggestsCommand { .get_locker() .borrow_mut() .get_locked_repository(!input.get_option("no-dev").as_bool().unwrap_or(false))?; - installed_repos.push(Box::new(locked_repo)); + installed_repos.push(RepositoryInterfaceHandle::new(locked_repo)); } else { // TODO(phase-b): Config::get returns PhpMixed; need to coerce to IndexMap<String, PhpMixed> let _platform_cfg = composer.get_config().borrow().get("platform"); let platform_overrides: IndexMap<String, PhpMixed> = todo!("extract IndexMap<String, PhpMixed> from PhpMixed config value"); - installed_repos.push(Box::new(PlatformRepository::new( + installed_repos.push(RepositoryInterfaceHandle::new(PlatformRepository::new( vec![], platform_overrides, )?)); @@ -82,8 +85,7 @@ impl SuggestsCommand { composer .get_repository_manager() .borrow() - .get_local_repository() - .clone_box(), + .get_local_repository(), ); } diff --git a/crates/shirabe/src/command/update_command.rs b/crates/shirabe/src/command/update_command.rs index f879283..f1b05af 100644 --- a/crates/shirabe/src/command/update_command.rs +++ b/crates/shirabe/src/command/update_command.rs @@ -635,13 +635,12 @@ impl UpdateCommand { .get_repository_manager() .borrow() .get_repositories(); - let _ = |repository: &Box<dyn RepositoryInterface>| -> bool { - repository - .as_any() - .downcast_ref::<PlatformRepository>() - .is_none() + let _ = |repository: &crate::repository::RepositoryInterfaceHandle| -> bool { + !repository.is::<PlatformRepository>() }; - repository_set.add_repository(Box::new(CompositeRepository::new(Vec::new())))?; + repository_set.add_repository(crate::repository::RepositoryInterfaceHandle::new( + CompositeRepository::new(Vec::new()), + ))?; let _ = array_filter::<i64, fn(&i64) -> bool>; VersionSelector::new(repository_set, None) |
