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.rs12
-rw-r--r--crates/shirabe/src/package/archiver/archive_manager.rs6
-rw-r--r--crates/shirabe/src/package/base_package.rs8
-rw-r--r--crates/shirabe/src/package/dumper/array_dumper.rs5
-rw-r--r--crates/shirabe/src/package/link.rs5
-rw-r--r--crates/shirabe/src/package/loader/array_loader.rs2
-rw-r--r--crates/shirabe/src/package/loader/loader_interface.rs2
-rw-r--r--crates/shirabe/src/package/loader/root_package_loader.rs54
-rw-r--r--crates/shirabe/src/package/locker.rs48
-rw-r--r--crates/shirabe/src/package/package_interface.rs6
-rw-r--r--crates/shirabe/src/package/version/version_bumper.rs17
-rw-r--r--crates/shirabe/src/package/version/version_guesser.rs106
-rw-r--r--crates/shirabe/src/package/version/version_parser.rs6
-rw-r--r--crates/shirabe/src/package/version/version_selector.rs44
14 files changed, 191 insertions, 130 deletions
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<dyn BasePackage>, 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<String> = 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<String> = 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::<CompletePackage>()
- {
+ if let Some(complete_pkg) = package.as_any().downcast_ref::<CompletePackage>() {
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::<RootPackage>() {
+ if let Some(root_pkg) = package.as_any().downcast_ref::<RootPackage>() {
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<String, PhpMixed>,
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<std::cell::RefCell<Config>>,
version_guesser: VersionGuesser,
io: Option<Box<dyn IOInterface>>,
}
@@ -33,7 +34,7 @@ pub struct RootPackageLoader {
impl RootPackageLoader {
pub fn new(
manager: RepositoryManager,
- config: Config,
+ config: std::rc::Rc<std::cell::RefCell<Config>>,
parser: Option<VersionParser>,
version_guesser: Option<VersionGuesser>,
io: Option<Box<dyn IOInterface>>,
@@ -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<IndexMap<String, String>>,
) -> Vec<IndexMap<String, String>> {
for (req_name, req_version) in requires {
- if let Some(m) = Preg::is_match_strict_groups(
+ let mut m: IndexMap<CaptureKey, String> = 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<CaptureKey, String> = 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<CaptureKey, String> = 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<std::cell::RefCell<ProcessExecutor>>,
/// @var mixed[]|null
lock_data_cache: Option<IndexMap<String, PhpMixed>>,
/// @var bool
@@ -62,9 +63,8 @@ impl Locker {
lock_file: JsonFile,
installation_manager: InstallationManager,
composer_file_contents: &str,
- process: Option<ProcessExecutor>,
+ process: std::rc::Rc<std::cell::RefCell<ProcessExecutor>>,
) -> 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<F>(
&mut self,
- composer_json: JsonFile,
+ composer_json: &JsonFile,
data_processor: Option<F>,
) -> 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::<i64>().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<CaptureKey, String> = 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::<i64>()
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<String, Vec<(String, i64)>> = IndexMap::new();
- if Preg::is_match_all_with_offsets(&pattern, &pretty_constraint, &mut matches)? {
+ let mut matches: IndexMap<CaptureKey, Vec<(String, usize)>> = 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<std::cell::RefCell<Config>>,
/// @var ProcessExecutor
- process: ProcessExecutor,
+ process: std::rc::Rc<std::cell::RefCell<ProcessExecutor>>,
/// @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<std::cell::RefCell<Config>>,
+ process: std::rc::Rc<std::cell::RefCell<ProcessExecutor>>,
version_parser: SemverVersionParser,
io: Option<Box<dyn IOInterface>>,
) -> 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<CaptureKey, String> = 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<CaptureKey, String> = IndexMap::new();
+ !Preg::is_match_strict_groups3(r"{^ *.+/HEAD }", &branch, Some(&mut tmp))
+ .unwrap_or(false)
+ } {
+ let mut m: IndexMap<CaptureKey, String> = 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<Option<(String, String)>> {
// 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<Option<VersionData>> {
// 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<String> =
array_map(|k: &String| k.clone(), &array_keys(driver.get_branches()));
@@ -495,7 +513,7 @@ impl VersionGuesser {
let mut promises: Vec<Box<dyn shirabe_external_packages::react::promise::promise_interface::PromiseInterface>> =
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<CaptureKey, String> = 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<Option<Box<dyn PackageInterface>>> {
- 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::<IgnoreAllPlatformRequirementFilter>()
.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::<IgnoreListPlatformRequirementFilter>();
+ let list_filter_opt = platform_requirement_filter
+ .as_ref()
+ .as_any()
+ .downcast_ref::<IgnoreListPlatformRequirementFilter>(
+ );
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!(
"<warning>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::<AliasPackage>() {
- 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::<AliasPackage>()
+ {
+ 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");