aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/command
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/command')
-rw-r--r--crates/shirabe/src/command/archive_command.rs7
-rw-r--r--crates/shirabe/src/command/audit_command.rs3
-rw-r--r--crates/shirabe/src/command/base_dependency_command.rs49
-rw-r--r--crates/shirabe/src/command/bump_command.rs9
-rw-r--r--crates/shirabe/src/command/check_platform_reqs_command.rs25
-rw-r--r--crates/shirabe/src/command/create_project_command.rs16
-rw-r--r--crates/shirabe/src/command/diagnose_command.rs2
-rw-r--r--crates/shirabe/src/command/fund_command.rs2
-rw-r--r--crates/shirabe/src/command/home_command.rs10
-rw-r--r--crates/shirabe/src/command/init_command.rs6
-rw-r--r--crates/shirabe/src/command/package_discovery_trait.rs6
-rw-r--r--crates/shirabe/src/command/reinstall_command.rs2
-rw-r--r--crates/shirabe/src/command/require_command.rs10
-rw-r--r--crates/shirabe/src/command/search_command.rs19
-rw-r--r--crates/shirabe/src/command/show_command.rs207
-rw-r--r--crates/shirabe/src/command/suggests_command.rs16
-rw-r--r--crates/shirabe/src/command/update_command.rs11
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)