From eb938e436264ec8c30c48dfd5aa9d86084b05114 Mon Sep 17 00:00:00 2001
From: Maksim <m.v.sharipov@gmail.com>
Date: Mon, 4 Apr 2022 06:24:35 +0200
Subject: [PATCH] refactor(migrations): separateMajorReleases (#14911)

---
 lib/config/migration.ts                       |  3 ---
 .../migrations/base/abstract-migration.ts     |  4 +++
 .../separate-major-release-migration.spec.ts  | 15 +++++++++++
 .../separate-major-release-migration.ts       |  9 +++++++
 .../separate-multiple-major-migration.spec.ts | 27 +++++++++++++++++++
 .../separate-multiple-major-migration.ts      | 11 ++++++++
 lib/config/migrations/migrations-service.ts   |  4 +++
 7 files changed, 70 insertions(+), 3 deletions(-)
 create mode 100644 lib/config/migrations/custom/separate-major-release-migration.spec.ts
 create mode 100644 lib/config/migrations/custom/separate-major-release-migration.ts
 create mode 100644 lib/config/migrations/custom/separate-multiple-major-migration.spec.ts
 create mode 100644 lib/config/migrations/custom/separate-multiple-major-migration.ts

diff --git a/lib/config/migration.ts b/lib/config/migration.ts
index 4deceaaa56..52a4cdea3a 100644
--- a/lib/config/migration.ts
+++ b/lib/config/migration.ts
@@ -128,9 +128,6 @@ export function migrateConfig(
         } else {
           migratedConfig.semanticCommitScope = null;
         }
-      } else if (key === 'separateMajorReleases') {
-        delete migratedConfig.separateMultipleMajor;
-        migratedConfig.separateMajorMinor = val;
       } else if (is.string(val) && val.startsWith('{{semanticPrefix}}')) {
         migratedConfig[key] = val.replace(
           '{{semanticPrefix}}',
diff --git a/lib/config/migrations/base/abstract-migration.ts b/lib/config/migrations/base/abstract-migration.ts
index 78ff8b457a..80fdcb6586 100644
--- a/lib/config/migrations/base/abstract-migration.ts
+++ b/lib/config/migrations/base/abstract-migration.ts
@@ -21,6 +21,10 @@ export abstract class AbstractMigration implements Migration {
     return this.migratedConfig[key] ?? this.originalConfig[key];
   }
 
+  protected has<Key extends keyof RenovateConfig>(key: Key): boolean {
+    return key in this.originalConfig;
+  }
+
   protected setSafely<Key extends keyof RenovateConfig>(
     key: Key,
     value: RenovateConfig[Key]
diff --git a/lib/config/migrations/custom/separate-major-release-migration.spec.ts b/lib/config/migrations/custom/separate-major-release-migration.spec.ts
new file mode 100644
index 0000000000..e43742bec3
--- /dev/null
+++ b/lib/config/migrations/custom/separate-major-release-migration.spec.ts
@@ -0,0 +1,15 @@
+import { SeparateMajorReleasesMigration } from './separate-major-release-migration';
+
+describe('config/migrations/custom/separate-major-release-migration', () => {
+  it('should migrate', () => {
+    expect(SeparateMajorReleasesMigration).toMigrate(
+      {
+        separateMajorReleases: true,
+      },
+      {
+        separateMajorMinor: true,
+        separateMajorReleases: true,
+      }
+    );
+  });
+});
diff --git a/lib/config/migrations/custom/separate-major-release-migration.ts b/lib/config/migrations/custom/separate-major-release-migration.ts
new file mode 100644
index 0000000000..ba31f27494
--- /dev/null
+++ b/lib/config/migrations/custom/separate-major-release-migration.ts
@@ -0,0 +1,9 @@
+import { AbstractMigration } from '../base/abstract-migration';
+
+export class SeparateMajorReleasesMigration extends AbstractMigration {
+  override readonly propertyName = 'separateMajorReleases';
+
+  override run(value: unknown): void {
+    this.setSafely('separateMajorMinor', value);
+  }
+}
diff --git a/lib/config/migrations/custom/separate-multiple-major-migration.spec.ts b/lib/config/migrations/custom/separate-multiple-major-migration.spec.ts
new file mode 100644
index 0000000000..ff1ce38fe5
--- /dev/null
+++ b/lib/config/migrations/custom/separate-multiple-major-migration.spec.ts
@@ -0,0 +1,27 @@
+import { SeparateMultipleMajorMigration } from './separate-multiple-major-migration';
+
+describe('config/migrations/custom/separate-multiple-major-migration', () => {
+  it('should remove if separateMajorReleases exists', () => {
+    expect(SeparateMultipleMajorMigration).toMigrate(
+      {
+        separateMajorReleases: true,
+        separateMultipleMajor: true,
+      },
+      {
+        separateMajorReleases: true,
+      }
+    );
+  });
+
+  it('should skip if separateMajorReleases does not exist', () => {
+    expect(SeparateMultipleMajorMigration).toMigrate(
+      {
+        separateMultipleMajor: true,
+      },
+      {
+        separateMultipleMajor: true,
+      },
+      false
+    );
+  });
+});
diff --git a/lib/config/migrations/custom/separate-multiple-major-migration.ts b/lib/config/migrations/custom/separate-multiple-major-migration.ts
new file mode 100644
index 0000000000..7eff203c25
--- /dev/null
+++ b/lib/config/migrations/custom/separate-multiple-major-migration.ts
@@ -0,0 +1,11 @@
+import { AbstractMigration } from '../base/abstract-migration';
+
+export class SeparateMultipleMajorMigration extends AbstractMigration {
+  override readonly propertyName = 'separateMultipleMajor';
+
+  override run(): void {
+    if (this.has('separateMajorReleases')) {
+      this.delete();
+    }
+  }
+}
diff --git a/lib/config/migrations/migrations-service.ts b/lib/config/migrations/migrations-service.ts
index b97e2a4556..b5203a46a7 100644
--- a/lib/config/migrations/migrations-service.ts
+++ b/lib/config/migrations/migrations-service.ts
@@ -31,6 +31,8 @@ import { RenovateForkMigration } from './custom/renovate-fork-migration';
 import { RequiredStatusChecksMigration } from './custom/required-status-checks-migration';
 import { ScheduleMigration } from './custom/schedule-migration';
 import { SemanticCommitsMigration } from './custom/semantic-commits-migration';
+import { SeparateMajorReleasesMigration } from './custom/separate-major-release-migration';
+import { SeparateMultipleMajorMigration } from './custom/separate-multiple-major-migration';
 import { SuppressNotificationsMigration } from './custom/suppress-notifications-migration';
 import { TrustLevelMigration } from './custom/trust-level-migration';
 import { UnpublishSafeMigration } from './custom/unpublish-safe-migration';
@@ -98,6 +100,8 @@ export class MigrationsService {
     RequiredStatusChecksMigration,
     ScheduleMigration,
     SemanticCommitsMigration,
+    SeparateMajorReleasesMigration,
+    SeparateMultipleMajorMigration,
     SuppressNotificationsMigration,
     TrustLevelMigration,
     UnpublishSafeMigration,
-- 
GitLab