aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-18 01:57:02 +0900
committernsfisis <nsfisis@gmail.com>2026-08-18 01:57:02 +0900
commit530d085d4f3e19f94ac3cf8f8ac3b17000214b2e (patch)
treeb4de2c2443e2bb2cfc692454ac284dc1d2313e59 /crates/shirabe/src/package
parent0caac63bacefb9a1f62848636d47fca07f592bba (diff)
downloadphp-shirabe-530d085d4f3e19f94ac3cf8f8ac3b17000214b2e.tar.gz
php-shirabe-530d085d4f3e19f94ac3cf8f8ac3b17000214b2e.tar.zst
php-shirabe-530d085d4f3e19f94ac3cf8f8ac3b17000214b2e.zip
refactor(pcre): inline Preg into its call sites and drop the crate
Preg had shed everything it owned: after the last few rounds its methods were one-line forwards to the shim's preg_*(), differing only in a default argument or a wrapper the caller unwrapped anyway. The 460 call sites now name the shim function, and shirabe-pcre is gone from the workspace along with its LICENSE entry. The forwards expand as they read: isMatch becomes preg_match2(.., 0).is_some() (is_none() where PHP negates it), isMatch3 and match3 drop the .is_some(), matchAll counts through preg_match_all2(..).occurrence_count(), and replace4/replace5 spell out the limit and count arguments preg_replace2 takes. Callbacks are the one place the shapes differ: preg_replace_callback carries an error out of the callback, so the fourteen infallible closures wrap their result in Ok() and expect() it back. Config::process() is the fifteenth, and it drops the `error` cell it captured to smuggle a failure past a closure that could only return a String. The `?` in the closure now carries it, which is what the PHP does -- a throw from the callback leaves preg_replace_callback at the failing match rather than running the remaining replacements and reporting the last error. The module doc that explained why composer/pcre's exceptions and *StrictGroups() variants have no counterpart moves to the shim's preg module, where the functions it describes live. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/package')
-rw-r--r--crates/shirabe/src/package/archiver/archivable_files_finder.rs5
-rw-r--r--crates/shirabe/src/package/archiver/archive_manager.rs9
-rw-r--r--crates/shirabe/src/package/archiver/base_exclude_filter.rs4
-rw-r--r--crates/shirabe/src/package/loader/array_loader.rs11
-rw-r--r--crates/shirabe/src/package/loader/root_package_loader.rs17
-rw-r--r--crates/shirabe/src/package/loader/validating_array_loader.rs29
-rw-r--r--crates/shirabe/src/package/locker.rs8
-rw-r--r--crates/shirabe/src/package/package.rs29
-rw-r--r--crates/shirabe/src/package/version/version_bumper.rs13
-rw-r--r--crates/shirabe/src/package/version/version_guesser.rs45
-rw-r--r--crates/shirabe/src/package/version/version_parser.rs9
-rw-r--r--crates/shirabe/src/package/version/version_selector.rs7
12 files changed, 97 insertions, 89 deletions
diff --git a/crates/shirabe/src/package/archiver/archivable_files_finder.rs b/crates/shirabe/src/package/archiver/archivable_files_finder.rs
index 8fba18cb..7a1797bf 100644
--- a/crates/shirabe/src/package/archiver/archivable_files_finder.rs
+++ b/crates/shirabe/src/package/archiver/archivable_files_finder.rs
@@ -4,8 +4,7 @@ use crate::package::archiver::BaseExcludeFilter;
use crate::package::archiver::ComposerExcludeFilter;
use crate::package::archiver::GitExcludeFilter;
use crate::util::Filesystem;
-use shirabe_pcre::Preg;
-use shirabe_php_shim::{RuntimeException, preg_quote, realpath};
+use shirabe_php_shim::{RuntimeException, preg_quote, preg_replace, realpath};
use shirabe_symfony_finder::Finder;
use std::path::{Path, PathBuf};
@@ -56,7 +55,7 @@ impl ArchivableFilesFinder {
return false;
}
- let relative_path = Preg::replace(
+ let relative_path = preg_replace(
format!("#^{}#", preg_quote(&sources_clone, Some('#'))),
"",
&fs.normalize_path(&realpath.to_string_lossy()),
diff --git a/crates/shirabe/src/package/archiver/archive_manager.rs b/crates/shirabe/src/package/archiver/archive_manager.rs
index a0216d88..4f9e2ddc 100644
--- a/crates/shirabe/src/package/archiver/archive_manager.rs
+++ b/crates/shirabe/src/package/archiver/archive_manager.rs
@@ -10,10 +10,9 @@ use crate::util::Filesystem;
use crate::util::SyncHelper;
use crate::util::r#loop::Loop;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
use shirabe_php_shim::{
- InvalidArgumentException, RuntimeException, bin2hex, file_exists, php_regex, random_bytes,
- realpath, sys_get_temp_dir,
+ InvalidArgumentException, RuntimeException, bin2hex, file_exists, php_regex, preg_match2,
+ preg_replace, random_bytes, realpath, sys_get_temp_dir,
};
pub struct ArchiveManager {
@@ -58,7 +57,7 @@ impl ArchiveManager {
) -> anyhow::Result<IndexMap<String, String>> {
let base_name = match package.get_archive_name() {
Some(name) => name,
- None => Preg::replace(php_regex!("#[^a-z0-9-_]#i"), "-", &package.get_name()),
+ None => preg_replace(php_regex!("#[^a-z0-9-_]#i"), "-", &package.get_name()),
};
let mut parts: IndexMap<String, String> = IndexMap::new();
@@ -66,7 +65,7 @@ impl ArchiveManager {
let dist_reference = package.get_dist_reference();
if let Some(ref dist_ref) = dist_reference {
- if Preg::is_match(php_regex!("{^[a-f0-9]{40}$}"), dist_ref) {
+ if preg_match2(php_regex!("{^[a-f0-9]{40}$}"), dist_ref, 0).is_some() {
parts.insert("dist_reference".to_string(), dist_ref.to_string());
if let Some(dist_type) = package.get_dist_type() {
parts.insert("dist_type".to_string(), dist_type);
diff --git a/crates/shirabe/src/package/archiver/base_exclude_filter.rs b/crates/shirabe/src/package/archiver/base_exclude_filter.rs
index e5487038..16a189a8 100644
--- a/crates/shirabe/src/package/archiver/base_exclude_filter.rs
+++ b/crates/shirabe/src/package/archiver/base_exclude_filter.rs
@@ -1,6 +1,6 @@
//! ref: composer/src/Composer/Package/Archiver/BaseExcludeFilter.php
-use shirabe_pcre::Preg;
+use shirabe_php_shim::preg_match2;
use shirabe_symfony_finder::Glob;
#[derive(Debug)]
@@ -86,7 +86,7 @@ pub trait BaseExcludeFilter {
relative_path
};
- if Preg::is_match(pattern, path) {
+ if preg_match2(pattern, path, 0).is_some() {
exclude = !negate;
}
}
diff --git a/crates/shirabe/src/package/loader/array_loader.rs b/crates/shirabe/src/package/loader/array_loader.rs
index 21811f14..b6b5ac1e 100644
--- a/crates/shirabe/src/package/loader/array_loader.rs
+++ b/crates/shirabe/src/package/loader/array_loader.rs
@@ -17,11 +17,10 @@ use crate::package::loader::LoaderInterface;
use crate::package::version::VersionParser;
use chrono::Utc;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
use shirabe_php_shim::{
AnyThrowable, E_USER_DEPRECATED, PhpMixed, UnexpectedValueException, is_scalar, is_string,
- json_encode, ltrim, php_regex, stripos, strpos, strtolower, strval, substr, trigger_error,
- trim,
+ json_encode, ltrim, php_regex, preg_match2, preg_replace, stripos, strpos, strtolower, strval,
+ substr, trigger_error, trim,
};
#[derive(Debug)]
@@ -340,7 +339,7 @@ impl ArrayLoader {
&& !shirabe_php_shim::empty(time_value)
{
let time_str = time_value.as_string().unwrap_or("");
- let time = if Preg::is_match(php_regex!(r"/^\d++$/D"), time_str) {
+ let time = if preg_match2(php_regex!(r"/^\d++$/D"), time_str, 0).is_some() {
format!("@{}", time_str)
} else {
time_str.to_string()
@@ -510,7 +509,7 @@ impl ArrayLoader {
if let Some(alias_normalized) = alias_normalized
&& !alias_normalized.is_empty()
{
- let pretty_alias = Preg::replace(php_regex!(r"{(\.9{7})+}"), ".x", &alias_normalized);
+ let pretty_alias = preg_replace(php_regex!(r"{(\.9{7})+}"), ".x", &alias_normalized);
return Ok(match package {
CompleteOrRootPackage::Root(root) => RootAliasPackageHandle::new(
@@ -771,7 +770,7 @@ impl ArrayLoader {
&& default_branch_is_true
&& self
.version_parser
- .parse_numeric_alias_prefix(&Preg::replace(php_regex!(r"{^v}"), "", &version_str))
+ .parse_numeric_alias_prefix(&preg_replace(php_regex!(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 012c30fd..bc49ffc0 100644
--- a/crates/shirabe/src/package/loader/root_package_loader.rs
+++ b/crates/shirabe/src/package/loader/root_package_loader.rs
@@ -15,9 +15,9 @@ use crate::repository::RepositoryManager;
use crate::util::Platform;
use crate::util::ProcessExecutor;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
use shirabe_php_shim::{
- PhpMixed, RuntimeException, UnexpectedValueException, php_regex, preg_split, strtolower,
+ PhpMixed, RuntimeException, UnexpectedValueException, php_regex, preg_match2, preg_replace,
+ preg_split, strtolower,
};
#[derive(Debug)]
@@ -252,9 +252,10 @@ 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_match3(
+ if let Some(m) = preg_match2(
php_regex!(r"{(?:^|\| *|, *)([^,\s#|]+)(?:#[^ ]+)? +as +([^,\s|]+)(?:$| *\|| *,)}"),
req_version,
+ 0,
) {
let m1 = m.get(1).unwrap_or_default().to_string();
let m2 = m.get(2).unwrap_or_default().to_string();
@@ -316,7 +317,7 @@ impl RootPackageLoader {
let mut matched = false;
for constraint in &constraints {
- if let Some(m) = Preg::is_match3(&pattern, constraint) {
+ if let Some(m) = preg_match2(&pattern, constraint, 0) {
let name = strtolower(req_name);
let m1 = m.get(1).unwrap_or_default().to_string();
let normalized_m1 = VersionParser::normalize_stability(&m1).unwrap_or_default();
@@ -336,8 +337,8 @@ impl RootPackageLoader {
for constraint in &constraints {
let req_version_stripped =
- Preg::replace(php_regex!(r"{^([^,\s@]+) as .+$}"), "$1", constraint);
- if Preg::is_match(php_regex!(r"{^[^,\s@]+$}"), &req_version_stripped) {
+ preg_replace(php_regex!(r"{^([^,\s@]+) as .+$}"), "$1", constraint);
+ if preg_match2(php_regex!(r"{^[^,\s@]+$}"), &req_version_stripped, 0).is_some() {
let stability_name = VersionParser::parse_stability(&req_version_stripped);
if stability_name != "stable" {
let name = strtolower(req_name);
@@ -361,8 +362,8 @@ impl RootPackageLoader {
mut references: IndexMap<String, String>,
) -> IndexMap<String, String> {
for (req_name, req_version) in requires {
- let req_version = Preg::replace(php_regex!(r"{^([^,\s@]+) as .+$}"), "$1", req_version);
- if let Some(m) = Preg::is_match3(php_regex!(r"{^[^,\s@]+?#([a-f0-9]+)$}"), &req_version)
+ let req_version = preg_replace(php_regex!(r"{^([^,\s@]+) as .+$}"), "$1", req_version);
+ if let Some(m) = preg_match2(php_regex!(r"{^[^,\s@]+?#([a-f0-9]+)$}"), &req_version, 0)
&& VersionParser::parse_stability(&req_version) == "dev"
{
let name = strtolower(req_name);
diff --git a/crates/shirabe/src/package/loader/validating_array_loader.rs b/crates/shirabe/src/package/loader/validating_array_loader.rs
index 6b9bea91..5ac1a929 100644
--- a/crates/shirabe/src/package/loader/validating_array_loader.rs
+++ b/crates/shirabe/src/package/loader/validating_array_loader.rs
@@ -7,12 +7,11 @@ use crate::package::version::VersionParser;
use crate::package::{STABILITIES, SUPPORTED_LINK_TYPES};
use crate::repository::PlatformRepository;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
use shirabe_php_shim::{
CmpOp, E_USER_DEPRECATED, PHP_EOL, PhpMixed, array_intersect_key, array_values,
filter_var_email, get_debug_type, is_array, is_bool, is_int, is_numeric, is_scalar, is_string,
- json_encode, parse_url, php_regex, php_to_string, str_replace, strcasecmp, strtolower,
- strtotime, substr, trigger_error, trim, var_export,
+ json_encode, parse_url, php_regex, php_to_string, preg_match2, preg_replace, str_replace,
+ strcasecmp, strtolower, strtotime, substr, trigger_error, trim, var_export,
};
use shirabe_semver::Intervals;
use shirabe_semver::constraint::AnyConstraint;
@@ -74,12 +73,15 @@ impl ValidatingArrayLoader {
return None;
}
- if !Preg::is_match(
+ if preg_match2(
php_regex!(
"{^[a-z0-9](?:[_.-]?[a-z0-9]++)*+/[a-z0-9](?:(?:[_.]|-{1,2})?[a-z0-9]++)*+$}iD"
),
name,
- ) {
+ 0,
+ )
+ .is_none()
+ {
return Some(format!(
"{} is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match \"^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{{0,2}})[a-z0-9]+)*$\".",
name
@@ -100,14 +102,14 @@ impl ValidatingArrayLoader {
));
}
- if Preg::is_match(php_regex!("{\\.json$}"), name) {
+ if preg_match2(php_regex!("{\\.json$}"), name, 0).is_some() {
return Some(format!(
"{} is invalid, package names can not end in .json, consider renaming it or perhaps using a -json suffix instead.",
name
));
}
- if Preg::is_match(php_regex!("{[A-Z]}"), name) {
+ if preg_match2(php_regex!("{[A-Z]}"), name, 0).is_some() {
if is_link {
return Some(format!(
"{} is invalid, it should not contain uppercase characters. Please use {} instead.",
@@ -116,7 +118,7 @@ impl ValidatingArrayLoader {
));
}
- let suggest_name = Preg::replace(
+ let suggest_name = preg_replace(
php_regex!("{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}"),
"\\1\\3-\\2\\4",
name,
@@ -141,7 +143,7 @@ impl ValidatingArrayLoader {
.as_string()
.unwrap_or("")
.to_string();
- if !Preg::is_match(format!("{{^{}$}}u", regex), &value) {
+ if preg_match2(format!("{{^{}$}}u", regex), &value, 0).is_none() {
let message = format!(
"{} : invalid value ({}), must match {}",
property, value, regex
@@ -256,7 +258,7 @@ impl ValidatingArrayLoader {
if let Some(regex_str) = regex {
let value_str = php_to_string(&value);
- if !Preg::is_match(format!("{{^{}$}}u", regex_str), &value_str) {
+ if preg_match2(format!("{{^{}$}}u", regex_str), &value_str, 0).is_none() {
self.warnings.borrow_mut().push(format!(
"{}.{} : invalid value ({}), must match {}",
property, key, value_str, regex_str
@@ -1185,7 +1187,8 @@ impl LoaderInterface for ValidatingArrayLoader {
self.warnings
.borrow_mut()
.push(format!("{}.{}", link_type, err));
- } else if !Preg::is_match(php_regex!("{^[A-Za-z0-9_./-]+$}"), &package) {
+ } else if preg_match2(php_regex!("{^[A-Za-z0-9_./-]+$}"), &package, 0).is_none()
+ {
self.errors.borrow_mut().push(format!(
"{}.{} : invalid key, package names must be strings containing only [A-Za-z0-9_./-]",
link_type, package
@@ -1448,7 +1451,7 @@ impl LoaderInterface for ValidatingArrayLoader {
}
if let Some(ref_val) = section.get("reference").filter(|_| isset("reference")) {
let ref_str = php_to_string(ref_val);
- if Preg::is_match(php_regex!("{^\\s*-}"), &ref_str) {
+ if preg_match2(php_regex!("{^\\s*-}"), &ref_str, 0).is_some() {
self.errors.borrow_mut().push(format!(
"{}.reference : must not start with a \"-\", \"{}\" given",
src_type, ref_str
@@ -1457,7 +1460,7 @@ impl LoaderInterface for ValidatingArrayLoader {
}
if let Some(url_val) = section.get("url").filter(|_| isset("url")) {
let url_str = php_to_string(url_val);
- if Preg::is_match(php_regex!("{^\\s*-}"), &url_str) {
+ if preg_match2(php_regex!("{^\\s*-}"), &url_str, 0).is_some() {
self.errors.borrow_mut().push(format!(
"{}.url : must not start with a \"-\", \"{}\" given",
src_type, url_str
diff --git a/crates/shirabe/src/package/locker.rs b/crates/shirabe/src/package/locker.rs
index 7d45e573..fee45fef 100644
--- a/crates/shirabe/src/package/locker.rs
+++ b/crates/shirabe/src/package/locker.rs
@@ -24,12 +24,11 @@ use crate::repository::RootPackageRepository;
use crate::util::Git as GitUtil;
use crate::util::ProcessExecutor;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
use shirabe_php_shim::Catch as _;
use shirabe_php_shim::{
DATE_RFC3339, LogicException, PhpMixed, RuntimeException, array_intersect, array_keys,
array_map, array_merge, file_get_contents, filemtime, function_exists, hash, in_array_loose,
- is_int, ksort, php_regex, realpath, strcmp, strtolower, touch2, trim, usort,
+ is_int, ksort, php_regex, preg_match2, realpath, strcmp, strtolower, touch2, trim, usort,
};
use shirabe_seld_json_lint::ParsingException;
@@ -824,7 +823,7 @@ impl Locker {
),
None,
);
- if Preg::is_match(php_regex!(r"{^\s*\d+\s*$}"), &output_str) {
+ if preg_match2(php_regex!(r"{^\s*\d+\s*$}"), &output_str, 0).is_some() {
let ts = trim(&output_str, None).parse::<i64>().unwrap_or(0);
datetime = chrono::DateTime::from_timestamp(ts, 0);
}
@@ -843,9 +842,10 @@ impl Locker {
]),
&mut output,
path.as_deref(),
- )? && let Some(m) = Preg::is_match3(
+ )? && let Some(m) = preg_match2(
php_regex!(r"{^\s*(\d+)\s*}"),
output.as_string().unwrap_or(""),
+ 0,
) {
let ts = m
.get(1)
diff --git a/crates/shirabe/src/package/package.rs b/crates/shirabe/src/package/package.rs
index 2e2d5feb..ddeb2932 100644
--- a/crates/shirabe/src/package/package.rs
+++ b/crates/shirabe/src/package/package.rs
@@ -10,9 +10,9 @@ use crate::repository::RepositoryInterfaceWeakHandle;
use crate::util::ComposerMirror;
use chrono::{DateTime, Utc};
use indexmap::{IndexMap, IndexSet};
-use shirabe_pcre::Preg;
use shirabe_php_shim::{
- E_USER_DEPRECATED, LogicException, PhpMixed, php_regex, strpos, trigger_error,
+ E_USER_DEPRECATED, LogicException, PhpMixed, PregMatches, php_regex, preg_match2, preg_replace,
+ preg_replace_callback, strpos, trigger_error,
};
/// Mirror entry, e.g. `['url' => 'https://...', 'preferred' => true]`.
@@ -139,7 +139,7 @@ impl Package {
pub fn get_target_dir(&self) -> Option<String> {
let target_dir = self.target_dir.as_ref()?;
- let replaced = Preg::replace(
+ let replaced = preg_replace(
php_regex!("{ (?:^|[\\\\/]+) \\.\\.? (?:[\\\\/]+|$) (?:\\.\\.? (?:[\\\\/]+|$) )*}x"),
"/",
target_dir,
@@ -416,12 +416,14 @@ impl Package {
// only bitbucket, github and gitlab have auto generated dist URLs that easily allow replacing the reference in the dist URL
// TODO generalize this a bit for self-managed/on-prem versions? Some kind of replace token in dist urls which allow this?
if self.get_dist_url().is_some()
- && Preg::is_match(
+ && preg_match2(
php_regex!(
"{^https?://(?:(?:www\\.)?bitbucket\\.org|(api\\.)?github\\.com|(?:www\\.)?gitlab\\.com)/}i"
),
&self.get_dist_url().unwrap_or_default(),
+ 0,
)
+ .is_some()
{
self.set_dist_reference(Some(reference.clone()));
// Regex pattern compatibility:
@@ -431,14 +433,17 @@ impl Package {
// lookaround, the capturing version consumes its boundary delimiter, so two 40-hex
// SHAs sharing a single `/` between them would not both match; harmless here since a
// dist URL never carries more than one SHA reference.
- self.set_dist_url(Some(Preg::replace_callback(
- php_regex!("{(/|sha=)[a-f0-9]{40}(/|$)}i"),
- |m: &shirabe_pcre::PregMatches| -> String {
- let get = |i: usize| -> String { m.get(i).unwrap_or_default().to_string() };
- format!("{}{}{}", get(1), reference, get(2))
- },
- &self.get_dist_url().unwrap_or_default(),
- )));
+ self.set_dist_url(Some(
+ preg_replace_callback(
+ php_regex!("{(/|sha=)[a-f0-9]{40}(/|$)}i"),
+ |m: &PregMatches| -> anyhow::Result<String> {
+ let get = |i: usize| -> String { m.get(i).unwrap_or_default().to_string() };
+ Ok(format!("{}{}{}", get(1), reference, get(2)))
+ },
+ &self.get_dist_url().unwrap_or_default(),
+ )
+ .expect("the replacement callback cannot fail"),
+ ));
} else if self.get_dist_reference().is_some() {
// update the dist reference if there was one, but if none was provided ignore it
self.set_dist_reference(Some(reference));
diff --git a/crates/shirabe/src/package/version/version_bumper.rs b/crates/shirabe/src/package/version/version_bumper.rs
index 6911fb14..50808916 100644
--- a/crates/shirabe/src/package/version/version_bumper.rs
+++ b/crates/shirabe/src/package/version/version_bumper.rs
@@ -5,8 +5,9 @@ use crate::package::dumper::ArrayDumper;
use crate::package::loader::ArrayLoader;
use crate::package::version::VersionParser;
use crate::util::Platform;
-use shirabe_pcre::{CaptureKey, Preg};
-use shirabe_php_shim::php_regex;
+use shirabe_php_shim::{
+ CaptureKey, php_regex, preg_match_all_offset_capture, preg_match2, preg_replace,
+};
use shirabe_semver::Intervals;
use shirabe_semver::constraint::AnyConstraint;
@@ -45,12 +46,12 @@ impl VersionBumper {
return Ok(pretty_constraint);
}
- let major = Preg::replace(php_regex!(r"{^([1-9][0-9]*|0\.\d+).*}"), "$1", &version);
+ let major = preg_replace(php_regex!(r"{^([1-9][0-9]*|0\.\d+).*}"), "$1", &version);
let version_without_suffix =
- Preg::replace(php_regex!(r"{(?:\.(?:0|9999999))+(-dev)?$}"), "", &version);
+ preg_replace(php_regex!(r"{(?:\.(?:0|9999999))+(-dev)?$}"), "", &version);
let new_pretty_constraint = format!("^{}", version_without_suffix);
- if !Preg::is_match(php_regex!(r"{^\^\d+(\.\d+)*$}"), &new_pretty_constraint) {
+ if preg_match2(php_regex!(r"{^\^\d+(\.\d+)*$}"), &new_pretty_constraint, 0).is_none() {
return Ok(pretty_constraint);
}
@@ -77,7 +78,7 @@ impl VersionBumper {
major = major
);
- let matches = Preg::is_match_all_with_offsets3(&pattern, &pretty_constraint);
+ let matches = preg_match_all_offset_capture(&pattern, &pretty_constraint);
if matches.occurrence_count() > 0 {
let mut modified = pretty_constraint.clone();
let constraint_matches = matches
diff --git a/crates/shirabe/src/package/version/version_guesser.rs b/crates/shirabe/src/package/version/version_guesser.rs
index c85000e7..fd7fe389 100644
--- a/crates/shirabe/src/package/version/version_guesser.rs
+++ b/crates/shirabe/src/package/version/version_guesser.rs
@@ -12,11 +12,10 @@ use crate::util::ProcessExecutor;
use crate::util::Svn as SvnUtil;
use crate::util::sync_executor;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
use shirabe_php_shim::{
PhpMixed, RuntimeException, array_keys, array_map, array_merge, empty, function_exists,
- implode, is_string, json_encode, php_regex, preg_quote, str_replace, strlen, strnatcasecmp,
- strpos, substr, trim, usort,
+ implode, is_string, json_encode, php_regex, preg_match2, preg_quote, preg_replace, str_replace,
+ strlen, strnatcasecmp, strpos, substr, trim, usort,
};
/// Seam over the parts of [`VersionGuesser`] that consumers depend on, so they can be exercised
@@ -157,12 +156,14 @@ impl VersionGuesser {
}
if "-dev" == substr(version_data.version.as_deref().unwrap_or(""), -4, None)
- && Preg::is_match(
+ && preg_match2(
php_regex!(r"{\.9{7}}"),
version_data.version.as_deref().unwrap_or(""),
+ 0,
)
+ .is_some()
{
- version_data.pretty_version = Some(Preg::replace(
+ version_data.pretty_version = Some(preg_replace(
php_regex!(r"{(\.9{7})+}"),
".x",
version_data.version.as_deref().unwrap_or(""),
@@ -181,12 +182,14 @@ impl VersionGuesser {
-4,
None,
)
- && Preg::is_match(
+ && preg_match2(
php_regex!(r"{\.9{7}}"),
version_data.feature_version.as_deref().unwrap_or(""),
+ 0,
)
+ .is_some()
{
- version_data.feature_pretty_version = Some(Preg::replace(
+ version_data.feature_pretty_version = Some(preg_replace(
php_regex!(r"{(\.9{7})+}"),
".x",
version_data.feature_version.as_deref().unwrap_or(""),
@@ -229,11 +232,12 @@ impl VersionGuesser {
// find current branch and collect all branch names
for branch in self.process.borrow().split_lines(&output) {
if !branch.is_empty()
- && let Some(m) = Preg::is_match3(
+ && let Some(m) = preg_match2(
php_regex!(
r"{^(?:\* ) *(\(no branch\)|\(detached from \S+\)|\(HEAD detached at \S+\)|\S+) *([a-f0-9]+) .*$}"
),
&branch,
+ 0,
)
{
let g1 = m.get(1).unwrap_or_default().to_string();
@@ -256,12 +260,13 @@ impl VersionGuesser {
}
if !branch.is_empty()
- && Preg::is_match3(php_regex!(r"{^ *.+/HEAD }"), &branch).is_none()
- && let Some(m) = Preg::is_match3(
+ && preg_match2(php_regex!(r"{^ *.+/HEAD }"), &branch, 0).is_none()
+ && let Some(m) = preg_match2(
php_regex!(
r"{^(?:\* )? *((?:remotes/(?:origin|upstream)/)?[^\s/]+) *([a-f0-9]+) .*$}"
),
&branch,
+ 0,
)
{
branches.push(m.get(1).unwrap_or_default().to_string());
@@ -499,8 +504,7 @@ impl VersionGuesser {
)
.is_some();
if !has_branch_alias || has_self_version {
- let branch =
- Preg::replace(php_regex!(r"{^dev-}"), "", version.as_deref().unwrap_or(""));
+ let branch = preg_replace(php_regex!(r"{^dev-}"), "", version.as_deref().unwrap_or(""));
let mut length = i64::MAX;
// return directly, if branch is configured to be non-feature branch
@@ -534,7 +538,7 @@ impl VersionGuesser {
for (index, candidate) in branches.iter().enumerate() {
let index = index as i64;
let candidate_version =
- Preg::replace(php_regex!(r"{^remotes/\S+/}"), "", candidate);
+ preg_replace(php_regex!(r"{^remotes/\S+/}"), "", candidate);
// do not compare against itself or other feature branches
if candidate == &branch
@@ -608,13 +612,10 @@ 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_match2(format!(
+ r"{{^({}|master|main|latest|next|current|support|tip|trunk|default|develop|\d+\..+)$}}",
+ non_feature_branches,
+ ), branch_name.unwrap_or(""), 0).is_none()
}
fn guess_fossil_version(&mut self, path: &str) -> anyhow::Result<VersionData> {
@@ -697,7 +698,7 @@ impl VersionGuesser {
trunk_path, branches_path, tags_path,
);
- if let Some(matches) = Preg::is_match3(&url_pattern, &output) {
+ if let Some(matches) = preg_match2(&url_pattern, &output, 0) {
let m1 = matches.get(1).unwrap_or_default();
let m2 = matches.get(2);
let m3 = matches.get(3);
@@ -750,7 +751,7 @@ impl VersionGuesser {
.into());
}
};
- if let Some(m) = Preg::is_match3(php_regex!(r"{^(\d+(?:\.\d+)*)-dev$}i"), &version) {
+ if let Some(m) = preg_match2(php_regex!(r"{^(\d+(?:\.\d+)*)-dev$}i"), &version, 0) {
return Ok(format!("{}.x-dev", m.get(1).unwrap_or_default()));
}
diff --git a/crates/shirabe/src/package/version/version_parser.rs b/crates/shirabe/src/package/version/version_parser.rs
index c16583e0..ad1a05cf 100644
--- a/crates/shirabe/src/package/version/version_parser.rs
+++ b/crates/shirabe/src/package/version/version_parser.rs
@@ -2,8 +2,7 @@
use crate::repository::PlatformRepository;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
-use shirabe_php_shim::php_regex;
+use shirabe_php_shim::{php_regex, preg_match2, preg_replace};
use shirabe_semver::Semver;
use shirabe_semver::VersionParser as SemverVersionParser;
use shirabe_semver::constraint::AnyConstraint;
@@ -50,7 +49,7 @@ impl VersionParser {
let count = pairs.len();
let mut i = 0_usize;
while i < count {
- let mut pair = Preg::replace(
+ let mut pair = preg_replace(
php_regex!(r"{^([^=: ]+)[=: ](.*)$}"),
"$1 $2",
pairs[i].trim(),
@@ -58,10 +57,12 @@ impl VersionParser {
if !pair.contains(' ')
&& i + 1 < count
&& !pairs[i + 1].contains('/')
- && !Preg::is_match(
+ && preg_match2(
php_regex!(r"{(?<=[a-z0-9_/-])\*|\*(?=[a-z0-9_/-])}i"),
&pairs[i + 1],
+ 0,
)
+ .is_none()
&& !PlatformRepository::is_platform_package(&pairs[i + 1])
{
pair += &format!(" {}", pairs[i + 1]);
diff --git a/crates/shirabe/src/package/version/version_selector.rs b/crates/shirabe/src/package/version/version_selector.rs
index 1661c749..c7b7b31e 100644
--- a/crates/shirabe/src/package/version/version_selector.rs
+++ b/crates/shirabe/src/package/version/version_selector.rs
@@ -16,8 +16,7 @@ use crate::repository::PlatformRepository;
use crate::repository::RepositoryInterface;
use crate::repository::RepositorySetInterface;
use indexmap::IndexMap;
-use shirabe_pcre::Preg;
-use shirabe_php_shim::{CmpOp, php_regex, strtolower, version_compare};
+use shirabe_php_shim::{CmpOp, php_regex, preg_match2, preg_replace, strtolower, version_compare};
use shirabe_semver::constraint::AnyConstraint;
use shirabe_semver::constraint::SimpleConstraint;
@@ -280,7 +279,7 @@ impl VersionSelector {
if let Some(extra) = extra
&& extra != VersionParser::DEFAULT_BRANCH_ALIAS
{
- let new_extra = Preg::replace(
+ let new_extra = preg_replace(
php_regex!(r"{^(\d+\.\d+\.\d+)(\.9999999)-dev$}"),
"$1.0",
&extra,
@@ -303,7 +302,7 @@ impl VersionSelector {
let semantic_version_parts: Vec<&str> = version.split('.').collect();
if semantic_version_parts.len() == 4
- && Preg::is_match(php_regex!(r"{^\d+\D?}"), semantic_version_parts[3])
+ && preg_match2(php_regex!(r"{^\d+\D?}"), semantic_version_parts[3], 0).is_some()
{
let mut parts: Vec<String> = semantic_version_parts
.iter()