aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/package')
-rw-r--r--crates/shirabe/src/package/alias_package.rs27
-rw-r--r--crates/shirabe/src/package/link.rs14
-rw-r--r--crates/shirabe/src/package/loader/array_loader.rs4
-rw-r--r--crates/shirabe/src/package/loader/validating_array_loader.rs22
-rw-r--r--crates/shirabe/src/package/locker.rs2
-rw-r--r--crates/shirabe/src/package/version/version_bumper.rs8
-rw-r--r--crates/shirabe/src/package/version/version_parser.rs25
-rw-r--r--crates/shirabe/src/package/version/version_selector.rs25
8 files changed, 70 insertions, 57 deletions
diff --git a/crates/shirabe/src/package/alias_package.rs b/crates/shirabe/src/package/alias_package.rs
index 0d687a1..e9b5dbf 100644
--- a/crates/shirabe/src/package/alias_package.rs
+++ b/crates/shirabe/src/package/alias_package.rs
@@ -3,7 +3,8 @@
use chrono::{DateTime, Utc};
use indexmap::IndexMap;
use shirabe_php_shim::{PhpMixed, in_array};
-use shirabe_semver::constraint::Constraint;
+use shirabe_semver::constraint::AnyConstraint;
+use shirabe_semver::constraint::SimpleConstraint;
use crate::package::BasePackage;
use crate::package::Link;
@@ -177,18 +178,18 @@ impl AliasPackage {
for link in &links {
// link is self.version, but must be replacing also the replaced version
if link.get_pretty_constraint().unwrap_or("") == "self.version" {
- let mut constraint = Constraint::new("=", &self.version);
+ let constraint = SimpleConstraint::new(
+ "=".to_string(),
+ self.version.to_string(),
+ Some(pretty_version.clone()),
+ );
let new_link = Link::new(
link.get_source().to_string(),
link.get_target().to_string(),
- Box::new(constraint.clone()),
+ constraint.into(),
Some(link_type.to_string()),
Some(pretty_version.clone()),
);
- shirabe_semver::constraint::ConstraintInterface::set_pretty_string(
- &mut constraint,
- Some(pretty_version.clone()),
- );
new_links.push(new_link);
}
}
@@ -200,18 +201,18 @@ impl AliasPackage {
if link_type == Link::TYPE_REQUIRE {
self.has_self_version_requires = true;
}
- let mut constraint = Constraint::new("=", &self.version);
+ let constraint = SimpleConstraint::new(
+ "=".to_string(),
+ self.version.to_string(),
+ Some(pretty_version.clone()),
+ );
let new_link = Link::new(
links[index].get_source().to_string(),
links[index].get_target().to_string(),
- Box::new(constraint.clone()),
+ constraint.into(),
Some(link_type.to_string()),
Some(pretty_version.clone()),
);
- shirabe_semver::constraint::ConstraintInterface::set_pretty_string(
- &mut constraint,
- Some(pretty_version.clone()),
- );
links[index] = new_link;
}
}
diff --git a/crates/shirabe/src/package/link.rs b/crates/shirabe/src/package/link.rs
index 80a98c7..d606c63 100644
--- a/crates/shirabe/src/package/link.rs
+++ b/crates/shirabe/src/package/link.rs
@@ -1,14 +1,14 @@
//! ref: composer/src/Composer/Package/Link.php
use shirabe_php_shim::UnexpectedValueException;
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
use crate::package::PackageInterface;
pub struct Link {
pub(crate) source: String,
pub(crate) target: String,
- pub(crate) constraint: Box<dyn ConstraintInterface>,
+ pub(crate) constraint: AnyConstraint,
pub(crate) description: String,
pub(crate) pretty_constraint: Option<String>,
}
@@ -20,7 +20,7 @@ impl Clone for Link {
Self {
source: self.source.clone(),
target: self.target.clone(),
- constraint: self.constraint.clone_box(),
+ constraint: self.constraint.clone(),
description: self.description.clone(),
pretty_constraint: self.pretty_constraint.clone(),
}
@@ -63,7 +63,7 @@ impl Link {
pub fn new(
source: String,
target: String,
- constraint: Box<dyn ConstraintInterface>,
+ constraint: AnyConstraint,
description: Option<String>,
pretty_constraint: Option<String>,
) -> Self {
@@ -94,8 +94,8 @@ impl Link {
&self.target
}
- pub fn get_constraint(&self) -> &dyn ConstraintInterface {
- &*self.constraint
+ pub fn get_constraint(&self) -> &AnyConstraint {
+ &self.constraint
}
pub fn get_pretty_constraint(&self) -> anyhow::Result<&str> {
@@ -117,7 +117,7 @@ impl Link {
self.source,
self.description,
self.target,
- self.constraint.__to_string(),
+ self.constraint.to_string(),
)
}
diff --git a/crates/shirabe/src/package/loader/array_loader.rs b/crates/shirabe/src/package/loader/array_loader.rs
index ffbe465..87d6e35 100644
--- a/crates/shirabe/src/package/loader/array_loader.rs
+++ b/crates/shirabe/src/package/loader/array_loader.rs
@@ -764,12 +764,10 @@ impl ArrayLoader {
}
};
- // TODO(phase-b): Link::new expects Box<dyn ConstraintInterface>; we have Arc<dyn ConstraintInterface + Send + Sync>
- let _ = parsed_constraint;
Ok(Link::new(
source.to_string(),
target.to_string(),
- todo!("phase-b: convert Arc<dyn ConstraintInterface> to Box<dyn ConstraintInterface>"),
+ parsed_constraint,
Some(description.to_string()),
Some(pretty_constraint.to_string()),
))
diff --git a/crates/shirabe/src/package/loader/validating_array_loader.rs b/crates/shirabe/src/package/loader/validating_array_loader.rs
index 59fc266..a2dd5a7 100644
--- a/crates/shirabe/src/package/loader/validating_array_loader.rs
+++ b/crates/shirabe/src/package/loader/validating_array_loader.rs
@@ -11,9 +11,9 @@ use shirabe_php_shim::{
is_string, json_encode, parse_url_all, php_to_string, sprintf, str_replace, strcasecmp,
strtolower, strtotime, substr, trigger_error, trim, var_export,
};
-use shirabe_semver::constraint::Constraint;
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
use shirabe_semver::constraint::MatchNoneConstraint;
+use shirabe_semver::constraint::SimpleConstraint;
use shirabe_semver::intervals::Intervals;
use crate::package::loader::InvalidPackageException;
@@ -877,7 +877,8 @@ impl ValidatingArrayLoader {
}
}
- let unbound_constraint = Constraint::new("=", "10000000-dev");
+ let unbound_constraint =
+ SimpleConstraint::new("=".to_string(), "10000000-dev".to_string(), None).into();
let link_types: Vec<&'static str> = SUPPORTED_LINK_TYPES.keys().copied().collect();
for link_type in link_types {
@@ -952,11 +953,14 @@ impl ValidatingArrayLoader {
} else if (self.flags & Self::CHECK_STRICT_CONSTRAINTS) != 0
&& link_type == "require"
&& link_constraint
- .as_any()
- .downcast_ref::<Constraint>()
+ .as_constraint()
.map_or(false, |c| ["==", "="].contains(&c.get_operator()))
- && Constraint::new(">=", "1.0.0.0-dev")
- .matches(link_constraint.as_ref())
+ && AnyConstraint::from(SimpleConstraint::new(
+ ">=".to_string(),
+ "1.0.0.0-dev".to_string(),
+ None,
+ ))
+ .matches(&link_constraint)
{
self.warnings.push(format!(
"{}.{} : exact version constraints ({}) should be avoided if the package follows semantic versioning",
@@ -964,8 +968,8 @@ impl ValidatingArrayLoader {
));
}
- let compacted = Intervals::compact_constraint(link_constraint.as_ref())?;
- if compacted.as_any().is::<MatchNoneConstraint>() {
+ let compacted = Intervals::compact_constraint(&link_constraint)?;
+ if compacted.is_match_none() {
self.warnings.push(format!(
"{}.{} : this version constraint cannot possibly match anything ({})",
link_type, package, constraint_str
diff --git a/crates/shirabe/src/package/locker.rs b/crates/shirabe/src/package/locker.rs
index ecd96e3..9522e55 100644
--- a/crates/shirabe/src/package/locker.rs
+++ b/crates/shirabe/src/package/locker.rs
@@ -967,7 +967,7 @@ impl Locker {
.find_packages_with_replacers_and_providers(
&link.get_target(),
Some(FindPackageConstraint::Constraint(
- link.get_constraint().clone_box(),
+ link.get_constraint().clone(),
)),
)
.is_empty()
diff --git a/crates/shirabe/src/package/version/version_bumper.rs b/crates/shirabe/src/package/version/version_bumper.rs
index a9b5a67..8cc4b5d 100644
--- a/crates/shirabe/src/package/version/version_bumper.rs
+++ b/crates/shirabe/src/package/version/version_bumper.rs
@@ -8,7 +8,7 @@ use crate::util::Platform;
use anyhow::Result;
use indexmap::IndexMap;
use shirabe_external_packages::composer::pcre::{CaptureKey, Preg};
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
use shirabe_semver::intervals::Intervals;
#[derive(Debug)]
@@ -17,7 +17,7 @@ pub struct VersionBumper;
impl VersionBumper {
pub fn bump_requirement(
&self,
- constraint: &dyn ConstraintInterface,
+ constraint: &AnyConstraint,
package: &dyn PackageInterface,
) -> Result<String> {
let parser = VersionParser::new();
@@ -114,8 +114,8 @@ impl VersionBumper {
}
let new_constraint = parser.parse_constraints(&modified)?;
- if Intervals::is_subset_of(new_constraint.as_ref(), constraint)?
- && Intervals::is_subset_of(constraint, new_constraint.as_ref())?
+ if Intervals::is_subset_of(&new_constraint, constraint)?
+ && Intervals::is_subset_of(constraint, &new_constraint)?
{
return Ok(pretty_constraint);
}
diff --git a/crates/shirabe/src/package/version/version_parser.rs b/crates/shirabe/src/package/version/version_parser.rs
index 46a2356..1b588bc 100644
--- a/crates/shirabe/src/package/version/version_parser.rs
+++ b/crates/shirabe/src/package/version/version_parser.rs
@@ -1,16 +1,16 @@
//! ref: composer/src/Composer/Package/Version/VersionParser.php
use indexmap::IndexMap;
-use std::sync::{Arc, LazyLock, Mutex};
+use std::sync::{LazyLock, Mutex};
use shirabe_external_packages::composer::pcre::Preg;
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
use shirabe_semver::semver::Semver;
use shirabe_semver::version_parser::VersionParser as SemverVersionParser;
use crate::repository::PlatformRepository;
-static CONSTRAINTS: LazyLock<Mutex<IndexMap<String, Arc<dyn ConstraintInterface + Send + Sync>>>> =
+static CONSTRAINTS: LazyLock<Mutex<IndexMap<String, AnyConstraint>>> =
LazyLock::new(|| Mutex::new(IndexMap::new()));
#[derive(Debug, Clone)]
@@ -21,12 +21,19 @@ pub struct VersionParser {
impl VersionParser {
pub const DEFAULT_BRANCH_ALIAS: &'static str = "9999999-dev";
- pub fn parse_constraints(
- &self,
- constraints: &str,
- ) -> anyhow::Result<Box<dyn ConstraintInterface>> {
- // TODO(phase-b): re-introduce a memoization cache once trait objects are Send+Sync.
- self.inner.parse_constraints(constraints)
+ pub fn parse_constraints(&self, constraints: &str) -> anyhow::Result<AnyConstraint> {
+ {
+ let cache = CONSTRAINTS.lock().unwrap();
+ if let Some(cached) = cache.get(constraints) {
+ return Ok(cached.clone());
+ }
+ }
+ let parsed = self.inner.parse_constraints(constraints)?;
+ CONSTRAINTS
+ .lock()
+ .unwrap()
+ .insert(constraints.to_string(), parsed.clone());
+ Ok(parsed)
}
pub fn parse_name_version_pairs(
diff --git a/crates/shirabe/src/package/version/version_selector.rs b/crates/shirabe/src/package/version/version_selector.rs
index 832f64c..3bd0191 100644
--- a/crates/shirabe/src/package/version/version_selector.rs
+++ b/crates/shirabe/src/package/version/version_selector.rs
@@ -8,8 +8,8 @@ use shirabe_external_packages::composer::pcre::Preg;
use shirabe_php_shim::{
PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION, strtolower, version_compare,
};
-use shirabe_semver::constraint::Constraint;
-use shirabe_semver::constraint::ConstraintInterface;
+use shirabe_semver::constraint::AnyConstraint;
+use shirabe_semver::constraint::SimpleConstraint;
use crate::filter::platform_requirement_filter::IgnoreAllPlatformRequirementFilter;
use crate::filter::platform_requirement_filter::IgnoreListPlatformRequirementFilter;
@@ -29,7 +29,7 @@ use crate::repository::RepositorySet;
#[derive(Debug)]
pub struct VersionSelector {
repository_set: RepositorySet,
- platform_constraints: IndexMap<String, Vec<Box<dyn ConstraintInterface>>>,
+ platform_constraints: IndexMap<String, Vec<AnyConstraint>>,
parser: Option<VersionParser>,
}
@@ -38,16 +38,19 @@ impl VersionSelector {
repository_set: RepositorySet,
platform_repo: Option<&crate::repository::PlatformRepository>,
) -> anyhow::Result<Self> {
- let mut platform_constraints: IndexMap<String, Vec<Box<dyn ConstraintInterface>>> =
- IndexMap::new();
+ let mut platform_constraints: IndexMap<String, Vec<AnyConstraint>> = IndexMap::new();
if let Some(platform_repo) = platform_repo {
for package in <PlatformRepository as RepositoryInterface>::get_packages(platform_repo)
{
- let constraint = Constraint::new("==", package.get_version());
+ let constraint = SimpleConstraint::new(
+ "==".to_string(),
+ package.get_version().to_string(),
+ None,
+ );
platform_constraints
.entry(package.get_name().to_string())
.or_default()
- .push(Box::new(constraint));
+ .push(constraint.into());
}
}
Ok(Self {
@@ -90,7 +93,7 @@ impl VersionSelector {
};
let mut candidates = self.repository_set.find_packages(
&strtolower(package_name),
- constraint.as_ref().map(|c| c.clone_box()),
+ constraint.as_ref().map(|c| c.clone()),
repo_set_flags,
);
@@ -142,7 +145,7 @@ impl VersionSelector {
let reason;
if let Some(provided_constraints) = self.platform_constraints.get(name) {
for provided_constraint in provided_constraints {
- if link.get_constraint().matches(provided_constraint.as_ref()) {
+ if link.get_constraint().matches(provided_constraint) {
continue 'reqs;
}
let list_filter_opt = platform_requirement_filter
@@ -154,10 +157,10 @@ impl VersionSelector {
if list_filter.is_upper_bound_ignored(name) {
let filtered_constraint = list_filter.filter_constraint(
name,
- link.get_constraint().clone_box(),
+ link.get_constraint().clone(),
false,
)?;
- if filtered_constraint.matches(provided_constraint.as_ref()) {
+ if filtered_constraint.matches(provided_constraint) {
continue 'reqs;
}
}