From c98a537f8b10cfb7a12aabecf5378287153c76b9 Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Fri, 11 Dec 2020 12:26:47 +0400
Subject: [PATCH] refactor(limits): Refactor global limits counter (#7931)

---
 lib/workers/global/initialize.ts  |  8 +++++++-
 lib/workers/global/limits.spec.ts | 21 +++++++++++++++++++++
 lib/workers/global/limits.ts      | 13 ++++---------
 3 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/lib/workers/global/initialize.ts b/lib/workers/global/initialize.ts
index f159bfdc7c..7eafa5e0c3 100644
--- a/lib/workers/global/initialize.ts
+++ b/lib/workers/global/initialize.ts
@@ -28,6 +28,12 @@ async function setDirectories(input: RenovateConfig): Promise<RenovateConfig> {
   return config;
 }
 
+function limitCommitsPerRun(config: RenovateConfig): void {
+  let limit = config.prCommitsPerRunLimit;
+  limit = typeof limit === 'number' && limit > 0 ? limit : null;
+  setMaxLimit(Limit.Commits, limit);
+}
+
 export async function globalInitialize(
   config_: RenovateConfig
 ): Promise<RenovateConfig> {
@@ -35,7 +41,7 @@ export async function globalInitialize(
   config = await initPlatform(config);
   config = await setDirectories(config);
   packageCache.init(config);
-  setMaxLimit(Limit.Commits, config.prCommitsPerRunLimit);
+  limitCommitsPerRun(config);
   setEmojiConfig(config);
   return config;
 }
diff --git a/lib/workers/global/limits.spec.ts b/lib/workers/global/limits.spec.ts
index d2a4ad8b6b..8714b92869 100644
--- a/lib/workers/global/limits.spec.ts
+++ b/lib/workers/global/limits.spec.ts
@@ -37,7 +37,28 @@ describe('lib/workers/global/limits', () => {
   it('increments undefined', () => {
     incLimitedValue(Limit.Commits);
     expect(isLimitReached(Limit.Commits)).toBe(false);
+  });
+
+  it('resets counter', () => {
     setMaxLimit(Limit.Commits, 1);
+    incLimitedValue(Limit.Commits);
     expect(isLimitReached(Limit.Commits)).toBe(true);
+    setMaxLimit(Limit.Commits, 1);
+    expect(isLimitReached(Limit.Commits)).toBe(false);
+  });
+
+  it('resets limit', () => {
+    setMaxLimit(Limit.Commits, 1);
+    incLimitedValue(Limit.Commits);
+    expect(isLimitReached(Limit.Commits)).toBe(true);
+    setMaxLimit(Limit.Commits, null);
+    expect(isLimitReached(Limit.Commits)).toBe(false);
+  });
+
+  it('sets non-positive limit as reached', () => {
+    setMaxLimit(Limit.Commits, 0);
+    expect(isLimitReached(Limit.Commits)).toBeTrue();
+    setMaxLimit(Limit.Commits, -1000);
+    expect(isLimitReached(Limit.Commits)).toBeTrue();
   });
 });
diff --git a/lib/workers/global/limits.ts b/lib/workers/global/limits.ts
index 5bb983bb09..04d194c72d 100644
--- a/lib/workers/global/limits.ts
+++ b/lib/workers/global/limits.ts
@@ -15,15 +15,10 @@ export function resetAllLimits(): void {
   limits.clear();
 }
 
-export function setMaxLimit(key: Limit, max: unknown): void {
-  const maxVal = typeof max === 'number' && max > 0 ? max : null;
-  logger.debug(`${key} limit = ${maxVal}`);
-  const limit = limits.get(key);
-  limits.set(key, {
-    current: 0,
-    ...limit,
-    max: maxVal,
-  });
+export function setMaxLimit(key: Limit, val: unknown): void {
+  const max = typeof val === 'number' ? Math.max(0, val) : null;
+  limits.set(key, { current: 0, max });
+  logger.debug(`${key} limit = ${max}`);
 }
 
 export function incLimitedValue(key: Limit, incBy = 1): void {
-- 
GitLab