[ticket/17516] Remove dependency on topological sort library

PHPBB-17516
This commit is contained in:
Máté Bartus 2025-06-01 11:37:12 +01:00
parent 2fce8aeb3e
commit b9df5bbbf0
3 changed files with 48 additions and 64 deletions

View file

@ -33,7 +33,6 @@
"ext-sodium": "*", "ext-sodium": "*",
"bantu/ini-get-wrapper": "~1.0", "bantu/ini-get-wrapper": "~1.0",
"carlos-mg89/oauth": "^0.8.15", "carlos-mg89/oauth": "^0.8.15",
"chita/topological_sort": "^3.0",
"composer/composer": "^2.0", "composer/composer": "^2.0",
"composer/installers": "^1.9", "composer/installers": "^1.9",
"composer/package-versions-deprecated": "^1.11", "composer/package-versions-deprecated": "^1.11",

43
phpBB/composer.lock generated
View file

@ -171,49 +171,6 @@
}, },
"time": "2025-02-08T12:14:07+00:00" "time": "2025-02-08T12:14:07+00:00"
}, },
{
"name": "chita/topological_sort",
"version": "v3.0.1",
"source": {
"type": "git",
"url": "https://github.com/CHItA/TopologicalSort.git",
"reference": "9e0401c712d0c7cf012f264cc105669844d2479e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/CHItA/TopologicalSort/zipball/9e0401c712d0c7cf012f264cc105669844d2479e",
"reference": "9e0401c712d0c7cf012f264cc105669844d2479e",
"shasum": ""
},
"require": {
"php": ">=7.1.0"
},
"require-dev": {
"phpunit/phpunit": "^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"CHItA\\TopologicalSort\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Máté Bartus",
"email": "mate.bartus@gmail.com"
}
],
"description": "Topological sort function",
"support": {
"issues": "https://github.com/CHItA/TopologicalSort/issues",
"source": "https://github.com/CHItA/TopologicalSort/tree/v3.0.1"
},
"time": "2021-01-04T21:31:59+00:00"
},
{ {
"name": "composer/ca-bundle", "name": "composer/ca-bundle",
"version": "1.5.6", "version": "1.5.6",

View file

@ -14,21 +14,17 @@
namespace phpbb\db\migration; namespace phpbb\db\migration;
use Closure; use Closure;
use LogicException;
use phpbb\config\config; use phpbb\config\config;
use phpbb\db\driver\driver_interface; use phpbb\db\driver\driver_interface;
use phpbb\db\migrator; use phpbb\db\migrator;
use phpbb\db\tools\tools_interface; use phpbb\db\tools\tools_interface;
use UnexpectedValueException; use UnexpectedValueException;
use CHItA\TopologicalSort\TopologicalSort;
/** /**
* The schema generator generates the schema based on the existing migrations * The schema generator generates the schema based on the existing migrations
*/ */
class schema_generator class schema_generator
{ {
use TopologicalSort;
/** @var config */ /** @var config */
protected $config; protected $config;
@ -103,24 +99,56 @@ class schema_generator
return $this->tables; return $this->tables;
} }
$migrations = $this->class_names; $dependency_counts = [];
$filter = function($class_name) { $dependencies = [];
return !migrator::is_migration($class_name); $applicable_migrations = [];
}; $migration_count = 0;
foreach ($this->class_names as $class_name)
$edges = function($class_name) {
return $class_name::depends_on();
};
$apply_for_each = function($class_name) {
$this->apply_migration_to_schema($class_name);
};
try
{ {
$this->topologicalSort($migrations, $edges, true, $apply_for_each, $filter); if (!migrator::is_migration($class_name))
{
continue;
} }
catch (LogicException $e)
$migration_count++;
$migration_dependencies = $class_name::depends_on();
if (empty($migration_dependencies))
{
$applicable_migrations[] = $class_name;
continue;
}
$dependency_counts[$class_name] = count($migration_dependencies);
foreach ($migration_dependencies as $migration_dependency)
{
$dependencies[$migration_dependency][] = $class_name;
}
}
$applied_migrations = 0;
while (!empty($applicable_migrations))
{
$migration = array_pop($applicable_migrations);
$this->apply_migration_to_schema($migration);
++$applied_migrations;
if (!array_key_exists($migration, $dependencies))
{
continue;
}
$dependents = $dependencies[$migration];
foreach ($dependents as $dependent)
{
$dependency_counts[$dependent]--;
if ($dependency_counts[$dependent] === 0)
{
$applicable_migrations[] = $dependent;
}
}
}
if ($migration_count !== $applied_migrations)
{ {
throw new UnexpectedValueException( throw new UnexpectedValueException(
"Migrations either have circular dependencies or unsatisfiable dependencies." "Migrations either have circular dependencies or unsatisfiable dependencies."