deployMigrations method

Future<DeployResult> deployMigrations({
  1. required SessionExecutor executor,
  2. required String migrationsDirectory,
})

Applies all pending local migrations in order.

Implementation

Future<DeployResult> deployMigrations({
  required pg.SessionExecutor executor,
  required String migrationsDirectory,
}) async {
  final localArtifacts = loadLocalMigrationArtifacts(
    migrationsDirectory,
    provider: PostgresqlMigrationRunner.providerName,
  );
  final activeNames = (await runner.loadActiveHistory(
    executor,
  )).map((record) => record.name).toSet();
  final appliedMigrationNames = <String>[];

  for (final artifact in localArtifacts) {
    if (activeNames.contains(artifact.name)) {
      continue;
    }

    if (containsManualMigrationWarnings(artifact.warnings)) {
      throw ManualMigrationRequiredException(
        'Migration `${artifact.name}` requires manual migration and cannot be applied automatically. Complete the change manually, then run `migrate resolve --applied ${artifact.name}`.',
      );
    }

    await runner.migrateToSchema(
      executor: executor,
      target: const SchemaParser().parse(artifact.afterSchema),
      migrationName: artifact.name,
      allowWarnings: true,
    );
    activeNames.add(artifact.name);
    appliedMigrationNames.add(artifact.name);
  }

  return DeployResult(
    localMigrationCount: localArtifacts.length,
    appliedMigrationNames: List<String>.unmodifiable(appliedMigrationNames),
  );
}