diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-17 08:05:42 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-17 08:05:42 +0900 |
| commit | 79b504e55cd4c4d1da102c3a076dc2a2e1edcd65 (patch) | |
| tree | 2c12198742f289de49b9b77a2c2ad66ef417405c /crates/shirabe/src/repository/vcs/svn_driver.rs | |
| parent | 9fd6aecad27240ccedab4487f6c157914142ca47 (diff) | |
| download | php-shirabe-79b504e55cd4c4d1da102c3a076dc2a2e1edcd65.tar.gz php-shirabe-79b504e55cd4c4d1da102c3a076dc2a2e1edcd65.tar.zst php-shirabe-79b504e55cd4c4d1da102c3a076dc2a2e1edcd65.zip | |
refactor(pcre): return the Preg $matches instead of filling an out-param
`Composer\Pcre\Preg` fills `$matches` through a by-ref parameter, and the
port mirrored that with a `&mut` (or `Option<&mut>`) out-param plus a
bool or count return. Callers had to declare an empty map one line ahead
of the call, and the type never said the map is only meaningful when the
call matched. Return the matches instead:
- match3/match4/is_match3/is_match4 -> Option<PregMatchedGroups>
- is_match_named -> Option<PregNamedGroups>
- match_all2/is_match_all -> PregMatchesAll
- is_match_all_with_offsets3 -> PregMatchesAllWithOffsets
Nothing is lost: the bool is `Option::is_some()`, and the occurrence
count is the length of any one column of a PREG_PATTERN_ORDER map, now
spelled `PregMatchesAll::occurrence_count()`. is_match() still answers
the bool question directly for callers that want no groups.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/repository/vcs/svn_driver.rs')
| -rw-r--r-- | crates/shirabe/src/repository/vcs/svn_driver.rs | 139 |
1 files changed, 60 insertions, 79 deletions
diff --git a/crates/shirabe/src/repository/vcs/svn_driver.rs b/crates/shirabe/src/repository/vcs/svn_driver.rs index db8c43f0..05380a17 100644 --- a/crates/shirabe/src/repository/vcs/svn_driver.rs +++ b/crates/shirabe/src/repository/vcs/svn_driver.rs @@ -13,7 +13,7 @@ use crate::util::Svn as SvnUtil; use crate::util::Url; use chrono::{DateTime, FixedOffset, Utc}; use indexmap::IndexMap; -use shirabe_pcre::{CaptureKey, Preg, PregMatchedGroups}; +use shirabe_pcre::{CaptureKey, Preg}; use shirabe_php_shim::Catch as _; use shirabe_php_shim::{ PhpMixed, RuntimeException, php_regex, stripos, strrpos, strtr, substr, trim, @@ -317,18 +317,14 @@ impl SvnDriver { &format!("{}{}{}", self.base_url, path, rev), )?; for line in self.inner.process.borrow().split_lines(&output) { - if !line.is_empty() { - let mut m = PregMatchedGroups::new(); - if Preg::is_match3( - php_regex!(r"{^Last Changed Date: ([^(]+)}"), - &line, - Some(&mut m), - ) { - let date_str = m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default(); - return Ok(shirabe_php_shim::date_create::<Utc>(date_str.trim()) - .ok() - .map(|d| d.fixed_offset())); - } + if !line.is_empty() + && let Some(m) = + Preg::is_match3(php_regex!(r"{^Last Changed Date: ([^(]+)}"), &line) + { + let date_str = m.get(&CaptureKey::ByIndex(1)).cloned().unwrap_or_default(); + return Ok(shirabe_php_shim::date_create::<Utc>(date_str.trim()) + .ok() + .map(|d| d.fixed_offset())); } } @@ -349,28 +345,23 @@ impl SvnDriver { let mut last_rev: i64 = 0; for line in self.inner.process.borrow().split_lines(&output) { let line = trim(&line, None); - if !line.is_empty() { - let mut m = PregMatchedGroups::new(); - if Preg::is_match3( - php_regex!(r"{^\s*(\S+).*?(\S+)\s*$}"), - &line, - Some(&mut m), - ) { - let rev: i64 = m - .get(&CaptureKey::ByIndex(1)) - .and_then(|s| s.parse().ok()) - .unwrap_or(0); - let path = - m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); - if path == "./" { - last_rev = rev; - } else { - let identifier = self.build_identifier( - &format!("/{}/{}", self.tags_path, path), - std::cmp::max(last_rev, rev), - ); - tags.insert(path.trim_end_matches('/').to_string(), identifier); - } + if !line.is_empty() + && let Some(m) = + Preg::is_match3(php_regex!(r"{^\s*(\S+).*?(\S+)\s*$}"), &line) + { + let rev: i64 = m + .get(&CaptureKey::ByIndex(1)) + .and_then(|s| s.parse().ok()) + .unwrap_or(0); + let path = m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); + if path == "./" { + last_rev = rev; + } else { + let identifier = self.build_identifier( + &format!("/{}/{}", self.tags_path, path), + std::cmp::max(last_rev, rev), + ); + tags.insert(path.trim_end_matches('/').to_string(), identifier); } } } @@ -400,27 +391,23 @@ impl SvnDriver { if !output.is_empty() { for line in self.inner.process.borrow().split_lines(&output) { let line = trim(&line, None); - if !line.is_empty() { - let mut m = PregMatchedGroups::new(); - if Preg::is_match3( - php_regex!(r"{^\s*(\S+).*?(\S+)\s*$}"), - &line, - Some(&mut m), - ) { - let rev: i64 = m - .get(&CaptureKey::ByIndex(1)) - .and_then(|s| s.parse().ok()) - .unwrap_or(0); - let path = m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); - if path == "./" { - let identifier = self.build_identifier( - &format!("/{}", self.trunk_path.clone().unwrap_or_default()), - rev, - ); - branches.insert("trunk".to_string(), identifier.clone()); - self.root_identifier = Some(identifier); - break; - } + if !line.is_empty() + && let Some(m) = + Preg::is_match3(php_regex!(r"{^\s*(\S+).*?(\S+)\s*$}"), &line) + { + let rev: i64 = m + .get(&CaptureKey::ByIndex(1)) + .and_then(|s| s.parse().ok()) + .unwrap_or(0); + let path = m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); + if path == "./" { + let identifier = self.build_identifier( + &format!("/{}", self.trunk_path.clone().unwrap_or_default()), + rev, + ); + branches.insert("trunk".to_string(), identifier.clone()); + self.root_identifier = Some(identifier); + break; } } } @@ -442,29 +429,23 @@ impl SvnDriver { .split_lines(&trim(&output, None)) { let line = trim(&line, None); - if !line.is_empty() { - let mut m = PregMatchedGroups::new(); - if Preg::is_match3( - php_regex!(r"{^\s*(\S+).*?(\S+)\s*$}"), - &line, - Some(&mut m), - ) { - let rev: i64 = m - .get(&CaptureKey::ByIndex(1)) - .and_then(|s| s.parse().ok()) - .unwrap_or(0); - let path = - m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); - if path == "./" { - last_rev = rev; - } else { - let identifier = self.build_identifier( - &format!("/{}/{}", self.branches_path, path), - std::cmp::max(last_rev, rev), - ); - branches - .insert(path.trim_end_matches('/').to_string(), identifier); - } + if !line.is_empty() + && let Some(m) = + Preg::is_match3(php_regex!(r"{^\s*(\S+).*?(\S+)\s*$}"), &line) + { + let rev: i64 = m + .get(&CaptureKey::ByIndex(1)) + .and_then(|s| s.parse().ok()) + .unwrap_or(0); + let path = m.get(&CaptureKey::ByIndex(2)).cloned().unwrap_or_default(); + if path == "./" { + last_rev = rev; + } else { + let identifier = self.build_identifier( + &format!("/{}/{}", self.branches_path, path), + std::cmp::max(last_rev, rev), + ); + branches.insert(path.trim_end_matches('/').to_string(), identifier); } } } |
