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/base_dependency_command.rs8
-rw-r--r--crates/shirabe/src/command/bump_command.rs5
-rw-r--r--crates/shirabe/src/command/licenses_command.rs10
-rw-r--r--crates/shirabe/src/command/package_discovery_trait.rs14
-rw-r--r--crates/shirabe/src/command/require_command.rs4
-rw-r--r--crates/shirabe/src/command/show_command.rs206
-rw-r--r--crates/shirabe/src/command/status_command.rs38
-rw-r--r--crates/shirabe/src/command/suggests_command.rs17
-rw-r--r--crates/shirabe/src/command/validate_command.rs2
10 files changed, 129 insertions, 182 deletions
diff --git a/crates/shirabe/src/command/archive_command.rs b/crates/shirabe/src/command/archive_command.rs
index 225b092..aab7b51 100644
--- a/crates/shirabe/src/command/archive_command.rs
+++ b/crates/shirabe/src/command/archive_command.rs
@@ -201,10 +201,9 @@ impl ArchiveCommand {
None => return Ok(1),
}
} else {
- let _rc = self.require_composer(None, None)?;
- // TODO(phase-c): composer.get_package() returns &dyn RootPackageInterface, not a
- // handle, so it cannot be shared as a CompletePackageInterfaceHandle yet.
- todo!("share composer.get_package() as a CompletePackageInterfaceHandle")
+ let rc = self.require_composer(None, None)?;
+ let composer = crate::command::composer_full(&rc);
+ composer.get_package().clone().into()
};
io.write_error(&format!(
diff --git a/crates/shirabe/src/command/base_dependency_command.rs b/crates/shirabe/src/command/base_dependency_command.rs
index f449629..7a5300a 100644
--- a/crates/shirabe/src/command/base_dependency_command.rs
+++ b/crates/shirabe/src/command/base_dependency_command.rs
@@ -337,9 +337,7 @@ pub trait BaseDependencyCommand: BaseCommand {
} else {
package.get_pretty_version().to_string()
};
- let package_url = PackageInfo::get_view_source_or_homepage_url(
- package.as_rc().borrow().as_package_interface(),
- );
+ let package_url = PackageInfo::get_view_source_or_homepage_url(package.clone());
let name_with_link = match &package_url {
Some(url) => format!(
"<href={}>{}</>",
@@ -414,9 +412,7 @@ pub trait BaseDependencyCommand: BaseCommand {
} else {
package.get_pretty_version().to_string()
};
- let package_url = PackageInfo::get_view_source_or_homepage_url(
- package.as_rc().borrow().as_package_interface(),
- );
+ let package_url = PackageInfo::get_view_source_or_homepage_url(package.clone());
let name_with_link = match &package_url {
Some(url) => format!(
"<href={}>{}</>",
diff --git a/crates/shirabe/src/command/bump_command.rs b/crates/shirabe/src/command/bump_command.rs
index 3299f85..a1e5f35 100644
--- a/crates/shirabe/src/command/bump_command.rs
+++ b/crates/shirabe/src/command/bump_command.rs
@@ -255,10 +255,7 @@ impl BumpCommand {
package = alias.get_alias_of().into();
}
- let bumped = bumper.bump_requirement(
- link.get_constraint(),
- package.as_rc().borrow().as_package_interface(),
- )?;
+ let bumped = bumper.bump_requirement(link.get_constraint(), package.clone())?;
if bumped == current_constraint {
continue;
diff --git a/crates/shirabe/src/command/licenses_command.rs b/crates/shirabe/src/command/licenses_command.rs
index 6c7ea73..add5b0b 100644
--- a/crates/shirabe/src/command/licenses_command.rs
+++ b/crates/shirabe/src/command/licenses_command.rs
@@ -114,11 +114,7 @@ impl LicensesCommand {
if input.get_option("no-dev").as_bool().unwrap_or(false) {
RepositoryUtils::filter_required_packages(
&repo.get_packages(),
- composer
- .get_package()
- .as_rc()
- .borrow()
- .as_package_interface(),
+ composer.get_package().clone().into(),
false,
vec![],
)
@@ -160,9 +156,7 @@ impl LicensesCommand {
PhpMixed::String("Licenses".to_string()),
]);
for package in &packages {
- let link = PackageInfo::get_view_source_or_homepage_url(
- package.as_rc().borrow().as_package_interface(),
- );
+ let link = PackageInfo::get_view_source_or_homepage_url(package.clone());
let name = if let Some(link) = link {
format!(
"<href={}>{}</>",
diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs
index e8a56a9..d0574c6 100644
--- a/crates/shirabe/src/command/package_discovery_trait.rs
+++ b/crates/shirabe/src/command/package_discovery_trait.rs
@@ -21,9 +21,7 @@ use crate::filter::platform_requirement_filter::IgnoreAllPlatformRequirementFilt
use crate::filter::platform_requirement_filter::PlatformRequirementFilterFactory;
use crate::io::IOInterface;
use crate::io::IOInterfaceImmutable;
-use crate::package::BasePackage;
-use crate::package::CompletePackageInterface;
-use crate::package::PackageInterface;
+use crate::package::PackageInterfaceHandle;
use crate::package::version::VersionParser;
use crate::package::version::VersionSelector;
use crate::repository::CompositeRepository;
@@ -576,7 +574,7 @@ pub trait PackageDiscoveryTrait {
&format!(
"Package %s has requirements incompatible with your PHP version, PHP extensions and Composer version{}",
self.get_platform_exception_details(
- candidate.as_rc().borrow().as_package_interface(),
+ candidate.clone(),
platform_repo,
),
),
@@ -673,7 +671,7 @@ pub trait PackageDiscoveryTrait {
&format!(
"Could not find package %s in any version matching your PHP version, PHP extensions and Composer version{}%s",
self.get_platform_exception_details(
- candidate.as_rc().borrow().as_package_interface(),
+ candidate.clone(),
platform_repo,
),
),
@@ -781,9 +779,7 @@ pub trait PackageDiscoveryTrait {
if fixed {
package.get_pretty_version().to_string()
} else {
- version_selector.find_recommended_require_version(
- package.as_rc().borrow().as_package_interface(),
- )?
+ version_selector.find_recommended_require_version(package.clone())?
},
))
}
@@ -846,7 +842,7 @@ pub trait PackageDiscoveryTrait {
fn get_platform_exception_details(
&self,
- candidate: &dyn PackageInterface,
+ candidate: PackageInterfaceHandle,
platform_repo: Option<&PlatformRepository>,
) -> String {
let mut details: Vec<String> = vec![];
diff --git a/crates/shirabe/src/command/require_command.rs b/crates/shirabe/src/command/require_command.rs
index 66e1134..bf5f159 100644
--- a/crates/shirabe/src/command/require_command.rs
+++ b/crates/shirabe/src/command/require_command.rs
@@ -976,9 +976,7 @@ impl RequireCommand {
} else {
requirements.insert(
package_name.clone(),
- version_selector.find_recommended_require_version(
- package.as_rc().borrow().as_package_interface(),
- )?,
+ version_selector.find_recommended_require_version(package.clone())?,
);
}
self.get_io().write_error3(
diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs
index f3c1b3d..b72a986 100644
--- a/crates/shirabe/src/command/show_command.rs
+++ b/crates/shirabe/src/command/show_command.rs
@@ -24,9 +24,10 @@ use crate::filter::platform_requirement_filter::PlatformRequirementFilterInterfa
use crate::io::IOInterface;
use crate::io::IOInterfaceImmutable;
use crate::json::JsonFile;
-use crate::package::CompletePackageInterface;
+use crate::package::CompletePackageInterfaceHandle;
use crate::package::Link;
use crate::package::PackageInterface;
+use crate::package::PackageInterfaceHandle;
use crate::package::base_package;
use crate::package::version::VersionParser;
use crate::package::version::VersionSelector;
@@ -397,7 +398,7 @@ impl ShowCommand {
.get_packages();
let packages = RepositoryUtils::filter_required_packages(
&local_packages,
- root_pkg.as_rc().borrow().as_package_interface(),
+ root_pkg.clone().into(),
false,
Vec::new(),
);
@@ -545,13 +546,8 @@ impl ShowCommand {
let mut exit_code: i64 = 0;
if input.get_option("tree").as_bool() == Some(true) {
- let package_ref = package.as_rc().borrow();
- let array_tree = self.generate_package_tree(
- package_ref.as_package_interface(),
- &*installed_repo,
- &*repos,
- );
- drop(package_ref);
+ let array_tree =
+ self.generate_package_tree(package.clone().into(), &*installed_repo, &*repos);
if format == "json" {
let mut wrapper: IndexMap<String, PhpMixed> = IndexMap::new();
@@ -579,9 +575,8 @@ impl ShowCommand {
let mut latest_package: Option<crate::package::PackageInterfaceHandle> = None;
if input.get_option("latest").as_bool() == Some(true) {
- let package_ref = package.as_rc().borrow();
latest_package = self.find_latest_package(
- package_ref.as_package_interface(),
+ package.clone().into(),
composer.as_ref().unwrap(),
&platform_repo,
input.get_option("major-only").as_bool().unwrap_or(false),
@@ -626,25 +621,21 @@ impl ShowCommand {
return Ok(exit_code);
}
- let package_ref = package.as_rc().borrow();
- let package_dyn = package_ref
- .as_complete_package_interface()
- .expect("single_package is a CompletePackageInterface");
- let latest_ref = latest_package.as_ref().map(|p| p.as_rc().borrow());
- let latest_dyn: Option<&dyn PackageInterface> =
- latest_ref.as_ref().map(|r| r.as_package_interface());
if format == "json" {
self.print_package_info_as_json(
- package_dyn,
+ package.clone(),
&versions_map,
&*installed_repo,
- latest_dyn,
+ latest_package,
)?;
} else {
- self.print_package_info(package_dyn, &versions_map, &*installed_repo, latest_dyn)?;
+ self.print_package_info(
+ package.clone(),
+ &versions_map,
+ &*installed_repo,
+ latest_package,
+ )?;
}
- drop(latest_ref);
- drop(package_ref);
return Ok(exit_code);
}
@@ -670,9 +661,8 @@ impl ShowCommand {
),
true,
) {
- let package_ref = package.as_rc().borrow();
array_tree.push(self.generate_package_tree(
- package_ref.as_package_interface(),
+ package.clone(),
&*installed_repo,
&*repos,
));
@@ -844,9 +834,8 @@ impl ShowCommand {
if let PackageOrName::Pkg(package) = package_or_name {
if !Preg::is_match(&ignored_packages_regex, &package.get_pretty_name())?
{
- let package_ref = package.as_rc().borrow();
let latest = self.find_latest_package(
- package_ref.as_package_interface(),
+ package.clone(),
composer.as_ref().unwrap(),
&platform_repo,
show_major_only,
@@ -854,7 +843,6 @@ impl ShowCommand {
show_patch_only,
&*platform_req_filter,
)?;
- drop(package_ref);
if latest.is_none() {
continue;
}
@@ -956,9 +944,7 @@ impl ShowCommand {
);
package_view_data.insert(
"source".to_string(),
- match PackageInfo::get_view_source_url(
- package.as_rc().borrow().as_package_interface(),
- ) {
+ match PackageInfo::get_view_source_url(package.clone()) {
Some(s) => PhpMixed::String(s),
None => PhpMixed::Null,
},
@@ -1007,14 +993,8 @@ impl ShowCommand {
latest_version_str =
latest_version_str.trim_start_matches('v').to_string();
}
- let latest_ref = latest.as_rc().borrow();
- let package_ref = package.as_rc().borrow();
- let update_status = Self::get_update_status(
- latest_ref.as_package_interface(),
- package_ref.as_package_interface(),
- );
- drop(package_ref);
- drop(latest_ref);
+ let update_status =
+ Self::get_update_status(latest.clone(), package.clone());
latest_length = latest_length.max(latest_version_str.len());
package_view_data
.insert("latest".to_string(), PhpMixed::String(latest_version_str));
@@ -1480,8 +1460,8 @@ impl ShowCommand {
/// @return array|string|string[]
pub(crate) fn get_version_style(
&self,
- latest_package: &dyn PackageInterface,
- package: &dyn PackageInterface,
+ latest_package: PackageInterfaceHandle,
+ package: PackageInterfaceHandle,
) -> String {
Self::update_status_to_version_style(&Self::get_update_status(latest_package, package))
.to_string()
@@ -1539,9 +1519,7 @@ impl ShowCommand {
}
// select an exact match if it is in the installed repo and no specific version was required
- if version.is_null()
- && installed_repo.has_package(p.as_rc().borrow().as_package_interface())
- {
+ if version.is_null() && installed_repo.has_package(p.clone()) {
matched_package = Some(p.clone());
}
@@ -1575,14 +1553,18 @@ impl ShowCommand {
/// Prints package info.
pub(crate) fn print_package_info(
&mut self,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
versions: &IndexMap<String, String>,
installed_repo: &InstalledRepository,
- latest_package: Option<&dyn PackageInterface>,
+ latest_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<()> {
- self.print_meta(package, versions, installed_repo, latest_package);
- self.print_links(package, Link::TYPE_REQUIRE, None);
- self.print_links(package, Link::TYPE_DEV_REQUIRE, Some("requires (dev)"));
+ self.print_meta(package.clone(), versions, installed_repo, latest_package);
+ self.print_links(package.clone(), Link::TYPE_REQUIRE, None);
+ self.print_links(
+ package.clone(),
+ Link::TYPE_DEV_REQUIRE,
+ Some("requires (dev)"),
+ );
if !package.get_suggests().is_empty() {
self.get_io().write("\n<info>suggests</info>");
@@ -1592,8 +1574,8 @@ impl ShowCommand {
}
}
- self.print_links(package, Link::TYPE_PROVIDE, None);
- self.print_links(package, Link::TYPE_CONFLICT, None);
+ self.print_links(package.clone(), Link::TYPE_PROVIDE, None);
+ self.print_links(package.clone(), Link::TYPE_CONFLICT, None);
self.print_links(package, Link::TYPE_REPLACE, None);
Ok(())
}
@@ -1601,13 +1583,13 @@ impl ShowCommand {
/// Prints package metadata.
pub(crate) fn print_meta(
&mut self,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
versions: &IndexMap<String, String>,
installed_repo: &InstalledRepository,
- latest_package: Option<&dyn PackageInterface>,
+ latest_package: Option<PackageInterfaceHandle>,
) {
- let is_installed_package = !PlatformRepository::is_platform_package(package.get_name())
- && installed_repo.has_package(package.as_package_interface());
+ let is_installed_package = !PlatformRepository::is_platform_package(&package.get_name())
+ && installed_repo.has_package(package.clone().into());
self.get_io().write(&format!(
"<info>name</info> : {}",
@@ -1615,12 +1597,12 @@ impl ShowCommand {
));
self.get_io().write(&format!(
"<info>descrip.</info> : {}",
- package.get_description().unwrap_or("")
+ package.get_description().unwrap_or_default()
));
let keywords = package.get_keywords();
self.get_io()
.write(&format!("<info>keywords</info> : {}", keywords.join(", ")));
- self.print_versions(package, versions, installed_repo);
+ self.print_versions(package.clone(), versions, installed_repo);
if is_installed_package {
if let Some(rd) = package.get_release_date() {
let rel = self.get_relative_time(&rd);
@@ -1631,8 +1613,8 @@ impl ShowCommand {
));
}
}
- let latest = if let Some(latest) = latest_package {
- let style = self.get_version_style(latest, package.as_package_interface());
+ let latest: PackageInterfaceHandle = if let Some(latest) = latest_package {
+ let style = self.get_version_style(latest.clone(), package.clone().into());
let released_time = match latest.get_release_date() {
None => String::new(),
Some(rd) => {
@@ -1649,26 +1631,26 @@ impl ShowCommand {
));
latest
} else {
- package.as_package_interface()
+ package.clone().into()
};
self.get_io()
.write(&format!("<info>type</info> : {}", package.get_type()));
- self.print_licenses(package);
+ self.print_licenses(package.clone());
self.get_io().write(&format!(
"<info>homepage</info> : {}",
- package.get_homepage().unwrap_or("")
+ package.get_homepage().unwrap_or_default()
));
self.get_io().write(&format!(
"<info>source</info> : [{}] <comment>{}</comment> {}",
- package.get_source_type().unwrap_or(""),
- package.get_source_url().unwrap_or(""),
- package.get_source_reference().unwrap_or("")
+ package.get_source_type().unwrap_or_default(),
+ package.get_source_url().unwrap_or_default(),
+ package.get_source_reference().unwrap_or_default()
));
self.get_io().write(&format!(
"<info>dist</info> : [{}] <comment>{}</comment> {}",
- package.get_dist_type().unwrap_or(""),
- package.get_dist_url().unwrap_or(""),
- package.get_dist_reference().unwrap_or("")
+ package.get_dist_type().unwrap_or_default(),
+ package.get_dist_url().unwrap_or_default(),
+ package.get_dist_reference().unwrap_or_default()
));
if is_installed_package {
// TODO(phase-b): get_installation_manager wants &mut Composer; PHP shares by ref.
@@ -1691,7 +1673,7 @@ impl ShowCommand {
package.get_names(true).join(", ")
));
- if let Some(c) = latest.as_complete_package_interface() {
+ if let Some(c) = latest.as_complete() {
if c.is_abandoned() {
let replacement = match c.get_replacement_package() {
Some(rp) => format!(" The author suggests using the {} package instead.", rp),
@@ -1759,7 +1741,7 @@ impl ShowCommand {
/// Prints all available versions of this package and highlights the installed one if any.
pub(crate) fn print_versions(
&mut self,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
versions: &IndexMap<String, String>,
installed_repo: &InstalledRepository,
) {
@@ -1767,7 +1749,7 @@ impl ShowCommand {
versions_keys = Semver::rsort(versions_keys);
// highlight installed version
- let installed_packages = installed_repo.find_packages(package.get_name(), None);
+ let installed_packages = installed_repo.find_packages(&package.get_name(), None);
if !installed_packages.is_empty() {
for installed_package in installed_packages.iter() {
let installed_version = installed_package.get_pretty_version();
@@ -1792,7 +1774,7 @@ impl ShowCommand {
/// print link objects
pub(crate) fn print_links(
&mut self,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
link_type: &str,
title: Option<&str>,
) {
@@ -1813,7 +1795,7 @@ impl ShowCommand {
}
/// Prints the licenses of a package with metadata
- pub(crate) fn print_licenses(&mut self, package: &dyn CompletePackageInterface) {
+ pub(crate) fn print_licenses(&mut self, package: CompletePackageInterfaceHandle) {
let spdx_licenses = SpdxLicenses::new();
let licenses = package.get_license();
@@ -1846,10 +1828,10 @@ impl ShowCommand {
/// Prints package info in JSON format.
pub(crate) fn print_package_info_as_json(
&mut self,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
versions: &IndexMap<String, String>,
installed_repo: &InstalledRepository,
- latest_package: Option<&dyn PackageInterface>,
+ latest_package: Option<PackageInterfaceHandle>,
) -> anyhow::Result<()> {
let mut json: IndexMap<String, PhpMixed> = IndexMap::new();
json.insert(
@@ -1858,7 +1840,7 @@ impl ShowCommand {
);
json.insert(
"description".to_string(),
- PhpMixed::String(package.get_description().unwrap_or("").to_string()),
+ PhpMixed::String(package.get_description().unwrap_or_default()),
);
let keywords: Vec<PhpMixed> = package
.get_keywords()
@@ -1876,7 +1858,7 @@ impl ShowCommand {
json.insert(
"homepage".to_string(),
match package.get_homepage() {
- Some(h) => PhpMixed::String(h.to_string()),
+ Some(h) => PhpMixed::String(h),
None => PhpMixed::Null,
},
);
@@ -1892,31 +1874,31 @@ impl ShowCommand {
);
json = Self::append_versions(json, versions);
- json = Self::append_licenses(json, package);
+ json = Self::append_licenses(json, package.clone());
- let latest = if let Some(latest) = latest_package {
+ let latest: PackageInterfaceHandle = if let Some(latest) = latest_package {
json.insert(
"latest".to_string(),
PhpMixed::String(latest.get_pretty_version().to_string()),
);
latest
} else {
- package.as_package_interface()
+ package.clone().into()
};
if package.get_source_type().is_some() {
let mut src: IndexMap<String, PhpMixed> = IndexMap::new();
src.insert(
"type".to_string(),
- PhpMixed::String(package.get_source_type().unwrap_or("").to_string()),
+ PhpMixed::String(package.get_source_type().unwrap_or_default()),
);
src.insert(
"url".to_string(),
- PhpMixed::String(package.get_source_url().unwrap_or("").to_string()),
+ PhpMixed::String(package.get_source_url().unwrap_or_default()),
);
src.insert(
"reference".to_string(),
- PhpMixed::String(package.get_source_reference().unwrap_or("").to_string()),
+ PhpMixed::String(package.get_source_reference().unwrap_or_default()),
);
json.insert(
"source".to_string(),
@@ -1928,15 +1910,15 @@ impl ShowCommand {
let mut dst: IndexMap<String, PhpMixed> = IndexMap::new();
dst.insert(
"type".to_string(),
- PhpMixed::String(package.get_dist_type().unwrap_or("").to_string()),
+ PhpMixed::String(package.get_dist_type().unwrap_or_default()),
);
dst.insert(
"url".to_string(),
- PhpMixed::String(package.get_dist_url().unwrap_or("").to_string()),
+ PhpMixed::String(package.get_dist_url().unwrap_or_default()),
);
dst.insert(
"reference".to_string(),
- PhpMixed::String(package.get_dist_reference().unwrap_or("").to_string()),
+ PhpMixed::String(package.get_dist_reference().unwrap_or_default()),
);
json.insert(
"dist".to_string(),
@@ -1944,8 +1926,8 @@ impl ShowCommand {
);
}
- if !PlatformRepository::is_platform_package(package.get_name())
- && installed_repo.has_package(package.as_package_interface())
+ if !PlatformRepository::is_platform_package(&package.get_name())
+ && installed_repo.has_package(package.clone().into())
{
// TODO(phase-b): get_installation_manager wants &mut Composer; PHP shares by ref.
let _ = self.require_composer(None, None)?;
@@ -1966,7 +1948,7 @@ impl ShowCommand {
}
}
- if let Some(c) = latest.as_complete_package_interface() {
+ if let Some(c) = latest.as_complete() {
if c.is_abandoned() {
json.insert(
"replacement".to_string(),
@@ -2000,7 +1982,7 @@ impl ShowCommand {
);
}
- json = Self::append_autoload(json, package);
+ json = Self::append_autoload(json, package.clone());
if !package.get_include_paths().is_empty() {
json.insert(
@@ -2057,7 +2039,7 @@ impl ShowCommand {
fn append_licenses(
mut json: IndexMap<String, PhpMixed>,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
) -> IndexMap<String, PhpMixed> {
let licenses = package.get_license();
if !licenses.is_empty() {
@@ -2092,7 +2074,7 @@ impl ShowCommand {
fn append_autoload(
mut json: IndexMap<String, PhpMixed>,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
) -> IndexMap<String, PhpMixed> {
let autoload_config = package.get_autoload();
if !autoload_config.is_empty() {
@@ -2148,10 +2130,10 @@ impl ShowCommand {
fn append_links(
mut json: IndexMap<String, PhpMixed>,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
) -> IndexMap<String, PhpMixed> {
for link_type in Link::types().iter() {
- json = Self::append_link(json, package, link_type);
+ json = Self::append_link(json, package.clone(), link_type);
}
json
@@ -2159,7 +2141,7 @@ impl ShowCommand {
fn append_link(
mut json: IndexMap<String, PhpMixed>,
- package: &dyn CompletePackageInterface,
+ package: CompletePackageInterfaceHandle,
link_type: &str,
) -> IndexMap<String, PhpMixed> {
let links = package.get_links_for_type(link_type);
@@ -2285,7 +2267,7 @@ impl ShowCommand {
/// Generate the package tree
pub(crate) fn generate_package_tree(
&mut self,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
installed_repo: &InstalledRepository,
remote_repos: &dyn RepositoryInterface,
) -> IndexMap<String, PhpMixed> {
@@ -2354,8 +2336,8 @@ impl ShowCommand {
"description".to_string(),
PhpMixed::String(
package
- .as_complete_package_interface()
- .map(|c| c.get_description().unwrap_or("").to_string())
+ .as_complete()
+ .map(|c| c.get_description().unwrap_or_default())
.unwrap_or_default(),
),
);
@@ -2518,8 +2500,8 @@ impl ShowCommand {
}
fn get_update_status(
- latest_package: &dyn PackageInterface,
- package: &dyn PackageInterface,
+ latest_package: PackageInterfaceHandle,
+ package: PackageInterfaceHandle,
) -> String {
if latest_package.get_full_pretty_version(true, 0)
== package.get_full_pretty_version(true, 0)
@@ -2532,7 +2514,7 @@ impl ShowCommand {
constraint = format!("^{}", constraint);
}
if !latest_package.get_version().is_empty()
- && Semver::satisfies(latest_package.get_version(), &constraint)
+ && Semver::satisfies(&latest_package.get_version(), &constraint)
{
// it needs an immediate semver-compliant upgrade
return "semver-safe-update".to_string();
@@ -2559,7 +2541,7 @@ impl ShowCommand {
/// Given a package, this finds the latest package matching it
fn find_latest_package(
&mut self,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
composer: &PartialComposerHandle,
platform_repo: &PlatformRepository,
major_only: bool,
@@ -2587,7 +2569,7 @@ impl ShowCommand {
.get_minimum_stability()
.to_string();
let flags = composer_ref.get_package().get_stability_flags();
- if let Some(flag_value) = flags.get(name) {
+ if let Some(flag_value) = flags.get(&name) {
let key_map: IndexMap<String, String> = base_package::STABILITIES
.iter()
.map(|(k, v)| (k.to_string(), v.to_string()))
@@ -2605,7 +2587,7 @@ impl ShowCommand {
let mut target_version: Option<String> = None;
if package.get_version().starts_with("dev-") {
- target_version = Some(package.get_version().to_string());
+ target_version = Some(package.get_version());
// dev-x branches are considered to be on the latest major version always, do not look up for a new commit as that is deemed a minor upgrade (albeit risky)
if major_only {
@@ -2618,7 +2600,7 @@ impl ShowCommand {
if major_only
&& Preg::is_match3(
r"{^(?P<zero_major>(?:0\.)+)?(?P<first_meaningful>\d+)\.}",
- package.get_version(),
+ &package.get_version(),
Some(&mut groups),
)?
{
@@ -2644,7 +2626,7 @@ impl ShowCommand {
}
if patch_only {
- let trimmed_version = Preg::replace(r"{(\.0)+$}D", "", package.get_version())?;
+ let trimmed_version = Preg::replace(r"{(\.0)+$}D", "", &package.get_version())?;
let parts_needed = if trimmed_version.starts_with('0') {
4
} else {
@@ -2658,26 +2640,26 @@ impl ShowCommand {
}
}
- let show_warnings_box: Box<dyn Fn(&dyn PackageInterface) -> bool>;
+ let show_warnings_box: Box<dyn Fn(PackageInterfaceHandle) -> bool>;
if self.get_io().is_verbose() {
- show_warnings_box = Box::new(|_p: &dyn PackageInterface| -> bool { true });
+ show_warnings_box = Box::new(|_p: PackageInterfaceHandle| -> bool { true });
} else {
- let package_version = package.get_version().to_string();
- show_warnings_box = Box::new(move |candidate: &dyn PackageInterface| -> bool {
+ let package_version = package.get_version();
+ show_warnings_box = Box::new(move |candidate: PackageInterfaceHandle| -> bool {
if candidate.get_version().starts_with("dev-")
|| package_version.starts_with("dev-")
{
return false;
}
- version_compare(candidate.get_version(), &package_version, "<=")
+ version_compare(&candidate.get_version(), &package_version, "<=")
});
}
// TODO(phase-b): platform_req_filter needs to be Option<Box<dyn ...>>; current code holds &dyn.
let _ = platform_req_filter;
let _ = show_warnings_box;
let mut candidate = version_selector.find_best_candidate(
- name,
+ &name,
target_version.as_deref(),
&best_stability,
None,
diff --git a/crates/shirabe/src/command/status_command.rs b/crates/shirabe/src/command/status_command.rs
index 182dec8..9f66adf 100644
--- a/crates/shirabe/src/command/status_command.rs
+++ b/crates/shirabe/src/command/status_command.rs
@@ -125,19 +125,18 @@ impl StatusCommand {
let target_dir = composer
.get_installation_manager()
.borrow_mut()
- .get_install_path(package.as_rc().borrow().as_package_interface());
+ .get_install_path(package.clone());
let target_dir = match target_dir {
Some(d) => d,
None => continue,
};
// TODO(phase-b): downloader borrow lifetime tied to dm.borrow() temporary; restructure later.
let dm_borrow = dm.borrow();
- let downloader: &dyn crate::downloader::DownloaderInterface = match dm_borrow
- .get_downloader_for_package(package.as_rc().borrow().as_package_interface())?
- {
- Some(d) => d,
- None => continue,
- };
+ let downloader: &dyn crate::downloader::DownloaderInterface =
+ match dm_borrow.get_downloader_for_package(package.clone())? {
+ Some(d) => d,
+ None => continue,
+ };
// TODO(phase-b): isinstance checks using ChangeReportInterface/VcsCapableDownloaderInterface/DvcsDownloaderInterface
if let Some(change_reporter) = downloader.as_change_report_interface() {
@@ -148,20 +147,16 @@ impl StatusCommand {
);
}
- if let Some(changes) = change_reporter.get_local_changes(
- package.as_rc().borrow().as_package_interface(),
- &target_dir,
- )? {
+ if let Some(changes) =
+ change_reporter.get_local_changes(package.clone(), &target_dir)?
+ {
errors.insert(target_dir.clone(), changes);
}
}
if let Some(vcs_downloader) = downloader.as_vcs_capable_downloader_interface() {
if vcs_downloader
- .get_vcs_reference(
- package.as_rc().borrow().as_package_interface(),
- target_dir.clone(),
- )
+ .get_vcs_reference(package.clone(), target_dir.clone())
.is_some()
{
let previous_ref = match package.get_installation_source().as_deref() {
@@ -170,10 +165,8 @@ impl StatusCommand {
_ => None,
};
- let current_version = guesser.guess_version(
- &dumper.dump(package.as_rc().borrow().as_package_interface()),
- &target_dir,
- )?;
+ let current_version =
+ guesser.guess_version(&dumper.dump(package.clone()), &target_dir)?;
if let (Some(prev_ref), Some(cur_version)) = (&previous_ref, &current_version) {
if cur_version.commit.as_deref() != Some(prev_ref.as_str())
@@ -207,10 +200,9 @@ impl StatusCommand {
}
if let Some(dvcs_downloader) = downloader.as_dvcs_downloader_interface() {
- if let Some(unpushed) = dvcs_downloader.get_unpushed_changes(
- package.as_rc().borrow().as_package_interface(),
- target_dir.clone(),
- ) {
+ if let Some(unpushed) =
+ dvcs_downloader.get_unpushed_changes(package.clone(), target_dir.clone())
+ {
unpushed_changes.insert(target_dir, unpushed);
}
}
diff --git a/crates/shirabe/src/command/suggests_command.rs b/crates/shirabe/src/command/suggests_command.rs
index b4693a2..aa1ae15 100644
--- a/crates/shirabe/src/command/suggests_command.rs
+++ b/crates/shirabe/src/command/suggests_command.rs
@@ -47,10 +47,8 @@ impl SuggestsCommand {
let composer = self.require_composer(None, None)?;
let mut composer = crate::command::composer_full_mut(&composer);
- // TODO(phase-c): composer.get_package() returns &dyn RootPackageInterface, not a
- // RootPackageInterfaceHandle, so it cannot be shared into RootPackageRepository::new yet.
let root_package_handle: crate::package::RootPackageInterfaceHandle =
- todo!("share composer.get_package() as a RootPackageInterfaceHandle");
+ composer.get_package().clone();
let mut installed_repos: Vec<Box<dyn RepositoryInterface>> =
vec![Box::new(RootPackageRepository::new(root_package_handle))];
@@ -97,16 +95,14 @@ impl SuggestsCommand {
let filter = input.get_argument("packages");
let mut packages = RepositoryInterface::get_packages(&installed_repo);
- // TODO(phase-c): composer.get_package() returns &dyn RootPackageInterface, not a handle,
- // so it cannot be shared into the package list yet.
let root_pkg_as_base: crate::package::BasePackageHandle =
- todo!("share composer.get_package() as a BasePackageHandle");
+ composer.get_package().clone().into();
packages.push(root_pkg_as_base);
for package in &packages {
if !empty(&filter) && !in_array(PhpMixed::String(package.get_name()), &filter, false) {
continue;
}
- reporter.add_suggestions_from_package(package.as_rc().borrow().as_package_interface());
+ reporter.add_suggestions_from_package(package.clone());
}
let mut mode = SuggestedPackagesReporter::MODE_BY_PACKAGE;
@@ -121,12 +117,9 @@ impl SuggestsCommand {
mode = SuggestedPackagesReporter::MODE_LIST;
}
- let only_dependents_of: Option<&dyn crate::package::PackageInterface> =
+ let only_dependents_of: Option<crate::package::PackageInterfaceHandle> =
if empty(&filter) && !input.get_option("all").as_bool().unwrap_or(false) {
- // TODO(phase-b): composer.get_package() returns &dyn RootPackageInterface; need conversion to &dyn PackageInterface
- Some(todo!(
- "convert RootPackageInterface to &dyn PackageInterface"
- ))
+ Some(composer.get_package().clone().into())
} else {
None
};
diff --git a/crates/shirabe/src/command/validate_command.rs b/crates/shirabe/src/command/validate_command.rs
index cb8fa89..12eadd7 100644
--- a/crates/shirabe/src/command/validate_command.rs
+++ b/crates/shirabe/src/command/validate_command.rs
@@ -217,7 +217,7 @@ impl ValidateCommand {
let path = composer
.get_installation_manager()
.borrow_mut()
- .get_install_path(package.as_rc().borrow().as_package_interface());
+ .get_install_path(package.clone());
let path = match path {
Some(p) => p,
None => continue,