aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/dependency_resolver')
-rw-r--r--crates/shirabe/src/dependency_resolver/lock_transaction.rs27
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));