mirror of
https://github.com/phpbb/phpbb.git
synced 2025-05-04 22:58:10 +02:00
[ticket/14162] Add CLI command db:revert
This command allow to revert a migration from the CLI PHPBB3-14162
This commit is contained in:
parent
3bde202a10
commit
2596fba487
@ -89,6 +89,19 @@ services:
|
||||
tags:
|
||||
- { name: console.command }
|
||||
|
||||
console.command.db.revert:
|
||||
class: phpbb\console\command\db\revert
|
||||
arguments:
|
||||
- @user
|
||||
- @migrator
|
||||
- @ext.manager
|
||||
- @config
|
||||
- @cache
|
||||
- @filesystem
|
||||
- %core.root_path%
|
||||
tags:
|
||||
- { name: console.command }
|
||||
|
||||
console.command.dev.migration_tips:
|
||||
class: phpbb\console\command\dev\migration_tips
|
||||
arguments:
|
||||
|
@ -51,6 +51,7 @@ $lang = array_merge($lang, array(
|
||||
'CLI_DESCRIPTION_CRON_RUN' => 'Runs all ready cron tasks.',
|
||||
'CLI_DESCRIPTION_CRON_RUN_ARGUMENT_1' => 'Name of the task to be run',
|
||||
'CLI_DESCRIPTION_DB_MIGRATE' => 'Updates the database by applying migrations.',
|
||||
'CLI_DESCRIPTION_DB_REVERT' => 'Revert a migration.',
|
||||
'CLI_DESCRIPTION_DELETE_CONFIG' => 'Deletes a configuration option',
|
||||
'CLI_DESCRIPTION_DISABLE_EXTENSION' => 'Disables the specified extension.',
|
||||
'CLI_DESCRIPTION_ENABLE_EXTENSION' => 'Enables the specified extension.',
|
||||
@ -94,6 +95,8 @@ $lang = array_merge($lang, array(
|
||||
|
||||
'CLI_FIXUP_RECALCULATE_EMAIL_HASH_SUCCESS' => 'Successfully recalculated all email hashes.',
|
||||
|
||||
'CLI_MIGRATION_NAME' => 'Migration name, including the namespace (use forward slashes instead of backslashes to avoid problems).',
|
||||
|
||||
'CLI_REPARSER_REPARSE_REPARSING' => 'Reparsing %1$s (range %2$d..%3$d)',
|
||||
'CLI_REPARSER_REPARSE_REPARSING_START' => 'Reparsing %s...',
|
||||
'CLI_REPARSER_REPARSE_SUCCESS' => 'Reparsing ended with success',
|
||||
|
@ -48,10 +48,17 @@ $lang = array_merge($lang, array(
|
||||
'MIGRATION_EFFECTIVELY_INSTALLED' => 'Migration already effectively installed (skipped): %s',
|
||||
'MIGRATION_EXCEPTION_ERROR' => 'Something went wrong during the request and an exception was thrown. The changes made before the error occurred were reversed to the best of our abilities, but you should check the board for errors.',
|
||||
'MIGRATION_NOT_FULFILLABLE' => 'The migration "%1$s" is not fulfillable, missing migration "%2$s".',
|
||||
'MIGRATION_NOT_INSTALLED' => 'The migration "%s" is not installed.',
|
||||
'MIGRATION_NOT_VALID' => '%s is not a valid migration.',
|
||||
'MIGRATION_SCHEMA_DONE' => 'Installed Schema: %1$s; Time: %2$.2f seconds',
|
||||
'MIGRATION_SCHEMA_RUNNING' => 'Installing Schema: %s.',
|
||||
|
||||
'MIGRATION_REVERT_DATA_DONE' => 'Reverted Data: %1$s; Time: %2$.2f seconds',
|
||||
'MIGRATION_REVERT_DATA_IN_PROGRESS' => 'Reverting Data: %1$s; Time: %2$.2f seconds',
|
||||
'MIGRATION_REVERT_DATA_RUNNING' => 'Reverting Data: %s.',
|
||||
'MIGRATION_REVERT_SCHEMA_DONE' => 'Reverted Schema: %1$s; Time: %2$.2f seconds',
|
||||
'MIGRATION_REVERT_SCHEMA_RUNNING' => 'Reverting Schema: %s.',
|
||||
|
||||
'MIGRATION_INVALID_DATA_MISSING_CONDITION' => 'A migration is invalid. An if statement helper is missing a condition.',
|
||||
'MIGRATION_INVALID_DATA_MISSING_STEP' => 'A migration is invalid. An if statement helper is missing a valid call to a migration step.',
|
||||
'MIGRATION_INVALID_DATA_CUSTOM_NOT_CALLABLE' => 'A migration is invalid. A custom callable function could not be called.',
|
||||
|
@ -15,20 +15,8 @@ namespace phpbb\console\command\db;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class migrate extends \phpbb\console\command\command
|
||||
class migrate extends \phpbb\console\command\db\migration_command
|
||||
{
|
||||
/** @var \phpbb\db\migrator */
|
||||
protected $migrator;
|
||||
|
||||
/** @var \phpbb\extension\manager */
|
||||
protected $extension_manager;
|
||||
|
||||
/** @var \phpbb\config\config */
|
||||
protected $config;
|
||||
|
||||
/** @var \phpbb\cache\service */
|
||||
protected $cache;
|
||||
|
||||
/** @var \phpbb\log\log */
|
||||
protected $log;
|
||||
|
||||
@ -40,14 +28,10 @@ class migrate extends \phpbb\console\command\command
|
||||
|
||||
function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache, \phpbb\log\log $log, \phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path)
|
||||
{
|
||||
$this->migrator = $migrator;
|
||||
$this->extension_manager = $extension_manager;
|
||||
$this->config = $config;
|
||||
$this->cache = $cache;
|
||||
$this->log = $log;
|
||||
$this->filesystem = $filesystem;
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
parent::__construct($user);
|
||||
parent::__construct($user, $migrator, $extension_manager, $config, $cache);
|
||||
$this->user->add_lang(array('common', 'install', 'migrator'));
|
||||
}
|
||||
|
||||
@ -91,21 +75,4 @@ class migrate extends \phpbb\console\command\command
|
||||
$this->finalise_update();
|
||||
$output->writeln($this->user->lang['DATABASE_UPDATE_COMPLETE']);
|
||||
}
|
||||
|
||||
protected function load_migrations()
|
||||
{
|
||||
$migrations = $this->extension_manager
|
||||
->get_finder()
|
||||
->core_path('phpbb/db/migration/data/')
|
||||
->extension_directory('/migrations')
|
||||
->get_classes();
|
||||
|
||||
$this->migrator->set_migrations($migrations);
|
||||
}
|
||||
|
||||
protected function finalise_update()
|
||||
{
|
||||
$this->cache->purge();
|
||||
$this->config->increment('assets_version', 1);
|
||||
}
|
||||
}
|
||||
|
56
phpBB/phpbb/console/command/db/migration_command.php
Normal file
56
phpBB/phpbb/console/command/db/migration_command.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
namespace phpbb\console\command\db;
|
||||
|
||||
abstract class migration_command extends \phpbb\console\command\command
|
||||
{
|
||||
/** @var \phpbb\db\migrator */
|
||||
protected $migrator;
|
||||
|
||||
/** @var \phpbb\extension\manager */
|
||||
protected $extension_manager;
|
||||
|
||||
/** @var \phpbb\config\config */
|
||||
protected $config;
|
||||
|
||||
/** @var \phpbb\cache\service */
|
||||
protected $cache;
|
||||
|
||||
function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache)
|
||||
{
|
||||
$this->migrator = $migrator;
|
||||
$this->extension_manager = $extension_manager;
|
||||
$this->config = $config;
|
||||
$this->cache = $cache;
|
||||
parent::__construct($user);
|
||||
}
|
||||
|
||||
protected function load_migrations()
|
||||
{
|
||||
$migrations = $this->extension_manager
|
||||
->get_finder()
|
||||
->core_path('phpbb/db/migration/data/')
|
||||
->extension_directory('/migrations')
|
||||
->get_classes();
|
||||
|
||||
$this->migrator->set_migrations($migrations);
|
||||
|
||||
return $migrations;
|
||||
}
|
||||
|
||||
protected function finalise_update()
|
||||
{
|
||||
$this->cache->purge();
|
||||
$this->config->increment('assets_version', 1);
|
||||
}
|
||||
}
|
83
phpBB/phpbb/console/command/db/revert.php
Normal file
83
phpBB/phpbb/console/command/db/revert.php
Normal file
@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
*
|
||||
* This file is part of the phpBB Forum Software package.
|
||||
*
|
||||
* @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
* @license GNU General Public License, version 2 (GPL-2.0)
|
||||
*
|
||||
* For full copyright and license information, please see
|
||||
* the docs/CREDITS.txt file.
|
||||
*
|
||||
*/
|
||||
namespace phpbb\console\command\db;
|
||||
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class revert extends \phpbb\console\command\db\migration_command
|
||||
{
|
||||
/** @var string phpBB root path */
|
||||
protected $phpbb_root_path;
|
||||
|
||||
/** @var \phpbb\filesystem\filesystem_interface */
|
||||
protected $filesystem;
|
||||
|
||||
function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache, \phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path)
|
||||
{
|
||||
$this->filesystem = $filesystem;
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
parent::__construct($user, $migrator, $extension_manager, $config, $cache);
|
||||
$this->user->add_lang(array('common', 'migrator'));
|
||||
}
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('db:revert')
|
||||
->setDescription($this->user->lang('CLI_DESCRIPTION_DB_REVERT'))
|
||||
->addArgument(
|
||||
'name',
|
||||
InputArgument::REQUIRED,
|
||||
$this->user->lang('CLI_MIGRATION_NAME')
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$name = str_replace('/', '\\', $input->getArgument('name'));
|
||||
|
||||
$this->migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($this->user, new console_migrator_output_handler($this->user, $output), $this->phpbb_root_path . 'store/migrations_' . time() . '.log', $this->filesystem));
|
||||
|
||||
$this->cache->purge();
|
||||
|
||||
if (!in_array($name, $this->load_migrations()))
|
||||
{
|
||||
$output->writeln('<error>' . $this->user->lang('MIGRATION_NOT_VALID', $name) . '</error>');
|
||||
return 1;
|
||||
}
|
||||
else if ($this->migrator->migration_state($name) === false)
|
||||
{
|
||||
$output->writeln('<error>' . $this->user->lang('MIGRATION_NOT_INSTALLED', $name) . '</error>');
|
||||
return 1;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
while ($this->migrator->migration_state($name) !== false)
|
||||
{
|
||||
$this->migrator->revert($name);
|
||||
}
|
||||
}
|
||||
catch (\phpbb\db\migration\exception $e)
|
||||
{
|
||||
$output->writeln('<error>' . $e->getLocalisedMessage($this->user) . '</error>');
|
||||
$this->finalise_update();
|
||||
return 1;
|
||||
}
|
||||
|
||||
$this->finalise_update();
|
||||
}
|
||||
}
|
@ -416,6 +416,9 @@ class migrator
|
||||
|
||||
if ($state['migration_data_done'])
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_REVERT_DATA_RUNNING', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE);
|
||||
$elapsed_time = microtime(true);
|
||||
|
||||
if ($state['migration_data_state'] !== 'revert_data')
|
||||
{
|
||||
$result = $this->process_data_step($migration->update_data(), $state['migration_data_state'], true);
|
||||
@ -431,9 +434,22 @@ class migrator
|
||||
}
|
||||
|
||||
$this->set_migration_state($name, $state);
|
||||
|
||||
$elapsed_time = microtime(true) - $elapsed_time;
|
||||
if ($state['migration_data_done'])
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_REVERT_DATA_DONE', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_NORMAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_REVERT_DATA_IN_PROGRESS', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_VERY_VERBOSE);
|
||||
}
|
||||
}
|
||||
else if ($state['migration_schema_done'])
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_REVERT_SCHEMA_RUNNING', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE);
|
||||
$elapsed_time = microtime(true);
|
||||
|
||||
$steps = $this->helper->get_schema_steps($migration->revert_schema());
|
||||
$result = $this->process_data_step($steps, $state['migration_data_state']);
|
||||
|
||||
@ -448,6 +464,9 @@ class migrator
|
||||
|
||||
unset($this->migration_state[$name]);
|
||||
}
|
||||
|
||||
$elapsed_time = microtime(true) - $elapsed_time;
|
||||
$this->output_handler->write(array('MIGRATION_REVERT_SCHEMA_DONE', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_NORMAL);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user