From 735129bbd74703abbf048ea129ee5c0e018e7d58 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Fri, 19 May 2023 22:37:31 +0200
Subject: [PATCH] fix(versioning/composer): handle abnormal subset ranges
 (#22319)

---
 lib/modules/versioning/composer/index.spec.ts |  4 ++++
 lib/modules/versioning/composer/index.ts      | 12 +++++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/lib/modules/versioning/composer/index.spec.ts b/lib/modules/versioning/composer/index.spec.ts
index f11774f78c..e1bcbd602e 100644
--- a/lib/modules/versioning/composer/index.spec.ts
+++ b/lib/modules/versioning/composer/index.spec.ts
@@ -69,6 +69,8 @@ describe('modules/versioning/composer/index', () => {
     ${'~1.0 | ~2.0'}  | ${true}
     ${'~1.0||~2.0'}   | ${true}
     ${'~1.0 || ~2.0'} | ${true}
+    ${'<8.0-DEV'}     | ${true}
+    ${'<8-DEV'}       | ${true}
   `('isValid("$version") === $expected', ({ version, expected }) => {
     const res = !!semver.isValid(version);
     expect(res).toBe(expected);
@@ -134,6 +136,8 @@ describe('modules/versioning/composer/index', () => {
     ${'^1.0.0'}           | ${'^0.9.0'}           | ${false}
     ${'^1.1.0 || ^2.0.0'} | ${'^1.0.0 || ^2.0.0'} | ${true}
     ${'^1.0.0 || ^2.0.0'} | ${'^1.1.0 || ^2.0.0'} | ${false}
+    ${'^7.0.0'}           | ${'<8.0-DEV'}         | ${true}
+    ${'^7.0.0'}           | ${'less than 8'}      | ${false}
   `('subset("$a", "$b") === $expected', ({ a, b, expected }) => {
     expect(semver.subset!(a, b)).toBe(expected);
   });
diff --git a/lib/modules/versioning/composer/index.ts b/lib/modules/versioning/composer/index.ts
index 7fc94cd290..9a6a2ef905 100644
--- a/lib/modules/versioning/composer/index.ts
+++ b/lib/modules/versioning/composer/index.ts
@@ -91,6 +91,11 @@ function composer2npm(input: string): string {
         '>=$1 <1'
       );
 
+      // add extra digits to <8-DEV and <8.0-DEV
+      output = output
+        .replace(regEx(/^(<\d+(\.\d+)?)$/g), '$1.0')
+        .replace(regEx(/^(<\d+(\.\d+)?)$/g), '$1.0');
+
       return output + stability;
     })
     .map((part) => part.replace(/([a-z])([0-9])/gi, '$1.$2'))
@@ -171,7 +176,12 @@ function minSatisfyingVersion(
 }
 
 function subset(subRange: string, superRange: string): boolean | undefined {
-  return npm.subset!(composer2npm(subRange), composer2npm(superRange));
+  try {
+    return npm.subset!(composer2npm(subRange), composer2npm(superRange));
+  } catch (err) {
+    logger.trace({ err }, 'composer.subset error');
+    return false;
+  }
 }
 
 function getNewValue({
-- 
GitLab