repairMigration method

Future<File?> repairMigration({
  1. String? tag,
  2. required bool force,
  3. required String runMode,
  4. String? targetMigrationVersion,
})

Creates a repair migration that will bring the database up to date with the targeted migration version.

If targetMigrationVersion is not specified, the latest migration version will be used.

Returns the repair migration file, or null if no migration was created.

Implementation

Future<File?> repairMigration({
  String? tag,
  required bool force,
  required String runMode,
  String? targetMigrationVersion,
}) async {
  var migrationVersion =
      targetMigrationVersion ?? _getLatestMigrationVersion();

  _validateRepairMigrationVersion(migrationVersion);

  DatabaseDefinition dstDatabase = await _getSourceDatabaseDefinition(
    projectName,
    migrationVersion,
  );

  var client = ConfigInfo(runMode).createServiceClient();
  DatabaseDefinition liveDatabase;
  try {
    liveDatabase = await client.insights.getLiveDatabaseDefinition();
  } catch (e) {
    throw MigrationLiveDatabaseDefinitionException(
      exception: e.toString(),
    );
  } finally {
    client.close();
  }

  var migration = generateDatabaseMigration(
    databaseSource: liveDatabase,
    databaseTarget: dstDatabase,
  );

  var warnings = migration.warnings;
  _printWarnings(warnings);

  if (warnings.isNotEmpty && !force) {
    log.info('Migration aborted. Use --force to ignore warnings.');
    return null;
  }

  bool versionsMismatch = _moduleVersionMismatch(liveDatabase, dstDatabase);

  if (migration.isEmpty && !versionsMismatch && !force) {
    log.info(
      'No changes detected. Use --force to create an empty repair migration.',
    );
    return null;
  }

  var repairMigrationName = createVersionName(tag);

  var installedModules = [
    ...dstDatabase.installedModules,
    DatabaseMigrationVersion(
      module: MigrationConstants.repairMigrationModuleName,
      version: repairMigrationName,
    )
  ];

  List<DatabaseMigrationVersion> removedModules = _removedModulesDiff(
    liveDatabase.installedModules,
    installedModules,
  );

  return _writeRepairMigration(
    repairMigrationName,
    migration,
    installedModules,
    removedModules,
  );
}