From ad0a2e144d81d4ff721c36c9be2ee4a31adbbcf6 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sun, 23 Apr 2023 11:21:09 +0200
Subject: [PATCH] fix(versioning/composer): compatible composer numeric soft
 (#21744)

---
 lib/modules/versioning/composer/index.spec.ts | 10 ++++----
 lib/modules/versioning/composer/index.ts      | 23 ++++++++++++-------
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/lib/modules/versioning/composer/index.spec.ts b/lib/modules/versioning/composer/index.spec.ts
index f5ad722ef6..63eaed7e24 100644
--- a/lib/modules/versioning/composer/index.spec.ts
+++ b/lib/modules/versioning/composer/index.spec.ts
@@ -84,8 +84,9 @@ describe('modules/versioning/composer/index', () => {
 
   test.each`
     versions                                                                                   | range        | expected
+    ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']}                                           | ${'~6'}      | ${null}
     ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']}                                           | ${'~4'}      | ${'4.2.0'}
-    ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']}                                      | ${'~4'}      | ${'4.2.0'}
+    ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']}                                      | ${'~4'}      | ${'v4.2.0'}
     ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']}                                           | ${'~0.4'}    | ${'0.5.0'}
     ${['0.4.0', '0.5.0', '4.0.0-beta1', '4.0.0-beta2', '4.2.0-beta1', '4.2.0-beta2', '5.0.0']} | ${'~4@beta'} | ${'4.0.0-beta2'}
   `(
@@ -97,8 +98,9 @@ describe('modules/versioning/composer/index', () => {
 
   test.each`
     versions                                                                             | range        | expected
+    ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']}                                     | ${'~6'}      | ${null}
     ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']}                                     | ${'~4'}      | ${'4.0.0'}
-    ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']}                                | ${'~4'}      | ${'4.0.0'}
+    ${['v0.4.0', 'v0.5.0', 'v4.0.0', 'v4.2.0', 'v5.0.0']}                                | ${'~4'}      | ${'v4.0.0'}
     ${['0.4.0', '0.5.0', '4.0.0', '4.2.0', '5.0.0']}                                     | ${'~0.4'}    | ${'0.4.0'}
     ${['0.4.0', '0.5.0', '4.0.0-beta1', '4.0.0', '4.2.0-beta1', '4.2.0-beta2', '5.0.0']} | ${'~4@beta'} | ${'4.0.0-beta1'}
   `(
@@ -195,8 +197,8 @@ describe('modules/versioning/composer/index', () => {
   );
 
   test.each`
-    versions                                     | expected
-    ${['1.2.3-beta', '2.0.1', '1.3.4', '1.2.3']} | ${['1.2.3-beta', '1.2.3', '1.3.4', '2.0.1']}
+    versions                                                                      | expected
+    ${['1.2.3-beta', '1.0.0-alpha24', '2.0.1', '1.3.4', '1.0.0-alpha9', '1.2.3']} | ${['1.0.0-alpha9', '1.0.0-alpha24', '1.2.3-beta', '1.2.3', '1.3.4', '2.0.1']}
   `('$versions -> sortVersions -> $expected ', ({ versions, expected }) => {
     expect(versions.sort(semver.sortVersions)).toEqual(expected);
   });
diff --git a/lib/modules/versioning/composer/index.ts b/lib/modules/versioning/composer/index.ts
index 1c1db9884b..7fc94cd290 100644
--- a/lib/modules/versioning/composer/index.ts
+++ b/lib/modules/versioning/composer/index.ts
@@ -93,6 +93,7 @@ function composer2npm(input: string): string {
 
       return output + stability;
     })
+    .map((part) => part.replace(/([a-z])([0-9])/gi, '$1.$2'))
     .join(' || ');
 }
 
@@ -147,20 +148,26 @@ function getSatisfyingVersion(
   versions: string[],
   range: string
 ): string | null {
-  return npm.getSatisfyingVersion(
-    versions.map(composer2npm),
-    composer2npm(range)
-  );
+  const npmVersions = versions.map(composer2npm);
+  const npmVersion = npm.getSatisfyingVersion(npmVersions, composer2npm(range));
+  if (!npmVersion) {
+    return null;
+  }
+  // get index of npmVersion in npmVersions
+  return versions[npmVersions.indexOf(npmVersion)] ?? npmVersion;
 }
 
 function minSatisfyingVersion(
   versions: string[],
   range: string
 ): string | null {
-  return npm.minSatisfyingVersion(
-    versions.map(composer2npm),
-    composer2npm(range)
-  );
+  const npmVersions = versions.map(composer2npm);
+  const npmVersion = npm.minSatisfyingVersion(npmVersions, composer2npm(range));
+  if (!npmVersion) {
+    return null;
+  }
+  // get index of npmVersion in npmVersions
+  return versions[npmVersions.indexOf(npmVersion)] ?? npmVersion;
 }
 
 function subset(subRange: string, superRange: string): boolean | undefined {
-- 
GitLab