aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/command/show_command.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/command/show_command.rs')
-rw-r--r--crates/shirabe/src/command/show_command.rs206
1 files changed, 94 insertions, 112 deletions
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,