1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-04-14 12:52:08 +02:00

[ticket/11386] Use finder to find migration files

PHPBB3-11386
This commit is contained in:
Nathaniel Guse 2013-03-02 11:02:53 -06:00
parent 8200509c79
commit 39ca212e17
5 changed files with 102 additions and 61 deletions

View File

@ -5,6 +5,7 @@ services:
- @config
- @dbal.conn
- @dbal.tools
- @ext.manager
- %tables.migrations%
- %core.root_path%
- %core.php_ext%

View File

@ -116,11 +116,12 @@ services:
- @service_container
- @dbal.conn
- @config
- @migrator
- %tables.ext%
- %core.root_path%
- .%core.php_ext%
- @cache.driver
calls:
- [set_migrator, [@migrator]]
ext.finder:
class: phpbb_extension_finder

View File

@ -31,6 +31,9 @@ class phpbb_db_migrator
/** @var phpbb_db_tools */
protected $db_tools;
/** @var phpbb_extension_manager */
protected $extension_manager;
/** @var string */
protected $table_prefix;
@ -69,11 +72,12 @@ class phpbb_db_migrator
/**
* Constructor of the database migrator
*/
public function __construct(phpbb_config $config, phpbb_db_driver $db, phpbb_db_tools $db_tools, $migrations_table, $phpbb_root_path, $php_ext, $table_prefix, $tools)
public function __construct(phpbb_config $config, phpbb_db_driver $db, phpbb_db_tools $db_tools, phpbb_extension_manager $extension_manager, $migrations_table, $phpbb_root_path, $php_ext, $table_prefix, $tools)
{
$this->config = $config;
$this->db = $db;
$this->db_tools = $db_tools;
$this->extension_manager = $extension_manager;
$this->migrations_table = $migrations_table;
@ -180,55 +184,26 @@ class phpbb_db_migrator
* If FALSE, we will not check. You SHOULD check at least once
* to prevent errors (if including multiple directories, check
* with the last call to prevent throwing errors unnecessarily).
* @param bool $recursive Set to true to also load data files from subdirectories
* @return array Array of migration names
*/
public function load_migrations($path, $check_fulfillable = true, $recursive = true)
public function load_migrations($path, $check_fulfillable = true)
{
if (!is_dir($path))
{
throw new phpbb_db_migration_exception('DIRECTORY INVALID', $path);
}
$handle = opendir($path);
while (($file = readdir($handle)) !== false)
$finder = $this->extension_manager->get_finder();
$migration_files = $finder
->extension_directory("/")
->find_from_paths(array('/' => $path));
foreach ($migration_files as $migration)
{
if ($file == '.' || $file == '..')
$migration_name = $migration['path'] . $migration['filename'];
if (!in_array($migration_name, $this->migrations))
{
continue;
}
// Recursion through subdirectories
if (is_dir($path . $file) && $recursive)
{
$this->load_migrations($path . $file . '/', $check_fulfillable, $recursive);
}
if (strpos($file, '_') !== 0 && strrpos($file, '.' . $this->php_ext) === (strlen($file) - strlen($this->php_ext) - 1))
{
// We try to find what class existed by comparing the classes declared before and after including the file.
$declared_classes = get_declared_classes();
include ($path . $file);
$added_classes = array_diff(get_declared_classes(), $declared_classes);
if (
// If two classes have been added and phpbb_db_migration is one of them, we've only added one real migration
!(sizeof($added_classes) == 2 && in_array('phpbb_db_migration', $added_classes)) &&
// Otherwise there should only be one class added
sizeof($added_classes) != 1
)
{
throw new phpbb_db_migration_exception('MIGRATION DATA FILE INVALID', $path . $file);
}
$name = array_pop($added_classes);
if (!in_array($name, $this->migrations))
{
$this->migrations[] = $name;
}
$this->migrations[] = $migration_name;
}
}

View File

@ -247,15 +247,28 @@ class phpbb_extension_finder
* phpBB naming rules an incorrect class name will be returned.
*
* @param bool $cache Whether the result should be cached
* @param bool $use_all_available Use all available instead of just all
* enabled extensions
* @return array An array of found class names
*/
public function get_classes($cache = true)
public function get_classes($cache = true, $use_all_available = false)
{
$this->query['extension_suffix'] .= $this->php_ext;
$this->query['core_suffix'] .= $this->php_ext;
$files = $this->find($cache, false);
$files = $this->find($cache, false, $use_all_available);
return $this->get_classes_from_files($files);
}
/**
* Get class names from a list of files
*
* @param array $files Array of files (from find())
* @return array Array of class names
*/
public function get_classes_from_files($files)
{
$classes = array();
foreach ($files as $file => $ext_name)
{
@ -270,23 +283,27 @@ class phpbb_extension_finder
* Finds all directories matching the configured options
*
* @param bool $cache Whether the result should be cached
* @param bool $use_all_available Use all available instead of just all
* enabled extensions
* @param bool $extension_keys Whether the result should have extension name as array key
* @return array An array of paths to found directories
*/
public function get_directories($cache = true, $extension_keys = false)
public function get_directories($cache = true, $use_all_available = false, $extension_keys = false)
{
return $this->find_with_root_path($cache, true, $extension_keys);
return $this->find_with_root_path($cache, true, $use_all_available, $extension_keys);
}
/**
* Finds all files matching the configured options.
*
* @param bool $cache Whether the result should be cached
* @param bool $use_all_available Use all available instead of just all
* enabled extensions
* @return array An array of paths to found files
*/
public function get_files($cache = true)
public function get_files($cache = true, $use_all_available = false)
{
return $this->find_with_root_path($cache, false);
return $this->find_with_root_path($cache, false, $use_all_available);
}
/**
@ -295,13 +312,15 @@ class phpbb_extension_finder
* @param bool $cache Whether the result should be cached
* @param bool $is_dir Directories will be returned when true, only files
* otherwise
* @param bool $use_all_available Use all available instead of just all
* enabled extensions
* @param bool $extension_keys If true, result will be associative array
* with extension name as key
* @return array An array of paths to found items
*/
protected function find_with_root_path($cache = true, $is_dir = false, $extension_keys = false)
protected function find_with_root_path($cache = true, $is_dir = false, $use_all_available = false, $extension_keys = false)
{
$items = $this->find($cache, $is_dir);
$items = $this->find($cache, $is_dir, $use_all_available);
$result = array();
foreach ($items as $item => $ext_name)
@ -325,12 +344,51 @@ class phpbb_extension_finder
* @param bool $cache Whether the result should be cached
* @param bool $is_dir Directories will be returned when true, only files
* otherwise
* @param bool $use_all_available Use all available instead of just all
* enabled extensions
* @return array An array of paths to found items
*/
public function find($cache = true, $is_dir = false)
public function find($cache = true, $is_dir = false, $use_all_available = false)
{
if ($use_all_available)
{
$extensions = $this->extension_manager->all_available();
}
else
{
$extensions = $this->extension_manager->all_enabled();
}
if ($this->query['core_path'])
{
$extensions['/'] = $this->phpbb_root_path . $this->query['core_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
* an array of paths
*
* @param array $extensions Array of extensions (name => full relative path)
* @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_paths($extensions, $cache = true, $is_dir = false)
{
$this->query['is_dir'] = $is_dir;
$query = md5(serialize($this->query));
$query = md5(serialize($this->query) . serialize($extensions));
if (!defined('DEBUG') && $cache && isset($this->cached_queries[$query]))
{
@ -339,13 +397,6 @@ class phpbb_extension_finder
$files = array();
$extensions = $this->extension_manager->all_enabled();
if ($this->query['core_path'])
{
$extensions['/'] = $this->phpbb_root_path . $this->query['core_path'];
}
foreach ($extensions as $name => $path)
{
$ext_name = $name;
@ -419,7 +470,13 @@ class phpbb_extension_finder
(!$prefix || substr($filename, 0, strlen($prefix)) === $prefix) &&
(!$directory || preg_match($directory_pattern, $relative_path)))
{
$files[str_replace(DIRECTORY_SEPARATOR, '/', $location . $name . substr($relative_path, 1))] = $ext_name;
$files[] = array(
'named_path' => str_replace(DIRECTORY_SEPARATOR, '/', $location . $name . substr($relative_path, 1)),
'ext_name' => $ext_name,
'path' => str_replace(array(DIRECTORY_SEPARATOR, $this->phpbb_root_path), array('/', ''), $file_info->getPath()) . '/',
'filename' => $filename,
'file_info' => $file_info,
);
}
}
}

View File

@ -49,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, $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, $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->php_ext = $php_ext;
$this->extension_table = $extension_table;
@ -69,6 +68,14 @@ class phpbb_extension_manager
}
}
/**
* Set migrator (get around circular reference)
*/
public function set_migrator(phpbb_db_migrator $migrator)
{
$this->migrator = $migrator;
}
/**
* Loads all extension information from the database
*