From d5f3d6fcea4324aea4e4da7dc1e8719c0a0c9c36 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 5 Mar 2024 15:02:51 +0100
Subject: [PATCH] fix(datasource/docker): better reuse of lookupName for
 getDigest (#27724)

---
 lib/modules/datasource/docker/index.spec.ts   |  6 ++++--
 lib/modules/datasource/docker/index.ts        | 19 ++++++++++++++-----
 lib/modules/datasource/index.ts               | 19 +++++++++++--------
 lib/modules/datasource/types.ts               |  3 +++
 .../repository/process/lookup/index.ts        |  3 ++-
 5 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/lib/modules/datasource/docker/index.spec.ts b/lib/modules/datasource/docker/index.spec.ts
index e02ea8a5fb..d450cbad18 100644
--- a/lib/modules/datasource/docker/index.spec.ts
+++ b/lib/modules/datasource/docker/index.spec.ts
@@ -491,14 +491,16 @@ describe('modules/datasource/docker/index', () => {
         .scope(gcrUrl)
         .get('/')
         .reply(200)
-        .head('/some-project/some-package/manifests/some-tag')
+        .head('/google.com/some-project/some-package/manifests/some-tag')
         .reply(200, '', { 'docker-content-digest': 'some-digest' });
 
       hostRules.find.mockReturnValue({});
       const res = await getDigest(
         {
           datasource: 'docker',
-          packageName: 'eu.gcr.io/some-project/some-package',
+          registryUrl: 'https://eu.gcr.io',
+          lookupName: 'google.com/some-project/some-package',
+          packageName: 'eu.gcr.io/google.com/some-project/some-package',
         },
         'some-tag',
       );
diff --git a/lib/modules/datasource/docker/index.ts b/lib/modules/datasource/docker/index.ts
index 92f23dfdab..5d896ed774 100644
--- a/lib/modules/datasource/docker/index.ts
+++ b/lib/modules/datasource/docker/index.ts
@@ -788,13 +788,22 @@ export class DockerDatasource extends Datasource {
     },
   })
   override async getDigest(
-    { registryUrl, packageName, currentDigest }: DigestConfig,
+    { registryUrl, lookupName, packageName, currentDigest }: DigestConfig,
     newValue?: string,
   ): Promise<string | null> {
-    const { registryHost, dockerRepository } = getRegistryRepository(
-      packageName,
-      registryUrl!,
-    );
+    let registryHost: string;
+    let dockerRepository: string;
+    if (registryUrl && lookupName) {
+      // Reuse the resolved values from getReleases()
+      registryHost = registryUrl;
+      dockerRepository = lookupName;
+    } else {
+      // Resolve values independently
+      ({ registryHost, dockerRepository } = getRegistryRepository(
+        packageName,
+        registryUrl!,
+      ));
+    }
     logger.debug(
       // TODO: types (#22198)
       `getDigest(${registryHost}, ${dockerRepository}, ${newValue})`,
diff --git a/lib/modules/datasource/index.ts b/lib/modules/datasource/index.ts
index 743552e57e..a8a7d1c1c6 100644
--- a/lib/modules/datasource/index.ts
+++ b/lib/modules/datasource/index.ts
@@ -398,15 +398,18 @@ function getDigestConfig(
   datasource: DatasourceApi,
   config: GetDigestInputConfig,
 ): DigestConfig {
-  const { currentValue, currentDigest } = config;
+  const { lookupName, currentValue, currentDigest } = config;
   const packageName = config.replacementName ?? config.packageName;
-  const [registryUrl] = resolveRegistryUrls(
-    datasource,
-    config.defaultRegistryUrls,
-    config.registryUrls,
-    config.additionalRegistryUrls,
-  );
-  return { packageName, registryUrl, currentValue, currentDigest };
+  // Prefer registryUrl from getReleases() lookup if it has been passed
+  const registryUrl =
+    config.registryUrl ??
+    resolveRegistryUrls(
+      datasource,
+      config.defaultRegistryUrls,
+      config.registryUrls,
+      config.additionalRegistryUrls,
+    )[0];
+  return { lookupName, packageName, registryUrl, currentValue, currentDigest };
 }
 
 export function getDigest(
diff --git a/lib/modules/datasource/types.ts b/lib/modules/datasource/types.ts
index 652c190d66..c08a04ae3f 100644
--- a/lib/modules/datasource/types.ts
+++ b/lib/modules/datasource/types.ts
@@ -9,6 +9,8 @@ export interface GetDigestInputConfig {
   packageName: string;
   defaultRegistryUrls?: string[];
   registryUrls?: string[] | null;
+  registryUrl?: string;
+  lookupName?: string;
   additionalRegistryUrls?: string[];
   currentValue?: string;
   currentDigest?: string;
@@ -17,6 +19,7 @@ export interface GetDigestInputConfig {
 
 export interface DigestConfig {
   packageName: string;
+  lookupName?: string;
   registryUrl?: string;
   currentValue?: string;
   currentDigest?: string;
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index d6a978abed..0d17bad8eb 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -500,7 +500,8 @@ export async function lookupUpdates(
         if (config.pinDigests === true || config.currentDigest) {
           const getDigestConfig: GetDigestInputConfig = {
             ...config,
-            packageName: res.lookupName ?? config.packageName,
+            registryUrl: update.registryUrl ?? res.registryUrl,
+            lookupName: res.lookupName,
           };
           // TODO #22198
           update.newDigest ??=
-- 
GitLab