mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 14:18:52 +00:00
Merge remote-tracking branch 'EXreaction/ticket/11415' into develop
* EXreaction/ticket/11415: [ticket/11415] Add test for find_from_extension() [ticket/11415] Send the extension base the finder rather than the manager [ticket/11415] Create function in finder find_from_extension [ticket/11415] Fix ext.manager constructor in tests [ticket/11415] Make migrator/ext.manager dependencies of the base ext class [ticket/11415] Remove migrator dependency from extension manager [ticket/11415] Move migrator to base extension class from ext.manager [ticket/11415] Move while loop from ext manager to acp_extensions.php
This commit is contained in:
commit
d8ed228ddf
10 changed files with 172 additions and 112 deletions
|
@ -130,7 +130,6 @@ services:
|
|||
- @service_container
|
||||
- @dbal.conn
|
||||
- @config
|
||||
- @migrator
|
||||
- @filesystem
|
||||
- %tables.ext%
|
||||
- %core.root_path%
|
||||
|
|
|
@ -44,6 +44,10 @@ class acp_extensions
|
|||
$action = $request->variable('action', 'list');
|
||||
$ext_name = $request->variable('ext_name', '');
|
||||
|
||||
// What is a safe limit of execution time? Half the max execution time should be safe.
|
||||
$safe_time_limit = (ini_get('max_execution_time') / 2);
|
||||
$start_time = time();
|
||||
|
||||
// Cancel action
|
||||
if ($request->is_set_post('cancel'))
|
||||
{
|
||||
|
@ -105,11 +109,15 @@ class acp_extensions
|
|||
|
||||
try
|
||||
{
|
||||
if ($phpbb_extension_manager->enable_step($ext_name))
|
||||
while ($phpbb_extension_manager->enable_step($ext_name))
|
||||
{
|
||||
$template->assign_var('S_NEXT_STEP', true);
|
||||
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing
|
||||
if ((time() - $start_time) >= $safe_time_limit)
|
||||
{
|
||||
$template->assign_var('S_NEXT_STEP', true);
|
||||
|
||||
meta_refresh(0, $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name));
|
||||
meta_refresh(0, $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (phpbb_db_migration_exception $e)
|
||||
|
@ -139,11 +147,15 @@ class acp_extensions
|
|||
break;
|
||||
|
||||
case 'disable':
|
||||
if ($phpbb_extension_manager->disable_step($ext_name))
|
||||
while ($phpbb_extension_manager->disable_step($ext_name))
|
||||
{
|
||||
$template->assign_var('S_NEXT_STEP', true);
|
||||
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing
|
||||
if ((time() - $start_time) >= $safe_time_limit)
|
||||
{
|
||||
$template->assign_var('S_NEXT_STEP', true);
|
||||
|
||||
meta_refresh(0, $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name));
|
||||
meta_refresh(0, $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name));
|
||||
}
|
||||
}
|
||||
|
||||
$this->tpl_name = 'acp_ext_disable';
|
||||
|
@ -165,11 +177,15 @@ class acp_extensions
|
|||
case 'purge':
|
||||
try
|
||||
{
|
||||
if ($phpbb_extension_manager->purge_step($ext_name))
|
||||
while ($phpbb_extension_manager->purge_step($ext_name))
|
||||
{
|
||||
$template->assign_var('S_NEXT_STEP', true);
|
||||
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing
|
||||
if ((time() - $start_time) >= $safe_time_limit)
|
||||
{
|
||||
$template->assign_var('S_NEXT_STEP', true);
|
||||
|
||||
meta_refresh(0, $this->u_action . '&action=purge&ext_name=' . urlencode($ext_name));
|
||||
meta_refresh(0, $this->u_action . '&action=purge&ext_name=' . urlencode($ext_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (phpbb_db_migration_exception $e)
|
||||
|
|
|
@ -27,25 +27,51 @@ class phpbb_extension_base implements phpbb_extension_interface
|
|||
/** @var ContainerInterface */
|
||||
protected $container;
|
||||
|
||||
/** @var phpbb_extension_finder */
|
||||
protected $finder;
|
||||
|
||||
/** @var phpbb_db_migrator */
|
||||
protected $migrator;
|
||||
|
||||
/** @var string */
|
||||
protected $extension_name;
|
||||
|
||||
/** @var string */
|
||||
protected $extension_path;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param ContainerInterface $container Container object
|
||||
* @param phpbb_extension_finder $extension_finder
|
||||
* @param string $extension_name Name of this extension (from ext.manager)
|
||||
* @param string $extension_path Relative path to this extension
|
||||
*/
|
||||
public function __construct(ContainerInterface $container)
|
||||
public function __construct(ContainerInterface $container, phpbb_extension_finder $extension_finder, phpbb_db_migrator $migrator, $extension_name, $extension_path)
|
||||
{
|
||||
$this->container = $container;
|
||||
$this->extension_finder = $extension_finder;
|
||||
$this->migrator = $migrator;
|
||||
|
||||
$this->extension_name = $extension_name;
|
||||
$this->extension_path = $extension_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Single enable step that does nothing
|
||||
* Single enable step that installs any included migrations
|
||||
*
|
||||
* @param mixed $old_state State returned by previous call of this method
|
||||
* @return false Indicates no further steps are required
|
||||
*/
|
||||
public function enable_step($old_state)
|
||||
{
|
||||
return false;
|
||||
$migrations = $this->get_migration_file_list();
|
||||
|
||||
$this->migrator->set_migrations($migrations);
|
||||
|
||||
$this->migrator->update();
|
||||
|
||||
return !$this->migrator->finished();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -60,13 +86,50 @@ class phpbb_extension_base implements phpbb_extension_interface
|
|||
}
|
||||
|
||||
/**
|
||||
* Single purge step that does nothing
|
||||
* Single purge step that reverts any included and installed migrations
|
||||
*
|
||||
* @param mixed $old_state State returned by previous call of this method
|
||||
* @return false Indicates no further steps are required
|
||||
*/
|
||||
public function purge_step($old_state)
|
||||
{
|
||||
$migrations = $this->get_migration_file_list();
|
||||
|
||||
$this->migrator->set_migrations($migrations);
|
||||
|
||||
foreach ($migrations as $migration)
|
||||
{
|
||||
while ($this->migrator->migration_state($migration) !== false)
|
||||
{
|
||||
$this->migrator->revert($migration);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of migration files from this extension
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function get_migration_file_list()
|
||||
{
|
||||
static $migrations = false;
|
||||
|
||||
if ($migrations !== false)
|
||||
{
|
||||
return $migrations;
|
||||
}
|
||||
|
||||
// Only have the finder search in this extension path directory
|
||||
$migrations = $this->extension_finder
|
||||
->extension_directory('/migrations')
|
||||
->find_from_extension($this->extension_name, $this->extension_path);
|
||||
$migrations = $this->extension_finder->get_classes_from_files($migrations);
|
||||
|
||||
return $migrations;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -377,6 +377,34 @@ class phpbb_extension_finder
|
|||
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds all file system entries matching the configured options for one
|
||||
* specific extension
|
||||
*
|
||||
* @param string $extension_name Name of the extension
|
||||
* @param string $extension_path Relative path to the extension root directory
|
||||
* @param bool $cache Whether the result should be cached
|
||||
* @param bool $is_dir Directories will be returned when true, only files
|
||||
* otherwise
|
||||
* @return array An array of paths to found items
|
||||
*/
|
||||
public function find_from_extension($extension_name, $extension_path, $cache = true, $is_dir = false)
|
||||
{
|
||||
$extensions = array(
|
||||
$extension_name => $extension_path,
|
||||
);
|
||||
|
||||
$files = array();
|
||||
$file_list = $this->find_from_paths($extensions, $cache, $is_dir);
|
||||
|
||||
foreach ($file_list as $file)
|
||||
{
|
||||
$files[$file['named_path']] = $file['ext_name'];
|
||||
}
|
||||
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds all file system entries matching the configured options from
|
||||
|
|
|
@ -29,7 +29,6 @@ class phpbb_extension_manager
|
|||
|
||||
protected $db;
|
||||
protected $config;
|
||||
protected $migrator;
|
||||
protected $cache;
|
||||
protected $php_ext;
|
||||
protected $extensions;
|
||||
|
@ -43,7 +42,6 @@ class phpbb_extension_manager
|
|||
* @param ContainerInterface $container A container
|
||||
* @param phpbb_db_driver $db A database connection
|
||||
* @param phpbb_config $config phpbb_config
|
||||
* @param phpbb_db_migrator $migrator
|
||||
* @param phpbb_filesystem $filesystem
|
||||
* @param string $extension_table The name of the table holding extensions
|
||||
* @param string $phpbb_root_path Path to the phpbb includes directory.
|
||||
|
@ -51,13 +49,12 @@ class phpbb_extension_manager
|
|||
* @param phpbb_cache_driver_interface $cache A cache instance or null
|
||||
* @param string $cache_name The name of the cache variable, defaults to _ext
|
||||
*/
|
||||
public function __construct(ContainerInterface $container, phpbb_db_driver $db, phpbb_config $config, phpbb_db_migrator $migrator, phpbb_filesystem $filesystem, $extension_table, $phpbb_root_path, $php_ext = 'php', phpbb_cache_driver_interface $cache = null, $cache_name = '_ext')
|
||||
public function __construct(ContainerInterface $container, phpbb_db_driver $db, phpbb_config $config, phpbb_filesystem $filesystem, $extension_table, $phpbb_root_path, $php_ext = 'php', phpbb_cache_driver_interface $cache = null, $cache_name = '_ext')
|
||||
{
|
||||
$this->container = $container;
|
||||
$this->phpbb_root_path = $phpbb_root_path;
|
||||
$this->db = $db;
|
||||
$this->config = $config;
|
||||
$this->migrator = $migrator;
|
||||
$this->cache = $cache;
|
||||
$this->filesystem = $filesystem;
|
||||
$this->php_ext = $php_ext;
|
||||
|
@ -136,13 +133,15 @@ class phpbb_extension_manager
|
|||
{
|
||||
$extension_class_name = 'phpbb_ext_' . str_replace('/', '_', $name) . '_ext';
|
||||
|
||||
$migrator = $this->container->get('migrator');
|
||||
|
||||
if (class_exists($extension_class_name))
|
||||
{
|
||||
return new $extension_class_name($this->container);
|
||||
return new $extension_class_name($this->container, $this->get_finder(), $migrator, $name, $this->get_extension_path($name, true));
|
||||
}
|
||||
else
|
||||
{
|
||||
return new phpbb_extension_base($this->container);
|
||||
return new phpbb_extension_base($this->container, $this->get_finder(), $migrator, $name, $this->get_extension_path($name, true));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -178,12 +177,6 @@ class phpbb_extension_manager
|
|||
|
||||
$old_state = (isset($this->extensions[$name]['ext_state'])) ? unserialize($this->extensions[$name]['ext_state']) : false;
|
||||
|
||||
// Returns false if not completed
|
||||
if (!$this->handle_migrations($name, 'enable'))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
$extension = $this->get_extension($name);
|
||||
$state = $extension->enable_step($old_state);
|
||||
|
||||
|
@ -199,12 +192,21 @@ class phpbb_extension_manager
|
|||
$this->extensions[$name]['ext_path'] = $this->get_extension_path($extension_data['ext_name']);
|
||||
ksort($this->extensions);
|
||||
|
||||
$sql = 'UPDATE ' . $this->extension_table . '
|
||||
SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . "
|
||||
$sql = 'SELECT COUNT(ext_name) as row_count
|
||||
FROM ' . $this->extension_table . "
|
||||
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
|
||||
$this->db->sql_query($sql);
|
||||
$result = $this->db->sql_query($sql);
|
||||
$count = $this->db->sql_fetchfield('row_count');
|
||||
$this->db->sql_freeresult($result);
|
||||
|
||||
if (!$this->db->sql_affectedrows())
|
||||
if ($count)
|
||||
{
|
||||
$sql = 'UPDATE ' . $this->extension_table . '
|
||||
SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . "
|
||||
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
|
||||
$this->db->sql_query($sql);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sql = 'INSERT INTO ' . $this->extension_table . '
|
||||
' . $this->db->sql_build_array('INSERT', $extension_data);
|
||||
|
@ -335,12 +337,6 @@ class phpbb_extension_manager
|
|||
|
||||
$old_state = unserialize($this->extensions[$name]['ext_state']);
|
||||
|
||||
// Returns false if not completed
|
||||
if (!$this->handle_migrations($name, 'purge'))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
$extension = $this->get_extension($name);
|
||||
$state = $extension->purge_step($old_state);
|
||||
|
||||
|
@ -514,72 +510,4 @@ class phpbb_extension_manager
|
|||
{
|
||||
return new phpbb_extension_finder($this, $this->filesystem, $this->phpbb_root_path, $this->cache, $this->php_ext, $this->cache_name . '_finder');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle installing/reverting migrations
|
||||
*
|
||||
* @param string $extension_name Name of the extension
|
||||
* @param string $mode enable or purge
|
||||
* @return bool True if completed, False if not completed
|
||||
*/
|
||||
protected function handle_migrations($extension_name, $mode)
|
||||
{
|
||||
$extensions = array(
|
||||
$extension_name => $this->phpbb_root_path . $this->get_extension_path($extension_name),
|
||||
);
|
||||
|
||||
$finder = $this->get_finder();
|
||||
$migrations = array();
|
||||
$file_list = $finder
|
||||
->extension_directory('/migrations')
|
||||
->find_from_paths($extensions);
|
||||
|
||||
if (empty($file_list))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach ($file_list as $file)
|
||||
{
|
||||
$migrations[$file['named_path']] = $file['ext_name'];
|
||||
}
|
||||
$migrations = $finder->get_classes_from_files($migrations);
|
||||
$this->migrator->set_migrations($migrations);
|
||||
|
||||
// What is a safe limit of execution time? Half the max execution time should be safe.
|
||||
$safe_time_limit = (ini_get('max_execution_time') / 2);
|
||||
$start_time = time();
|
||||
|
||||
if ($mode == 'enable')
|
||||
{
|
||||
while (!$this->migrator->finished())
|
||||
{
|
||||
$this->migrator->update();
|
||||
|
||||
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing
|
||||
if ((time() - $start_time) >= $safe_time_limit)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ($mode == 'purge')
|
||||
{
|
||||
foreach ($migrations as $migration)
|
||||
{
|
||||
while ($this->migrator->migration_state($migration) !== false)
|
||||
{
|
||||
$this->migrator->revert($migration);
|
||||
|
||||
// Are we approaching the time limit? If so we want to pause the update and continue after refreshing
|
||||
if ((time() - $start_time) >= $safe_time_limit)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,11 +55,14 @@ class phpbb_dbal_migrator_test extends phpbb_database_test_case
|
|||
'phpbb_',
|
||||
$tools
|
||||
);
|
||||
|
||||
$container = new phpbb_mock_container_builder();
|
||||
$container->set('migrator', $migrator);
|
||||
|
||||
$this->extension_manager = new phpbb_extension_manager(
|
||||
new phpbb_mock_container_builder(),
|
||||
$container,
|
||||
$this->db,
|
||||
$this->config,
|
||||
$this->migrator,
|
||||
new phpbb_filesystem(),
|
||||
'phpbb_ext',
|
||||
dirname(__FILE__) . '/../../phpBB/',
|
||||
|
|
|
@ -158,6 +158,23 @@ class phpbb_extension_finder_test extends phpbb_test_case
|
|||
);
|
||||
}
|
||||
|
||||
public function test_find_from_extension()
|
||||
{
|
||||
$files = $this->finder
|
||||
->extension_directory('/type')
|
||||
->find_from_extension('foo', dirname(__FILE__) . '/ext/foo/');
|
||||
$classes = $this->finder->get_classes_from_files($files);
|
||||
|
||||
sort($classes);
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'phpbb_ext_foo_type_alternative',
|
||||
'phpbb_ext_foo_type_dummy_empty',
|
||||
),
|
||||
$classes
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* These do not work because of changes with PHPBB3-11386
|
||||
* They do not seem neccessary to me, so I am commenting them out for now
|
||||
|
|
|
@ -107,11 +107,13 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
|
|||
$table_prefix,
|
||||
array()
|
||||
);
|
||||
$container = new phpbb_mock_container_builder();
|
||||
$container->set('migrator', $migrator);
|
||||
|
||||
return new phpbb_extension_manager(
|
||||
new phpbb_mock_container_builder(),
|
||||
$container,
|
||||
$db,
|
||||
$config,
|
||||
$migrator,
|
||||
new phpbb_filesystem(),
|
||||
'phpbb_ext',
|
||||
dirname(__FILE__) . '/',
|
||||
|
|
|
@ -61,11 +61,13 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
|
|||
$this->table_prefix,
|
||||
array()
|
||||
);
|
||||
$container = new phpbb_mock_container_builder();
|
||||
$container->set('migrator', $migrator);
|
||||
|
||||
$this->extension_manager = new phpbb_extension_manager(
|
||||
new phpbb_mock_container_builder(),
|
||||
$container,
|
||||
$this->db,
|
||||
$this->config,
|
||||
$this->migrator,
|
||||
new phpbb_filesystem(),
|
||||
'phpbb_ext',
|
||||
$this->phpbb_root_path,
|
||||
|
|
|
@ -148,11 +148,13 @@ class phpbb_functional_test_case extends phpbb_test_case
|
|||
self::$config['table_prefix'],
|
||||
array()
|
||||
);
|
||||
$container = new phpbb_mock_container_builder();
|
||||
$container->set('migrator', $migrator);
|
||||
|
||||
$extension_manager = new phpbb_extension_manager(
|
||||
new phpbb_mock_container_builder(),
|
||||
$container,
|
||||
$db,
|
||||
$config,
|
||||
$migrator,
|
||||
new phpbb_filesystem(),
|
||||
self::$config['table_prefix'] . 'ext',
|
||||
dirname(__FILE__) . '/',
|
||||
|
|
Loading…
Add table
Reference in a new issue