aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/repository/vcs/github_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/github_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/github_driver.rs')
-rw-r--r--crates/shirabe/src/repository/vcs/github_driver.rs67
1 files changed, 14 insertions, 53 deletions
diff --git a/crates/shirabe/src/repository/vcs/github_driver.rs b/crates/shirabe/src/repository/vcs/github_driver.rs
index 08561171..11bb9503 100644
--- a/crates/shirabe/src/repository/vcs/github_driver.rs
+++ b/crates/shirabe/src/repository/vcs/github_driver.rs
@@ -14,7 +14,7 @@ use crate::util::GitHub;
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, PhpMixed, RuntimeException, array_diff, array_map,
@@ -83,25 +83,14 @@ impl GitHubDriver {
.into());
};
- self.owner = match_
- .get(&CaptureKey::ByIndex(3))
- .unwrap_or_default()
- .to_string();
- self.repository = match_
- .get(&CaptureKey::ByIndex(4))
- .unwrap_or_default()
- .to_string();
+ self.owner = match_.get(3).unwrap_or_default().to_string();
+ self.repository = match_.get(4).unwrap_or_default().to_string();
self.inner.origin_url = strtolower(
&match_
- .get(&CaptureKey::ByIndex(1))
+ .get(1)
.filter(|s| !s.is_empty())
.map(str::to_string)
- .unwrap_or_else(|| {
- match_
- .get(&CaptureKey::ByIndex(2))
- .unwrap_or_default()
- .to_string()
- }),
+ .unwrap_or_else(|| match_.get(2).unwrap_or_default().to_string()),
);
if self.inner.origin_url == "www.github.com" {
self.inner.origin_url = "github.com".to_string();
@@ -494,23 +483,14 @@ impl GitHubDriver {
for line in preg_split(php_regex!(r"{\r?\n}"), &funding) {
let line = trim(&line, None);
if let Some(m) = Preg::is_match3(php_regex!(r"{^(\w+)\s*:\s*(.+)$}"), &line) {
- let g1 = m
- .get(&CaptureKey::ByIndex(1))
- .unwrap_or_default()
- .to_string();
- let g2 = m
- .get(&CaptureKey::ByIndex(2))
- .unwrap_or_default()
- .to_string();
+ let g1 = m.get(1).unwrap_or_default().to_string();
+ let g2 = m.get(2).unwrap_or_default().to_string();
if g2 == "[" {
key = Some(g1);
continue;
}
if let Some(m2) = Preg::is_match3(php_regex!(r"{^\[(.*?)\](?:\s*#.*)?$}"), &g2) {
- let inner = m2
- .get(&CaptureKey::ByIndex(1))
- .unwrap_or_default()
- .to_string();
+ let inner = m2.get(1).unwrap_or_default().to_string();
for item in array_map(
|s: &String| trim(s, None),
&preg_split(php_regex!(r#"{[\'\"]?\s*,\s*[\'\"]?}"#), &inner),
@@ -530,20 +510,13 @@ impl GitHubDriver {
entry.insert("type".to_string(), PhpMixed::String(g1.clone()));
entry.insert(
"url".to_string(),
- PhpMixed::String(trim(
- m2.get(&CaptureKey::ByIndex(1)).unwrap_or_default(),
- Some("\"' "),
- )),
+ PhpMixed::String(trim(m2.get(1).unwrap_or_default(), Some("\"' "))),
);
result.push(entry);
}
key = None;
} else if let Some(m) = Preg::is_match3(php_regex!(r"{^(\w+)\s*:\s*#\s*$}"), &line) {
- key = Some(
- m.get(&CaptureKey::ByIndex(1))
- .unwrap_or_default()
- .to_string(),
- );
+ key = Some(m.get(1).unwrap_or_default().to_string());
} else if key.is_some()
&& let Some(m) = Preg::is_match3(php_regex!(r"{^-\s*(.+)(?:\s+#.*)?$}"), &line)
.or_else(|| Preg::is_match3(php_regex!(r"{^(.+),(?:\s*#.*)?$}"), &line))
@@ -555,10 +528,7 @@ impl GitHubDriver {
);
entry.insert(
"url".to_string(),
- PhpMixed::String(trim(
- m.get(&CaptureKey::ByIndex(1)).unwrap_or_default(),
- Some("\"' "),
- )),
+ PhpMixed::String(trim(m.get(1).unwrap_or_default(), Some("\"' "))),
);
result.push(entry);
} else if key.is_some() && line == "]" {
@@ -948,15 +918,10 @@ impl GitHubDriver {
};
let origin_url = matches
- .get(&CaptureKey::ByIndex(2))
+ .get(2)
.filter(|s| !s.is_empty())
.map(str::to_string)
- .unwrap_or_else(|| {
- matches
- .get(&CaptureKey::ByIndex(3))
- .unwrap_or_default()
- .to_string()
- });
+ .unwrap_or_else(|| matches.get(3).unwrap_or_default().to_string());
if !in_array_loose(
strtolower(&Preg::replace(php_regex!(r"{^www\.}i"), "", &origin_url)),
config.borrow().get("github-domains").values(),
@@ -1285,11 +1250,7 @@ impl GitHubDriver {
let links = explode(",", &header);
for link in &links {
if let Some(m) = Preg::is_match3(php_regex!(r#"{<(.+?)>; *rel="next"}"#), link) {
- return Some(
- m.get(&CaptureKey::ByIndex(1))
- .unwrap_or_default()
- .to_string(),
- );
+ return Some(m.get(1).unwrap_or_default().to_string());
}
}