From 6964458df17e181bb4fd5df000f46387e860cbb7 Mon Sep 17 00:00:00 2001
From: RahulGautamSingh <rahultesnik@gmail.com>
Date: Fri, 17 Jan 2025 21:28:40 +0530
Subject: [PATCH] fix(config/inherited): set `hostRules` (#33530)

---
 lib/workers/repository/init/inherited.spec.ts | 23 +++++++++++++++-
 lib/workers/repository/init/inherited.ts      | 26 +++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/lib/workers/repository/init/inherited.spec.ts b/lib/workers/repository/init/inherited.spec.ts
index e31f5ba2fc..5808c82d53 100644
--- a/lib/workers/repository/init/inherited.spec.ts
+++ b/lib/workers/repository/init/inherited.spec.ts
@@ -1,4 +1,4 @@
-import { mocked, platform } from '../../../../test/util';
+import { hostRules, mocked, platform } from '../../../../test/util';
 import * as presets_ from '../../../config/presets';
 import type { RenovateConfig } from '../../../config/types';
 import * as validation from '../../../config/validation';
@@ -91,6 +91,27 @@ describe('workers/repository/init/inherited', () => {
     expect(logger.warn).not.toHaveBeenCalled();
   });
 
+  it('should set hostRules from inherited config', async () => {
+    platform.getRawFile.mockResolvedValue(
+      `{
+        "hostRules": [
+          {
+            "matchHost": "some-host-url",
+            "token": "some-token"
+          }
+        ]
+      }`,
+    );
+    const res = await mergeInheritedConfig(config);
+    expect(hostRules.getAll()).toMatchObject([
+      {
+        matchHost: 'some-host-url',
+        token: 'some-token',
+      },
+    ]);
+    expect(res.hostRules).toBeUndefined();
+  });
+
   it('should resolve presets found in inherited config', async () => {
     platform.getRawFile.mockResolvedValue(
       '{"onboarding":false,"labels":["test"],"extends":[":automergeAll"]}',
diff --git a/lib/workers/repository/init/inherited.ts b/lib/workers/repository/init/inherited.ts
index d924ff825b..da497ca5ae 100644
--- a/lib/workers/repository/init/inherited.ts
+++ b/lib/workers/repository/init/inherited.ts
@@ -12,6 +12,9 @@ import {
 } from '../../../constants/error-messages';
 import { logger } from '../../../logger';
 import { platform } from '../../../modules/platform';
+import * as hostRules from '../../../util/host-rules';
+import * as queue from '../../../util/http/queue';
+import * as throttle from '../../../util/http/throttle';
 import * as template from '../../../util/template';
 
 export async function mergeInheritedConfig(
@@ -102,6 +105,7 @@ export async function mergeInheritedConfig(
   }
 
   if (is.nullOrUndefined(filteredConfig.extends)) {
+    setInheritedHostRules(filteredConfig);
     return mergeChildConfig(config, filteredConfig);
   }
 
@@ -137,5 +141,27 @@ export async function mergeInheritedConfig(
     );
   }
 
+  setInheritedHostRules(filteredConfig);
   return mergeChildConfig(config, filteredConfig);
 }
+
+function setInheritedHostRules(config: RenovateConfig): void {
+  if (config.hostRules) {
+    logger.debug('Setting hostRules from config');
+    for (const rule of config.hostRules) {
+      try {
+        hostRules.add(rule);
+      } catch (err) {
+        // istanbul ignore next
+        logger.warn(
+          { err, config: rule },
+          'Error setting hostRule from config',
+        );
+      }
+    }
+    // host rules can change concurrency
+    queue.clear();
+    throttle.clear();
+    delete config.hostRules;
+  }
+}
-- 
GitLab