diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-07-24 20:23:12 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-07-24 20:23:12 +0900 |
| commit | 76c6d132fbc8341bdf14537bba7f00b073eddbc1 (patch) | |
| tree | 3a2e9e2540d057d1f1304ee68534c8a2a778ca98 /crates/shirabe/src/dependency_resolver | |
| parent | 7d29b5116d51a2f4ae5f90b1ef33a4b1454edebd (diff) | |
| download | php-shirabe-76c6d132fbc8341bdf14537bba7f00b073eddbc1.tar.gz php-shirabe-76c6d132fbc8341bdf14537bba7f00b073eddbc1.tar.zst php-shirabe-76c6d132fbc8341bdf14537bba7f00b073eddbc1.zip | |
fix(package): rewrite dist-reference SHA regex without look-around
Package::set_source_dist_references and LockTransaction's dist-url
mirroring both used {(?<=/|sha=)[a-f0-9]{40}(?=/|$)}i, but the regex
crate has no look-around support at all and panics compiling it. Per
docs/dev/regex-porting.md, rewrote the boundary assertions into
capturing groups and switched to Preg::replace_callback, which
re-emits the captured delimiters around the replaced reference.
Diffstat (limited to 'crates/shirabe/src/dependency_resolver')
| -rw-r--r-- | crates/shirabe/src/dependency_resolver/lock_transaction.rs | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/crates/shirabe/src/dependency_resolver/lock_transaction.rs b/crates/shirabe/src/dependency_resolver/lock_transaction.rs index 1beedd24..d78db851 100644 --- a/crates/shirabe/src/dependency_resolver/lock_transaction.rs +++ b/crates/shirabe/src/dependency_resolver/lock_transaction.rs @@ -166,9 +166,30 @@ impl LockTransaction { &package.get_dist_url().unwrap(), ) { - let new_dist_url = Preg::replace( - php_regex!(r"{(?<=/|sha=)[a-f0-9]{40}(?=/|$)}i"), - &present_package.get_dist_reference().unwrap(), + // Regex pattern compatibility: + // The `regex` crate has no look-around, so `(?<=/|sha=)[a-f0-9]{40}(?=/|$)` is + // rewritten to capture the boundary delimiters instead of asserting them, and the + // callback re-emits them around the replaced reference. Unlike the zero-width + // 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. + let dist_reference = present_package.get_dist_reference().unwrap(); + let new_dist_url = Preg::replace_callback( + php_regex!(r"{(/|sha=)[a-f0-9]{40}(/|$)}i"), + |m: &indexmap::IndexMap< + shirabe_external_packages::composer::pcre::CaptureKey, + String, + >| + -> String { + let get = |i: usize| -> String { + m.get( + &shirabe_external_packages::composer::pcre::CaptureKey::ByIndex(i), + ) + .cloned() + .unwrap_or_default() + }; + format!("{}{}{}", get(1), dist_reference, get(2)) + }, &package.get_dist_url().unwrap(), ); present_package.set_dist_url(Some(new_dist_url)); |
