mirror of
https://github.com/phpbb/phpbb.git
synced 2025-05-04 06:39:14 +02:00
Merge branch 'develop-ascraeus' into develop
* develop-ascraeus: [ticket/13211] Move console migrator output handler back to console folder [ticket/13211] Also use log wrapper output handler for console migrations [ticket/13211] Move console migrator output handler to db folder [ticket/13211] Add log wrapper for writing database updater to log file [ticket/13126] Add missing use statement [ticket/13126] Fix tests [ticket/13126] Change messages verbosity levels [ticket/13126] Move migrator_output_handler to an interface [ticket/13126] Extends migrator_output_handler instead of using a closure [ticket/13126] Improve the feedback when running the migrations
This commit is contained in:
commit
d9f84da577
@ -84,6 +84,7 @@ services:
|
||||
- @config
|
||||
- @cache
|
||||
- @log
|
||||
- %core.root_path%
|
||||
tags:
|
||||
- { name: console.command }
|
||||
|
||||
|
@ -174,6 +174,8 @@ define('IN_DB_UPDATE', true);
|
||||
// End startup code
|
||||
|
||||
$migrator = $phpbb_container->get('migrator');
|
||||
$migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($user, new \phpbb\db\html_migrator_output_handler($user), $phpbb_root_path . 'store/migrations_' . time() . '.log'));
|
||||
|
||||
$migrator->create_migrations_table();
|
||||
|
||||
$phpbb_extension_manager = $phpbb_container->get('ext.manager');
|
||||
@ -199,8 +201,6 @@ $safe_time_limit = min(15, ($phpbb_ini->get_int('max_execution_time') / 2));
|
||||
|
||||
while (!$migrator->finished())
|
||||
{
|
||||
$migration_start_time = microtime(true);
|
||||
|
||||
try
|
||||
{
|
||||
$migrator->update();
|
||||
@ -219,28 +219,6 @@ while (!$migrator->finished())
|
||||
$migrator->last_run_migration['state']
|
||||
);
|
||||
|
||||
if (isset($migrator->last_run_migration['effectively_installed']) && $migrator->last_run_migration['effectively_installed'])
|
||||
{
|
||||
echo $user->lang('MIGRATION_EFFECTIVELY_INSTALLED', $migrator->last_run_migration['name']);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($migrator->last_run_migration['task'] == 'process_data_step' && $state['migration_data_done'])
|
||||
{
|
||||
echo $user->lang('MIGRATION_DATA_DONE', $migrator->last_run_migration['name'], (microtime(true) - $migration_start_time));
|
||||
}
|
||||
else if ($migrator->last_run_migration['task'] == 'process_data_step')
|
||||
{
|
||||
echo $user->lang('MIGRATION_DATA_IN_PROGRESS', $migrator->last_run_migration['name'], (microtime(true) - $migration_start_time));
|
||||
}
|
||||
else if ($state['migration_schema_done'])
|
||||
{
|
||||
echo $user->lang('MIGRATION_SCHEMA_DONE', $migrator->last_run_migration['name'], (microtime(true) - $migration_start_time));
|
||||
}
|
||||
}
|
||||
|
||||
echo "<br />\n";
|
||||
|
||||
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing
|
||||
if ((time() - $update_start_time) >= $safe_time_limit)
|
||||
{
|
||||
|
@ -41,12 +41,16 @@ $lang = array_merge($lang, array(
|
||||
|
||||
'GROUP_NOT_EXIST' => 'The group "%s" unexpectedly does not exist.',
|
||||
|
||||
'MIGRATION_APPLY_DEPENDENCIES' => 'Apply dependencies of %s.',
|
||||
'MIGRATION_DATA_DONE' => 'Installed Data: %1$s; Time: %2$.2f seconds',
|
||||
'MIGRATION_DATA_IN_PROGRESS' => 'Installing Data: %1$s; Time: %2$.2f seconds',
|
||||
'MIGRATION_DATA_RUNNING' => 'Installing Data: %s.',
|
||||
'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_VALID' => '%s is not a valid migration.',
|
||||
'MIGRATION_SCHEMA_DONE' => 'Installed Schema: %1$s; Time: %2$.2f seconds',
|
||||
'MIGRATION_SCHEMA_RUNNING' => 'Installing Schema: %s.',
|
||||
|
||||
'MODULE_ERROR' => 'An error occurred while creating a module: %s',
|
||||
'MODULE_INFO_FILE_NOT_EXIST' => 'A required module info file is missing: %2$s',
|
||||
|
@ -0,0 +1,69 @@
|
||||
<?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 phpbb\user;
|
||||
use phpbb\db\migrator_output_handler_interface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class console_migrator_output_handler implements migrator_output_handler_interface
|
||||
{
|
||||
/**
|
||||
* User object.
|
||||
*
|
||||
* @var user
|
||||
*/
|
||||
private $user;
|
||||
|
||||
/**
|
||||
* Console output object.
|
||||
*
|
||||
* @var OutputInterface
|
||||
*/
|
||||
private $output;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param user $user User object
|
||||
* @param OutputInterface $output Console output object
|
||||
*/
|
||||
public function __construct(user $user, OutputInterface $output)
|
||||
{
|
||||
$this->user = $user;
|
||||
$this->output = $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function write($message, $verbosity)
|
||||
{
|
||||
if ($verbosity <= $this->output->getVerbosity())
|
||||
{
|
||||
$translated_message = call_user_func_array(array($this->user, 'lang'), $message);
|
||||
|
||||
if ($verbosity === migrator_output_handler_interface::VERBOSITY_NORMAL)
|
||||
{
|
||||
$translated_message = '<info>' . $translated_message . '</info>';
|
||||
}
|
||||
else if ($verbosity === migrator_output_handler_interface::VERBOSITY_VERBOSE)
|
||||
{
|
||||
$translated_message = '<comment>' . $translated_message . '</comment>';
|
||||
}
|
||||
|
||||
$this->output->writeln($translated_message);
|
||||
}
|
||||
}
|
||||
}
|
@ -32,13 +32,17 @@ class migrate extends \phpbb\console\command\command
|
||||
/** @var \phpbb\log\log */
|
||||
protected $log;
|
||||
|
||||
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)
|
||||
/** @var string phpBB root path */
|
||||
protected $phpbb_root_path;
|
||||
|
||||
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_root_path)
|
||||
{
|
||||
$this->migrator = $migrator;
|
||||
$this->extension_manager = $extension_manager;
|
||||
$this->config = $config;
|
||||
$this->cache = $cache;
|
||||
$this->log = $log;
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
parent::__construct($user);
|
||||
$this->user->add_lang(array('common', 'install', 'migrator'));
|
||||
}
|
||||
@ -53,6 +57,8 @@ class migrate extends \phpbb\console\command\command
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$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->migrator->create_migrations_table();
|
||||
|
||||
$this->cache->purge();
|
||||
@ -61,8 +67,6 @@ class migrate extends \phpbb\console\command\command
|
||||
$orig_version = $this->config['version'];
|
||||
while (!$this->migrator->finished())
|
||||
{
|
||||
$migration_start_time = microtime(true);
|
||||
|
||||
try
|
||||
{
|
||||
$this->migrator->update();
|
||||
@ -73,36 +77,6 @@ class migrate extends \phpbb\console\command\command
|
||||
$this->finalise_update();
|
||||
return 1;
|
||||
}
|
||||
|
||||
$migration_stop_time = microtime(true) - $migration_start_time;
|
||||
|
||||
$state = array_merge(
|
||||
array(
|
||||
'migration_schema_done' => false,
|
||||
'migration_data_done' => false,
|
||||
),
|
||||
$this->migrator->last_run_migration['state']
|
||||
);
|
||||
|
||||
if (!empty($this->migrator->last_run_migration['effectively_installed']))
|
||||
{
|
||||
$msg = $this->user->lang('MIGRATION_EFFECTIVELY_INSTALLED', $this->migrator->last_run_migration['name']);
|
||||
$output->writeln("<comment>$msg</comment>");
|
||||
}
|
||||
else if ($this->migrator->last_run_migration['task'] == 'process_data_step' && $state['migration_data_done'])
|
||||
{
|
||||
$msg = $this->user->lang('MIGRATION_DATA_DONE', $this->migrator->last_run_migration['name'], $migration_stop_time);
|
||||
$output->writeln("<info>$msg</info>");
|
||||
}
|
||||
else if ($this->migrator->last_run_migration['task'] == 'process_data_step')
|
||||
{
|
||||
$output->writeln($this->user->lang('MIGRATION_DATA_IN_PROGRESS', $this->migrator->last_run_migration['name'], $migration_stop_time));
|
||||
}
|
||||
else if ($state['migration_schema_done'])
|
||||
{
|
||||
$msg = $this->user->lang('MIGRATION_SCHEMA_DONE', $this->migrator->last_run_migration['name'], $migration_stop_time);
|
||||
$output->writeln("<info>$msg</info>");
|
||||
}
|
||||
}
|
||||
|
||||
if ($orig_version != $this->config['version'])
|
||||
|
48
phpBB/phpbb/db/html_migrator_output_handler.php
Normal file
48
phpBB/phpbb/db/html_migrator_output_handler.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?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\db;
|
||||
|
||||
use phpbb\user;
|
||||
|
||||
class html_migrator_output_handler implements migrator_output_handler_interface
|
||||
{
|
||||
/**
|
||||
* User object.
|
||||
*
|
||||
* @var user
|
||||
*/
|
||||
private $user;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param user $user User object
|
||||
*/
|
||||
public function __construct(user $user)
|
||||
{
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function write($message, $verbosity)
|
||||
{
|
||||
if ($verbosity <= migrator_output_handler_interface::VERBOSITY_VERBOSE)
|
||||
{
|
||||
$final_message = call_user_func_array(array($this->user, 'lang'), $message);
|
||||
echo $final_message . "<br />\n";
|
||||
}
|
||||
}
|
||||
}
|
95
phpBB/phpbb/db/log_wrapper_migrator_output_handler.php
Normal file
95
phpBB/phpbb/db/log_wrapper_migrator_output_handler.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?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\db;
|
||||
|
||||
use phpbb\user;
|
||||
|
||||
class log_wrapper_migrator_output_handler implements migrator_output_handler_interface
|
||||
{
|
||||
/**
|
||||
* User object.
|
||||
*
|
||||
* @var user
|
||||
*/
|
||||
protected $user;
|
||||
|
||||
/**
|
||||
* A migrator output handler
|
||||
*
|
||||
* @var migrator_output_handler_interface
|
||||
*/
|
||||
protected $migrator;
|
||||
|
||||
/**
|
||||
* Log file handle
|
||||
* @var resource
|
||||
*/
|
||||
protected $file_handle = false;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param user $user User object
|
||||
* @param migrator_output_handler_interface $migrator Migrator output handler
|
||||
* @param string $log_file File to log to
|
||||
*/
|
||||
public function __construct(user $user, migrator_output_handler_interface $migrator, $log_file)
|
||||
{
|
||||
$this->user = $user;
|
||||
$this->migrator = $migrator;
|
||||
$this->file_open($log_file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open file for logging
|
||||
*
|
||||
* @param string $file File to open
|
||||
*/
|
||||
protected function file_open($file)
|
||||
{
|
||||
if (phpbb_is_writable(dirname($file)))
|
||||
{
|
||||
$this->file_handle = fopen($file, 'w');
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new \RuntimeException('Unable to write to migrator log file');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function write($message, $verbosity)
|
||||
{
|
||||
$this->migrator->write($message, $verbosity);
|
||||
|
||||
if ($this->file_handle !== false)
|
||||
{
|
||||
$translated_message = call_user_func_array(array($this->user, 'lang'), $message) . "\n";
|
||||
|
||||
if ($verbosity <= migrator_output_handler_interface::VERBOSITY_NORMAL)
|
||||
{
|
||||
$translated_message = '[INFO] ' . $translated_message;
|
||||
}
|
||||
else
|
||||
{
|
||||
$translated_message = '[DEBUG] ' . $translated_message;
|
||||
}
|
||||
|
||||
fwrite($this->file_handle, $translated_message);
|
||||
fflush($this->file_handle);
|
||||
}
|
||||
}
|
||||
}
|
@ -67,6 +67,13 @@ class migrator
|
||||
*/
|
||||
public $last_run_migration = false;
|
||||
|
||||
/**
|
||||
* The output handler. A null handler is configured by default.
|
||||
*
|
||||
* @var migrator_output_handler
|
||||
*/
|
||||
public $output_handler;
|
||||
|
||||
/**
|
||||
* Constructor of the database migrator
|
||||
*/
|
||||
@ -84,6 +91,8 @@ class migrator
|
||||
|
||||
$this->table_prefix = $table_prefix;
|
||||
|
||||
$this->output_handler = new null_migrator_output_handler();
|
||||
|
||||
foreach ($tools as $tool)
|
||||
{
|
||||
$this->tools[$tool->get_name()] = $tool;
|
||||
@ -94,6 +103,16 @@ class migrator
|
||||
$this->load_migration_state();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the output handler.
|
||||
*
|
||||
* @param migrator_output_handler $handler The output handler
|
||||
*/
|
||||
public function set_output_handler(migrator_output_handler_interface $handler)
|
||||
{
|
||||
$this->output_handler = $handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all migrations and their application state from the database.
|
||||
*
|
||||
@ -161,6 +180,10 @@ class migrator
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_EFFECTIVELY_INSTALLED', $name), migrator_output_handler_interface::VERBOSITY_DEBUG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,6 +198,7 @@ class migrator
|
||||
{
|
||||
if (!class_exists($name))
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_NOT_VALID', $name), migrator_output_handler_interface::VERBOSITY_DEBUG);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -191,6 +215,11 @@ class migrator
|
||||
'migration_end_time' => 0,
|
||||
);
|
||||
|
||||
if (!empty($state['migration_depends_on']))
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_APPLY_DEPENDENCIES', $name), migrator_output_handler_interface::VERBOSITY_DEBUG);
|
||||
}
|
||||
|
||||
foreach ($state['migration_depends_on'] as $depend)
|
||||
{
|
||||
if ($this->unfulfillable($depend) !== false)
|
||||
@ -227,6 +256,8 @@ class migrator
|
||||
);
|
||||
|
||||
$this->last_run_migration['effectively_installed'] = true;
|
||||
|
||||
$this->output_handler->write(array('MIGRATION_EFFECTIVELY_INSTALLED', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -238,23 +269,43 @@ class migrator
|
||||
|
||||
if (!$state['migration_schema_done'])
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_SCHEMA_RUNNING', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE);
|
||||
|
||||
$this->last_run_migration['task'] = 'process_schema_step';
|
||||
$elapsed_time = microtime(true);
|
||||
$steps = $this->helper->get_schema_steps($migration->update_schema());
|
||||
$result = $this->process_data_step($steps, $state['migration_data_state']);
|
||||
$elapsed_time = microtime(true) - $elapsed_time;
|
||||
|
||||
$state['migration_data_state'] = ($result === true) ? '' : $result;
|
||||
$state['migration_schema_done'] = ($result === true);
|
||||
|
||||
$this->output_handler->write(array('MIGRATION_SCHEMA_DONE', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_NORMAL);
|
||||
}
|
||||
else if (!$state['migration_data_done'])
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_DATA_RUNNING', $name), migrator_output_handler_interface::VERBOSITY_VERBOSE);
|
||||
|
||||
$this->last_run_migration['task'] = 'process_data_step';
|
||||
|
||||
$elapsed_time = microtime(true);
|
||||
$result = $this->process_data_step($migration->update_data(), $state['migration_data_state']);
|
||||
$elapsed_time = microtime(true) - $elapsed_time;
|
||||
|
||||
$state['migration_data_state'] = ($result === true) ? '' : $result;
|
||||
$state['migration_data_done'] = ($result === true);
|
||||
$state['migration_end_time'] = ($result === true) ? time() : 0;
|
||||
|
||||
if ($state['migration_schema_done'])
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_DATA_DONE', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_NORMAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->output_handler->write(array('MIGRATION_DATA_IN_PROGRESS', $name, $elapsed_time), migrator_output_handler_interface::VERBOSITY_VERY_VERBOSE);
|
||||
}
|
||||
}
|
||||
catch (\phpbb\db\migration\exception $e)
|
||||
{
|
||||
|
31
phpBB/phpbb/db/migrator_output_handler_interface.php
Normal file
31
phpBB/phpbb/db/migrator_output_handler_interface.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?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\db;
|
||||
|
||||
interface migrator_output_handler_interface
|
||||
{
|
||||
const VERBOSITY_QUIET = 0;
|
||||
const VERBOSITY_NORMAL = 1;
|
||||
const VERBOSITY_VERBOSE = 2;
|
||||
const VERBOSITY_VERY_VERBOSE = 3;
|
||||
const VERBOSITY_DEBUG = 4;
|
||||
|
||||
/**
|
||||
* Write output using the configured closure.
|
||||
*
|
||||
* @param string|array $message The message to write or an array containing the language key and all of its parameters.
|
||||
* @param int $verbosity The verbosity of the message.
|
||||
*/
|
||||
public function write($message, $verbosity);
|
||||
}
|
24
phpBB/phpbb/db/null_migrator_output_handler.php
Normal file
24
phpBB/phpbb/db/null_migrator_output_handler.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?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\db;
|
||||
|
||||
class null_migrator_output_handler implements migrator_output_handler_interface
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function write($message, $verbosity)
|
||||
{
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user