From 735129bbd74703abbf048ea129ee5c0e018e7d58 Mon Sep 17 00:00:00 2001 From: Rhys Arkins 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 f11774f78c3308..e1bcbd602e90da 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 7fc94cd290cc9c..9a6a2ef905fada 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({