aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/vcs/gitlab_driver.rs
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
commit0caac63bacefb9a1f62848636d47fca07f592bba (patch)
tree8d2ef66e597a8d8c228d3ba2490a59f48b26db4d /crates/shirabe/src/repository/vcs/gitlab_driver.rs
parent34c74255d781ad0a0bf7cc5ad4ec1761bef61e04 (diff)
downloadphp-shirabe-0caac63bacefb9a1f62848636d47fca07f592bba.tar.gz
php-shirabe-0caac63bacefb9a1f62848636d47fca07f592bba.tar.zst
php-shirabe-0caac63bacefb9a1f62848636d47fca07f592bba.zip
refactor(preg): split PregMatches reads into get() and name()
PregMatches keyed both forms of a capture group through CaptureKey, so every read built one: a usize wrapped in an enum, or worse, a String allocated to name a group that regex::Captures can look up from a &str. It now mirrors regex::Captures instead -- get() takes the group number, name() the group name -- and the enum drops out of the type entirely. That is 285 call sites across 59 files, and the named ones carry most of the win: `matches.get(&CaptureKey::ByName("host".to_string()))` reads as `matches.name("host")`. ProcessExecutor loses a `user_key` binding that existed only to build the key once. CaptureKey stays as the key type of PregMatchesAll and PregMatchesAllWithOffsets, where numbered and named entries share one IndexMap and a key type is the point. Five files still name it. Also retargets the two preg_match_all comments that described the occurrence count through `matches[&CaptureKey::ByIndex(0)].len()`, an Index impl these types no longer carry. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/vcs/gitlab_driver.rs')
-rw-r--r--crates/shirabe/src/repository/vcs/gitlab_driver.rs63
1 files changed, 13 insertions, 50 deletions
diff --git a/crates/shirabe/src/repository/vcs/gitlab_driver.rs b/crates/shirabe/src/repository/vcs/gitlab_driver.rs
index 5494feed..30c3f7ae 100644
--- a/crates/shirabe/src/repository/vcs/gitlab_driver.rs
+++ b/crates/shirabe/src/repository/vcs/gitlab_driver.rs
@@ -15,7 +15,7 @@ use crate::util::HttpDownloader;
use crate::util::http::Response;
use chrono::{DateTime, FixedOffset};
use indexmap::IndexMap;
-use shirabe_pcre::{CaptureKey, Preg};
+use shirabe_pcre::Preg;
use shirabe_php_shim::Catch as _;
use shirabe_php_shim::{
InvalidArgumentException, LogicException, PhpMixed, RuntimeException, array_search_mixed,
@@ -90,27 +90,14 @@ impl GitLabDriver {
};
let guessed_domain = match_
- .get(&CaptureKey::ByName("domain".to_string()))
+ .name("domain")
.filter(|s| !s.is_empty())
.map(str::to_string)
- .unwrap_or_else(|| {
- match_
- .get(&CaptureKey::ByName("domain2".to_string()))
- .unwrap_or_default()
- .to_string()
- });
+ .unwrap_or_else(|| match_.name("domain2").unwrap_or_default().to_string());
let configured_domains = self.inner.config.borrow_mut().get("gitlab-domains");
- let mut url_parts: Vec<String> = explode(
- "/",
- match_
- .get(&CaptureKey::ByName("parts".to_string()))
- .unwrap_or_default(),
- );
+ let mut url_parts: Vec<String> = explode("/", match_.name("parts").unwrap_or_default());
- let scheme_match = match_
- .get(&CaptureKey::ByName("scheme".to_string()))
- .unwrap_or_default()
- .to_string();
+ let scheme_match = match_.name("scheme").unwrap_or_default().to_string();
self.scheme = if matches!(scheme_match.as_str(), "https" | "http") {
scheme_match
} else if self
@@ -124,9 +111,7 @@ impl GitLabDriver {
} else {
"https".to_string()
};
- let port = match_
- .get(&CaptureKey::ByName("port".to_string()))
- .map(str::to_string);
+ let port = match_.name("port").map(str::to_string);
let origin =
Self::determine_origin(&configured_domains, guessed_domain, &mut url_parts, port);
let origin = match origin {
@@ -170,9 +155,7 @@ impl GitLabDriver {
self.repository = Preg::replace(
php_regex!(r"#(\.git)$#"),
"",
- match_
- .get(&CaptureKey::ByName("repo".to_string()))
- .unwrap_or_default(),
+ match_.name("repo").unwrap_or_default(),
);
self.inner.cache = Some(Cache::new(
@@ -948,34 +931,19 @@ impl GitLabDriver {
return Ok(false);
};
- let scheme = match_
- .get(&CaptureKey::ByName("scheme".to_string()))
- .unwrap_or_default()
- .to_string();
+ let scheme = match_.name("scheme").unwrap_or_default().to_string();
let guessed_domain = match_
- .get(&CaptureKey::ByName("domain".to_string()))
+ .name("domain")
.filter(|s| !s.is_empty())
.map(str::to_string)
- .unwrap_or_else(|| {
- match_
- .get(&CaptureKey::ByName("domain2".to_string()))
- .unwrap_or_default()
- .to_string()
- });
- let mut url_parts: Vec<String> = explode(
- "/",
- match_
- .get(&CaptureKey::ByName("parts".to_string()))
- .unwrap_or_default(),
- );
+ .unwrap_or_else(|| match_.name("domain2").unwrap_or_default().to_string());
+ let mut url_parts: Vec<String> = explode("/", match_.name("parts").unwrap_or_default());
if Self::determine_origin(
&config.borrow().get("gitlab-domains"),
guessed_domain,
&mut url_parts,
- match_
- .get(&CaptureKey::ByName("port".to_string()))
- .map(str::to_string),
+ match_.name("port").map(str::to_string),
)
.is_none()
{
@@ -1011,12 +979,7 @@ impl GitLabDriver {
let links = explode(",", &header);
for link in &links {
if let Some(match_) = Preg::is_match3(php_regex!(r#"{<(.+?)>; *rel="next"}"#), link) {
- return Some(
- match_
- .get(&CaptureKey::ByIndex(1))
- .unwrap_or_default()
- .to_string(),
- );
+ return Some(match_.get(1).unwrap_or_default().to_string());
}
}