public function execute(InputInterface $input, OutputInterface $output)
{
$configuration = $this->getMigrationConfiguration($input, $output);
$migration = $this->createMigration($configuration);
$this->outputHeader($configuration, $output);
$timeAllqueries = $input->getOption('query-time');
$executedMigrations = $configuration->getMigratedVersions();
$availableMigrations = $configuration->getAvailableVersions();
$version = $this->getVersionNameFromAlias($input->getArgument('version'), $output, $configuration);
if ($version === false) {
return 1;
}
$executedUnavailableMigrations = array_diff($executedMigrations, $availableMigrations);
if (!empty($executedUnavailableMigrations)) {
$output->writeln(sprintf('<error>WARNING! You have %s previously executed migrations' . ' in the database that are not registered migrations.</error>', count($executedUnavailableMigrations)));
foreach ($executedUnavailableMigrations as $executedUnavailableMigration) {
$output->writeln(sprintf(' <comment>>></comment> %s (<comment>%s</comment>)', $configuration->getDateTime($executedUnavailableMigration), $executedUnavailableMigration));
}
$question = 'Are you sure you wish to continue? (y/n)';
if (!$this->canExecute($question, $input, $output)) {
$output->writeln('<error>Migration cancelled!</error>');
return 1;
}
}
if ($path = $input->getOption('write-sql')) {
$path = is_bool($path) ? getcwd() : $path;
$migration->writeSqlFile($path, $version);
return 0;
}
$dryRun = (bool) $input->getOption('dry-run');
$cancelled = false;
$migration->setNoMigrationException($input->getOption('allow-no-migration'));
$result = $migration->migrate($version, $dryRun, $timeAllqueries, function () use($input, $output, &$cancelled) {
$question = 'WARNING! You are about to execute a database migration' . ' that could result in schema changes and data lost.' . ' Are you sure you wish to continue? (y/n)';
$canContinue = $this->canExecute($question, $input, $output);
$cancelled = !$canContinue;
return $canContinue;
});
if ($cancelled) {
$output->writeln('<error>Migration cancelled!</error>');
return 1;
}
}