From 5e31fa33c3b5cf726a57a063b8e7a070869250fe Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 19 May 2026 21:46:01 +0900 Subject: fix(compile): fix more random compile errors Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/shirabe/src/package/alias_package.rs | 12 ++- .../src/package/archiver/archive_manager.rs | 6 +- crates/shirabe/src/package/base_package.rs | 8 +- crates/shirabe/src/package/dumper/array_dumper.rs | 5 +- crates/shirabe/src/package/link.rs | 5 +- crates/shirabe/src/package/loader/array_loader.rs | 2 +- .../shirabe/src/package/loader/loader_interface.rs | 2 +- .../src/package/loader/root_package_loader.rs | 54 +++++++---- crates/shirabe/src/package/locker.rs | 48 +++++----- crates/shirabe/src/package/package_interface.rs | 6 ++ .../shirabe/src/package/version/version_bumper.rs | 17 ++-- .../shirabe/src/package/version/version_guesser.rs | 106 +++++++++++++-------- .../shirabe/src/package/version/version_parser.rs | 6 +- .../src/package/version/version_selector.rs | 44 +++++---- 14 files changed, 191 insertions(+), 130 deletions(-) (limited to 'crates/shirabe/src/package') diff --git a/crates/shirabe/src/package/alias_package.rs b/crates/shirabe/src/package/alias_package.rs index e115362..3f4b1d8 100644 --- a/crates/shirabe/src/package/alias_package.rs +++ b/crates/shirabe/src/package/alias_package.rs @@ -53,13 +53,16 @@ impl AliasPackage { /// @param string $version The version the alias must report /// @param string $prettyVersion The alias's non-normalized version pub fn new(alias_of: Box, version: String, pretty_version: String) -> Self { - let inner = BasePackage::new(alias_of.get_name().to_string()); + let alias_name = alias_of.get_name().to_string(); - let stability = VersionParser::parse_stability(&version); + let stability = VersionParser::parse_stability(&version).to_string(); let dev = stability == "dev"; let mut this = Self { - inner, + id: -1, + name: alias_name.to_lowercase(), + pretty_name: alias_name, + repository: None, version, pretty_version, dev, @@ -429,8 +432,7 @@ impl PackageInterface for AliasPackage { fn get_full_pretty_version(&self, truncate: bool, display_mode: i64) -> String { // TODO(phase-b): BasePackage.get_full_pretty_version returns Result; bridge here - self.alias_of - .get_full_pretty_version(truncate, display_mode) + BasePackage::get_full_pretty_version(self.alias_of.as_ref(), truncate, display_mode) .unwrap_or_default() } diff --git a/crates/shirabe/src/package/archiver/archive_manager.rs b/crates/shirabe/src/package/archiver/archive_manager.rs index 73b0d84..374e16c 100644 --- a/crates/shirabe/src/package/archiver/archive_manager.rs +++ b/crates/shirabe/src/package/archiver/archive_manager.rs @@ -184,7 +184,7 @@ impl ArchiveManager { let json_file = JsonFile::new(composer_json_path, None, None)?; let json_data = json_file.read()?; if let Some(archive) = json_data.get("archive") { - if let Some(name) = archive.get("name").and_then(|v| v.as_str()) { + if let Some(name) = archive.get("name").and_then(|v| v.as_string()) { if !name.is_empty() { package.set_archive_name(name.to_string()); } @@ -192,8 +192,8 @@ impl ArchiveManager { if let Some(exclude) = archive.get("exclude") { if let Some(excludes) = exclude.as_array() { let excludes: Vec = excludes - .iter() - .filter_map(|v| v.as_str().map(|s| s.to_string())) + .values() + .filter_map(|v| v.as_string().map(|s| s.to_string())) .collect(); if !excludes.is_empty() { package.set_archive_excludes(excludes); diff --git a/crates/shirabe/src/package/base_package.rs b/crates/shirabe/src/package/base_package.rs index fb906d1..052a480 100644 --- a/crates/shirabe/src/package/base_package.rs +++ b/crates/shirabe/src/package/base_package.rs @@ -168,7 +168,11 @@ pub trait BasePackage: PackageInterface + std::fmt::Display { } } -pub fn package_name_to_regexp(allow_pattern: &str, wrap: &str) -> String { +pub fn package_name_to_regexp(allow_pattern: &str) -> String { + package_name_to_regexp2(allow_pattern, "{^%s$}i") +} + +pub fn package_name_to_regexp2(allow_pattern: &str, wrap: &str) -> String { let cleaned = preg_quote(allow_pattern, None).replace("\\*", ".*"); wrap.replace("%s", &cleaned) } @@ -176,7 +180,7 @@ pub fn package_name_to_regexp(allow_pattern: &str, wrap: &str) -> String { pub fn package_names_to_regexp(package_names: &[String], wrap: &str) -> String { let patterns: Vec = package_names .iter() - .map(|name| package_name_to_regexp(name, "%s")) + .map(|name| package_name_to_regexp2(name, "%s")) .collect(); wrap.replace("%s", &patterns.join("|")) } diff --git a/crates/shirabe/src/package/dumper/array_dumper.rs b/crates/shirabe/src/package/dumper/array_dumper.rs index d81fd6c..0b57070 100644 --- a/crates/shirabe/src/package/dumper/array_dumper.rs +++ b/crates/shirabe/src/package/dumper/array_dumper.rs @@ -260,8 +260,7 @@ impl ArrayDumper { ); } - if let Some(complete_pkg) = (package.as_any() as &dyn Any).downcast_ref::() - { + if let Some(complete_pkg) = package.as_any().downcast_ref::() { if let Some(archive_name) = complete_pkg.get_archive_name() { let entry = data .entry("archive".to_string()) @@ -422,7 +421,7 @@ impl ArrayDumper { } } - if let Some(root_pkg) = (package.as_any() as &dyn Any).downcast_ref::() { + if let Some(root_pkg) = package.as_any().downcast_ref::() { let minimum_stability = root_pkg.get_minimum_stability(); if !minimum_stability.is_empty() { data.insert( diff --git a/crates/shirabe/src/package/link.rs b/crates/shirabe/src/package/link.rs index e41d431..2732075 100644 --- a/crates/shirabe/src/package/link.rs +++ b/crates/shirabe/src/package/link.rs @@ -114,7 +114,10 @@ impl Link { pub fn to_string(&self) -> String { format!( "{} {} {} ({})", - self.source, self.description, self.target, self.constraint + self.source, + self.description, + self.target, + 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 275d718..3ece5c7 100644 --- a/crates/shirabe/src/package/loader/array_loader.rs +++ b/crates/shirabe/src/package/loader/array_loader.rs @@ -410,7 +410,7 @@ impl ArrayLoader { if let Some(time_value) = config.get("time") { if !shirabe_php_shim::empty(time_value) { let time_str = time_value.as_string().unwrap_or(""); - let time = if Preg::is_match(r"/^\d++$/D", time_str) { + let time = if Preg::is_match(r"/^\d++$/D", time_str).unwrap_or(false) { format!("@{}", time_str) } else { time_str.to_string() diff --git a/crates/shirabe/src/package/loader/loader_interface.rs b/crates/shirabe/src/package/loader/loader_interface.rs index f941f9a..2b93bc5 100644 --- a/crates/shirabe/src/package/loader/loader_interface.rs +++ b/crates/shirabe/src/package/loader/loader_interface.rs @@ -4,7 +4,7 @@ use crate::package::base_package::BasePackage; use indexmap::IndexMap; use shirabe_php_shim::PhpMixed; -pub trait LoaderInterface { +pub trait LoaderInterface: std::fmt::Debug { fn load( &self, config: IndexMap, diff --git a/crates/shirabe/src/package/loader/root_package_loader.rs b/crates/shirabe/src/package/loader/root_package_loader.rs index 59c9cf5..d2e2a7a 100644 --- a/crates/shirabe/src/package/loader/root_package_loader.rs +++ b/crates/shirabe/src/package/loader/root_package_loader.rs @@ -1,7 +1,7 @@ //! ref: composer/src/Composer/Package/Loader/RootPackageLoader.php use indexmap::IndexMap; -use shirabe_external_packages::composer::pcre::preg::Preg; +use shirabe_external_packages::composer::pcre::preg::{CaptureKey, Preg}; use shirabe_php_shim::{ LogicException, RuntimeException, UnexpectedValueException, strtolower, ucfirst, }; @@ -10,6 +10,7 @@ use crate::config::Config; use crate::io::io_interface::IOInterface; use crate::package::base_package::{BasePackage, STABILITIES, SUPPORTED_LINK_TYPES}; 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; @@ -25,7 +26,7 @@ use crate::util::process_executor::ProcessExecutor; pub struct RootPackageLoader { inner: ArrayLoader, manager: RepositoryManager, - config: Config, + config: std::rc::Rc>, version_guesser: VersionGuesser, io: Option>, } @@ -33,7 +34,7 @@ pub struct RootPackageLoader { impl RootPackageLoader { pub fn new( manager: RepositoryManager, - config: Config, + config: std::rc::Rc>, parser: Option, version_guesser: Option, io: Option>, @@ -42,7 +43,12 @@ impl RootPackageLoader { let version_guesser = version_guesser.unwrap_or_else(|| { let mut process_executor = ProcessExecutor::new(io.as_deref()); process_executor.enable_async(); - VersionGuesser::new(&config, process_executor, inner.version_parser.clone()) + VersionGuesser::new( + std::rc::Rc::clone(&config), + std::rc::Rc::new(std::cell::RefCell::new(process_executor)), + inner.version_parser.clone(), + io.as_ref().map(|i| i.clone_box()), + ) }); Self { inner, @@ -284,11 +290,15 @@ impl RootPackageLoader { ); } - let repos = RepositoryFactory::default_repos(None, &self.config, &mut self.manager)?; + let repos = RepositoryFactory::default_repos( + None, + Some(std::rc::Rc::clone(&self.config)), + Some(&mut self.manager), + )?; for repo in repos { self.manager.add_repository(repo); } - real_package.set_repositories(self.config.get_repositories()); + real_package.set_repositories(self.config.borrow().get_repositories()); Ok(package) } @@ -299,27 +309,31 @@ impl RootPackageLoader { mut aliases: Vec>, ) -> Vec> { for (req_name, req_version) in requires { - if let Some(m) = Preg::is_match_strict_groups( + let mut m: IndexMap = IndexMap::new(); + if Preg::is_match_strict_groups3( r"(?:^|\| *|, *)([^,\s#|]+)(?:#[^ ]+)? +as +([^,\s|]+)(?:$| *\|| *,)", req_version, + Some(&mut m), ) - .unwrap_or(None) + .unwrap_or(false) { + let m1 = m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default(); + let m2 = m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); let mut alias = IndexMap::new(); alias.insert("package".to_string(), strtolower(req_name)); alias.insert( "version".to_string(), self.inner .version_parser - .normalize(&m[1], req_version) + .normalize(&m1, Some(req_version)) .unwrap_or_default(), ); - alias.insert("alias".to_string(), m[2].clone()); + alias.insert("alias".to_string(), m2.clone()); alias.insert( "alias_normalized".to_string(), self.inner .version_parser - .normalize(&m[2], req_version) + .normalize(&m2, Some(req_version)) .unwrap_or_default(), ); aliases.push(alias); @@ -370,9 +384,13 @@ impl RootPackageLoader { let mut matched = false; for constraint in &constraints { - if let Some(Some(m)) = Preg::is_match_strict_groups(&pattern, constraint).ok() { + let mut m: IndexMap = IndexMap::new(); + if Preg::is_match_strict_groups3(&pattern, constraint, Some(&mut m)) + .unwrap_or(false) + { let name = strtolower(req_name); - let stability = stabilities[VersionParser::normalize_stability(&m[1])]; + let m1 = m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default(); + let stability = stabilities[VersionParser::normalize_stability(&m1)]; if stability_flags.get(&name).copied().unwrap_or(i64::MAX) > stability { continue; @@ -415,12 +433,16 @@ impl RootPackageLoader { for (req_name, req_version) in requires { let req_version = Preg::replace(r"^([^,\s@]+) as .+$", "$1", req_version).unwrap_or_default(); - if let Some(Some(m)) = - Preg::is_match_strict_groups(r"^[^,\s@]+?#([a-f0-9]+)$", &req_version).ok() + let mut m: IndexMap = IndexMap::new(); + if Preg::is_match_strict_groups3(r"^[^,\s@]+?#([a-f0-9]+)$", &req_version, Some(&mut m)) + .unwrap_or(false) { if VersionParser::parse_stability(&req_version) == "dev" { let name = strtolower(req_name); - references.insert(name, m[1].clone()); + references.insert( + name, + m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default(), + ); } } } diff --git a/crates/shirabe/src/package/locker.rs b/crates/shirabe/src/package/locker.rs index 397af08..8b3fea5 100644 --- a/crates/shirabe/src/package/locker.rs +++ b/crates/shirabe/src/package/locker.rs @@ -3,7 +3,7 @@ use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::composer::pcre::preg::Preg; +use shirabe_external_packages::composer::pcre::preg::{CaptureKey, Preg}; use shirabe_external_packages::seld::json_lint::parsing_exception::ParsingException; use shirabe_php_shim::{ DATE_RFC3339, LogicException, PhpMixed, RuntimeException, array_intersect, array_keys, @@ -21,6 +21,7 @@ use crate::package::complete_alias_package::CompleteAliasPackage; use crate::package::dumper::array_dumper::ArrayDumper; use crate::package::link::Link; use crate::package::loader::array_loader::ArrayLoader; +use crate::package::loader::loader_interface::LoaderInterface; use crate::package::package_interface::PackageInterface; use crate::package::root_package_interface::RootPackageInterface; use crate::package::version::version_parser::VersionParser; @@ -48,7 +49,7 @@ pub struct Locker { /// @var ArrayDumper dumper: ArrayDumper, /// @var ProcessExecutor - process: ProcessExecutor, + process: std::rc::Rc>, /// @var mixed[]|null lock_data_cache: Option>, /// @var bool @@ -62,9 +63,8 @@ impl Locker { lock_file: JsonFile, installation_manager: InstallationManager, composer_file_contents: &str, - process: Option, + process: std::rc::Rc>, ) -> Self { - let process = process.unwrap_or_else(|| ProcessExecutor::new(Some(io), None)); Self { lock_file, installation_manager, @@ -606,10 +606,9 @@ impl Locker { }; if !is_locked || Some(&lock) != current_data.as_ref() { if write { - self.lock_file.write( - PhpMixed::Array(lock.into_iter().map(|(k, v)| (k, Box::new(v))).collect()), - None, - )?; + self.lock_file.write(PhpMixed::Array( + lock.into_iter().map(|(k, v)| (k, Box::new(v))).collect(), + ))?; self.lock_data_cache = None; self.virtual_file_written = false; } else { @@ -639,7 +638,7 @@ impl Locker { /// Updates the lock file's hash in-place from a given composer.json's JsonFile pub fn update_hash( &mut self, - composer_json: JsonFile, + composer_json: &JsonFile, data_processor: Option, ) -> Result<()> where @@ -670,15 +669,12 @@ impl Locker { lock_data = processor(lock_data); } - self.lock_file.write( - PhpMixed::Array( - self.fixup_json_data_type(lock_data) - .into_iter() - .map(|(k, v)| (k, Box::new(v))) - .collect(), - ), - None, - )?; + self.lock_file.write(PhpMixed::Array( + self.fixup_json_data_type(lock_data) + .into_iter() + .map(|(k, v)| (k, Box::new(v))) + .collect(), + ))?; self.lock_data_cache = None; self.virtual_file_written = false; if let Some(mtime) = lock_mtime { @@ -838,7 +834,7 @@ impl Locker { args.extend(no_show_signature_flags); let command = GitUtil::build_rev_list_command(&self.process, args); let mut output = PhpMixed::Null; - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute( PhpMixed::String(command), Some(&mut output), path.as_deref(), @@ -850,7 +846,7 @@ impl Locker { ), None, ); - if Preg::is_match(r"{^\s*\d+\s*$}", &output_str) { + if Preg::is_match(r"{^\s*\d+\s*$}", &output_str).unwrap_or(false) { // TODO(phase-b): new \DateTime('@'.trim($output), new \DateTimeZone('UTC')) let ts = trim(&output_str, None).parse::().unwrap_or(0); datetime = chrono::DateTime::from_timestamp(ts, 0); @@ -859,7 +855,7 @@ impl Locker { } "hg" => { let mut output = PhpMixed::Null; - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute( PhpMixed::List(vec![ Box::new(PhpMixed::String("hg".to_string())), Box::new(PhpMixed::String("log".to_string())), @@ -871,12 +867,16 @@ impl Locker { Some(&mut output), path.as_deref(), )? { - if let Some(m) = Preg::is_match_strict_groups( + let mut m: IndexMap = IndexMap::new(); + if Preg::is_match_strict_groups3( r"{^\s*(\d+)\s*}", output.as_string().unwrap_or(""), - ) { + Some(&mut m), + ) + .unwrap_or(false) + { let ts = m - .get(1) + .get(&CaptureKey::ByIndex(1)) .cloned() .unwrap_or_default() .parse::() diff --git a/crates/shirabe/src/package/package_interface.rs b/crates/shirabe/src/package/package_interface.rs index c6ccce8..beadc5c 100644 --- a/crates/shirabe/src/package/package_interface.rs +++ b/crates/shirabe/src/package/package_interface.rs @@ -301,6 +301,12 @@ pub trait PackageInterface: std::fmt::Display + std::fmt::Debug { ) -> Option<&dyn crate::package::complete_package_interface::CompletePackageInterface> { None } + + fn as_root_package_interface( + &self, + ) -> Option<&dyn crate::package::root_package_interface::RootPackageInterface> { + None + } } impl dyn PackageInterface { diff --git a/crates/shirabe/src/package/version/version_bumper.rs b/crates/shirabe/src/package/version/version_bumper.rs index 8963fd6..f7c2377 100644 --- a/crates/shirabe/src/package/version/version_bumper.rs +++ b/crates/shirabe/src/package/version/version_bumper.rs @@ -7,7 +7,7 @@ use crate::package::version::version_parser::VersionParser; use crate::util::platform::Platform; use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::composer::pcre::preg::Preg; +use shirabe_external_packages::composer::pcre::preg::{CaptureKey, Preg}; use shirabe_semver::constraint::constraint_interface::ConstraintInterface; use shirabe_semver::intervals::Intervals; @@ -49,9 +49,9 @@ impl VersionBumper { return Ok(pretty_constraint); } - let major = Preg::replace(r"{^([1-9][0-9]*|0\.\d+).*}", "$1", version.clone())?; + let major = Preg::replace(r"{^([1-9][0-9]*|0\.\d+).*}", "$1", &version)?; let version_without_suffix = - Preg::replace(r"{(?:\.(?:0|9999999))+(-dev)?$}", "", version.clone())?; + Preg::replace(r"{(?:\.(?:0|9999999))+(-dev)?$}", "", &version)?; let new_pretty_constraint = format!("^{}", version_without_suffix); if !Preg::is_match(r"{^\^\d+(\.\d+)*$}", &new_pretty_constraint)? { @@ -73,13 +73,16 @@ impl VersionBumper { major = major ); - let mut matches: IndexMap> = IndexMap::new(); - if Preg::is_match_all_with_offsets(&pattern, &pretty_constraint, &mut matches)? { + let mut matches: IndexMap> = IndexMap::new(); + if Preg::is_match_all_with_offsets3(&pattern, &pretty_constraint, Some(&mut matches))? { let mut modified = pretty_constraint.clone(); - let constraint_matches = matches.get("constraint").cloned().unwrap_or_default(); + let constraint_matches = matches + .get(&CaptureKey::ByName("constraint".to_string())) + .cloned() + .unwrap_or_default(); for match_ in constraint_matches.iter().rev() { let match_str = &match_.0; - let match_offset = match_.1; + let match_offset = match_.1 as i64; let suffix = if match_str.matches('.').count() == 2 && version_without_suffix.matches('.').count() == 1 { diff --git a/crates/shirabe/src/package/version/version_guesser.rs b/crates/shirabe/src/package/version/version_guesser.rs index c4e25e0..b366b20 100644 --- a/crates/shirabe/src/package/version/version_guesser.rs +++ b/crates/shirabe/src/package/version/version_guesser.rs @@ -2,7 +2,7 @@ use anyhow::Result; use indexmap::IndexMap; -use shirabe_external_packages::composer::pcre::preg::Preg; +use shirabe_external_packages::composer::pcre::preg::{CaptureKey, Preg}; use shirabe_external_packages::symfony::component::process::process::Process; use shirabe_php_shim::{ PHP_INT_MAX, PhpMixed, RuntimeException, array_keys, array_map, array_merge, empty, @@ -28,10 +28,10 @@ use crate::util::svn::Svn as SvnUtil; #[derive(Debug)] pub struct VersionGuesser { /// @var Config - config: Config, + config: std::rc::Rc>, /// @var ProcessExecutor - process: ProcessExecutor, + process: std::rc::Rc>, /// @var SemverVersionParser version_parser: SemverVersionParser, @@ -52,8 +52,8 @@ pub struct VersionData { impl VersionGuesser { pub fn new( - config: Config, - process: ProcessExecutor, + config: std::rc::Rc>, + process: std::rc::Rc>, version_parser: SemverVersionParser, io: Option>, ) -> Self { @@ -130,6 +130,7 @@ impl VersionGuesser { if "-dev" == substr(version_data.version.as_deref().unwrap_or(""), -4, None) && Preg::is_match(r"{\.9{7}}", version_data.version.as_deref().unwrap_or("")) + .unwrap_or(false) { version_data.pretty_version = Some(Preg::replace( r"{(\.9{7})+}", @@ -154,6 +155,7 @@ impl VersionGuesser { r"{\.9{7}}", version_data.feature_version.as_deref().unwrap_or(""), ) + .unwrap_or(false) { version_data.feature_pretty_version = Some(Preg::replace( r"{(\.9{7})+}", @@ -183,7 +185,7 @@ impl VersionGuesser { // try to fetch current version from git branch let mut output = String::new(); - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute_args( &[ "git".to_string(), "branch".to_string(), @@ -199,14 +201,24 @@ impl VersionGuesser { let mut is_feature_branch = false; // find current branch and collect all branch names - for branch in self.process.split_lines(&output) { + for branch in self.process.borrow().split_lines(&output) { if !branch.is_empty() { - if let Some(m) = Preg::is_match_strict_groups( + let mut m: IndexMap = IndexMap::new(); + if Preg::is_match_strict_groups3( r"{^(?:\* ) *(\(no branch\)|\(detached from \S+\)|\(HEAD detached at \S+\)|\S+) *([a-f0-9]+) .*$}", &branch, - ) { - let g1 = m.get(1).cloned().unwrap_or_default(); - let g2 = m.get(2).cloned().unwrap_or_default(); + Some(&mut m), + ) + .unwrap_or(false) + { + let g1 = m + .get(&CaptureKey::ByIndex(1)) + .cloned() + .unwrap_or_default(); + let g2 = m + .get(&CaptureKey::ByIndex(2)) + .cloned() + .unwrap_or_default(); if g1 == "(no branch)" || strpos(&g1, "(detached ") == Some(0) || strpos(&g1, "(HEAD detached at") == Some(0) @@ -225,14 +237,20 @@ impl VersionGuesser { } } - if !branch.is_empty() - && Preg::is_match_strict_groups(r"{^ *.+/HEAD }", &branch).is_none() - { - if let Some(m) = Preg::is_match_strict_groups( + if !branch.is_empty() && { + let mut tmp: IndexMap = IndexMap::new(); + !Preg::is_match_strict_groups3(r"{^ *.+/HEAD }", &branch, Some(&mut tmp)) + .unwrap_or(false) + } { + let mut m: IndexMap = IndexMap::new(); + if Preg::is_match_strict_groups3( r"{^(?:\* )? *((?:remotes/(?:origin|upstream)/)?[^\s/]+) *([a-f0-9]+) .*$}", &branch, - ) { - branches.push(m.get(1).cloned().unwrap_or_default()); + Some(&mut m), + ) + .unwrap_or(false) + { + branches.push(m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default()); } } } @@ -258,7 +276,7 @@ impl VersionGuesser { } } GitUtil::check_for_repo_ownership_error( - &self.process.get_error_output(), + &self.process.borrow().get_error_output(), path, self.io.as_deref(), ); @@ -293,10 +311,11 @@ impl VersionGuesser { .unwrap_or_default(), ); let mut command_output = String::new(); - if 0 == self - .process - .execute(&command, &mut command_output, Some(path.to_string())) - { + if 0 == self.process.borrow_mut().execute_args( + &command, + &mut command_output, + Some(path.to_string()), + ) { let parsed = trim( &GitUtil::parse_rev_list_output(&command_output, &self.process), None, @@ -322,7 +341,7 @@ impl VersionGuesser { fn version_from_git_tags(&mut self, path: &str) -> Result> { // try to fetch current version from git tags let mut output = String::new(); - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute_args( &[ "git".to_string(), "describe".to_string(), @@ -352,7 +371,7 @@ impl VersionGuesser { ) -> Result> { // try to fetch current version from hg branch let mut output = String::new(); - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute_args( &["hg".to_string(), "branch".to_string()], &mut output, Some(path.to_string()), @@ -392,8 +411,7 @@ impl VersionGuesser { self.config.clone(), // TODO(phase-b): HttpDownloader::new signature todo!("HttpDownloader::new(io, config)"), - // TODO(phase-b): clone ProcessExecutor - todo!("self.process.clone()"), + std::rc::Rc::clone(&self.process), ); let branches: Vec = array_map(|k: &String| k.clone(), &array_keys(driver.get_branches())); @@ -495,7 +513,7 @@ impl VersionGuesser { let mut promises: Vec> = vec![]; - self.process.set_max_jobs(30); + self.process.borrow_mut().set_max_jobs(30); // TODO(phase-b): try/finally with resetMaxJobs let result: Result<()> = (|| -> Result<()> { let mut last_index: i64 = -1; @@ -519,7 +537,7 @@ impl VersionGuesser { }, &scm_cmdline, ); - let async_promise = self.process.execute_async(&cmd_line, path); + let async_promise = self.process.borrow_mut().execute_async(&cmd_line, path); promises.push(async_promise.then(Box::new( move |process: Process| -> Result<()> { if !process.is_successful() { @@ -538,10 +556,10 @@ impl VersionGuesser { ))); } - self.process.wait(); + self.process.borrow_mut().wait(); Ok(()) })(); - self.process.reset_max_jobs(); + self.process.borrow_mut().reset_max_jobs(); result?; } @@ -571,13 +589,11 @@ impl VersionGuesser { non_feature_branches = implode("|", &names); } - !Preg::is_match( - &format!( - r"{{^({}|master|main|latest|next|current|support|tip|trunk|default|develop|\d+\..+)$}}", - non_feature_branches, - ), - branch_name.unwrap_or(""), - ) + !Preg::is_match(&format!( + r"{{^({}|master|main|latest|next|current|support|tip|trunk|default|develop|\d+\..+)$}}", + non_feature_branches, + ), branch_name.unwrap_or("")).unwrap_or(false) + .unwrap_or(false) } /// @return array{version: string|null, commit: '', pretty_version: string|null} @@ -587,7 +603,7 @@ impl VersionGuesser { // try to fetch current version from fossil let mut output = String::new(); - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute_args( &[ "fossil".to_string(), "branch".to_string(), @@ -603,7 +619,7 @@ impl VersionGuesser { // try to fetch current version from fossil tags let mut output = String::new(); - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute_args( &["fossil".to_string(), "tag".to_string(), "list".to_string()], &mut output, Some(path.to_string()), @@ -639,7 +655,7 @@ impl VersionGuesser { // try to fetch current version from svn let mut output = String::new(); - if 0 == self.process.execute( + if 0 == self.process.borrow_mut().execute_args( &["svn".to_string(), "info".to_string(), "--xml".to_string()], &mut output, Some(path.to_string()), @@ -720,8 +736,14 @@ impl VersionGuesser { .into()); } }; - if let Some(m) = Preg::is_match_strict_groups(r"{^(\d+(?:\.\d+)*)-dev$}i", &version) { - return Ok(format!("{}.x-dev", m.get(1).cloned().unwrap_or_default())); + let mut m: IndexMap = IndexMap::new(); + if Preg::is_match_strict_groups3(r"{^(\d+(?:\.\d+)*)-dev$}i", &version, Some(&mut m)) + .unwrap_or(false) + { + return Ok(format!( + "{}.x-dev", + m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default() + )); } Ok(version) diff --git a/crates/shirabe/src/package/version/version_parser.rs b/crates/shirabe/src/package/version/version_parser.rs index 6dbf425..84749a3 100644 --- a/crates/shirabe/src/package/version/version_parser.rs +++ b/crates/shirabe/src/package/version/version_parser.rs @@ -42,11 +42,7 @@ impl VersionParser { let count = pairs.len(); let mut i = 0_usize; while i < count { - let mut pair = Preg::replace( - r"{^([^=: ]+)[=: ](.*)$}", - "$1 $2", - pairs[i].trim().to_string(), - )?; + let mut pair = Preg::replace(r"{^([^=: ]+)[=: ](.*)$}", "$1 $2", &pairs[i].trim())?; if !pair.contains(' ') && i + 1 < count && !pairs[i + 1].contains('/') diff --git a/crates/shirabe/src/package/version/version_selector.rs b/crates/shirabe/src/package/version/version_selector.rs index 5cbc052..1df58ab 100644 --- a/crates/shirabe/src/package/version/version_selector.rs +++ b/crates/shirabe/src/package/version/version_selector.rs @@ -17,7 +17,7 @@ use crate::filter::platform_requirement_filter::platform_requirement_filter_fact use crate::filter::platform_requirement_filter::platform_requirement_filter_interface::PlatformRequirementFilterInterface; use crate::io::io_interface::IOInterface; use crate::package::alias_package::AliasPackage; -use crate::package::base_package::BasePackage; +use crate::package::base_package::{self, BasePackage}; use crate::package::dumper::array_dumper::ArrayDumper; use crate::package::loader::array_loader::ArrayLoader; use crate::package::package_interface::PackageInterface; @@ -41,7 +41,7 @@ impl VersionSelector { IndexMap::new(); if let Some(platform_repo) = platform_repo { for package in platform_repo.get_packages() { - let constraint = Constraint::new("==", package.get_version())?; + let constraint = Constraint::new("==", package.get_version()); platform_constraints .entry(package.get_name().to_string()) .or_default() @@ -65,7 +65,7 @@ impl VersionSelector { io: Option<&dyn IOInterface>, show_warnings: shirabe_php_shim::PhpMixed, ) -> anyhow::Result>> { - if !BasePackage::STABILITIES.contains_key(preferred_stability) { + if !base_package::STABILITIES.contains_key(preferred_stability) { return Err(shirabe_php_shim::UnexpectedValueException { message: format!( "Expected a valid stability name as 3rd argument, got {}", @@ -92,7 +92,7 @@ impl VersionSelector { repo_set_flags, )?; - let min_priority = *BasePackage::STABILITIES.get(preferred_stability).unwrap(); + let min_priority = *base_package::STABILITIES.get(preferred_stability).unwrap(); candidates.sort_by(|a, b| { let a_priority = a.get_stability_priority(); let b_priority = b.get_stability_priority(); @@ -116,7 +116,9 @@ impl VersionSelector { } }); - let is_ignore_all = (platform_requirement_filter.as_ref() as &dyn Any) + let is_ignore_all = platform_requirement_filter + .as_ref() + .as_any() .downcast_ref::() .is_some(); @@ -141,9 +143,11 @@ impl VersionSelector { if link.get_constraint().matches(provided_constraint.as_ref()) { continue 'reqs; } - let list_filter_opt = (platform_requirement_filter.as_ref() - as &dyn Any) - .downcast_ref::(); + let list_filter_opt = platform_requirement_filter + .as_ref() + .as_any() + .downcast_ref::( + ); if let Some(list_filter) = list_filter_opt { if list_filter.is_upper_bound_ignored(name) { let filtered_constraint = list_filter.filter_constraint( @@ -178,8 +182,8 @@ impl VersionSelector { } else { "" }; - io.write_error( - shirabe_php_shim::PhpMixed::String(format!( + io.write_error3( + &format!( "Cannot use {}{} {} as it {} {} {} which {}.", pkg.get_pretty_name(), latest, @@ -188,7 +192,7 @@ impl VersionSelector { link.get_target(), link.get_pretty_constraint(), reason - )), + ), true, if is_first_warning { io_interface::NORMAL @@ -223,16 +227,16 @@ impl VersionSelector { Some(p) => p, }; - let package = - if let Some(alias) = (package.as_ref() as &dyn Any).downcast_ref::() { - if alias.get_version() == VersionParser::DEFAULT_BRANCH_ALIAS { - alias.get_alias_of() - } else { - package - } + let package = if let Some(alias) = package.as_ref().as_any().downcast_ref::() + { + if alias.get_version() == VersionParser::DEFAULT_BRANCH_ALIAS { + alias.get_alias_of() } else { package - }; + } + } else { + package + }; Ok(Some(package)) } @@ -268,7 +272,7 @@ impl VersionSelector { if let Some(extra) = extra { if extra != VersionParser::DEFAULT_BRANCH_ALIAS { let new_extra = - Preg::replace(r"{^(\d+\.\d+\.\d+)(\.9999999)-dev$}", "$1.0", extra.clone())?; + Preg::replace(r"{^(\d+\.\d+\.\d+)(\.9999999)-dev$}", "$1.0", &extra)?; if new_extra != extra { let new_extra = new_extra.replace(".9999999", ".0"); return self.transform_version(&new_extra, &new_extra, "dev"); -- cgit v1.3.1