aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/version
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/package/version')
-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
4 files changed, 99 insertions, 74 deletions
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");