From 726e3e4e4e91c229ec3432312ccf31b0b90c0dfb Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Mon, 12 Feb 2024 16:24:58 -0300
Subject: [PATCH] fix(datasource): Check release constraints validity (#27191)

---
 lib/modules/datasource/common.spec.ts |  4 +--
 lib/modules/datasource/common.ts      | 45 ++++++++++++++++++++++-----
 2 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/lib/modules/datasource/common.spec.ts b/lib/modules/datasource/common.spec.ts
index 67e7ebccde..703283f9c0 100644
--- a/lib/modules/datasource/common.spec.ts
+++ b/lib/modules/datasource/common.spec.ts
@@ -218,8 +218,8 @@ describe('modules/datasource/common', () => {
       const releaseResult = {
         releases: [
           { version: '1.0.0' },
-          { version: '2.0.0', constraints: {} as never },
-          { version: '3.0.0', constraints: { baz: ['^0.9.0'] } },
+          { version: '2.0.0', constraints: { baz: [undefined] } as never },
+          { version: '3.0.0', constraints: { baz: ['^0.9.0', 'invalid'] } },
         ],
       };
       expect(applyConstraintsFiltering(releaseResult, config)).toEqual({
diff --git a/lib/modules/datasource/common.ts b/lib/modules/datasource/common.ts
index 9cb24fd158..6b952da4f4 100644
--- a/lib/modules/datasource/common.ts
+++ b/lib/modules/datasource/common.ts
@@ -181,14 +181,43 @@ export function applyConstraintsFiltering<
         continue;
       }
 
-      const satisfiesConstraints = constraint.some(
-        // If the constraint value is a subset of any release's constraints, then it's OK
-        // fallback to release's constraint match if subset is not supported by versioning
-        (releaseConstraint) =>
-          !releaseConstraint ||
-          (versioning.subset?.(configConstraint, releaseConstraint) ??
-            versioning.matches(configConstraint, releaseConstraint)),
-      );
+      let satisfiesConstraints = false;
+      for (const releaseConstraint of constraint) {
+        if (!releaseConstraint) {
+          satisfiesConstraints = true;
+          logger.once.debug(
+            {
+              packageName: config.packageName,
+              versioning: versioningName,
+              constraint: releaseConstraint,
+            },
+            'Undefined release constraint',
+          );
+          break;
+        }
+
+        if (!versioning.isValid(releaseConstraint)) {
+          logger.once.debug(
+            {
+              packageName: config.packageName,
+              versioning: versioningName,
+              constraint: releaseConstraint,
+            },
+            'Invalid release constraint',
+          );
+          break;
+        }
+
+        if (versioning.subset?.(configConstraint, releaseConstraint)) {
+          satisfiesConstraints = true;
+          break;
+        }
+
+        if (versioning.matches(configConstraint, releaseConstraint)) {
+          satisfiesConstraints = true;
+          break;
+        }
+      }
 
       if (!satisfiesConstraints) {
         filteredReleases.push(release.version);
-- 
GitLab