From d82b6480c36a8389d08bf19305f67a51f83fb653 Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Sun, 19 Nov 2023 23:09:32 +0000 Subject: [PATCH] Issue #3390693 by mikelutz, smustgrave: MigrationPluginManager::ExpandPluginIds can lose derivative plugins under certain circumstances (cherry picked from commit d5d6431e12aecb9cff91acefd3cd1001111ee66c) --- .../src/Plugin/MigrationPluginManager.php | 2 +- .../src/Unit/MigrationPluginManagerTest.php | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/modules/migrate/src/Plugin/MigrationPluginManager.php b/core/modules/migrate/src/Plugin/MigrationPluginManager.php index df1915372242..5f05d6dd4af0 100644 --- a/core/modules/migrate/src/Plugin/MigrationPluginManager.php +++ b/core/modules/migrate/src/Plugin/MigrationPluginManager.php @@ -145,7 +145,7 @@ public function expandPluginIds(array $migration_ids) { $plugin_ids = []; $all_ids = array_keys($this->getDefinitions()); foreach ($migration_ids as $id) { - $plugin_ids += preg_grep('/^' . preg_quote($id, '/') . PluginBase::DERIVATIVE_SEPARATOR . '/', $all_ids); + $plugin_ids = array_merge($plugin_ids, preg_grep('/^' . preg_quote($id, '/') . PluginBase::DERIVATIVE_SEPARATOR . '/', $all_ids)); if ($this->hasDefinition($id)) { $plugin_ids[] = $id; } diff --git a/core/modules/migrate/tests/src/Unit/MigrationPluginManagerTest.php b/core/modules/migrate/tests/src/Unit/MigrationPluginManagerTest.php index 174487822033..0982d783336f 100644 --- a/core/modules/migrate/tests/src/Unit/MigrationPluginManagerTest.php +++ b/core/modules/migrate/tests/src/Unit/MigrationPluginManagerTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\migrate\Unit; +use Drupal\Core\Cache\CacheBackendInterface; use Drupal\migrate\Plugin\Migration; use Drupal\migrate\Plugin\MigrationPluginManager; use Drupal\Tests\UnitTestCase; @@ -65,6 +66,25 @@ public function testDependencyBuilding($migrations_data, $result_ids) { } } + /** + * Tests that expandPluginIds returns all derivatives. + */ + public function testExpandPluginIds() { + $backend = $this->prophesize(CacheBackendInterface::class); + $cache = new \stdClass(); + $cache->data = [ + 'a:a' => ['provider' => 'core'], + 'a:b' => ['provider' => 'core'], + 'b' => ['provider' => 'core'], + ]; + $backend->get('migration_plugins')->willReturn($cache); + $this->pluginManager->setCacheBackend($backend->reveal(), 'migration_plugins'); + $plugin_ids = $this->pluginManager->expandPluginIds(['b', 'a']); + $this->assertContains('a:a', $plugin_ids); + $this->assertContains('a:b', $plugin_ids); + $this->assertContains('b', $plugin_ids); + } + /** * Provide dependency data for testing. */ -- GitLab