SyncFilterDeriver uses getExtensionChangelists for getDerivativeDefinitions

Created on 21 February 2023, over 1 year ago

Problem/Motivation

I will start with error report during deployment:

[notice] Database updates start.
> [error] AssertionError: The file specified by the given app root, relative path and file name (/var/www/html/docroot/profiles/contrib/profile/themes/my_admintheme.info.yml) do not exist. in assert() (line 68 of /var/www/html/docroot/core/lib/Drupal/Core/Extension/Extension.php) #0 /var/www/html/docroot/core/lib/Drupal/Core/Extension/Extension.php(68): assert(false, 'The file specif...')
> #1 /var/www/html/docroot/modules/contrib/config_sync/src/ConfigSyncLister.php(152): Drupal\Core\Extension\Extension->__construct('/var/www/html/d...', 'theme', 'profiles/contri...')

Steps to reproduce

This happens due to the fact, that admin theme that was used in the project was moved outside of the profile and became a separate package. This can be fixed with drush cr easily, but in case of deployment with CI/CD using drush deploy command only, it won't work and throw the exception. Normally this could be fixed with update hook that resets the extension list cache. But, the assertion error is thrown even before any updates are executed, because this happens on container build time:

#0 /var/www/html/docroot/core/lib/Drupal/Core/Extension/Extension.php(68): assert()
#1 /var/www/html/docroot/modules/contrib/config_sync/src/ConfigSyncLister.php(152): Drupal\Core\Extension\Extension->__construct()
#2 /var/www/html/docroot/modules/contrib/config_sync/src/ConfigSyncLister.php(135): Drupal\config_sync\ConfigSyncLister->getExtensionChangelist()
#3 /var/www/html/docroot/modules/contrib/config_sync/src/Plugin/ConfigFilter/SyncFilterDeriver.php(90): Drupal\config_sync\ConfigSyncLister->getExtensionChangelists()
#4 /var/www/html/docroot/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php(101): Drupal\config_sync\Plugin\ConfigFilter\SyncFilterDeriver->getDerivativeDefinitions()
#5 /var/www/html/docroot/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php(87): Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator->getDerivatives()
#6 /var/www/html/docroot/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php(291): Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator->getDefinitions()
#7 /var/www/html/docroot/modules/contrib/config_filter/src/Plugin/ConfigFilterPluginManager.php(70): Drupal\Core\Plugin\DefaultPluginManager->findDefinitions()
#8 /var/www/html/docroot/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php(181): Drupal\config_filter\Plugin\ConfigFilterPluginManager->findDefinitions()
#9 /var/www/html/docroot/modules/contrib/config_filter/src/Plugin/ConfigFilterPluginManager.php(37): Drupal\Core\Plugin\DefaultPluginManager->getDefinitions()
#10 /var/www/html/docroot/modules/contrib/config_filter/src/ConfigFilterStorageFactory.php(88): Drupal\config_filter\Plugin\ConfigFilterPluginManager->getFiltersForStorages()
#11 /var/www/html/docroot/modules/contrib/config_filter/src/ConfigFilterStorageFactory.php(54): Drupal\config_filter\ConfigFilterStorageFactory->getFilteredStorage()
#12 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1130): Drupal\config_filter\ConfigFilterStorageFactory->getSync()
#13 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(618): Symfony\Component\DependencyInjection\ContainerBuilder->createService()
#14 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1265): Symfony\Component\DependencyInjection\ContainerBuilder->doGet()
#15 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1213): Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices()
#16 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1621): Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices()
#17 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1167): Symfony\Component\DependencyInjection\ContainerBuilder->callMethod()
#18 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(618): Symfony\Component\DependencyInjection\ContainerBuilder->createService()
#19 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1265): Symfony\Component\DependencyInjection\ContainerBuilder->doGet()
#20 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1213): Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices()
#21 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1621): Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices()
#22 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(1167): Symfony\Component\DependencyInjection\ContainerBuilder->callMethod()
#23 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(618): Symfony\Component\DependencyInjection\ContainerBuilder->createService()
#24 /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php(558): Symfony\Component\DependencyInjection\ContainerBuilder->doGet()
#25 /var/www/html/vendor/drush/drush/src/Boot/DrupalBoot8.php(288): Symfony\Component\DependencyInjection\ContainerBuilder->get()
#26 /var/www/html/vendor/drush/drush/src/Boot/DrupalBoot8.php(251): Drush\Boot\DrupalBoot8->addDrupalModuleDrushCommands()
#27 /var/www/html/vendor/drush/drush/src/Boot/BootstrapManager.php(291): Drush\Boot\DrupalBoot8->bootstrapDrupalFull()
#28 /var/www/html/vendor/drush/drush/src/Boot/BootstrapManager.php(432): Drush\Boot\BootstrapManager->doBootstrap()
#29 /var/www/html/vendor/drush/drush/src/Boot/BootstrapManager.php(384): Drush\Boot\BootstrapManager->bootstrapToPhaseIndex()
#30 /var/www/html/vendor/drush/drush/src/Boot/BootstrapHook.php(32): Drush\Boot\BootstrapManager->bootstrapToPhase()
#31 /var/www/html/vendor/consolidation/annotated-command/src/Hooks/Dispatchers/InitializeHookDispatcher.php(44): Drush\Boot\BootstrapHook->initialize()
#32 /var/www/html/vendor/consolidation/annotated-command/src/Hooks/Dispatchers/InitializeHookDispatcher.php(36): Consolidation\AnnotatedCommand\Hooks\Dispatchers\InitializeHookDispatcher->doInitializeHook()
#33 /var/www/html/vendor/consolidation/annotated-command/src/Hooks/Dispatchers/InitializeHookDispatcher.php(29): Consolidation\AnnotatedCommand\Hooks\Dispatchers\InitializeHookDispatcher->callInitializeHook()
#34 /var/www/html/vendor/consolidation/annotated-command/src/CommandProcessor.php(145): Consolidation\AnnotatedCommand\Hooks\Dispatchers\InitializeHookDispatcher->initialize()
#35 /var/www/html/vendor/consolidation/annotated-command/src/AnnotatedCommand.php(375): Consolidation\AnnotatedCommand\CommandProcessor->initializeHook()
#36 /var/www/html/vendor/symfony/console/Command/Command.php(221): Consolidation\AnnotatedCommand\AnnotatedCommand->initialize()
#37 /var/www/html/vendor/symfony/console/Application.php(1039): Symfony\Component\Console\Command\Command->run()
#38 /var/www/html/vendor/symfony/console/Application.php(275): Symfony\Component\Console\Application->doRunCommand()
#39 /var/www/html/vendor/symfony/console/Application.php(149): Symfony\Component\Console\Application->doRun()
#40 /var/www/html/vendor/drush/drush/src/Runtime/Runtime.php(124): Symfony\Component\Console\Application->run()
#41 /var/www/html/vendor/drush/drush/src/Runtime/Runtime.php(51): Drush\Runtime\Runtime->doRun()
#42 /var/www/html/vendor/drush/drush/drush.php(72): Drush\Runtime\Runtime->run()
#43 /var/www/html/vendor/drush/drush/drush(4): require('...')
#44 /var/www/html/vendor/bin/drush(117): include('...')
#45 {main}

To be more precised in this Deriver Plugin class SyncFilterDeriver. This all happens only because derivatives at the moment are dependent on extension change list. And here comes the question/solution:

Proposed resolution

Would it be possible to use getSyncExtensions from ConfigSyncExtensionsTrait instead of getExtensionChangelists for derivatives definition, or is it crucial to have only extensions with changes as plugin derivatives?

Remaining tasks

If proposed resolution is ok, create patch or MR and change getExtensionChangelists to getSyncExtensions

User interface changes

None

API changes

It will be necessary to set getSyncExtensions as public method and maybe add it to ConfigSyncListerInterface

Data model changes

None

Feature request
Status

Active

Version

3.0

Component

Code

Created by

🇩🇪Germany a.dmitriiev

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Comments & Activities

Production build 0.71.5 2024