geno/wp-content/plugins/mailpoet/lib/Migrator/Cli.php
2024-02-01 11:54:18 +00:00

153 lines
4.5 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\Migrator;
if (!defined('ABSPATH')) exit;
use WP_CLI;
class Cli {
/** @var Migrator */
private $migrator;
/** @var Repository */
private $repository;
/** @var Store */
private $store;
public function __construct(
Migrator $migrator,
Repository $repository,
Store $store
) {
$this->migrator = $migrator;
$this->repository = $repository;
$this->store = $store;
}
public function initialize(): void {
if (!class_exists(WP_CLI::class)) {
return;
}
WP_CLI::add_command('mailpoet:migrations:run', [$this, 'run'], [
'shortdesc' => 'Runs MailPoet database migrations',
]);
WP_CLI::add_command('mailpoet:migrations:status', [$this, 'status'], [
'shortdesc' => 'Shows status of MailPoet database migrations',
]);
}
public function run(): void {
$this->printHeader();
$this->migrator->run(new class($this) implements Logger {
/** @var Cli */
private $cli;
/** @var float */
private $started;
/** @var float */
private $migrationStarted;
/** @var int */
private $migrationsCount = 0;
public function __construct(
Cli $cli
) {
$this->cli = $cli;
}
public function logBefore(array $status): void {
WP_CLI::log("STATUS:\n");
$this->cli->printStats($status);
$new = array_values(
array_filter($status, function (array $migration): bool {
return $migration['status'] === Migrator::MIGRATION_STATUS_NEW;
})
);
if (count($new) === 0) {
WP_CLI::success('No new migrations to run.');
} else {
WP_CLI::log("RUNNING MIGRATIONS:\n");
}
$this->started = microtime(true);
}
public function logMigrationStarted(array $migration): void {
WP_CLI::out(sprintf(' %s... ', $migration['name']));
$this->migrationStarted = microtime(true);
}
public function logMigrationCompleted(array $migration): void {
$this->migrationsCount += 1;
$seconds = microtime(true) - $this->migrationStarted;
WP_CLI::out(sprintf("completed in %.0Fs ✔\n", $seconds));
}
public function logAfter(): void {
if ($this->migrationsCount > 0) {
$seconds = microtime(true) - $this->started;
WP_CLI::log('');
WP_CLI::success(sprintf("Completed %d new migrations in %.0Fs.", $this->migrationsCount, $seconds));
}
}
});
}
public function status(): void {
$this->printHeader();
$status = $this->migrator->getStatus();
if (!$status) {
WP_CLI::warning("No migrations found.\n");
} else {
WP_CLI::log("STATUS:\n");
$this->printStats($status);
WP_CLI::log("MIGRATIONS:\n");
$table = array_map(function (array $data): array {
$data['name'] .= $data['unknown'] ? ' (unknown)' : '';
unset($data['unknown']);
return array_map(function ($field) {
return $field === null ? '' : $field;
}, $data);
}, $status);
WP_CLI\Utils\format_items('table', $table, array_keys($table[0]));
}
}
public function printHeader(): void {
WP_CLI::log('MAILPOET DATABASE MIGRATIONS');
WP_CLI::log("============================\n");
}
public function printStats(array $status): void {
$stats = [
Migrator::MIGRATION_STATUS_NEW => 0,
Migrator::MIGRATION_STATUS_COMPLETED => 0,
Migrator::MIGRATION_STATUS_STARTED => 0,
Migrator::MIGRATION_STATUS_FAILED => 0,
];
foreach ($status as $migration) {
$stats[$migration['status']] += 1;
}
$defined = count($this->repository->loadAll());
$processed = array_sum($stats) - $stats[Migrator::MIGRATION_STATUS_NEW];
WP_CLI::log(sprintf('Defined: %4d (in %s)', $defined, realpath($this->repository->getMigrationsDir())));
WP_CLI::log(sprintf('Processed: %4d (in database table \'%s\')', $processed, $this->store->getMigrationsTable()));
WP_CLI::log('');
WP_CLI::log(sprintf('New: %4d (not run yet)', $stats[Migrator::MIGRATION_STATUS_NEW]));
WP_CLI::log(sprintf('Completed: %4d (successfully executed)', $stats[Migrator::MIGRATION_STATUS_COMPLETED]));
WP_CLI::log(sprintf('Started: %4d (still running, or never completed)', $stats[Migrator::MIGRATION_STATUS_STARTED]));
WP_CLI::log(sprintf('Failed: %4d (an error occurred)', $stats[Migrator::MIGRATION_STATUS_FAILED]));
WP_CLI::log('');
}
}