You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.4 KiB
167 lines
4.4 KiB
<?php |
|
|
|
/** |
|
* This file is part of CodeIgniter 4 framework. |
|
* |
|
* (c) CodeIgniter Foundation <admin@codeigniter.com> |
|
* |
|
* For the full copyright and license information, please view |
|
* the LICENSE file that was distributed with this source code. |
|
*/ |
|
|
|
namespace CodeIgniter\Commands\Database; |
|
|
|
use CodeIgniter\CLI\BaseCommand; |
|
use CodeIgniter\CLI\CLI; |
|
use Config\Services; |
|
|
|
/** |
|
* Displays a list of all migrations and whether they've been run or not. |
|
* |
|
* @see \CodeIgniter\Commands\Database\MigrateStatusTest |
|
*/ |
|
class MigrateStatus extends BaseCommand |
|
{ |
|
/** |
|
* The group the command is lumped under |
|
* when listing commands. |
|
* |
|
* @var string |
|
*/ |
|
protected $group = 'Database'; |
|
|
|
/** |
|
* The Command's name |
|
* |
|
* @var string |
|
*/ |
|
protected $name = 'migrate:status'; |
|
|
|
/** |
|
* the Command's short description |
|
* |
|
* @var string |
|
*/ |
|
protected $description = 'Displays a list of all migrations and whether they\'ve been run or not.'; |
|
|
|
/** |
|
* the Command's usage |
|
* |
|
* @var string |
|
*/ |
|
protected $usage = 'migrate:status [options]'; |
|
|
|
/** |
|
* the Command's Options |
|
* |
|
* @var array<string, string> |
|
*/ |
|
protected $options = [ |
|
'-g' => 'Set database group', |
|
]; |
|
|
|
/** |
|
* Namespaces to ignore when looking for migrations. |
|
* |
|
* @var string[] |
|
*/ |
|
protected $ignoredNamespaces = [ |
|
'CodeIgniter', |
|
'Config', |
|
'Kint', |
|
'Laminas\ZendFrameworkBridge', |
|
'Laminas\Escaper', |
|
'Psr\Log', |
|
]; |
|
|
|
/** |
|
* Displays a list of all migrations and whether they've been run or not. |
|
* |
|
* @param array<string, mixed> $params |
|
*/ |
|
public function run(array $params) |
|
{ |
|
$runner = Services::migrations(); |
|
$paramGroup = $params['g'] ?? CLI::getOption('g'); |
|
|
|
// Get all namespaces |
|
$namespaces = Services::autoloader()->getNamespace(); |
|
|
|
// Collection of migration status |
|
$status = []; |
|
|
|
foreach (array_keys($namespaces) as $namespace) { |
|
if (ENVIRONMENT !== 'testing') { |
|
// Make Tests\\Support discoverable for testing |
|
$this->ignoredNamespaces[] = 'Tests\Support'; // @codeCoverageIgnore |
|
} |
|
|
|
if (in_array($namespace, $this->ignoredNamespaces, true)) { |
|
continue; |
|
} |
|
|
|
if (APP_NAMESPACE !== 'App' && $namespace === 'App') { |
|
continue; // @codeCoverageIgnore |
|
} |
|
|
|
$migrations = $runner->findNamespaceMigrations($namespace); |
|
|
|
if (empty($migrations)) { |
|
continue; |
|
} |
|
|
|
$runner->setNamespace($namespace); |
|
$history = $runner->getHistory((string) $paramGroup); |
|
ksort($migrations); |
|
|
|
foreach ($migrations as $uid => $migration) { |
|
$migrations[$uid]->name = mb_substr($migration->name, mb_strpos($migration->name, $uid . '_')); |
|
|
|
$date = '---'; |
|
$group = '---'; |
|
$batch = '---'; |
|
|
|
foreach ($history as $row) { |
|
// @codeCoverageIgnoreStart |
|
if ($runner->getObjectUid($row) !== $migration->uid) { |
|
continue; |
|
} |
|
|
|
$date = date('Y-m-d H:i:s', $row->time); |
|
$group = $row->group; |
|
$batch = $row->batch; |
|
// @codeCoverageIgnoreEnd |
|
} |
|
|
|
$status[] = [ |
|
$namespace, |
|
$migration->version, |
|
$migration->name, |
|
$group, |
|
$date, |
|
$batch, |
|
]; |
|
} |
|
} |
|
|
|
if (! $status) { |
|
// @codeCoverageIgnoreStart |
|
CLI::error(lang('Migrations.noneFound'), 'light_gray', 'red'); |
|
CLI::newLine(); |
|
|
|
return; |
|
// @codeCoverageIgnoreEnd |
|
} |
|
|
|
$headers = [ |
|
CLI::color(lang('Migrations.namespace'), 'yellow'), |
|
CLI::color(lang('Migrations.version'), 'yellow'), |
|
CLI::color(lang('Migrations.filename'), 'yellow'), |
|
CLI::color(lang('Migrations.group'), 'yellow'), |
|
CLI::color(str_replace(': ', '', lang('Migrations.on')), 'yellow'), |
|
CLI::color(lang('Migrations.batch'), 'yellow'), |
|
]; |
|
|
|
CLI::table($status, $headers); |
|
} |
|
}
|
|
|