aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/loader
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/package/loader')
-rw-r--r--crates/shirabe/src/package/loader/array_loader.rs2
-rw-r--r--crates/shirabe/src/package/loader/root_package_loader.rs100
-rw-r--r--crates/shirabe/src/package/loader/validating_array_loader.rs20
3 files changed, 62 insertions, 60 deletions
diff --git a/crates/shirabe/src/package/loader/array_loader.rs b/crates/shirabe/src/package/loader/array_loader.rs
index 3ece5c7..82b2ef7 100644
--- a/crates/shirabe/src/package/loader/array_loader.rs
+++ b/crates/shirabe/src/package/loader/array_loader.rs
@@ -860,7 +860,7 @@ impl ArrayLoader {
&& default_branch_is_true
&& self
.version_parser
- .parse_numeric_alias_prefix(&Preg::replace(r"{^v}", "", &version_str))
+ .parse_numeric_alias_prefix(&Preg::replace(r"{^v}", "", &version_str)?)
.is_none()
{
return Ok(Some(VersionParser::DEFAULT_BRANCH_ALIAS.to_string()));
diff --git a/crates/shirabe/src/package/loader/root_package_loader.rs b/crates/shirabe/src/package/loader/root_package_loader.rs
index d2e2a7a..15f1114 100644
--- a/crates/shirabe/src/package/loader/root_package_loader.rs
+++ b/crates/shirabe/src/package/loader/root_package_loader.rs
@@ -9,12 +9,14 @@ use shirabe_php_shim::{
use crate::config::Config;
use crate::io::io_interface::IOInterface;
use crate::package::base_package::{BasePackage, STABILITIES, SUPPORTED_LINK_TYPES};
+use crate::package::complete_package_interface::CompletePackageInterface;
use crate::package::loader::array_loader::ArrayLoader;
use crate::package::loader::loader_interface::LoaderInterface;
use crate::package::loader::validating_array_loader::ValidatingArrayLoader;
use crate::package::package_interface::PackageInterface;
use crate::package::root_alias_package::RootAliasPackage;
use crate::package::root_package::RootPackage;
+use crate::package::root_package_interface::RootPackageInterface;
use crate::package::version::version_guesser::VersionGuesser;
use crate::package::version::version_parser::VersionParser;
use crate::repository::repository_factory::RepositoryFactory;
@@ -39,9 +41,9 @@ impl RootPackageLoader {
version_guesser: Option<VersionGuesser>,
io: Option<Box<dyn IOInterface>>,
) -> Self {
- let inner = ArrayLoader::new(parser);
+ let inner = ArrayLoader::new(parser, true);
let version_guesser = version_guesser.unwrap_or_else(|| {
- let mut process_executor = ProcessExecutor::new(io.as_deref());
+ let mut process_executor = ProcessExecutor::new(io.as_deref().map(|i| i.clone_box()));
process_executor.enable_async();
VersionGuesser::new(
std::rc::Rc::clone(&config),
@@ -94,7 +96,7 @@ impl RootPackageLoader {
let mut commit: Option<String> = None;
if Platform::get_env("COMPOSER_ROOT_VERSION").is_some() {
- let version = self.version_guesser.get_root_version_from_env();
+ let version = self.version_guesser.get_root_version_from_env()?;
config.insert(
"version".to_string(),
Box::new(shirabe_php_shim::PhpMixed::String(version)),
@@ -102,18 +104,25 @@ impl RootPackageLoader {
} else {
let cwd_str = cwd
.map(|s| s.to_string())
- .unwrap_or_else(|| Platform::get_cwd(true));
- let version_data = self.version_guesser.guess_version(&config, &cwd_str);
+ .unwrap_or_else(|| Platform::get_cwd(true).unwrap_or_default());
+ // TODO(phase-b): config here is IndexMap<String, Box<PhpMixed>> but guess_version
+ // expects IndexMap<String, PhpMixed>; pass an empty map as placeholder.
+ let unboxed_config: IndexMap<String, shirabe_php_shim::PhpMixed> = IndexMap::new();
+ let version_data = self
+ .version_guesser
+ .guess_version(&unboxed_config, &cwd_str)?;
if let Some(data) = version_data {
config.insert(
"version".to_string(),
Box::new(shirabe_php_shim::PhpMixed::String(
- data.pretty_version.clone(),
+ data.pretty_version.clone().unwrap_or_default(),
)),
);
config.insert(
"version_normalized".to_string(),
- Box::new(shirabe_php_shim::PhpMixed::String(data.version.clone())),
+ Box::new(shirabe_php_shim::PhpMixed::String(
+ data.version.clone().unwrap_or_default(),
+ )),
);
commit = data.commit;
}
@@ -127,7 +136,7 @@ impl RootPackageLoader {
io.warning(&format!(
"Composer could not detect the root package ({}) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version",
name
- ));
+ ), &[]);
}
}
config.insert(
@@ -176,42 +185,30 @@ impl RootPackageLoader {
}
}
- let package = self
- .inner
- .load(config.clone(), "Composer\\Package\\RootPackage")?;
+ // TODO(phase-b): config is IndexMap<String, Box<PhpMixed>> but LoaderInterface::load
+ // expects IndexMap<String, PhpMixed>; pass empty placeholder.
+ let unboxed_config: IndexMap<String, shirabe_php_shim::PhpMixed> = IndexMap::new();
+ let mut package = self.inner.load(
+ unboxed_config,
+ Some("Composer\\Package\\RootPackage".to_string()),
+ )?;
- let real_package: &mut RootPackage =
- if let Some(alias_pkg) = package.as_any_mut().downcast_mut::<RootAliasPackage>() {
- alias_pkg
- .get_alias_of_mut()
- .as_any_mut()
- .downcast_mut::<RootPackage>()
- .ok_or_else(|| {
- anyhow::anyhow!(LogicException {
- message: "Expecting a Composer\\Package\\RootPackage at this point"
- .to_string(),
- code: 0,
- })
- })?
- } else if let Some(root_pkg) = package.as_any_mut().downcast_mut::<RootPackage>() {
- root_pkg
- } else {
- return Err(anyhow::anyhow!(LogicException {
- message: "Expecting a Composer\\Package\\RootPackage at this point".to_string(),
- code: 0,
- }));
- };
+ // TODO(phase-b): as_any_mut is not available on BasePackage; downcast via Any is not
+ // possible without it. Skipping real downcast and using todo!() placeholder.
+ let real_package: &mut RootPackage = {
+ let _ = &mut package;
+ todo!("downcast Box<dyn BasePackage> to &mut RootPackage requires as_any_mut on trait")
+ };
if auto_versioned {
- real_package.replace_version(
- real_package.get_version().to_string(),
- RootPackage::DEFAULT_PRETTY_VERSION.to_string(),
- );
+ // TODO(phase-b): replace_version is an inherent method on Package, not exposed via trait.
+ let _ = real_package;
+ todo!("replace_version is not accessible through RootPackage's embedded Package");
}
if let Some(min_stability) = config.get("minimum-stability").and_then(|v| v.as_string()) {
real_package.set_minimum_stability(
- VersionParser::normalize_stability(min_stability).to_string(),
+ VersionParser::normalize_stability(min_stability).unwrap_or_default(),
);
}
@@ -222,19 +219,10 @@ impl RootPackageLoader {
for link_type in ["require", "require-dev"] {
if config.contains_key(link_type) {
let link_info = &SUPPORTED_LINK_TYPES[link_type];
- let method = format!("get_{}", link_info.method);
- let links: IndexMap<String, String> = real_package
- .call_get_links_method(&method)
- .iter()
- .map(|(target, link)| {
- (
- target.clone(),
- link.get_constraint()
- .map(|c| c.get_pretty_string().to_string())
- .unwrap_or_default(),
- )
- })
- .collect();
+ let _method = format!("get_{}", link_info.method);
+ // TODO(phase-b): PHP uses dynamic method dispatch ($realPackage->{$method}()).
+ // We need a Rust-side equivalent (e.g. a match on link_type) to collect Links.
+ let links: IndexMap<String, String> = IndexMap::new();
aliases = self.extract_aliases(&links, aliases);
stability_flags = Self::extract_stability_flags(
&links,
@@ -295,10 +283,13 @@ impl RootPackageLoader {
Some(std::rc::Rc::clone(&self.config)),
Some(&mut self.manager),
)?;
- for repo in repos {
+ for (_, repo) in repos {
self.manager.add_repository(repo);
}
- real_package.set_repositories(self.config.borrow().get_repositories());
+ // TODO(phase-b): Config::get_repositories returns IndexMap<String, PhpMixed>, but
+ // set_repositories expects Vec<IndexMap<String, PhpMixed>>; pass empty placeholder.
+ real_package.set_repositories(Vec::new());
+ let _ = self.config.borrow().get_repositories();
Ok(package)
}
@@ -390,7 +381,8 @@ impl RootPackageLoader {
{
let name = strtolower(req_name);
let m1 = m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default();
- let stability = stabilities[VersionParser::normalize_stability(&m1)];
+ let normalized_m1 = VersionParser::normalize_stability(&m1).unwrap_or_default();
+ let stability = stabilities[normalized_m1.as_str()];
if stability_flags.get(&name).copied().unwrap_or(i64::MAX) > stability {
continue;
@@ -411,7 +403,7 @@ impl RootPackageLoader {
let stability_name = VersionParser::parse_stability(&req_version_stripped);
if stability_name != "stable" {
let name = strtolower(req_name);
- let stability = stabilities[stability_name];
+ let stability = stabilities[stability_name.as_str()];
if stability_flags.get(&name).copied().unwrap_or(i64::MAX) > stability
|| minimum_stability_val > stability
{
diff --git a/crates/shirabe/src/package/loader/validating_array_loader.rs b/crates/shirabe/src/package/loader/validating_array_loader.rs
index 5009a0d..f01b774 100644
--- a/crates/shirabe/src/package/loader/validating_array_loader.rs
+++ b/crates/shirabe/src/package/loader/validating_array_loader.rs
@@ -12,6 +12,7 @@ use shirabe_php_shim::{
strtolower, strtotime, substr, trigger_error, trim, var_export,
};
use shirabe_semver::constraint::constraint::Constraint;
+use shirabe_semver::constraint::constraint_interface::ConstraintInterface;
use shirabe_semver::constraint::match_none_constraint::MatchNoneConstraint;
use shirabe_semver::intervals::Intervals;
@@ -215,7 +216,7 @@ impl ValidatingArrayLoader {
let license_to_validate = str_replace("proprietary", "MIT", &license_str);
if !license_validator.validate(&license_to_validate) {
if license_validator
- .validate(&trim(&license_to_validate, " \t\n\r\0\u{0B}"))
+ .validate(&trim(&license_to_validate, Some(" \t\n\r\0\u{0B}")))
{
self.warnings.push(sprintf(
"License %s must not contain extra spaces, make sure to trim it.",
@@ -963,7 +964,7 @@ impl ValidatingArrayLoader {
));
}
- let compacted = Intervals::compact_constraint(link_constraint.as_ref());
+ let compacted = Intervals::compact_constraint(link_constraint.as_ref())?;
if compacted.as_any().is::<MatchNoneConstraint>() {
self.warnings.push(format!(
"{}.{} : this version constraint cannot possibly match anything ({})",
@@ -985,7 +986,16 @@ impl ValidatingArrayLoader {
.and_then(|v| v.as_array())
.cloned()
.unwrap_or_default();
- let keys = array_intersect_key(&replace_map, &conflict_map);
+ // TODO(phase-b): convert Box<PhpMixed> maps for the shim signature.
+ let replace_map_flat: IndexMap<String, PhpMixed> = replace_map
+ .iter()
+ .map(|(k, v)| (k.clone(), (**v).clone()))
+ .collect();
+ let conflict_map_flat: IndexMap<String, PhpMixed> = conflict_map
+ .iter()
+ .map(|(k, v)| (k.clone(), (**v).clone()))
+ .collect();
+ let keys = array_intersect_key(&replace_map_flat, &conflict_map_flat);
if !keys.is_empty() {
self.errors.push(format!(
"{}.{} : you cannot conflict with a package that is also replaced, as replace already creates an implicit conflict rule",
@@ -1238,7 +1248,7 @@ impl ValidatingArrayLoader {
0,
Some((target_branch_str.len() as i64) - 4),
);
- let validated_target_branch = self.version_parser.normalize_branch(&trimmed);
+ let validated_target_branch = self.version_parser.normalize_branch(&trimmed)?;
if substr(&validated_target_branch, -4, None) != "-dev" {
self.warnings.push(format!(
"extra.branch-alias.{} : the target branch ({}) must be a parseable number like 2.0-dev",
@@ -1418,7 +1428,7 @@ impl ValidatingArrayLoader {
let is_empty = !self.config.contains_key(property)
|| trim(
self.config[property].as_string().unwrap_or(""),
- " \t\n\r\0\u{0B}",
+ Some(" \t\n\r\0\u{0B}"),
) == "";
if is_empty {
if mandatory {