From 1acda01b6e2735dce7543d6219162d9130b77447 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sat, 13 Feb 2021 10:55:44 +0100
Subject: [PATCH] refactor: store bucket releases, not versions

---
 lib/versioning/pep440/index.spec.ts           |  9 ++++
 .../repository/process/lookup/index.ts        | 46 ++++++++++---------
 2 files changed, 34 insertions(+), 21 deletions(-)

diff --git a/lib/versioning/pep440/index.spec.ts b/lib/versioning/pep440/index.spec.ts
index 8fae2af3b7..199acb23b0 100644
--- a/lib/versioning/pep440/index.spec.ts
+++ b/lib/versioning/pep440/index.spec.ts
@@ -38,6 +38,15 @@ describe('pep440.isStable(version)', () => {
   });
 });
 
+describe('pep440.equals(version1, version2)', () => {
+  it('returns correct true', () => {
+    expect(pep440.equals('1.0', '1.0.0')).toBeTruthy();
+  });
+  it('returns false when version invalid', () => {
+    expect(pep440.equals('1.0.0', '1.0..foo')).toBeFalsy();
+  });
+});
+
 describe('pep440.isSingleVersion()', () => {
   it('returns true if naked version', () => {
     expect(pep440.isSingleVersion('1.2.3')).toBeTruthy();
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index 2b61c65dca..88b576ee9a 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -311,20 +311,26 @@ export async function lookupUpdates(
     if (vulnerabilityAlert) {
       filteredVersions = filteredVersions.slice(0, 1);
     }
-    const buckets: Record<string, [string]> = {};
-    for (const toVersion of filteredVersions.map((v) => v.version)) {
-      const bucket = getBucket(config, fromVersion, toVersion, versioning);
+    const buckets: Record<string, [Release]> = {};
+    for (const release of filteredVersions) {
+      const bucket = getBucket(
+        config,
+        fromVersion,
+        release.version,
+        versioning
+      );
       if (buckets[bucket]) {
-        buckets[bucket].push(toVersion);
+        buckets[bucket].push(release);
       } else {
-        buckets[bucket] = [toVersion];
+        buckets[bucket] = [release];
       }
     }
-    for (const [bucket, versions] of Object.entries(buckets)) {
-      const bucketVersions = versions.sort((v1, v2) =>
-        versioning.sortVersions(v1, v2)
+    for (const [bucket, bucketReleases] of Object.entries(buckets)) {
+      const sortedReleases = bucketReleases.sort((r1, r2) =>
+        versioning.sortVersions(r1.version, r2.version)
       );
-      const toVersion = bucketVersions.pop();
+      const release = sortedReleases.pop();
+      const toVersion = release.version;
       const update: LookupUpdate = { fromVersion, toVersion, newValue: null };
       update.bucket = bucket;
       try {
@@ -367,21 +373,19 @@ export async function lookupUpdates(
       if (!versioning.isVersion(update.newValue)) {
         update.isRange = true;
       }
-      const updateRelease = releases.find((release) =>
-        versioning.equals(release.version, toVersion)
-      );
-      // TODO: think more about whether to just Object.assign this
-      const releaseFields: (keyof Pick<
-        Release,
-        'releaseTimestamp' | 'downloadUrl' | 'checksumUrl' | 'newDigest'
-      >)[] = ['releaseTimestamp', 'newDigest'];
+      const releaseFields = [
+        'checksumUrl',
+        'downloadUrl',
+        'newDigest',
+        'releaseTimestamp',
+      ];
       releaseFields.forEach((field) => {
-        if (updateRelease[field] !== undefined) {
-          update[field] = updateRelease[field] as never;
+        if (release[field] !== undefined) {
+          update[field] = release[field];
         }
       });
-      if (bucketVersions.length) {
-        update.skippedOverVersions = bucketVersions;
+      if (sortedReleases.length) {
+        update.skippedOverVersions = sortedReleases.map((r) => r.version);
       }
       if (
         rangeStrategy === 'update-lockfile' &&
-- 
GitLab