writeMigration function

Future<String> writeMigration(
  1. Migration migration, {
  2. required String directory,
  3. required MigrationHistory history,
})

Saves a new fixed migration and updates the registry. Never replaces a file.

Implementation

Future<String> writeMigration(
  Migration migration, {
  required String directory,
  required MigrationHistory history,
}) async {
  final previous = history.checked;
  final all = [...previous, migration];
  validateMigrations(all, dialect: history.dialect);
  await _registryDialect(directory, history.dialect);
  final root = Directory(directory);
  await root.create(recursive: true);
  await _checkMigrationFiles(root, previous);
  final source = formatMigration(migrationSource(migration));
  final registry = formatMigration(
    migrationHistorySource(all.map((m) => m.id), dialect: history.dialect),
  );
  final file = File(p.join(directory, 'm${migration.id}.dart'));
  if (await FileSystemEntity.type(file.path, followLinks: false) !=
      FileSystemEntityType.notFound) {
    throw GenerationException('Migration already exists: ${file.path}');
  }
  await file.create(exclusive: true);
  try {
    await file.writeAsString(source, flush: true);
    await _replaceSource(p.join(directory, 'migrations.g.dart'), registry);
  } catch (_) {
    await file.delete();
    rethrow;
  }
  return file.path;
}