From 0b54d5e590c69256982dae6e4784bcf714075912 Mon Sep 17 00:00:00 2001
From: Maksim <m.v.sharipov@gmail.com>
Date: Sun, 13 Mar 2022 12:38:28 +0100
Subject: [PATCH] refactor(migrations): automergeMajor (#14634)

---
 lib/config/migration.ts                       |  4 --
 .../custom/automerge-major-migration.spec.ts  | 47 +++++++++++++++++++
 .../custom/automerge-major-migration.ts       | 15 ++++++
 lib/config/migrations/migrations-service.ts   |  2 +
 4 files changed, 64 insertions(+), 4 deletions(-)
 create mode 100644 lib/config/migrations/custom/automerge-major-migration.spec.ts
 create mode 100644 lib/config/migrations/custom/automerge-major-migration.ts

diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 28c4249cc1..17550d14af 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -202,10 +202,6 @@ export function migrateConfig(
         migratedConfig.minor = migratedConfig.minor || {};
         migratedConfig.minor.automerge = !!val;
         delete migratedConfig[key];
-      } else if (key === 'automergeMajor') {
-        migratedConfig.major = migratedConfig.major || {};
-        migratedConfig.major.automerge = !!val;
-        delete migratedConfig[key];
       } else if (key === 'separateMajorReleases') {
         delete migratedConfig.separateMultipleMajor;
         migratedConfig.separateMajorMinor = val;
diff --git a/lib/config/migrations/custom/automerge-major-migration.spec.ts b/lib/config/migrations/custom/automerge-major-migration.spec.ts
new file mode 100644
index 0000000000..0d2a9a7d30
--- /dev/null
+++ b/lib/config/migrations/custom/automerge-major-migration.spec.ts
@@ -0,0 +1,47 @@
+import { AutomergeMajorMigration } from './automerge-major-migration';
+
+describe('config/migrations/custom/automerge-major-migration', () => {
+  it('should migrate value to object', () => {
+    expect(AutomergeMajorMigration).toMigrate(
+      {
+        automergeMajor: 'some-value',
+      },
+      {
+        major: {
+          automerge: true,
+        },
+      }
+    );
+  });
+
+  it('should migrate value to object and concat with existing minor object', () => {
+    expect(AutomergeMajorMigration).toMigrate(
+      {
+        automergeMajor: 'some-value',
+        major: {
+          matchFiles: ['test'],
+        },
+      },
+      {
+        major: {
+          automerge: true,
+          matchFiles: ['test'],
+        },
+      }
+    );
+  });
+
+  it('should ignore non object minor value', () => {
+    expect(AutomergeMajorMigration).toMigrate(
+      {
+        automergeMajor: 'some-value',
+        major: null,
+      },
+      {
+        major: {
+          automerge: true,
+        },
+      }
+    );
+  });
+});
diff --git a/lib/config/migrations/custom/automerge-major-migration.ts b/lib/config/migrations/custom/automerge-major-migration.ts
new file mode 100644
index 0000000000..f99c552651
--- /dev/null
+++ b/lib/config/migrations/custom/automerge-major-migration.ts
@@ -0,0 +1,15 @@
+import is from '@sindresorhus/is';
+import { AbstractMigration } from '../base/abstract-migration';
+
+export class AutomergeMajorMigration extends AbstractMigration {
+  override readonly deprecated = true;
+  override readonly propertyName = 'automergeMajor';
+
+  override run(value: unknown): void {
+    const major = this.get('major');
+
+    const newMajor = is.object(major) ? major : {};
+    newMajor.automerge = Boolean(value);
+    this.setHard('major', newMajor);
+  }
+}
diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts
index d24c4e2f7e..42b4246b4e 100644
--- a/lib/config/migrations/migrations-service.ts
+++ b/lib/config/migrations/migrations-service.ts
@@ -2,6 +2,7 @@ import { dequal } from 'dequal';
 import type { RenovateConfig } from '../types';
 import { RemovePropertyMigration } from './base/remove-property-migration';
 import { RenamePropertyMigration } from './base/rename-property-migration';
+import { AutomergeMajorMigration } from './custom/automerge-major-migration';
 import { AutomergeTypeMigration } from './custom/automerge-type-migration';
 import { BinarySourceMigration } from './custom/binary-source-migration';
 import { CompatibilityMigration } from './custom/compatibility-migration';
@@ -55,6 +56,7 @@ export class MigrationsService {
   ]);
 
   static readonly customMigrations: ReadonlyArray<MigrationConstructor> = [
+    AutomergeMajorMigration,
     AutomergeTypeMigration,
     BinarySourceMigration,
     CompatibilityMigration,
-- 
GitLab