diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-07-20 06:28:35 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-07-20 06:28:35 +0900 |
| commit | f74e69ad1147618efd174791ac12904c0dcc6e28 (patch) | |
| tree | a0dc3f49338c470b7197d5e1f6a38975b4b1da79 /crates/shirabe-semver/src | |
| parent | de56316efae59dc1bfd517b90bc66611d017a52a (diff) | |
| download | php-shirabe-f74e69ad1147618efd174791ac12904c0dcc6e28.tar.gz php-shirabe-f74e69ad1147618efd174791ac12904c0dcc6e28.tar.zst php-shirabe-f74e69ad1147618efd174791ac12904c0dcc6e28.zip | |
fix(semver): stop classical pattern matching 6+ digit versions
The regex crate parses PCRE's possessive \d{1,5}+ as a stacked
repetition (?:\d{1,5})+, i.e. \d+, so date versions like 20121020
matched the classical pattern and normalized to 20121020.0.0.0 instead
of falling through to the date(time) pattern like PHP. The plain
\d{1,5} is equivalent to the possessive form here per the
regex-porting rules. Un-ignore test_find_recommended_require_version
which this had blocked.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe-semver/src')
| -rw-r--r-- | crates/shirabe-semver/src/version_parser.rs | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/crates/shirabe-semver/src/version_parser.rs b/crates/shirabe-semver/src/version_parser.rs index c27f7819..287716d9 100644 --- a/crates/shirabe-semver/src/version_parser.rs +++ b/crates/shirabe-semver/src/version_parser.rs @@ -128,8 +128,13 @@ impl VersionParser { let mut matches: Vec<Option<String>> = Vec::new(); // match classical versioning + // Regex pattern compatibility: + // PCRE's possessive `\d{1,5}+` is parsed by the `regex` crate as a stacked + // repetition `(?:\d{1,5})+` (i.e. `\d+`), which wrongly let 6+ digit numbers + // (e.g. date versions like 20121020) match here. The plain `\d{1,5}` is + // equivalent to the possessive form for this pattern. let classical_pattern = format!( - "{{^v?(\\d{{1,5}}+)(\\.\\d++)?(\\.\\d++)?(\\.\\d++)?{}$}}i", + "{{^v?(\\d{{1,5}})(\\.\\d++)?(\\.\\d++)?(\\.\\d++)?{}$}}i", MODIFIER_REGEX ); if shirabe_php_shim::preg_match(&classical_pattern, &version, &mut matches) { |
