From b9df5bbbf029d9005dad7dabd4be774207e85791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Bartus?= Date: Sun, 1 Jun 2025 11:37:12 +0100 Subject: [PATCH] [ticket/17516] Remove dependency on topological sort library PHPBB-17516 --- phpBB/composer.json | 1 - phpBB/composer.lock | 43 ------------ phpBB/phpbb/db/migration/schema_generator.php | 68 +++++++++++++------ 3 files changed, 48 insertions(+), 64 deletions(-) diff --git a/phpBB/composer.json b/phpBB/composer.json index c75912664b..6c2288bcd2 100644 --- a/phpBB/composer.json +++ b/phpBB/composer.json @@ -33,7 +33,6 @@ "ext-sodium": "*", "bantu/ini-get-wrapper": "~1.0", "carlos-mg89/oauth": "^0.8.15", - "chita/topological_sort": "^3.0", "composer/composer": "^2.0", "composer/installers": "^1.9", "composer/package-versions-deprecated": "^1.11", diff --git a/phpBB/composer.lock b/phpBB/composer.lock index a353e9409b..1dd732fb45 100644 --- a/phpBB/composer.lock +++ b/phpBB/composer.lock @@ -171,49 +171,6 @@ }, "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", "version": "1.5.6", diff --git a/phpBB/phpbb/db/migration/schema_generator.php b/phpBB/phpbb/db/migration/schema_generator.php index 0048d8198d..ce07c30d45 100644 --- a/phpBB/phpbb/db/migration/schema_generator.php +++ b/phpBB/phpbb/db/migration/schema_generator.php @@ -14,21 +14,17 @@ namespace phpbb\db\migration; use Closure; -use LogicException; use phpbb\config\config; use phpbb\db\driver\driver_interface; use phpbb\db\migrator; use phpbb\db\tools\tools_interface; use UnexpectedValueException; -use CHItA\TopologicalSort\TopologicalSort; /** * The schema generator generates the schema based on the existing migrations */ class schema_generator { - use TopologicalSort; - /** @var config */ protected $config; @@ -103,24 +99,56 @@ class schema_generator return $this->tables; } - $migrations = $this->class_names; - $filter = function($class_name) { - return !migrator::is_migration($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 + $dependency_counts = []; + $dependencies = []; + $applicable_migrations = []; + $migration_count = 0; + foreach ($this->class_names as $class_name) { - $this->topologicalSort($migrations, $edges, true, $apply_for_each, $filter); + if (!migrator::is_migration($class_name)) + { + continue; + } + + $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; + } } - catch (LogicException $e) + + $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( "Migrations either have circular dependencies or unsatisfiable dependencies."