PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Migrator / Cli.php
mailpoet / lib / Migrator Last commit date
AppMigration.php 2 years ago AppMigrationTemplate.php 2 years ago Cli.php 2 weeks ago DbMigration.php 6 months ago DbMigrationTemplate.php 2 years ago Logger.php 2 years ago Migrator.php 1 year ago MigratorException.php 2 years ago Repository.php 2 years ago Runner.php 2 years ago Store.php 6 months ago index.php 3 years ago
Cli.php
167 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Migrator;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use WP_CLI;
9
10 class Cli {
11 /** @var Migrator */
12 private $migrator;
13
14 /** @var Repository */
15 private $repository;
16
17 /** @var Store */
18 private $store;
19
20 public function __construct(
21 Migrator $migrator,
22 Repository $repository,
23 Store $store
24 ) {
25 $this->migrator = $migrator;
26 $this->repository = $repository;
27 $this->store = $store;
28 }
29
30 public function initialize(): void {
31 if (!class_exists(WP_CLI::class)) {
32 return;
33 }
34
35 WP_CLI::add_command('mailpoet migrations run', [$this, 'run'], [
36 'shortdesc' => 'Runs MailPoet database migrations',
37 ]);
38
39 WP_CLI::add_command('mailpoet migrations status', [$this, 'status'], [
40 'shortdesc' => 'Shows status of MailPoet database migrations',
41 ]);
42
43 // Deprecated colon-named aliases kept for backwards compatibility. Remove in a future release (STOMAIL-8177).
44 $this->registerDeprecatedAlias('mailpoet:migrations:run', 'mailpoet migrations run', [$this, 'run']);
45 $this->registerDeprecatedAlias('mailpoet:migrations:status', 'mailpoet migrations status', [$this, 'status']);
46 }
47
48 private function registerDeprecatedAlias(string $oldName, string $newName, callable $handler): void {
49 WP_CLI::add_command($oldName, function () use ($oldName, $newName, $handler): void {
50 WP_CLI::warning(sprintf('`wp %s` is deprecated and will be removed in a future release. Use `wp %s` instead.', $oldName, $newName));
51 $handler();
52 }, [
53 'shortdesc' => sprintf('Deprecated. Use `wp %s` instead', $newName),
54 ]);
55 }
56
57 public function run(): void {
58 $this->printHeader();
59 $this->migrator->run(new class($this) implements Logger {
60 /** @var Cli */
61 private $cli;
62
63 /** @var float */
64 private $started;
65
66 /** @var float */
67 private $migrationStarted;
68
69 /** @var int */
70 private $migrationsCount = 0;
71
72 public function __construct(
73 Cli $cli
74 ) {
75 $this->cli = $cli;
76 }
77
78 public function logBefore(array $status): void {
79 WP_CLI::log("STATUS:\n");
80 $this->cli->printStats($status);
81
82 $new = array_values(
83 array_filter($status, function (array $migration): bool {
84 return $migration['status'] === Migrator::MIGRATION_STATUS_NEW;
85 })
86 );
87
88 if (count($new) === 0) {
89 WP_CLI::success('No new migrations to run.');
90 } else {
91 WP_CLI::log("RUNNING MIGRATIONS:\n");
92 }
93 $this->started = microtime(true);
94 }
95
96 public function logMigrationStarted(array $migration): void {
97 WP_CLI::out(sprintf(' %s... ', $migration['name']));
98 $this->migrationStarted = microtime(true);
99 }
100
101 public function logMigrationCompleted(array $migration): void {
102 $this->migrationsCount += 1;
103 $seconds = microtime(true) - $this->migrationStarted;
104 WP_CLI::out(sprintf("completed in %.0Fs ✔\n", $seconds));
105 }
106
107 public function logAfter(): void {
108 if ($this->migrationsCount > 0) {
109 $seconds = microtime(true) - $this->started;
110 WP_CLI::log('');
111 WP_CLI::success(sprintf("Completed %d new migrations in %.0Fs.", $this->migrationsCount, $seconds));
112 }
113 }
114 });
115 }
116
117 public function status(): void {
118 $this->printHeader();
119 $status = $this->migrator->getStatus();
120 if (!$status) {
121 WP_CLI::warning("No migrations found.\n");
122 } else {
123 WP_CLI::log("STATUS:\n");
124 $this->printStats($status);
125
126 WP_CLI::log("MIGRATIONS:\n");
127 $table = array_map(function (array $data): array {
128 $data['name'] .= $data['unknown'] ? ' (unknown)' : '';
129 unset($data['unknown']);
130 return array_map(function ($field) {
131 return $field === null ? '' : $field;
132 }, $data);
133 }, $status);
134 WP_CLI\Utils\format_items('table', $table, array_keys($table[0]));
135 }
136 }
137
138 public function printHeader(): void {
139 WP_CLI::log('MAILPOET DATABASE MIGRATIONS');
140 WP_CLI::log("============================\n");
141 }
142
143 public function printStats(array $status): void {
144 $stats = [
145 Migrator::MIGRATION_STATUS_NEW => 0,
146 Migrator::MIGRATION_STATUS_COMPLETED => 0,
147 Migrator::MIGRATION_STATUS_STARTED => 0,
148 Migrator::MIGRATION_STATUS_FAILED => 0,
149 ];
150 foreach ($status as $migration) {
151 $stats[$migration['status']] += 1;
152 }
153
154 $defined = count($this->repository->loadAll());
155 $processed = array_sum($stats) - $stats[Migrator::MIGRATION_STATUS_NEW];
156
157 WP_CLI::log(sprintf('Defined: %4d (in %s)', $defined, realpath($this->repository->getMigrationsDir())));
158 WP_CLI::log(sprintf('Processed: %4d (in database table \'%s\')', $processed, $this->store->getMigrationsTable()));
159 WP_CLI::log('');
160 WP_CLI::log(sprintf('New: %4d (not run yet)', $stats[Migrator::MIGRATION_STATUS_NEW]));
161 WP_CLI::log(sprintf('Completed: %4d (successfully executed)', $stats[Migrator::MIGRATION_STATUS_COMPLETED]));
162 WP_CLI::log(sprintf('Started: %4d (still running, or never completed)', $stats[Migrator::MIGRATION_STATUS_STARTED]));
163 WP_CLI::log(sprintf('Failed: %4d (an error occurred)', $stats[Migrator::MIGRATION_STATUS_FAILED]));
164 WP_CLI::log('');
165 }
166 }
167