aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/downloader/download_manager.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/downloader/download_manager.rs')
-rw-r--r--crates/shirabe/src/downloader/download_manager.rs73
1 files changed, 37 insertions, 36 deletions
diff --git a/crates/shirabe/src/downloader/download_manager.rs b/crates/shirabe/src/downloader/download_manager.rs
index 83a03c4..33a555a 100644
--- a/crates/shirabe/src/downloader/download_manager.rs
+++ b/crates/shirabe/src/downloader/download_manager.rs
@@ -14,7 +14,7 @@ use crate::downloader::DownloaderInterface;
use crate::exception::IrrecoverableDownloadException;
use crate::io::IOInterface;
use crate::io::IOInterfaceImmutable;
-use crate::package::PackageInterface;
+use crate::package::PackageInterfaceHandle;
use crate::util::Filesystem;
/// Downloaders manager.
@@ -130,7 +130,7 @@ impl DownloadManager {
/// wrong type
pub fn get_downloader_for_package(
&self,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
) -> Result<Option<&dyn DownloaderInterface>> {
let installation_source = package.get_installation_source();
@@ -138,10 +138,10 @@ impl DownloadManager {
return Ok(None);
}
- let downloader = if installation_source == Some("dist") {
- self.get_downloader(package.get_dist_type().unwrap_or(""))?
- } else if installation_source == Some("source") {
- self.get_downloader(package.get_source_type().unwrap_or(""))?
+ let downloader = if installation_source.as_deref() == Some("dist") {
+ self.get_downloader(&package.get_dist_type().unwrap_or_default())?
+ } else if installation_source.as_deref() == Some("source") {
+ self.get_downloader(&package.get_source_type().unwrap_or_default())?
} else {
return Err(InvalidArgumentException {
message: format!(
@@ -153,14 +153,14 @@ impl DownloadManager {
.into());
};
- if installation_source != Some(&downloader.get_installation_source()) {
+ if installation_source.as_deref() != Some(&downloader.get_installation_source()) {
return Err(LogicException {
message: sprintf(
"Downloader \"%s\" is a %s type downloader and can not be used to download %s for package %s",
&[
PhpMixed::String(shirabe_php_shim::get_class_obj(downloader)),
PhpMixed::String(downloader.get_installation_source()),
- PhpMixed::String(installation_source.unwrap_or("").to_string()),
+ PhpMixed::String(installation_source.clone().unwrap_or_default()),
PhpMixed::String(package.to_string()),
],
),
@@ -197,16 +197,16 @@ impl DownloadManager {
/// @throws \RuntimeException
pub async fn download(
&self,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
target_dir: &str,
- prev_package: Option<&dyn PackageInterface>,
+ prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
let target_dir = self.normalize_target_dir(target_dir);
self.filesystem
.borrow_mut()
.ensure_directory_exists(&dirname(&target_dir));
- let mut sources = self.get_available_sources(package, prev_package)?;
+ let mut sources = self.get_available_sources(package.clone(), prev_package.clone())?;
// PHP closure: uses recursive variable $download and captures $sources by reference
// TODO(phase-b): recursive closure with mutable shared state needs Rc<RefCell<>> or similar
@@ -231,7 +231,7 @@ impl DownloadManager {
// TODO(phase-b): &mut on shared package — PHP mutates by reference
todo!("package.set_installation_source(Some(source.clone()))");
- let downloader = match self.get_downloader_for_package(package)? {
+ let downloader = match self.get_downloader_for_package(package.clone())? {
Some(d) => d,
None => {
return Ok(None);
@@ -240,7 +240,7 @@ impl DownloadManager {
// TODO(phase-b): use anyhow::Result<Result<T, E>> to model PHP try/catch
let result = match downloader
- .download3(package, &target_dir, prev_package)
+ .download3(package.clone(), &target_dir, prev_package.clone())
.await
{
Ok(r) => r,
@@ -290,12 +290,12 @@ impl DownloadManager {
pub async fn prepare(
&self,
r#type: &str,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
target_dir: &str,
- prev_package: Option<&dyn PackageInterface>,
+ prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
let target_dir = self.normalize_target_dir(target_dir);
- if let Some(downloader) = self.get_downloader_for_package(package)? {
+ if let Some(downloader) = self.get_downloader_for_package(package.clone())? {
return downloader
.prepare(r#type, package, &target_dir, prev_package)
.await;
@@ -314,11 +314,11 @@ impl DownloadManager {
/// @throws \RuntimeException
pub async fn install(
&self,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
target_dir: &str,
) -> Result<Option<PhpMixed>> {
let target_dir = self.normalize_target_dir(target_dir);
- if let Some(downloader) = self.get_downloader_for_package(package)? {
+ if let Some(downloader) = self.get_downloader_for_package(package.clone())? {
return downloader.install2(package, &target_dir).await;
}
@@ -335,13 +335,13 @@ impl DownloadManager {
/// @throws \InvalidArgumentException if initial package is not installed
pub async fn update(
&self,
- initial: &dyn PackageInterface,
- target: &dyn PackageInterface,
+ initial: PackageInterfaceHandle,
+ target: PackageInterfaceHandle,
target_dir: &str,
) -> Result<Option<PhpMixed>> {
let target_dir = self.normalize_target_dir(target_dir);
- let downloader = self.get_downloader_for_package(target)?;
- let initial_downloader = self.get_downloader_for_package(initial)?;
+ let downloader = self.get_downloader_for_package(target.clone())?;
+ let initial_downloader = self.get_downloader_for_package(initial.clone())?;
// no downloaders present means update from metapackage to metapackage, nothing to do
if initial_downloader.is_none() && downloader.is_none() {
@@ -362,7 +362,7 @@ impl DownloadManager {
// TODO(phase-b): use anyhow::Result<Result<T, E>> to model PHP try/catch
match downloader
.unwrap()
- .update(initial, target, &target_dir)
+ .update(initial.clone(), target.clone(), &target_dir)
.await
{
Ok(p) => return Ok(p),
@@ -404,11 +404,11 @@ impl DownloadManager {
/// @phpstan-return PromiseInterface<void|null>
pub async fn remove(
&self,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
target_dir: &str,
) -> Result<Option<PhpMixed>> {
let target_dir = self.normalize_target_dir(target_dir);
- if let Some(downloader) = self.get_downloader_for_package(package)? {
+ if let Some(downloader) = self.get_downloader_for_package(package.clone())? {
return downloader.remove2(package, &target_dir).await;
}
@@ -425,12 +425,12 @@ impl DownloadManager {
pub async fn cleanup(
&self,
r#type: &str,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
target_dir: &str,
- prev_package: Option<&dyn PackageInterface>,
+ prev_package: Option<PackageInterfaceHandle>,
) -> Result<Option<PhpMixed>> {
let target_dir = self.normalize_target_dir(target_dir);
- if let Some(downloader) = self.get_downloader_for_package(package)? {
+ if let Some(downloader) = self.get_downloader_for_package(package.clone())? {
return downloader
.cleanup(r#type, package, &target_dir, prev_package)
.await;
@@ -444,14 +444,14 @@ impl DownloadManager {
/// @param PackageInterface $package package instance
pub(crate) fn resolve_package_install_preference(
&self,
- package: &dyn PackageInterface,
+ package: PackageInterfaceHandle,
) -> String {
for (pattern, preference) in &self.package_preferences {
let pattern_regex = format!(
"{{^{}$}}i",
str_replace("\\*", ".*", &preg_quote(pattern, None)),
);
- if Preg::is_match(&pattern_regex, package.get_name()).unwrap_or(false) {
+ if Preg::is_match(&pattern_regex, &package.get_name()).unwrap_or(false) {
if "dist" == preference || (!package.is_dev() && "auto" == preference) {
return "dist".to_string();
}
@@ -471,8 +471,8 @@ impl DownloadManager {
/// @phpstan-return array<'dist'|'source'>&non-empty-array
fn get_available_sources(
&self,
- package: &dyn PackageInterface,
- prev_package: Option<&dyn PackageInterface>,
+ package: PackageInterfaceHandle,
+ prev_package: Option<PackageInterfaceHandle>,
) -> Result<Vec<String>> {
let source_type = package.get_source_type();
let dist_type = package.get_dist_type();
@@ -498,7 +498,7 @@ impl DownloadManager {
// if we are updating, we want to keep the same source as the previously installed package (if available in the new one)
let prev_source = prev.get_installation_source();
if in_array(
- PhpMixed::String(prev_source.unwrap_or("").to_string()),
+ PhpMixed::String(prev_source.clone().unwrap_or_default()),
&PhpMixed::List(
sources
.iter()
@@ -509,10 +509,10 @@ impl DownloadManager {
)
// unless the previous package was stable dist (by default) and the new package is dev, then we allow the new default to take over
&& !(!prev.is_dev()
- && prev.get_installation_source() == Some("dist")
+ && prev.get_installation_source().as_deref() == Some("dist")
&& package.is_dev())
{
- let prev_source_owned = prev_source.unwrap_or("").to_string();
+ let prev_source_owned = prev_source.unwrap_or_default();
usort(&mut sources, move |a: &String, b: &String| -> i64 {
if *a == prev_source_owned { -1 } else { 1 }
});
@@ -523,7 +523,8 @@ impl DownloadManager {
// reverse sources in case dist is the preferred source for this package
if !self.prefer_source
- && (self.prefer_dist || "dist" == self.resolve_package_install_preference(package))
+ && (self.prefer_dist
+ || "dist" == self.resolve_package_install_preference(package.clone()))
{
sources = array_reverse(&sources, false);
}