mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-08 04:18:52 +00:00
[ticket/13740] Use service collection instead of array of task names
PHPBB3-13740
This commit is contained in:
parent
794726a464
commit
62103cec30
14 changed files with 221 additions and 242 deletions
|
@ -8,6 +8,8 @@ services:
|
|||
- @language
|
||||
- %core.root_path%
|
||||
- %core.php_ext%
|
||||
tags:
|
||||
- { name: install_data_install, order: 2 }
|
||||
|
||||
installer.install_data.add_languages:
|
||||
class: phpbb\install\module\install_data\task\add_languages
|
||||
|
@ -15,15 +17,28 @@ services:
|
|||
- @installer.helper.iohandler
|
||||
- @installer.helper.container_factory
|
||||
- @language.helper.language_file
|
||||
tags:
|
||||
- { name: install_data_install, order: 1 }
|
||||
|
||||
installer.install_data.add_modules:
|
||||
class: phpbb\install\module\install_data\task\add_modules
|
||||
arguments:
|
||||
- @installer.helper.iohandler
|
||||
- @installer.helper.container_factory
|
||||
tags:
|
||||
- { name: install_data_install, order: 3 }
|
||||
|
||||
installer.module.data_install_collection:
|
||||
class: phpbb\di\ordered_service_collection
|
||||
arguments:
|
||||
- @service_container
|
||||
tags:
|
||||
- { name: service_collection, tag: install_data_install }
|
||||
|
||||
installer.module.data_install:
|
||||
class: phpbb\install\module\install_data\module
|
||||
parent: installer.module_base
|
||||
arguments:
|
||||
- ["installer.install_data.add_languages", "installer.install_data.add_bots", "installer.install_data.add_modules"]
|
||||
- @installer.module.data_install_collection
|
||||
tags:
|
||||
- { name: installer_install_module, order: 5 }
|
||||
|
|
|
@ -6,9 +6,10 @@ services:
|
|||
- @installer.helper.database
|
||||
- @filesystem
|
||||
- @installer.helper.iohandler
|
||||
# - @installer.helper.container_factory
|
||||
- %core.root_path%
|
||||
- %core.php_ext%
|
||||
tags:
|
||||
- { name: install_database_install, order: 1 }
|
||||
|
||||
installer.install_database.add_default_data:
|
||||
class: phpbb\install\module\install_database\task\add_default_data
|
||||
|
@ -19,6 +20,8 @@ services:
|
|||
- @installer.helper.container_factory
|
||||
- @language
|
||||
- %core.root_path%
|
||||
tags:
|
||||
- { name: install_database_install, order: 2 }
|
||||
|
||||
installer.install_database.add_config_settings:
|
||||
class: phpbb\install\module\install_database\task\add_config_settings
|
||||
|
@ -29,9 +32,20 @@ services:
|
|||
- @installer.helper.container_factory
|
||||
- @language
|
||||
- %core.root_path%
|
||||
tags:
|
||||
- { name: install_database_install, order: 3 }
|
||||
|
||||
installer.module.install_database_collection:
|
||||
class: phpbb\di\ordered_service_collection
|
||||
arguments:
|
||||
- @service_container
|
||||
tags:
|
||||
- { name: service_collection, tag: install_database_install }
|
||||
|
||||
installer.module.database_install:
|
||||
class: phpbb\install\module\install_database\module
|
||||
parent: installer.module_base
|
||||
arguments:
|
||||
- ["installer.install_database.create_schema", "installer.install_database.add_default_data", "installer.install_database.add_config_settings"]
|
||||
- @installer.module.install_database_collection
|
||||
tags:
|
||||
- { name: installer_install_module, order: 4 }
|
||||
|
|
|
@ -8,9 +8,20 @@ services:
|
|||
- @installer.helper.iohandler
|
||||
- %core.root_path%
|
||||
- %core.php_ext%
|
||||
tags:
|
||||
- { name: install_filesystem_install, order: 1 }
|
||||
|
||||
installer.module.install_filesystem_collection:
|
||||
class: phpbb\di\ordered_service_collection
|
||||
arguments:
|
||||
- @service_container
|
||||
tags:
|
||||
- { name: service_collection, tag: install_filesystem_install }
|
||||
|
||||
installer.module.filesystem_install:
|
||||
class: phpbb\install\module\install_filesystem\module
|
||||
parent: installer.module_base
|
||||
arguments:
|
||||
- ["installer.install_filesystem.create_config_file"]
|
||||
- @installer.module.install_filesystem_collection
|
||||
tags:
|
||||
- { name: installer_install_module, order: 3 }
|
||||
|
|
|
@ -3,6 +3,8 @@ services:
|
|||
class: phpbb\install\module\install_finish\task\populate_migrations
|
||||
arguments:
|
||||
- @installer.helper.container_factory
|
||||
tags:
|
||||
- { name: install_finish, order: 1 }
|
||||
|
||||
installer.install_finish.notify_user:
|
||||
class: phpbb\install\module\install_finish\task\notify_user
|
||||
|
@ -12,9 +14,20 @@ services:
|
|||
- @installer.helper.iohandler
|
||||
- %core.root_path%
|
||||
- %core.php_ext%
|
||||
tags:
|
||||
- { name: install_finish, order: 2 }
|
||||
|
||||
installer.module.install_finish_collection:
|
||||
class: phpbb\di\ordered_service_collection
|
||||
arguments:
|
||||
- @service_container
|
||||
tags:
|
||||
- { name: service_collection, tag: install_finish }
|
||||
|
||||
installer.module.finish_install:
|
||||
class: phpbb\install\module\install_filesystem\module
|
||||
parent: installer.module_base
|
||||
arguments:
|
||||
- ["installer.install_finish.populate_migrations", "installer.install_finish.notify_user"]
|
||||
- @installer.module.install_finish_collection
|
||||
tags:
|
||||
- { name: installer_install_module, order: 6 }
|
||||
|
|
|
@ -4,6 +4,8 @@ services:
|
|||
arguments:
|
||||
- @installer.helper.config
|
||||
- @installer.helper.iohandler
|
||||
tags:
|
||||
- { name: install_obtain_data, order: 1 }
|
||||
|
||||
installer.obtain_data.obtain_board_data:
|
||||
class: phpbb\install\module\obtain_data\task\obtain_board_data
|
||||
|
@ -11,6 +13,8 @@ services:
|
|||
- @installer.helper.config
|
||||
- @installer.helper.iohandler
|
||||
- @language.helper.language_file
|
||||
tags:
|
||||
- { name: install_obtain_data, order: 5 }
|
||||
|
||||
installer.obtain_data.obtain_database_data:
|
||||
class: phpbb\install\module\obtain_data\task\obtain_database_data
|
||||
|
@ -18,28 +22,45 @@ services:
|
|||
- @installer.helper.database
|
||||
- @installer.helper.config
|
||||
- @installer.helper.iohandler
|
||||
tags:
|
||||
- { name: install_obtain_data, order: 2 }
|
||||
|
||||
installer.obtain_data.obtain_email_data:
|
||||
class: phpbb\install\module\obtain_data\task\obtain_email_data
|
||||
arguments:
|
||||
- @installer.helper.config
|
||||
- @installer.helper.iohandler
|
||||
tags:
|
||||
- { name: install_obtain_data, order: 4 }
|
||||
|
||||
installer.obtain_data.obtain_imagick_path:
|
||||
class: phpbb\install\module\obtain_data\task\obtain_imagick_path
|
||||
arguments:
|
||||
- @installer.helper.config
|
||||
tags:
|
||||
- { name: install_obtain_data, order: 6 }
|
||||
|
||||
installer.obtain_data.obtain_server_data:
|
||||
class: phpbb\install\module\obtain_data\task\obtain_server_data
|
||||
arguments:
|
||||
- @installer.helper.config
|
||||
- @installer.helper.iohandler
|
||||
tags:
|
||||
- { name: install_obtain_data, order: 3 }
|
||||
|
||||
installer.module.install_obtain_data_collection:
|
||||
class: phpbb\di\ordered_service_collection
|
||||
arguments:
|
||||
- @service_container
|
||||
tags:
|
||||
- { name: service_collection, tag: install_obtain_data }
|
||||
|
||||
installer.module.obtain_data_install:
|
||||
class: phpbb\install\module\obtain_data\module
|
||||
parent: installer.module_base
|
||||
arguments:
|
||||
- ["installer.obtain_data.obtain_admin_data", "installer.obtain_data.obtain_database_data", "installer.obtain_data.obtain_server_data", "installer.obtain_data.obtain_email_data", "installer.obtain_data.obtain_board_data", "installer.obtain_data.obtain_imagick_path"]
|
||||
- @installer.module.install_obtain_data_collection
|
||||
- true
|
||||
- false
|
||||
tags:
|
||||
- { name: installer_install_module, order: 2 }
|
||||
|
|
|
@ -6,18 +6,31 @@ services:
|
|||
- @installer.helper.iohandler
|
||||
- %core.root_path%
|
||||
- %core.php_ext%
|
||||
tags:
|
||||
- { name: installer_requirements, order: 1 }
|
||||
|
||||
installer.requirements.check_server_environment:
|
||||
class: phpbb\install\module\requirements\task\check_server_environment
|
||||
arguments:
|
||||
- @installer.helper.database
|
||||
- @installer.helper.iohandler
|
||||
tags:
|
||||
- { name: installer_requirements, order: 2 }
|
||||
|
||||
installer.module.install_requirements_collection:
|
||||
class: phpbb\di\ordered_service_collection
|
||||
arguments:
|
||||
- @service_container
|
||||
tags:
|
||||
- { name: service_collection, tag: installer_requirements }
|
||||
|
||||
# Please note, that the name of this module is hard coded in the installer service
|
||||
installer.module.requirements_install:
|
||||
class: phpbb\install\module\requirements\module
|
||||
parent: installer.module_base
|
||||
arguments:
|
||||
- ["installer.requirements.check_filesystem", "installer.requirements.check_server_environment"]
|
||||
- @installer.module.install_requirements_collection
|
||||
- true
|
||||
- false
|
||||
tags:
|
||||
- { name: installer_install_module, order: 1 }
|
||||
|
|
|
@ -69,7 +69,14 @@ services:
|
|||
- @installer.helper.config
|
||||
- @service_container
|
||||
|
||||
installer.install.module_collection:
|
||||
class: phpbb\di\ordered_service_collection
|
||||
arguments:
|
||||
- @service_container
|
||||
tags:
|
||||
- { name: service_collection, tag: installer_install_module }
|
||||
|
||||
installer.installer.install:
|
||||
parent: installer.installer.abstract
|
||||
calls:
|
||||
- [set_modules, [["installer.module.requirements_install", "installer.module.obtain_data_install", "installer.module.filesystem_install", "installer.module.database_install", "installer.module.data_install", "installer.module.finish_install"]]]
|
||||
- [set_modules, [@installer.install.module_collection]]
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
<?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\install\exception;
|
||||
|
||||
class module_not_found_exception extends installer_exception
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $module_service_name;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $module_service_name The name of the missing installer module
|
||||
*/
|
||||
public function __construct($module_service_name)
|
||||
{
|
||||
$this->module_service_name = $module_service_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the missing installer module's service name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_module_service_name()
|
||||
{
|
||||
return $this->module_service_name;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?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\install\exception;
|
||||
|
||||
class resource_limit_reached_exception extends installer_exception
|
||||
{
|
||||
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
<?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\install\exception;
|
||||
|
||||
class task_not_found_exception extends installer_exception
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $task_service_name;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $task_service_name The name of the missing installer module
|
||||
*/
|
||||
public function __construct($task_service_name)
|
||||
{
|
||||
$this->task_service_name = $task_service_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the missing installer task's service name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_task_service_name()
|
||||
{
|
||||
return $this->task_service_name;
|
||||
}
|
||||
}
|
|
@ -87,9 +87,7 @@ class config
|
|||
$this->installer_config = array();
|
||||
$this->system_data = array();
|
||||
$this->progress_data = array(
|
||||
'last_task_module_index' => 0,
|
||||
'last_task_module_name' => '', // Stores the service name of the latest finished module
|
||||
'last_task_index' => 0,
|
||||
'last_task_name' => '', // Stores the service name of the latest finished task
|
||||
'max_task_progress' => 0,
|
||||
'current_task_progress' => 0,
|
||||
|
@ -180,24 +178,20 @@ class config
|
|||
* Saves the latest executed task
|
||||
*
|
||||
* @param string $task_service_name Name of the installer task service
|
||||
* @param int $task_index Index of the task in the task list array
|
||||
*/
|
||||
public function set_finished_task($task_service_name, $task_index)
|
||||
public function set_finished_task($task_service_name)
|
||||
{
|
||||
$this->progress_data['last_task_name'] = $task_service_name;
|
||||
$this->progress_data['last_task_index'] = $task_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set active module
|
||||
*
|
||||
* @param string $module_service_name Name of the installer module service
|
||||
* @param int $module_index Index of the module in the module list array
|
||||
*/
|
||||
public function set_active_module($module_service_name, $module_index)
|
||||
public function set_active_module($module_service_name)
|
||||
{
|
||||
$this->progress_data['last_task_module_name'] = $module_service_name;
|
||||
$this->progress_data['last_task_module_index'] = $module_index;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -13,10 +13,10 @@
|
|||
|
||||
namespace phpbb\install;
|
||||
|
||||
use phpbb\di\ordered_service_collection;
|
||||
use phpbb\install\exception\installer_config_not_writable_exception;
|
||||
use phpbb\install\exception\invalid_service_name_exception;
|
||||
use phpbb\install\exception\module_not_found_exception;
|
||||
use phpbb\install\exception\task_not_found_exception;
|
||||
use phpbb\install\exception\resource_limit_reached_exception;
|
||||
use phpbb\install\exception\user_interaction_required_exception;
|
||||
use phpbb\install\helper\config;
|
||||
use phpbb\install\helper\iohandler\iohandler_interface;
|
||||
|
@ -62,7 +62,7 @@ class installer
|
|||
{
|
||||
$this->install_config = $config;
|
||||
$this->container = $container;
|
||||
$this->installer_modules = array();
|
||||
$this->installer_modules = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -71,12 +71,10 @@ class installer
|
|||
* Note: The installer will run modules in the order they are set in
|
||||
* the array.
|
||||
*
|
||||
* @param array $modules Array of module service names
|
||||
* @param ordered_service_collection $modules Service collection of module service names
|
||||
*/
|
||||
public function set_modules($modules)
|
||||
public function set_modules(ordered_service_collection $modules)
|
||||
{
|
||||
$modules = (array) $modules;
|
||||
|
||||
$this->installer_modules = $modules;
|
||||
}
|
||||
|
||||
|
@ -99,7 +97,8 @@ class installer
|
|||
$this->install_config->load_config();
|
||||
|
||||
// Recover install progress
|
||||
$module_index = $this->recover_progress();
|
||||
$module_name = $this->recover_progress();
|
||||
$module_found = false;
|
||||
|
||||
// Variable used to check if the install process have been finished
|
||||
$install_finished = false;
|
||||
|
@ -111,27 +110,17 @@ class installer
|
|||
$this->install_config->set_finished_navigation_stage(array('install', 0, 'introduction'));
|
||||
$this->iohandler->set_finished_stage_menu(array('install', 0, 'introduction'));
|
||||
|
||||
try
|
||||
{
|
||||
if ($this->install_config->get_task_progress_count() === 0)
|
||||
{
|
||||
// Count all tasks in the current installer modules
|
||||
$step_count = 0;
|
||||
foreach ($this->installer_modules as $index => $name)
|
||||
{
|
||||
try
|
||||
{
|
||||
/** @var \phpbb\install\module_interface $module */
|
||||
$module = $this->container->get($name);
|
||||
}
|
||||
catch (InvalidArgumentException $e)
|
||||
{
|
||||
throw new module_not_found_exception($name);
|
||||
}
|
||||
|
||||
/** @var \phpbb\install\module_interface $module */
|
||||
foreach ($this->installer_modules as $name => $module)
|
||||
{
|
||||
$module_step_count = $module->get_step_count();
|
||||
$step_count += $module_step_count;
|
||||
$this->module_step_count[$index] = $module_step_count;
|
||||
$this->module_step_count[$name] = $module_step_count;
|
||||
}
|
||||
|
||||
// Set task count
|
||||
|
@ -143,32 +132,31 @@ class installer
|
|||
$this->install_config->get_task_progress_count()
|
||||
);
|
||||
|
||||
// Run until there are available resources
|
||||
while ($this->install_config->get_time_remaining() > 0 && $this->install_config->get_memory_remaining() > 0)
|
||||
try
|
||||
{
|
||||
// Check if module exists, if not the install is completed
|
||||
if (!isset($this->installer_modules[$module_index]))
|
||||
foreach ($this->installer_modules as $name => $module)
|
||||
{
|
||||
$install_finished = true;
|
||||
break;
|
||||
// Skip forward until the current task is reached
|
||||
if (!empty($task_name) && !$module_found)
|
||||
{
|
||||
if ($module_name === $name)
|
||||
{
|
||||
$module_found = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Log progress
|
||||
$module_service_name = $this->installer_modules[$module_index];
|
||||
$this->install_config->set_active_module($module_service_name, $module_index);
|
||||
$this->install_config->set_active_module($name);
|
||||
|
||||
// Get module from container
|
||||
try
|
||||
// Run until there are available resources
|
||||
if ($this->install_config->get_time_remaining() <= 0 && $this->install_config->get_memory_remaining() <= 0)
|
||||
{
|
||||
/** @var \phpbb\install\module_interface $module */
|
||||
$module = $this->container->get($module_service_name);
|
||||
throw new resource_limit_reached_exception();
|
||||
}
|
||||
catch (InvalidArgumentException $e)
|
||||
{
|
||||
throw new module_not_found_exception($module_service_name);
|
||||
}
|
||||
|
||||
$module_index++;
|
||||
|
||||
// Check if module should be executed
|
||||
if (!$module->is_essential() && !$module->check_requirements())
|
||||
|
@ -178,9 +166,9 @@ class installer
|
|||
|
||||
$this->iohandler->add_log_message(array(
|
||||
'SKIP_MODULE',
|
||||
$module_service_name,
|
||||
$name,
|
||||
));
|
||||
$this->install_config->increment_current_task_progress($this->module_step_count[$module_index - 1]);
|
||||
$this->install_config->increment_current_task_progress($this->module_step_count[$name]);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -192,40 +180,18 @@ class installer
|
|||
|
||||
$this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path());
|
||||
$this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path());
|
||||
|
||||
// Clear task progress
|
||||
$this->install_config->set_finished_task('', 0);
|
||||
}
|
||||
|
||||
if ($install_finished)
|
||||
{
|
||||
// Send install finished message
|
||||
$this->iohandler->set_progress('INSTALLER_FINISHED', $this->install_config->get_task_progress_count());
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->iohandler->request_refresh();
|
||||
}
|
||||
// Installation finished
|
||||
$install_finished = true;
|
||||
}
|
||||
catch (user_interaction_required_exception $e)
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
catch (module_not_found_exception $e)
|
||||
catch (resource_limit_reached_exception $e)
|
||||
{
|
||||
$this->iohandler->add_error_message('MODULE_NOT_FOUND', array(
|
||||
'MODULE_NOT_FOUND_DESCRIPTION',
|
||||
$e->get_module_service_name(),
|
||||
));
|
||||
$flush_messages = true;
|
||||
}
|
||||
catch (task_not_found_exception $e)
|
||||
{
|
||||
$this->iohandler->add_error_message('TASK_NOT_FOUND', array(
|
||||
'TASK_NOT_FOUND_DESCRIPTION',
|
||||
$e->get_task_service_name(),
|
||||
));
|
||||
$flush_messages = true;
|
||||
// Do nothing
|
||||
}
|
||||
catch (invalid_service_name_exception $e)
|
||||
{
|
||||
|
@ -244,6 +210,16 @@ class installer
|
|||
$flush_messages = true;
|
||||
}
|
||||
|
||||
if ($install_finished)
|
||||
{
|
||||
// Send install finished message
|
||||
$this->iohandler->set_progress('INSTALLER_FINISHED', $this->install_config->get_task_progress_count());
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->iohandler->request_refresh();
|
||||
}
|
||||
|
||||
if ($flush_messages)
|
||||
{
|
||||
$this->iohandler->send_response();
|
||||
|
@ -274,14 +250,6 @@ class installer
|
|||
protected function recover_progress()
|
||||
{
|
||||
$progress_array = $this->install_config->get_progress_data();
|
||||
$module_service = $progress_array['last_task_module_name'];
|
||||
$module_index = $progress_array['last_task_module_index'];
|
||||
|
||||
if ($this->installer_modules[$module_index] === $module_service)
|
||||
{
|
||||
return $module_index;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return $progress_array['last_task_module_name'];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,12 +13,13 @@
|
|||
|
||||
namespace phpbb\install;
|
||||
|
||||
use phpbb\di\ordered_service_collection;
|
||||
use phpbb\install\exception\invalid_service_name_exception;
|
||||
use phpbb\install\exception\task_not_found_exception;
|
||||
use phpbb\install\exception\resource_limit_reached_exception;
|
||||
use phpbb\install\helper\config;
|
||||
use phpbb\install\helper\iohandler\iohandler_interface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
||||
use phpbb\install\helper\config;
|
||||
|
||||
/**
|
||||
* Base class for installer module
|
||||
|
@ -48,7 +49,7 @@ abstract class module_base implements module_interface
|
|||
/**
|
||||
* Array of tasks for installer module
|
||||
*
|
||||
* @var array
|
||||
* @var ordered_service_collection
|
||||
*/
|
||||
protected $task_collection;
|
||||
|
||||
|
@ -60,11 +61,11 @@ abstract class module_base implements module_interface
|
|||
/**
|
||||
* Installer module constructor
|
||||
*
|
||||
* @param array $tasks array of installer tasks for installer module
|
||||
* @param ordered_service_collection $tasks array of installer tasks for installer module
|
||||
* @param bool $essential flag indicating whether the module is essential or not
|
||||
* @param bool $allow_progress_bar flag indicating whether or not to send progress information from within the module
|
||||
*/
|
||||
public function __construct(array $tasks, $essential = true, $allow_progress_bar = true)
|
||||
public function __construct(ordered_service_collection $tasks, $essential = true, $allow_progress_bar = true)
|
||||
{
|
||||
$this->task_collection = $tasks;
|
||||
$this->is_essential = $essential;
|
||||
|
@ -109,26 +110,30 @@ abstract class module_base implements module_interface
|
|||
public function run()
|
||||
{
|
||||
// Recover install progress
|
||||
$task_index = $this->recover_progress();
|
||||
$task_name = $this->recover_progress();
|
||||
$name_found = false;
|
||||
|
||||
/**
|
||||
* @var string $name ID of the service
|
||||
* @var \phpbb\install\task_interface $task Task object
|
||||
*/
|
||||
foreach ($this->task_collection as $name => $task)
|
||||
{
|
||||
// Run until there are available resources
|
||||
while ($this->install_config->get_time_remaining() > 0 && $this->install_config->get_memory_remaining() > 0)
|
||||
if ($this->install_config->get_time_remaining() <= 0 && $this->install_config->get_memory_remaining() <= 0)
|
||||
{
|
||||
// Check if task exists
|
||||
if (!isset($this->task_collection[$task_index]))
|
||||
{
|
||||
break;
|
||||
throw new resource_limit_reached_exception();
|
||||
}
|
||||
|
||||
// Recover task to be executed
|
||||
try
|
||||
// Skip forward until the next task is reached
|
||||
if (!empty($task_name) && !$name_found)
|
||||
{
|
||||
/** @var \phpbb\install\task_interface $task */
|
||||
$task = $this->container->get($this->task_collection[$task_index]);
|
||||
if ($name === $task_name)
|
||||
{
|
||||
$name_found = true;
|
||||
}
|
||||
catch (InvalidArgumentException $e)
|
||||
{
|
||||
throw new task_not_found_exception($this->task_collection[$task_index]);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Send progress information
|
||||
|
@ -140,17 +145,15 @@ abstract class module_base implements module_interface
|
|||
);
|
||||
}
|
||||
|
||||
// Iterate to the next task
|
||||
$task_index++;
|
||||
|
||||
// Check if we can run the task
|
||||
if (!$task->is_essential() && !$task->check_requirements())
|
||||
{
|
||||
$this->iohandler->add_log_message(array(
|
||||
'SKIP_TASK',
|
||||
$this->task_collection[$task_index],
|
||||
$name,
|
||||
));
|
||||
$class_name = $this->get_class_from_service_name($this->task_collection[$task_index - 1]);
|
||||
|
||||
$class_name = $this->get_class_from_service_name($name);
|
||||
$this->install_config->increment_current_task_progress($class_name::get_step_count());
|
||||
continue;
|
||||
}
|
||||
|
@ -174,9 +177,11 @@ abstract class module_base implements module_interface
|
|||
$this->iohandler->send_response();
|
||||
|
||||
// Log install progress
|
||||
$current_task_index = $task_index - 1;
|
||||
$this->install_config->set_finished_task($this->task_collection[$current_task_index], $current_task_index);
|
||||
$this->install_config->set_finished_task($name);
|
||||
}
|
||||
|
||||
// Module finished, so clear task progress
|
||||
$this->install_config->set_finished_task('');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -187,24 +192,7 @@ abstract class module_base implements module_interface
|
|||
protected function recover_progress()
|
||||
{
|
||||
$progress_array = $this->install_config->get_progress_data();
|
||||
$last_finished_task_name = $progress_array['last_task_name'];
|
||||
$last_finished_task_index = $progress_array['last_task_index'];
|
||||
|
||||
// Check if the data is relevant to this module
|
||||
if (isset($this->task_collection[$last_finished_task_index]))
|
||||
{
|
||||
if ($this->task_collection[$last_finished_task_index] === $last_finished_task_name)
|
||||
{
|
||||
// Return the task index of the next task
|
||||
return $last_finished_task_index + 1;
|
||||
}
|
||||
}
|
||||
|
||||
// As of now if the progress has not been resolved we assume that it is because
|
||||
// the task progress belongs to the previous module,
|
||||
// so just default to the first task
|
||||
// @todo make module aware of it's service name that way this can be improved
|
||||
return 0;
|
||||
return $progress_array['last_task_name'];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -214,11 +202,13 @@ abstract class module_base implements module_interface
|
|||
{
|
||||
$step_count = 0;
|
||||
|
||||
/** @todo: Fix this
|
||||
foreach ($this->task_collection as $task_service_name)
|
||||
{
|
||||
$class_name = $this->get_class_from_service_name($task_service_name);
|
||||
$step_count += $class_name::get_step_count();
|
||||
}
|
||||
*/
|
||||
|
||||
return $step_count;
|
||||
}
|
||||
|
|
|
@ -63,8 +63,8 @@ class phpbb_installer_config_test extends phpbb_test_case
|
|||
*/
|
||||
public function test_progress_tracking()
|
||||
{
|
||||
$this->config->set_finished_task('foo', 3);
|
||||
$this->config->set_active_module('bar', 4);
|
||||
$this->config->set_finished_task('foo');
|
||||
$this->config->set_active_module('bar');
|
||||
$this->config->set_task_progress_count(10);
|
||||
$this->config->increment_current_task_progress();
|
||||
|
||||
|
@ -74,10 +74,8 @@ class phpbb_installer_config_test extends phpbb_test_case
|
|||
$this->config->increment_current_task_progress(2);
|
||||
|
||||
$this->assertEquals(array(
|
||||
'last_task_module_index' => 4,
|
||||
'last_task_module_name' => 'bar', // Stores the service name of the latest finished module
|
||||
'last_task_index' => 3,
|
||||
'last_task_name' => 'foo', // Stores the service name of the latest finished task
|
||||
'last_task_module_name' => 'bar',
|
||||
'last_task_name' => 'foo',
|
||||
'max_task_progress' => 10,
|
||||
'current_task_progress' => 3,
|
||||
),
|
||||
|
|
Loading…
Add table
Reference in a new issue